u8 encryptParameter[0x10]; ///< Encrypt parameter.
} FS_DeviceMoveContext;
-/// FS path.
+/// Filesystem path data, detailing the specific target of an operation.
typedef struct
{
FS_PathType type; ///< FS path type.
const void* data; ///< Pointer to FS path data.
} FS_Path;
-/// FS archive.
-typedef struct
-{
- u32 id; ///< Archive ID.
- FS_Path lowPath; ///< FS path.
- u64 handle; ///< Handle.
-} FS_Archive;
+/// Filesystem archive handle, providing access to a filesystem's contents.
+typedef u64 FS_Archive;
/// Initializes FS.
Result fsInit(void);
/**
* @brief Sets the FSUSER session to use in the current thread.
* @param session The handle of the FSUSER session to use.
- * @param sdmc When true, SDMC archive commands are redirected to this session too. Otherwise the default session is used.
*/
-void fsUseSession(Handle session, bool sdmc);
+void fsUseSession(Handle session);
/// Disables the FSUSER session override in the current thread.
void fsEndUseSession(void);
+/**
+ * @brief Exempts an archive from using alternate FS session handles provided with @ref fsUseSession
+ * Instead, the archive will use the default FS session handle, opened with @ref srvGetSessionHandle
+ * @param archive Archive to exempt.
+ */
+void fsExemptFromSession(FS_Archive archive);
+
+/**
+ * @brief Unexempts an archive from using alternate FS session handles provided with @ref fsUseSession
+ * @param archive Archive to remove from the exemption list.
+ */
+void fsUnexemptFromSession(FS_Archive archive);
+
/**
* @brief Creates an FS_Path instance.
* @param type Type of path.
Result FSUSER_OpenFile(Handle* out, FS_Archive archive, FS_Path path, u32 openFlags, u32 attributes);
/**
- * @brief Opens a file directly.
+ * @brief Opens a file directly, bypassing the requirement of an opened archive handle.
* @param out Pointer to output the file handle to.
- * @param archive Archive containing the file.
- * @param path Path of the file.
+ * @param archiveId ID of the archive containing the file.
+ * @param archivePath Path of the archive containing the file.
+ * @param filePath Path of the file.
* @param openFlags Flags to open the file with.
* @param attributes Attributes of the file.
*/
-Result FSUSER_OpenFileDirectly(Handle* out, FS_Archive archive, FS_Path path, u32 openFlags, u32 attributes);
+Result FSUSER_OpenFileDirectly(Handle* out, FS_ArchiveID archiveId, FS_Path archivePath, FS_Path filePath, u32 openFlags, u32 attributes);
/**
* @brief Deletes a file.
/**
* @brief Creates a file.
- * @param archive Archive containing the file.
+ * @param archive Archive to create the file in.
* @param path Path of the file.
* @param attributes Attributes of the file.
* @param fileSize Size of the file.
/**
* @brief Creates a directory
- * @param archive Archive containing the directory.
+ * @param archive Archive to create the directory in.
* @param path Path of the directory.
* @param attributes Attributes of the directory.
*/
/**
* @brief Opens an archive.
- * @param archive Archive to open.
+ * @param archive Pointer to output the opened archive to.
+ * @param id ID of the archive.
+ * @param path Path of the archive.
*/
-Result FSUSER_OpenArchive(FS_Archive* archive);
+Result FSUSER_OpenArchive(FS_Archive* archive, FS_ArchiveID id, FS_Path path);
/**
* @brief Performs a control operation on an archive.
* @brief Closes an archive.
* @param archive Archive to close.
*/
-Result FSUSER_CloseArchive(FS_Archive* archive);
+Result FSUSER_CloseArchive(FS_Archive archive);
/**
* @brief Gets the number of free bytes within an archive.
} _3DSX_Header;
static Result romfsInitCommon(void);
-static void romfsInitMtime(FS_Archive arch, FS_Path path);
+static void romfsInitMtime(FS_ArchiveID archId, FS_Path archPath, FS_Path filePath);
__attribute__((weak)) const char* __romfs_path = NULL;
if (units >= PATH_MAX) return 4;
__utf16path[units] = 0;
- FS_Archive arch = { ARCHIVE_SDMC, { PATH_EMPTY, 1, (u8*)"" }, 0 };
- FS_Path path = { PATH_UTF16, (units+1)*2, (u8*)__utf16path };
+ FS_Path archPath = { PATH_EMPTY, 1, (u8*)"" };
+ FS_Path filePath = { PATH_UTF16, (units+1)*2, (u8*)__utf16path };
- Result rc = FSUSER_OpenFileDirectly(&romFS_file, arch, path, FS_OPEN_READ, 0);
+ Result rc = FSUSER_OpenFileDirectly(&romFS_file, ARCHIVE_SDMC, archPath, filePath, FS_OPEN_READ, 0);
if (R_FAILED(rc)) return rc;
- romfsInitMtime(arch, path);
+ romfsInitMtime(ARCHIVE_SDMC, archPath, filePath);
_3DSX_Header hdr;
if (!_romfs_read_chk(0, &hdr, sizeof(hdr))) goto _fail0;
u8 zeros[0xC];
memset(zeros, 0, sizeof(zeros));
- FS_Archive arch = { ARCHIVE_ROMFS, { PATH_EMPTY, 1, (u8*)"" }, 0 };
- FS_Path path = { PATH_BINARY, sizeof(zeros), zeros };
+ FS_Path archPath = { PATH_EMPTY, 1, (u8*)"" };
+ FS_Path filePath = { PATH_BINARY, sizeof(zeros), zeros };
- Result rc = FSUSER_OpenFileDirectly(&romFS_file, arch, path, FS_OPEN_READ, 0);
+ Result rc = FSUSER_OpenFileDirectly(&romFS_file, ARCHIVE_ROMFS, archPath, filePath, FS_OPEN_READ, 0);
if (R_FAILED(rc)) return rc;
- romfsInitMtime(arch, path);
+ romfsInitMtime(ARCHIVE_ROMFS, archPath, filePath);
}
return romfsInitCommon();
return 10;
}
-static void romfsInitMtime(FS_Archive arch, FS_Path path)
+static void romfsInitMtime(FS_ArchiveID archId, FS_Path archPath, FS_Path filePath)
{
u64 mtime;
+ FS_Archive arch;
Result rc;
romFS_mtime = time(NULL);
- rc = FSUSER_OpenArchive(&arch);
+ rc = FSUSER_OpenArchive(&arch, archId, archPath);
if (R_FAILED(rc))
return;
rc = FSUSER_ControlArchive(arch, ARCHIVE_ACTION_GET_TIMESTAMP,
- (void*)path.data, path.size,
+ (void*)filePath.data, filePath.size,
&mtime, sizeof(mtime));
- FSUSER_CloseArchive(&arch);
+ FSUSER_CloseArchive(arch);
if (R_FAILED(rc))
return;
#include <3ds/env.h>
#include "../internal.h"
+#define FS_MAX_EXEMPT_ARCHIVE_HANDLES 16
+
static Handle fsuHandle;
static int fsuRefCount;
-static Handle fsSessionForArchive(FS_ArchiveID arch)
+static FS_Archive fsExemptArchives[FS_MAX_EXEMPT_ARCHIVE_HANDLES];
+
+static Handle fsSession(void)
{
ThreadVars* tv = getThreadVars();
- if (tv->fs_magic == FS_OVERRIDE_MAGIC && (arch != ARCHIVE_SDMC || tv->fs_sdmc))
+ if (tv->fs_magic == FS_OVERRIDE_MAGIC)
return tv->fs_session;
return fsuHandle;
}
-static Handle fsSession(void)
+static Handle fsSessionForArchive(FS_Archive archive)
{
- return fsSessionForArchive(0);
+ for (int i = 0; i < FS_MAX_EXEMPT_ARCHIVE_HANDLES; i++)
+ {
+ if (fsExemptArchives[i] == archive)
+ return fsuHandle;
+ }
+
+ return fsSession();
}
Result fsInit(void)
svcCloseHandle(fsuHandle);
}
-void fsUseSession(Handle session, bool sdmc)
+void fsUseSession(Handle session)
{
ThreadVars* tv = getThreadVars();
tv->fs_magic = FS_OVERRIDE_MAGIC;
tv->fs_session = session;
- tv->fs_sdmc = sdmc;
}
void fsEndUseSession(void)
tv->fs_magic = 0;
}
+void fsExemptFromSession(FS_Archive archive)
+{
+ int freeIndex = -1;
+ for (int i = 0; i < FS_MAX_EXEMPT_ARCHIVE_HANDLES; i++)
+ {
+ if (fsExemptArchives[i] == archive)
+ return;
+
+ if (freeIndex == -1 && fsExemptArchives[i] == 0)
+ freeIndex = i;
+ }
+
+ if (freeIndex != -1)
+ fsExemptArchives[freeIndex] = archive;
+}
+
+void fsUnexemptFromSession(FS_Archive archive)
+{
+ for (int i = 0; i < FS_MAX_EXEMPT_ARCHIVE_HANDLES; i++)
+ {
+ if (fsExemptArchives[i] == archive)
+ {
+ fsExemptArchives[i] = 0;
+ break;
+ }
+ }
+}
+
FS_Path fsMakePath(FS_PathType type, const void* path)
{
FS_Path p = { type, 0, path };
cmdbuf[0] = IPC_MakeHeader(0x802,7,2); // 0x80201C2
cmdbuf[1] = 0;
- cmdbuf[2] = (u32) archive.handle;
- cmdbuf[3] = (u32) (archive.handle >> 32);
+ cmdbuf[2] = (u32) archive;
+ cmdbuf[3] = (u32) (archive >> 32);
cmdbuf[4] = path.type;
cmdbuf[5] = path.size;
cmdbuf[6] = openFlags;
cmdbuf[9] = (u32) path.data;
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive.id)))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive)))) return ret;
if(out) *out = cmdbuf[3];
return cmdbuf[1];
}
-Result FSUSER_OpenFileDirectly(Handle* out, FS_Archive archive, FS_Path path, u32 openFlags, u32 attributes)
+Result FSUSER_OpenFileDirectly(Handle* out, FS_ArchiveID archiveId, FS_Path archivePath, FS_Path filePath, u32 openFlags, u32 attributes)
{
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x803,8,4); // 0x8030204
cmdbuf[1] = 0;
- cmdbuf[2] = archive.id;
- cmdbuf[3] = archive.lowPath.type;
- cmdbuf[4] = archive.lowPath.size;
- cmdbuf[5] = path.type;
- cmdbuf[6] = path.size;
+ cmdbuf[2] = archiveId;
+ cmdbuf[3] = archivePath.type;
+ cmdbuf[4] = archivePath.size;
+ cmdbuf[5] = filePath.type;
+ cmdbuf[6] = filePath.size;
cmdbuf[7] = openFlags;
cmdbuf[8] = attributes;
- cmdbuf[9] = IPC_Desc_StaticBuffer(archive.lowPath.size, 2);
- cmdbuf[10] = (u32) archive.lowPath.data;
- cmdbuf[11] = IPC_Desc_StaticBuffer(path.size, 0);
- cmdbuf[12] = (u32) path.data;
+ cmdbuf[9] = IPC_Desc_StaticBuffer(archivePath.size, 2);
+ cmdbuf[10] = (u32) archivePath.data;
+ cmdbuf[11] = IPC_Desc_StaticBuffer(filePath.size, 0);
+ cmdbuf[12] = (u32) filePath.data;
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive.id)))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSession()))) return ret;
if(out) *out = cmdbuf[3];
cmdbuf[0] = IPC_MakeHeader(0x804,5,2); // 0x8040142
cmdbuf[1] = 0;
- cmdbuf[2] = (u32) archive.handle;
- cmdbuf[3] = (u32) (archive.handle >> 32);
+ cmdbuf[2] = (u32) archive;
+ cmdbuf[3] = (u32) (archive >> 32);
cmdbuf[4] = path.type;
cmdbuf[5] = path.size;
cmdbuf[6] = IPC_Desc_StaticBuffer(path.size, 0);
cmdbuf[7] = (u32) path.data;
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive.id)))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive)))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x805,9,4); // 0x8050244
cmdbuf[1] = 0;
- cmdbuf[2] = (u32) srcArchive.handle;
- cmdbuf[3] = (u32) (srcArchive.handle >> 32);
+ cmdbuf[2] = (u32) srcArchive;
+ cmdbuf[3] = (u32) (srcArchive >> 32);
cmdbuf[4] = srcPath.type;
cmdbuf[5] = srcPath.size;
- cmdbuf[6] = (u32) dstArchive.handle;
- cmdbuf[7] = (u32) (dstArchive.handle >> 32);
+ cmdbuf[6] = (u32) dstArchive;
+ cmdbuf[7] = (u32) (dstArchive >> 32);
cmdbuf[8] = dstPath.type;
cmdbuf[9] = dstPath.size;
cmdbuf[10] = IPC_Desc_StaticBuffer(srcPath.size, 1);
cmdbuf[13] = (u32) dstPath.data;
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(srcArchive.id)))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(srcArchive)))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x806,5,2); // 0x8060142
cmdbuf[1] = 0;
- cmdbuf[2] = (u32) archive.handle;
- cmdbuf[3] = (u32) (archive.handle >> 32);
+ cmdbuf[2] = (u32) archive;
+ cmdbuf[3] = (u32) (archive >> 32);
cmdbuf[4] = path.type;
cmdbuf[5] = path.size;
cmdbuf[6] = IPC_Desc_StaticBuffer(path.size, 0);
cmdbuf[7] = (u32) path.data;
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive.id)))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive)))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x807,5,2); // 0x8070142
cmdbuf[1] = 0;
- cmdbuf[2] = (u32) archive.handle;
- cmdbuf[3] = (u32) (archive.handle >> 32);
+ cmdbuf[2] = (u32) archive;
+ cmdbuf[3] = (u32) (archive >> 32);
cmdbuf[4] = path.type;
cmdbuf[5] = path.size;
cmdbuf[6] = IPC_Desc_StaticBuffer(path.size, 0);
cmdbuf[7] = (u32) path.data;
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive.id)))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive)))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x808,8,2); // 0x8080202
cmdbuf[1] = 0;
- cmdbuf[2] = (u32) archive.handle;
- cmdbuf[3] = (u32) (archive.handle >> 32);
+ cmdbuf[2] = (u32) archive;
+ cmdbuf[3] = (u32) (archive >> 32);
cmdbuf[4] = path.type;
cmdbuf[5] = path.size;
cmdbuf[6] = attributes;
cmdbuf[10] = (u32) path.data;
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive.id)))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive)))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x809,6,2); // 0x8090182
cmdbuf[1] = 0;
- cmdbuf[2] = (u32) archive.handle;
- cmdbuf[3] = (u32) (archive.handle >> 32);
+ cmdbuf[2] = (u32) archive;
+ cmdbuf[3] = (u32) (archive >> 32);
cmdbuf[4] = path.type;
cmdbuf[5] = path.size;
cmdbuf[6] = attributes;
cmdbuf[8] = (u32) path.data;
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive.id)))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive)))) return ret;
return cmdbuf[1];
}
cmdbuf[0] = IPC_MakeHeader(0x80A,9,4); // 0x80A0244
cmdbuf[1] = 0;
- cmdbuf[2] = (u32) srcArchive.handle;
- cmdbuf[3] = (u32) (srcArchive.handle >> 32);
+ cmdbuf[2] = (u32) srcArchive;
+ cmdbuf[3] = (u32) (srcArchive >> 32);
cmdbuf[4] = srcPath.type;
cmdbuf[5] = srcPath.size;
- cmdbuf[6] = (u32) dstArchive.handle;
- cmdbuf[7] = (u32) (dstArchive.handle >> 32);
+ cmdbuf[6] = (u32) dstArchive;
+ cmdbuf[7] = (u32) (dstArchive >> 32);
cmdbuf[8] = dstPath.type;
cmdbuf[9] = dstPath.size;
cmdbuf[10] = IPC_Desc_StaticBuffer(srcPath.size, 1);
cmdbuf[13] = (u32) dstPath.data;
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(srcArchive.id)))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(srcArchive)))) return ret;
return cmdbuf[1];
}
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x80B,4,2); // 0x80B0102
- cmdbuf[1] = (u32) archive.handle;
- cmdbuf[2] = (u32) (archive.handle >> 32);
+ cmdbuf[1] = (u32) archive;
+ cmdbuf[2] = (u32) (archive >> 32);
cmdbuf[3] = path.type;
cmdbuf[4] = path.size;
cmdbuf[5] = IPC_Desc_StaticBuffer(path.size, 0);
cmdbuf[6] = (u32) path.data;
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive.id)))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive)))) return ret;
if(out) *out = cmdbuf[3];
return cmdbuf[1];
}
-Result FSUSER_OpenArchive(FS_Archive* archive)
+Result FSUSER_OpenArchive(FS_Archive* archive, FS_ArchiveID id, FS_Path path)
{
if(!archive) return -2;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x80C,3,2); // 0x80C00C2
- cmdbuf[1] = archive->id;
- cmdbuf[2] = archive->lowPath.type;
- cmdbuf[3] = archive->lowPath.size;
- cmdbuf[4] = IPC_Desc_StaticBuffer(archive->lowPath.size, 0);
- cmdbuf[5] = (u32) archive->lowPath.data;
+ cmdbuf[1] = id;
+ cmdbuf[2] = path.type;
+ cmdbuf[3] = path.size;
+ cmdbuf[4] = IPC_Desc_StaticBuffer(path.size, 0);
+ cmdbuf[5] = (u32) path.data;
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive->id)))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSession()))) return ret;
- archive->handle = cmdbuf[2] | ((u64) cmdbuf[3] << 32);
+ if(archive) *archive = cmdbuf[2] | ((u64) cmdbuf[3] << 32);
return cmdbuf[1];
}
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x80D,5,4); // 0x80D0144
- cmdbuf[1] = (u32) archive.handle;
- cmdbuf[2] = (u32) (archive.handle >> 32);
+ cmdbuf[1] = (u32) archive;
+ cmdbuf[2] = (u32) (archive >> 32);
cmdbuf[3] = action;
cmdbuf[4] = inputSize;
cmdbuf[5] = outputSize;
cmdbuf[9] = (u32) output;
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive.id)))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive)))) return ret;
return cmdbuf[1];
}
-Result FSUSER_CloseArchive(FS_Archive* archive)
+Result FSUSER_CloseArchive(FS_Archive archive)
{
if(!archive) return -2;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x80E,2,0); // 0x80E0080
- cmdbuf[1] = (u32) archive->handle;
- cmdbuf[2] = (u32) (archive->handle >> 32);
+ cmdbuf[1] = (u32) archive;
+ cmdbuf[2] = (u32) (archive >> 32);
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive->id)))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive)))) return ret;
return cmdbuf[1];
}
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x812,2,0); // 0x8120080
- cmdbuf[1] = (u32) archive.handle;
- cmdbuf[2] = (u32) (archive.handle >> 32);
+ cmdbuf[1] = (u32) archive;
+ cmdbuf[2] = (u32) (archive >> 32);
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive.id)))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive)))) return ret;
if(freeBytes) *freeBytes = cmdbuf[2] | ((u64) cmdbuf[3] << 32);
cmdbuf[0] = IPC_MakeHeader(0x814,0,0); // 0x8140000
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(ARCHIVE_SDMC)))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSession()))) return ret;
if(archiveResource) memcpy(archiveResource, &cmdbuf[2], sizeof(FS_ArchiveResource));
cmdbuf[5] = (u32) path.data;
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archiveId)))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSession()))) return ret;
if(totalSize) *totalSize = cmdbuf[2];
if(directories) *directories = cmdbuf[3];
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x85A,3,0); // 0x85A00C0
- cmdbuf[1] = (u32) archive.handle;
- cmdbuf[2] = (u32) (archive.handle >> 32);
+ cmdbuf[1] = (u32) archive;
+ cmdbuf[2] = (u32) (archive >> 32);
cmdbuf[3] = priority;
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSession()))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive)))) return ret;
return cmdbuf[1];
}
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x85B,2,0); // 0x85B0080
- cmdbuf[1] = (u32) archive.handle;
- cmdbuf[2] = (u32) (archive.handle >> 32);
+ cmdbuf[1] = (u32) archive;
+ cmdbuf[2] = (u32) (archive >> 32);
Result ret = 0;
- if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive.id)))) return ret;
+ if(R_FAILED(ret = svcSendSyncRequest(fsSessionForArchive(archive)))) return ret;
if(priority) *priority = cmdbuf[2];