diff --git a/libctru/include/3ds/services/fs.h b/libctru/include/3ds/services/fs.h index acac55a..eadff3c 100644 --- a/libctru/include/3ds/services/fs.h +++ b/libctru/include/3ds/services/fs.h @@ -127,6 +127,14 @@ typedef struct u64 fileSize; //!< file size } FS_dirent; +/*! ProductInfo. These strings are not NULL-terminated. */ +typedef struct +{ + char product_code[0x10]; + char company_code[0x2]; + u16 remaster_version; +} FS_ProductInfo; + Result fsInit(void); Result fsExit(void); Handle *fsGetSessionHandle(); @@ -150,6 +158,7 @@ Result FSUSER_GetSdmcArchiveResource(Handle *handle, u32 *sectorSize, u32 *clust Result FSUSER_GetNandArchiveResource(Handle *handle, u32 *sectorSize, u32 *clusterSize, u32 *numClusters, u32 *freeClusters); Result FSUSER_IsSdmcDetected(Handle *handle, u8 *detected); Result FSUSER_IsSdmcWritable(Handle *handle, u8 *writable); +Result FSUSER_GetProductInfo(Handle *handle, u32 processid, FS_ProductInfo *out); Result FSUSER_GetMediaType(Handle *handle, u8* mediatype); Result FSFILE_Close(Handle handle); diff --git a/libctru/source/services/fs.c b/libctru/source/services/fs.c index 04f93ad..d66eb17 100644 --- a/libctru/source/services/fs.c +++ b/libctru/source/services/fs.c @@ -1051,6 +1051,54 @@ FSUSER_IsSdmcDetected(Handle *handle, return cmdbuf[1]; } +/*! Get the ProductInfo for the specified process. + * + * @param[in] handle fs:USER handle + * @param[in] processid ProcessID + * @param[out] out Output ProductInfo + * + * @returns error + * + * @internal + * + * #### Request + * + * Index Word | Description + * -----------|------------------------- + * 0 | Header code [0x082E0040] + * 1 | u32 processID + * + * #### Response + * + * Index Word | Description + * -----------|------------------------- + * 0 | Header code + * 1 | Result code + * 2-6 | Output ProductInfo + */ +Result +FSUSER_GetProductInfo(Handle *handle, + u32 processid, + FS_ProductInfo *out) +{ + if(!handle) + handle = &fsuHandle; + + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = 0x082E0040; + cmdbuf[1] = processid; + + Result ret = 0; + if((ret = svcSendSyncRequest(*handle))) + return ret; + + if(out) + memcpy(out, &cmdbuf[2], sizeof(FS_ProductInfo)); + + return cmdbuf[1]; +} + /*! Get curent process mediatype * * @param[in] handle fs:USER handle