mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-04-08 23:25:40 +12:00
Merge pull request #239 from wheremyfoodat/nfc
[FS] AbnegateAccessRight, SetArchivePriority, GetArchiveResource
This commit is contained in:
commit
8f196c393a
3 changed files with 58 additions and 1 deletions
|
@ -251,4 +251,11 @@ public:
|
||||||
virtual std::optional<u32> readFile(FileSession* file, u64 offset, u32 size, u32 dataPointer) = 0;
|
virtual std::optional<u32> readFile(FileSession* file, u64 offset, u32 size, u32 dataPointer) = 0;
|
||||||
|
|
||||||
ArchiveBase(Memory& mem) : mem(mem) {}
|
ArchiveBase(Memory& mem) : mem(mem) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ArchiveResource {
|
||||||
|
u32 sectorSize; // Size of a sector in bytes
|
||||||
|
u32 clusterSize; // Size of a cluster in bytes
|
||||||
|
u32 partitionCapacityInClusters;
|
||||||
|
u32 freeSpaceInClusters;
|
||||||
};
|
};
|
|
@ -41,6 +41,7 @@ class FSService {
|
||||||
FSPath readPath(u32 type, u32 pointer, u32 size);
|
FSPath readPath(u32 type, u32 pointer, u32 size);
|
||||||
|
|
||||||
// Service commands
|
// Service commands
|
||||||
|
void abnegateAccessRight(u32 messagePointer);
|
||||||
void createDirectory(u32 messagePointer);
|
void createDirectory(u32 messagePointer);
|
||||||
void createExtSaveData(u32 messagePointer);
|
void createExtSaveData(u32 messagePointer);
|
||||||
void createFile(u32 messagePointer);
|
void createFile(u32 messagePointer);
|
||||||
|
@ -50,12 +51,12 @@ class FSService {
|
||||||
void deleteFile(u32 messagePointer);
|
void deleteFile(u32 messagePointer);
|
||||||
void formatSaveData(u32 messagePointer);
|
void formatSaveData(u32 messagePointer);
|
||||||
void formatThisUserSaveData(u32 messagePointer);
|
void formatThisUserSaveData(u32 messagePointer);
|
||||||
|
void getArchiveResource(u32 messagePointer);
|
||||||
void getFreeBytes(u32 messagePointer);
|
void getFreeBytes(u32 messagePointer);
|
||||||
void getFormatInfo(u32 messagePointer);
|
void getFormatInfo(u32 messagePointer);
|
||||||
void getPriority(u32 messagePointer);
|
void getPriority(u32 messagePointer);
|
||||||
void getThisSaveDataSecureValue(u32 messagePointer);
|
void getThisSaveDataSecureValue(u32 messagePointer);
|
||||||
void theGameboyVCFunction(u32 messagePointer);
|
void theGameboyVCFunction(u32 messagePointer);
|
||||||
|
|
||||||
void initialize(u32 messagePointer);
|
void initialize(u32 messagePointer);
|
||||||
void initializeWithSdkVersion(u32 messagePointer);
|
void initializeWithSdkVersion(u32 messagePointer);
|
||||||
void isSdmcDetected(u32 messagePointer);
|
void isSdmcDetected(u32 messagePointer);
|
||||||
|
@ -64,6 +65,7 @@ class FSService {
|
||||||
void openDirectory(u32 messagePointer);
|
void openDirectory(u32 messagePointer);
|
||||||
void openFile(u32 messagePointer);
|
void openFile(u32 messagePointer);
|
||||||
void openFileDirectly(u32 messagePointer);
|
void openFileDirectly(u32 messagePointer);
|
||||||
|
void setArchivePriority(u32 messagePointer);
|
||||||
void setPriority(u32 messagePointer);
|
void setPriority(u32 messagePointer);
|
||||||
|
|
||||||
// Used for set/get priority: Not sure what sort of priority this is referring to
|
// Used for set/get priority: Not sure what sort of priority this is referring to
|
||||||
|
|
|
@ -25,10 +25,13 @@ namespace FSCommands {
|
||||||
GetFreeBytes = 0x08120080,
|
GetFreeBytes = 0x08120080,
|
||||||
IsSdmcDetected = 0x08170000,
|
IsSdmcDetected = 0x08170000,
|
||||||
IsSdmcWritable = 0x08180000,
|
IsSdmcWritable = 0x08180000,
|
||||||
|
AbnegateAccessRight = 0x08400040,
|
||||||
GetFormatInfo = 0x084500C2,
|
GetFormatInfo = 0x084500C2,
|
||||||
|
GetArchiveResource = 0x08490040,
|
||||||
FormatSaveData = 0x084C0242,
|
FormatSaveData = 0x084C0242,
|
||||||
CreateExtSaveData = 0x08510242,
|
CreateExtSaveData = 0x08510242,
|
||||||
DeleteExtSaveData = 0x08520100,
|
DeleteExtSaveData = 0x08520100,
|
||||||
|
SetArchivePriority = 0x085A00C0,
|
||||||
InitializeWithSdkVersion = 0x08610042,
|
InitializeWithSdkVersion = 0x08610042,
|
||||||
SetPriority = 0x08620040,
|
SetPriority = 0x08620040,
|
||||||
GetPriority = 0x08630000,
|
GetPriority = 0x08630000,
|
||||||
|
@ -158,6 +161,7 @@ void FSService::handleSyncRequest(u32 messagePointer) {
|
||||||
case FSCommands::DeleteFile: deleteFile(messagePointer); break;
|
case FSCommands::DeleteFile: deleteFile(messagePointer); break;
|
||||||
case FSCommands::FormatSaveData: formatSaveData(messagePointer); break;
|
case FSCommands::FormatSaveData: formatSaveData(messagePointer); break;
|
||||||
case FSCommands::FormatThisUserSaveData: formatThisUserSaveData(messagePointer); break;
|
case FSCommands::FormatThisUserSaveData: formatThisUserSaveData(messagePointer); break;
|
||||||
|
case FSCommands::GetArchiveResource: getArchiveResource(messagePointer); break;
|
||||||
case FSCommands::GetFreeBytes: getFreeBytes(messagePointer); break;
|
case FSCommands::GetFreeBytes: getFreeBytes(messagePointer); break;
|
||||||
case FSCommands::GetFormatInfo: getFormatInfo(messagePointer); break;
|
case FSCommands::GetFormatInfo: getFormatInfo(messagePointer); break;
|
||||||
case FSCommands::GetPriority: getPriority(messagePointer); break;
|
case FSCommands::GetPriority: getPriority(messagePointer); break;
|
||||||
|
@ -170,7 +174,9 @@ void FSService::handleSyncRequest(u32 messagePointer) {
|
||||||
case FSCommands::OpenDirectory: openDirectory(messagePointer); break;
|
case FSCommands::OpenDirectory: openDirectory(messagePointer); break;
|
||||||
case FSCommands::OpenFile: [[likely]] openFile(messagePointer); break;
|
case FSCommands::OpenFile: [[likely]] openFile(messagePointer); break;
|
||||||
case FSCommands::OpenFileDirectly: [[likely]] openFileDirectly(messagePointer); break;
|
case FSCommands::OpenFileDirectly: [[likely]] openFileDirectly(messagePointer); break;
|
||||||
|
case FSCommands::SetArchivePriority: setArchivePriority(messagePointer); break;
|
||||||
case FSCommands::SetPriority: setPriority(messagePointer); break;
|
case FSCommands::SetPriority: setPriority(messagePointer); break;
|
||||||
|
case FSCommands::AbnegateAccessRight: abnegateAccessRight(messagePointer); break;
|
||||||
case FSCommands::TheGameboyVCFunction: theGameboyVCFunction(messagePointer); break;
|
case FSCommands::TheGameboyVCFunction: theGameboyVCFunction(messagePointer); break;
|
||||||
default: Helpers::panic("FS service requested. Command: %08X\n", command);
|
default: Helpers::panic("FS service requested. Command: %08X\n", command);
|
||||||
}
|
}
|
||||||
|
@ -579,6 +585,36 @@ void FSService::getPriority(u32 messagePointer) {
|
||||||
mem.write32(messagePointer + 8, priority);
|
mem.write32(messagePointer + 8, priority);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FSService::getArchiveResource(u32 messagePointer) {
|
||||||
|
const u32 mediaType = mem.read32(messagePointer + 4);
|
||||||
|
log("FS::GetArchiveResource (media type = %d) (stubbed)\n");
|
||||||
|
|
||||||
|
// For the time being, return the same stubbed archive resource for every media type
|
||||||
|
static constexpr ArchiveResource resource = {
|
||||||
|
.sectorSize = 512,
|
||||||
|
.clusterSize = 16_KB,
|
||||||
|
.partitionCapacityInClusters = 0x80000, // 0x80000 * 16 KB = 8GB
|
||||||
|
.freeSpaceInClusters = 0x80000, // Same here
|
||||||
|
};
|
||||||
|
|
||||||
|
mem.write32(messagePointer, IPC::responseHeader(0x849, 5, 0));
|
||||||
|
mem.write32(messagePointer + 4, Result::Success);
|
||||||
|
|
||||||
|
mem.write32(messagePointer + 8, resource.sectorSize);
|
||||||
|
mem.write32(messagePointer + 12, resource.clusterSize);
|
||||||
|
mem.write32(messagePointer + 16, resource.partitionCapacityInClusters);
|
||||||
|
mem.write32(messagePointer + 20, resource.freeSpaceInClusters);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FSService::setArchivePriority(u32 messagePointer) {
|
||||||
|
Handle archive = mem.read64(messagePointer + 4);
|
||||||
|
const u32 value = mem.read32(messagePointer + 12);
|
||||||
|
log("FS::SetArchivePriority (priority = %d, archive handle = %X)\n", value, handle);
|
||||||
|
|
||||||
|
mem.write32(messagePointer, IPC::responseHeader(0x85A, 1, 0));
|
||||||
|
mem.write32(messagePointer + 4, Result::Success);
|
||||||
|
}
|
||||||
|
|
||||||
void FSService::setPriority(u32 messagePointer) {
|
void FSService::setPriority(u32 messagePointer) {
|
||||||
const u32 value = mem.read32(messagePointer + 4);
|
const u32 value = mem.read32(messagePointer + 4);
|
||||||
log("FS::SetPriority (priority = %d)\n", value);
|
log("FS::SetPriority (priority = %d)\n", value);
|
||||||
|
@ -588,6 +624,18 @@ void FSService::setPriority(u32 messagePointer) {
|
||||||
priority = value;
|
priority = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FSService::abnegateAccessRight(u32 messagePointer) {
|
||||||
|
const u32 right = mem.read32(messagePointer + 4);
|
||||||
|
log("FS::AbnegateAccessRight (right = %d)\n", right);
|
||||||
|
|
||||||
|
if (right >= 0x38) {
|
||||||
|
Helpers::warn("FS::AbnegateAccessRight: Invalid access right");
|
||||||
|
}
|
||||||
|
|
||||||
|
mem.write32(messagePointer, IPC::responseHeader(0x840, 1, 0));
|
||||||
|
mem.write32(messagePointer + 4, Result::Success);
|
||||||
|
}
|
||||||
|
|
||||||
void FSService::getThisSaveDataSecureValue(u32 messagePointer) {
|
void FSService::getThisSaveDataSecureValue(u32 messagePointer) {
|
||||||
Helpers::warn("Unimplemented FS::GetThisSaveDataSecureValue");
|
Helpers::warn("Unimplemented FS::GetThisSaveDataSecureValue");
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue