mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-01 14:58:14 +00:00
Claude's new sceReg functions
This commit is contained in:
1 parent
34454f9d03
commit
606c233ee1
1 file changed
+81
-2
+81
-2
@@ -1143,6 +1143,10 @@ int sceRegGetKeys(int catHandle, u32 bufAddr, int num) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sceRegGetKeyInfo(int catHandle, const char *name, u32 outKeyHandleAddr, u32 outTypeAddr, u32 outSizeAddr) {
|
int sceRegGetKeyInfo(int catHandle, const char *name, u32 outKeyHandleAddr, u32 outTypeAddr, u32 outSizeAddr) {
|
||||||
|
if (!name) {
|
||||||
|
return hleLogError(Log::sceReg, -1, "Invalid name pointer");
|
||||||
|
}
|
||||||
|
|
||||||
auto iter = g_openCategories.find(catHandle);
|
auto iter = g_openCategories.find(catHandle);
|
||||||
if (iter == g_openCategories.end()) {
|
if (iter == g_openCategories.end()) {
|
||||||
return hleLogError(Log::sceReg, 0, "Not found");
|
return hleLogError(Log::sceReg, 0, "Not found");
|
||||||
@@ -1185,7 +1189,42 @@ int sceRegGetKeyInfo(int catHandle, const char *name, u32 outKeyHandleAddr, u32
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sceRegGetKeyInfoByName(int catHandle, const char *name, u32 typeAddr, u32 sizeAddr) {
|
int sceRegGetKeyInfoByName(int catHandle, const char *name, u32 typeAddr, u32 sizeAddr) {
|
||||||
return hleLogError(Log::sceReg, 0);
|
if (!name) {
|
||||||
|
return hleLogError(Log::sceReg, -1, "Invalid name pointer");
|
||||||
|
}
|
||||||
|
|
||||||
|
auto iter = g_openCategories.find(catHandle);
|
||||||
|
if (iter == g_openCategories.end()) {
|
||||||
|
return hleLogError(Log::sceReg, 0, "Not an open category");
|
||||||
|
}
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
const KeyValue *keyvals = LookupCategory(iter->second.path, &count);
|
||||||
|
if (!keyvals) {
|
||||||
|
return hleLogWarning(Log::sceReg, SCE_REG_ERROR_CATEGORY_NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
if (equals(keyvals[i].name, name)) {
|
||||||
|
int size = 0;
|
||||||
|
if (Memory::IsValid4AlignedAddress(typeAddr)) {
|
||||||
|
Memory::WriteUnchecked_U32((int)keyvals[i].type, typeAddr);
|
||||||
|
}
|
||||||
|
if (Memory::IsValid4AlignedAddress(sizeAddr)) {
|
||||||
|
switch (keyvals[i].type) {
|
||||||
|
case ValueType::BIN: size = (int)keyvals[i].intValue; break;
|
||||||
|
case ValueType::STR: size = (int)keyvals[i].intValue; break;
|
||||||
|
case ValueType::DIR: size = 0; break;
|
||||||
|
case ValueType::INT: size = 4; break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
Memory::WriteUnchecked_U32(size, sizeAddr);
|
||||||
|
}
|
||||||
|
return hleLogInfo(Log::sceReg, 0, "type: %d size: %d", (int)keyvals[i].type, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return hleLogWarning(Log::sceReg, -1, "key with name '%s' not found", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
int sceRegGetKeyValue(int catHandle, int keyHandle, u32 bufAddr, u32 size) {
|
int sceRegGetKeyValue(int catHandle, int keyHandle, u32 bufAddr, u32 size) {
|
||||||
@@ -1228,7 +1267,47 @@ int sceRegGetKeyValue(int catHandle, int keyHandle, u32 bufAddr, u32 size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int sceRegGetKeyValueByName(int catHandle, const char *name, u32 bufAddr, u32 size) {
|
int sceRegGetKeyValueByName(int catHandle, const char *name, u32 bufAddr, u32 size) {
|
||||||
return hleLogError(Log::sceReg, 0);
|
if (!name) {
|
||||||
|
return hleLogError(Log::sceReg, -1, "Invalid name pointer");
|
||||||
|
}
|
||||||
|
if (!Memory::IsValidRange(bufAddr, size)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto iter = g_openCategories.find(catHandle);
|
||||||
|
if (iter == g_openCategories.end()) {
|
||||||
|
return hleLogError(Log::sceReg, 0, "Not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
const KeyValue *keyvals = LookupCategory(iter->second.path, &count);
|
||||||
|
if (!keyvals) {
|
||||||
|
return hleLogWarning(Log::sceReg, SCE_REG_ERROR_CATEGORY_NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
if (!equals(keyvals[i].name, name))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
const KeyValue &keyval = keyvals[i];
|
||||||
|
switch (keyval.type) {
|
||||||
|
case ValueType::BIN:
|
||||||
|
Memory::MemcpyUnchecked(bufAddr, keyval.strValue, std::min(size, (u32)keyval.intValue));
|
||||||
|
return hleLogInfo(Log::sceReg, 0);
|
||||||
|
case ValueType::STR:
|
||||||
|
Memory::MemcpyUnchecked(bufAddr, keyval.strValue, std::min(size, (u32)keyval.intValue));
|
||||||
|
return hleLogInfo(Log::sceReg, 0, "value: '%s'", keyval.strValue);
|
||||||
|
case ValueType::INT:
|
||||||
|
Memory::WriteUnchecked_U32(keyval.intValue, bufAddr);
|
||||||
|
return hleLogInfo(Log::sceReg, 0, "value: %d (0x%08x)", keyval.intValue, keyval.intValue);
|
||||||
|
case ValueType::DIR:
|
||||||
|
case ValueType::FAIL:
|
||||||
|
default:
|
||||||
|
return hleLogWarning(Log::sceReg, 0, "Unexpected type for sceRegGetKeyValueByName");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return hleLogWarning(Log::sceReg, -1, "key with name '%s' not found", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
int sceRegSetKeyValue(int catHandle, const char *name, u32 bufAddr, u32 size) {
|
int sceRegSetKeyValue(int catHandle, const char *name, u32 bufAddr, u32 size) {
|
||||||
|
|||||||
Reference in new issue
Block a user