diff --git a/Core/ELF/PrxDecrypter.cpp b/Core/ELF/PrxDecrypter.cpp index 69aa9681d..b6e7f2f73 100644 --- a/Core/ELF/PrxDecrypter.cpp +++ b/Core/ELF/PrxDecrypter.cpp @@ -382,7 +382,7 @@ static int DecryptPRX1(const u8* pbIn, u8* pbOut, int cbTotal, u32 tag) memcpy(buffer1+0xD0, b00, 0x80); if (pti->codeExtra != 0) ExtraV2Mangle(buffer1+0x10, pti->codeExtra); - memcpy(pbOut+0x40 /* 0x2C+20 */, buffer1+0x40, 0x40); + memcpy(pbOut+0x40, buffer1+0x40, 0x40); int ret; int iXOR; diff --git a/Core/ELF/PrxDecrypter.h b/Core/ELF/PrxDecrypter.h index 19f41dc8a..23cbedbc1 100644 --- a/Core/ELF/PrxDecrypter.h +++ b/Core/ELF/PrxDecrypter.h @@ -32,8 +32,8 @@ typedef struct char modname[28]; // 0A u8 version; // 26 u8 nsegments; // 27 - int elf_size; // 28 - int psp_size; // 2C + u32 elf_size; // 28 + u32 psp_size; // 2C u32 entry; // 30 u32 modinfo_offset; // 34 int bss_size; // 38 diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 46d43637e..e9dd558cc 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -45,27 +45,15 @@ enum { }; static const char *blacklistedModules[] = { - "LIBFONT", - "sc_sascore", - "audiocodec", - "libatrac3plus", - "videocodec", - "mpegbase", - "mpeg", - "psmf", - "pspnet", - "pspnet_adhoc", - "pspnet_adhocctl", - "pspnet_adhoc_matching", - "pspnet_adhoc_download", - "pspnet_apctl", - "pspnet_resolver", - "pspnet_ap_dialog_dummy", - "libparse_uri", - "libparse_http", - "libhttp_rfc", - "libssl", - "libsuppreacc", + "sceATRAC3plus_Library", + "sceFont_Library", + "sceNetAdhocctl_Library", + "sceNetAdhocDownload_Library", + "sceNetAdhocMatching_Library", + "sceNetAdhoc_Library", + "sceNetApctl_Library", + "sceNetInet_Library", + "sceNet_Library", }; struct Module : public KernelObject @@ -216,6 +204,21 @@ Module *__KernelLoadELFFromPtr(const u8 *ptr, u32 loadAddress, std::string *erro else modinfo = (PspModuleInfo *)Memory::GetPointer(reader.GetVaddr() + (reader.GetSegmentPaddr(0) & 0x7FFFFFFF) - reader.GetSegmentOffset(0)); + // Check for module blacklist - we don't allow games to load these modules from disc + // as we have HLE implementations and the originals won't run in the emu because they + // directly access hardware or for other reasons. + for (u32 i = 0; i < ARRAY_SIZE(blacklistedModules); i++) { + if (strcmp(modinfo->name, blacklistedModules[i]) == 0) { + *error_string = "Blacklisted"; + if (newptr) + { + delete [] newptr; + } + kernelObjects.Destroy(module->GetUID()); + return 0; + } + } + bool hasSymbols = false; bool dontadd = false; @@ -335,11 +338,9 @@ Module *__KernelLoadELFFromPtr(const u8 *ptr, u32 loadAddress, std::string *erro INFO_LOG(HLE,"Exporting ent %d named %s, %d funcs, %d vars, resident %08x", m, name, ent->fcount, ent->vcount, ent->resident); - // This appears to return bogus pointers for modules like sceAtrac3Plus (running Puzzle Bobble Pocket, name = sceAtrac3plus) - u32 *residentPtr = (u32*)Memory::GetPointer(ent[m].resident); + u32 *residentPtr = (u32*)Memory::GetPointer(ent->resident); - // TODO: Re-enable when it works - for (u32 j = 0; j < ent[m].fcount; j++) + for (u32 j = 0; j < ent->fcount; j++) { u32 nid = residentPtr[j]; u32 exportAddr = residentPtr[ent->fcount + ent->vcount + j]; @@ -560,47 +561,19 @@ u32 sceKernelLoadModule(const char *name, u32 flags) SceKernelLMOption *lmoption = (SceKernelLMOption *)Memory::GetPointer(PARAM(2)); } - std::string fn(name); - int slashPos = fn.rfind('/'); - if (slashPos != -1) - fn = fn.substr(slashPos + 1); - - // Check for module blacklist - we don't allow games to load these modules from disc - // as we have HLE implementations and the originals won't run in the emu because they - // directly access hardware or for other reasons. - bool blacklisted = false; - std::string guessedModuleName = fn.substr(0, fn.size() - 4); - if (GetModuleIndex(guessedModuleName.c_str()) >= 0) { - blacklisted = true; - } - for (int i = 0; i < ARRAY_SIZE(blacklistedModules); i++) { - if (guessedModuleName == blacklistedModules[i]) { - blacklisted = true; - break; - } - } - Module *module = 0; - if (!blacklisted) { - u8 *temp = new u8[(int)size]; - u32 handle = pspFileSystem.OpenFile(name, FILEACCESS_READ); - pspFileSystem.ReadFile(handle, temp, (size_t)size); - module = __KernelLoadELFFromPtr(temp, 0, &error_string); - delete [] temp; - pspFileSystem.CloseFile(handle); - } + u8 *temp = new u8[(int)size]; + u32 handle = pspFileSystem.OpenFile(name, FILEACCESS_READ); + pspFileSystem.ReadFile(handle, temp, (size_t)size); + module = __KernelLoadELFFromPtr(temp, 0, &error_string); + delete [] temp; + pspFileSystem.CloseFile(handle); if (!module) { - // Lie about successfully loading blacklisted modules. - // Plus: Temporary hack until we have decryption: Lie that we succeeded. Helps compat. - if (error_string == "Executable encrypted - not yet supported" || blacklisted) - { - NOTICE_LOG(LOADER, "Module %s is blacklisted or encrypted - we lie about success", name); - return 1; - } - - ERROR_LOG(LOADER, "Failed to load module %s", name); - return SCE_KERNEL_ERROR_ILLEGAL_OBJECT; + // Module was blacklisted or couldn't be decrypted, which means it's a kernel module we don't want to run. + // Let's just act as if it worked. + NOTICE_LOG(LOADER, "Module %s is blacklisted or undecryptable - we lie about success", name); + return 1; } if (lmoption) {