]> Chaos Git - corbenik/ctrulib.git/commitdiff
Added AM_ListTitles(), removed nonsense bitwise ands, replaced sprint() with memcpy...
authorprofi200 <fd3194@gmx.de>
Sun, 1 Mar 2015 18:49:38 +0000 (19:49 +0100)
committerprofi200 <fd3194@gmx.de>
Sun, 1 Mar 2015 18:49:38 +0000 (19:49 +0100)
libctru/include/3ds.h
libctru/include/3ds/services/am.h
libctru/source/services/am.c

index 741ad034af60a2a34d5d17c3a4f56a7f412cb01e..325f491c8fda16781fd692c7d84ebf1bf6cfe321 100644 (file)
@@ -13,6 +13,7 @@ extern "C" {
 #include <3ds/os.h>
 #include <3ds/gfx.h>
 #include <3ds/console.h>
+#include <3ds/utils/utf.h>
 
 #include <3ds/services/ac.h>
 #include <3ds/services/am.h>
index 34620d32349c32892b5c9229b04e979c3da0a360..b1d5db2523704f8b879a76a7bbaf4e188e3cbebe 100644 (file)
@@ -4,6 +4,16 @@
        Requires access to "am:net" or "am:u" service
 */
 
+
+typedef struct
+{
+       u64 titleID;
+       u64 unknown;
+       u16 titleVersion;
+       u8 unknown2[6];
+} TitleList;
+
+
 Result amInit();
 Result amExit();
 
@@ -20,16 +30,26 @@ About: Writes a titleid list for a mediatype to a buffer
 
   mediatype            mediatype to get list from
   count                        number of titleids to get
-  buffer               buffer to write titleids to
+  titleIDs     buffer to write titleids to
 */
-Result AM_GetTitleList(u8 mediatype, u32 count, void *buffer);
+Result AM_GetTitleIdList(u8 mediatype, u32 count, u64 *titleIDs);
 
 /* AM_GetDeviceId()
 About: Gets a 32bit device id, it's used for some key slot inits
 
   device_id            ptr to where the device id is written to
 */
-Result AM_GetDeviceId(u32 *deviceid);
+Result AM_GetDeviceId(u32 *deviceID);
+
+/* AM_ListTitles()
+About: Get a list with details about the installed titles
+
+  mediatype    mediatype of title
+  titleCount   number of titles to list
+       titleIdList  pointer to a title ID list
+       titleList    pointer for the output TitleList array
+*/
+Result AM_ListTitles(u8 mediatype, u32 titleCount, u64 *titleIdList, TitleList *titleList);
 
 /**** Title Install Methods ****/
 /* AM_StartCiaInstall()
@@ -38,7 +58,7 @@ About: Inits CIA install process, the returned ciahandle is where the data for C
   mediatype            mediatype to install CIA to
   ciahandle            ptr to where the handle should be written to
 */
-Result AM_StartCiaInstall(u8 mediatype, Handle *ciahandle);
+Result AM_StartCiaInstall(u8 mediatype, Handle *ciaHandle);
 
 /* AM_StartDlpChildCiaInstall()
 About: Inits CIA install process, the returned ciahandle is where the data for CIA should be written to
@@ -46,14 +66,14 @@ Note: This is for installing DLP CIAs only, mediatype is hardcoded to be NAND
 
   ciahandle            ptr to where the handle should be written to
 */
-Result AM_StartDlpChildCiaInstall(Handle *ciahandle);
+Result AM_StartDlpChildCiaInstall(Handle *ciaHandle);
 
 /* AM_CancelCIAInstall()
 About: Abort CIA install process
 
   ciahandle            ptr to cia Handle provided by AM
 */
-Result AM_CancelCIAInstall(Handle *ciahandle);
+Result AM_CancelCIAInstall(Handle *ciaHandle);
 
 /* AM_FinishCiaInstall()
 About: Once all data is written to the cia handle, this command signals AM to proceed with CIA install.
@@ -62,7 +82,7 @@ Note: AM closes the cia handle provided here
   mediatype            same mediatype specified ciahandle was obtained
   ciahandle            ptr to cia Handle provided by AM
 */
-Result AM_FinishCiaInstall(u8 mediatype, Handle *ciahandle);
+Result AM_FinishCiaInstall(u8 mediatype, Handle *ciaHandle);
 
 /**** Title Delete Methods ****/
 /* AM_DeleteTitle()
@@ -72,7 +92,7 @@ Note: AM closes the cia handle provided here
   mediatype            mediatype of title
   titleid              title id of title
 */
-Result AM_DeleteTitle(u8 mediatype, u64 titleid);
+Result AM_DeleteTitle(u8 mediatype, u64 titleID);
 
 /* AM_DeleteAppTitle()
 About: Deletes any title on NAND/SDMC
@@ -81,7 +101,7 @@ Note: If the title has the system category bit set, this will fail
   mediatype            mediatype of title
   titleid              title id of title
 */
-Result AM_DeleteAppTitle(u8 mediatype, u64 titleid);
+Result AM_DeleteAppTitle(u8 mediatype, u64 titleID);
 
 /* AM_InstallFIRM()
 About: Installs FIRM to NAND (firm0:/ & firm1:/) from a CXI
@@ -90,7 +110,7 @@ Note: The title must have the uniqueid: 0x00000, otherwise this will fail.
   mediatype            mediatype of title
   titleid              title id of title
 */
-Result AM_InstallFIRM(u8 mediatype, u64 titleid);
+Result AM_InstallFIRM(u8 mediatype, u64 titleID);
 
 /* AM_GetTitleProductCode()
 About: Gets the product code of a title based on its title id.
@@ -99,5 +119,4 @@ About: Gets the product code of a title based on its title id.
   titleid              title id of title
   productcode           buffer to output the product code to (should have a length of 16) 
 */
-Result AM_GetTitleProductCode(u8 mediatype, u64 titleid, char* productcode);
-
+Result AM_GetTitleProductCode(u8 mediatype, u64 titleID, char* productCode);
index 56f3448a37b1685da78865b7e3b954ef2dd9752d..2671e55654806880a6e9de62ab72487fce700a82 100644 (file)
@@ -1,4 +1,5 @@
 #include <stdio.h>
+#include <string.h>
 #include <stdlib.h>
 #include <3ds/types.h>
 #include <3ds/svc.h>
@@ -35,7 +36,7 @@ Result AM_GetTitleCount(u8 mediatype, u32 *count)
        return (Result)cmdbuf[1];
 }
 
-Result AM_GetTitleList(u8 mediatype, u32 count, void *buffer)
+Result AM_GetTitleIdList(u8 mediatype, u32 count, u64 *titleIDs)
 {
        Result ret = 0;
        u32 *cmdbuf = getThreadCommandBuffer();
@@ -44,14 +45,32 @@ Result AM_GetTitleList(u8 mediatype, u32 count, void *buffer)
        cmdbuf[1] = count;
        cmdbuf[2] = mediatype;
        cmdbuf[3] = ((count*8) << 4) | 12;
-       cmdbuf[4] = (u32)buffer;
+       cmdbuf[4] = (u32)titleIDs;
 
        if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
        
        return (Result)cmdbuf[1];
 }
 
-Result AM_GetDeviceId(u32 *deviceid)
+Result AM_ListTitles(u8 mediatype, u32 titleCount, u64 *titleIdList, TitleList *titleList)
+{
+       Result ret = 0;
+       u32 *cmdbuf = getThreadCommandBuffer();
+
+       cmdbuf[0] = 0x00030084;
+       cmdbuf[1] = mediatype;
+       cmdbuf[2] = titleCount;
+       cmdbuf[3] = ((titleCount*8)<<4) | 10;
+       cmdbuf[4] = (u32)titleIdList;
+       cmdbuf[5] = ((sizeof(TitleList)*titleCount)<<4) | 12;
+       cmdbuf[6] = (u32)titleList;
+
+       if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
+
+       return (Result)cmdbuf[1];
+}
+
+Result AM_GetDeviceId(u32 *deviceID)
 {
        Result ret = 0;
        u32 *cmdbuf = getThreadCommandBuffer();
@@ -60,12 +79,12 @@ Result AM_GetDeviceId(u32 *deviceid)
 
        if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
 
-       *deviceid = cmdbuf[3];
+       *deviceID = cmdbuf[3];
        
        return (Result)cmdbuf[1];
 }
 
-Result AM_StartCiaInstall(u8 mediatype, Handle *ciahandle)
+Result AM_StartCiaInstall(u8 mediatype, Handle *ciaHandle)
 {
        Result ret = 0;
        u32 *cmdbuf = getThreadCommandBuffer();
@@ -75,12 +94,12 @@ Result AM_StartCiaInstall(u8 mediatype, Handle *ciahandle)
 
        if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
 
-       *ciahandle = cmdbuf[3];
+       *ciaHandle = cmdbuf[3];
        
        return (Result)cmdbuf[1];
 }
 
-Result AM_StartDlpChildCiaInstall(Handle *ciahandle)
+Result AM_StartDlpChildCiaInstall(Handle *ciaHandle)
 {
        Result ret = 0;
        u32 *cmdbuf = getThreadCommandBuffer();
@@ -89,96 +108,98 @@ Result AM_StartDlpChildCiaInstall(Handle *ciahandle)
 
        if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
 
-       *ciahandle = cmdbuf[3];
+       *ciaHandle = cmdbuf[3];
        
        return (Result)cmdbuf[1];
 }
 
-Result AM_CancelCIAInstall(Handle *ciahandle)
+Result AM_CancelCIAInstall(Handle *ciaHandle)
 {
        Result ret = 0;
        u32 *cmdbuf = getThreadCommandBuffer();
 
        cmdbuf[0] = 0x04040002;
        cmdbuf[1] = 0x10;
-       cmdbuf[2] = *ciahandle;
+       cmdbuf[2] = *ciaHandle;
 
        if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
 
        return (Result)cmdbuf[1];
 }
 
-Result AM_FinishCiaInstall(u8 mediatype, Handle *ciahandle)
+Result AM_FinishCiaInstall(u8 mediatype, Handle *ciaHandle)
 {
        Result ret = 0;
        u32 *cmdbuf = getThreadCommandBuffer();
 
        cmdbuf[0] = 0x04050002;
        cmdbuf[1] = 0x10;
-       cmdbuf[2] = *ciahandle;
+       cmdbuf[2] = *ciaHandle;
 
        if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
 
        return (Result)cmdbuf[1];
 }
 
-Result AM_DeleteTitle(u8 mediatype, u64 titleid)
+Result AM_DeleteTitle(u8 mediatype, u64 titleID)
 {
        Result ret = 0;
        u32 *cmdbuf = getThreadCommandBuffer();
 
        cmdbuf[0] = 0x041000C0;
        cmdbuf[1] = mediatype;
-       cmdbuf[2] = titleid & 0xffffffff;
-       cmdbuf[3] = (titleid >> 32) & 0xffffffff;
+       cmdbuf[2] = titleID & 0xffffffff;
+       cmdbuf[3] = (u32)(titleID >> 32);
 
        if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
 
        return (Result)cmdbuf[1];
 }
 
-Result AM_DeleteAppTitle(u8 mediatype, u64 titleid)
+Result AM_DeleteAppTitle(u8 mediatype, u64 titleID)
 {
        Result ret = 0;
        u32 *cmdbuf = getThreadCommandBuffer();
 
        cmdbuf[0] = 0x000400C0;
        cmdbuf[1] = mediatype;
-       cmdbuf[2] = titleid & 0xffffffff;
-       cmdbuf[3] = (titleid >> 32) & 0xffffffff;
+       cmdbuf[2] = titleID & 0xffffffff;
+       cmdbuf[3] = (u32)(titleID >> 32);
 
        if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
 
        return (Result)cmdbuf[1];
 }
 
-Result AM_InstallFIRM(u8 mediatype, u64 titleid)
+Result AM_InstallFIRM(u8 mediatype, u64 titleID)
 {
        Result ret = 0;
        u32 *cmdbuf = getThreadCommandBuffer();
 
        cmdbuf[0] = 0x000400C0;
        cmdbuf[1] = mediatype;
-       cmdbuf[2] = titleid & 0xffffffff;
-       cmdbuf[3] = (titleid >> 32) & 0xffffffff;
+       cmdbuf[2] = titleID & 0xffffffff;
+       cmdbuf[3] = (u32)(titleID >> 32);
 
        if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
 
        return (Result)cmdbuf[1];
 }
 
-Result AM_GetTitleProductCode(u8 mediatype, u64 titleid, char* productcode)
+Result AM_GetTitleProductCode(u8 mediatype, u64 titleID, char* productCode)
 {
        Result ret = 0;
        u32 *cmdbuf = getThreadCommandBuffer();
        
        cmdbuf[0] = 0x000500C0;
        cmdbuf[1] = mediatype;
-       cmdbuf[2] = titleid & 0xffffffff;
-       cmdbuf[3] = (titleid >> 32) & 0xffffffff;
+       cmdbuf[2] = titleID & 0xffffffff;
+       cmdbuf[3] = (u32)(titleID >> 32);
        
        if((ret = svcSendSyncRequest(amHandle))!=0) return ret;
 
-       snprintf(productcode, 16, "%s", (char*)(&cmdbuf[2]));
+       // The product code string can use the full 16 bytes without NULL terminator
+       if(productCode) memcpy(productCode, &cmdbuf[2], 16);
+
        return (Result)cmdbuf[1];
 }