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();
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);
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