Merge pull request #1974 from RadWolfie/symbolscan-fix
Fix Symbol Scan's Kernel Thunk Bug
This commit is contained in:
commit
8a1e4b1beb
|
@ -192,10 +192,7 @@ void CDECL EmuOutputMessage(xb_output_message mFlag,
|
||||||
}
|
}
|
||||||
case XB_OUTPUT_MESSAGE_DEBUG:
|
case XB_OUTPUT_MESSAGE_DEBUG:
|
||||||
default: {
|
default: {
|
||||||
#ifdef _DEBUG_TRACE
|
EmuLog(LOG_LEVEL::DEBUG, "%s", message);
|
||||||
printf("%s\n", message);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -390,7 +387,7 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
|
||||||
std::stringstream sstream;
|
std::stringstream sstream;
|
||||||
char tAsciiTitle[40] = "Unknown";
|
char tAsciiTitle[40] = "Unknown";
|
||||||
std::setlocale(LC_ALL, "English");
|
std::setlocale(LC_ALL, "English");
|
||||||
std::wcstombs(tAsciiTitle, g_pCertificate->wszTitleName, sizeof(tAsciiTitle));
|
std::wcstombs(tAsciiTitle, CxbxKrnl_Xbe->m_Certificate.wszTitleName, sizeof(tAsciiTitle));
|
||||||
std::string szTitleName(tAsciiTitle);
|
std::string szTitleName(tAsciiTitle);
|
||||||
CxbxKrnl_Xbe->PurgeBadChar(szTitleName);
|
CxbxKrnl_Xbe->PurgeBadChar(szTitleName);
|
||||||
sstream << cachePath << szTitleName << "-" << std::hex << uiHash << ".ini";
|
sstream << cachePath << szTitleName << "-" << std::hex << uiHash << ".ini";
|
||||||
|
@ -513,9 +510,9 @@ void EmuHLEIntercept(Xbe::Header *pXbeHeader)
|
||||||
|
|
||||||
// Store Certificate Details
|
// Store Certificate Details
|
||||||
symbolCacheData.SetValue(section_certificate, sect_certificate_keys.Name, tAsciiTitle);
|
symbolCacheData.SetValue(section_certificate, sect_certificate_keys.Name, tAsciiTitle);
|
||||||
symbolCacheData.SetValue(section_certificate, sect_certificate_keys.TitleID, FormatTitleId(g_pCertificate->dwTitleId).c_str());
|
symbolCacheData.SetValue(section_certificate, sect_certificate_keys.TitleID, FormatTitleId(CxbxKrnl_Xbe->m_Certificate.dwTitleId).c_str());
|
||||||
symbolCacheData.SetLongValue(section_certificate, sect_certificate_keys.TitleIDHex, g_pCertificate->dwTitleId, nullptr, /*UseHex =*/true);
|
symbolCacheData.SetLongValue(section_certificate, sect_certificate_keys.TitleIDHex, CxbxKrnl_Xbe->m_Certificate.dwTitleId, nullptr, /*UseHex =*/true);
|
||||||
symbolCacheData.SetLongValue(section_certificate, sect_certificate_keys.Region, g_pCertificate->dwGameRegion, nullptr, /*UseHex =*/true);
|
symbolCacheData.SetLongValue(section_certificate, sect_certificate_keys.Region, CxbxKrnl_Xbe->m_Certificate.dwGameRegion, nullptr, /*UseHex =*/true);
|
||||||
|
|
||||||
// Store Library Details
|
// Store Library Details
|
||||||
for (unsigned int i = 0; i < pXbeHeader->dwLibraryVersions; i++) {
|
for (unsigned int i = 0; i < pXbeHeader->dwLibraryVersions; i++) {
|
||||||
|
|
|
@ -1149,18 +1149,6 @@ void CxbxKrnlEmulate(unsigned int reserved_systems, blocks_reserved_t blocks_res
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Decode kernel thunk table address :
|
|
||||||
uint32_t kt = CxbxKrnl_Xbe->m_Header.dwKernelImageThunkAddr;
|
|
||||||
kt ^= XOR_KT_KEY[to_underlying(xbeType)];
|
|
||||||
|
|
||||||
// Process the Kernel thunk table to map Kernel function calls to their actual address :
|
|
||||||
MapThunkTable((uint32_t*)kt, CxbxKrnl_KernelThunkTable);
|
|
||||||
|
|
||||||
// Does this xbe import any other libraries?
|
|
||||||
if (CxbxKrnl_Xbe->m_Header.dwNonKernelImportDirAddr) {
|
|
||||||
ImportLibraries((XbeImportEntry*)CxbxKrnl_Xbe->m_Header.dwNonKernelImportDirAddr);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_ExceptionManager = new ExceptionManager(); // If in need to add VEHs, move this line earlier. (just in case)
|
g_ExceptionManager = new ExceptionManager(); // If in need to add VEHs, move this line earlier. (just in case)
|
||||||
|
|
||||||
// Launch the XBE :
|
// Launch the XBE :
|
||||||
|
@ -1170,7 +1158,7 @@ void CxbxKrnlEmulate(unsigned int reserved_systems, blocks_reserved_t blocks_res
|
||||||
void* XbeTlsData = (XbeTls != nullptr) ? (void*)CxbxKrnl_Xbe->m_TLS->dwDataStartAddr : nullptr;
|
void* XbeTlsData = (XbeTls != nullptr) ? (void*)CxbxKrnl_Xbe->m_TLS->dwDataStartAddr : nullptr;
|
||||||
// Decode Entry Point
|
// Decode Entry Point
|
||||||
xbox::addr EntryPoint = CxbxKrnl_Xbe->m_Header.dwEntryAddr;
|
xbox::addr EntryPoint = CxbxKrnl_Xbe->m_Header.dwEntryAddr;
|
||||||
EntryPoint ^= XOR_EP_KEY[to_underlying(xbeType)];
|
EntryPoint ^= XOR_EP_KEY[to_underlying(CxbxKrnl_Xbe->GetXbeType())];
|
||||||
// Launch XBE
|
// Launch XBE
|
||||||
CxbxKrnlInit(
|
CxbxKrnlInit(
|
||||||
XbeTlsData,
|
XbeTlsData,
|
||||||
|
@ -1478,8 +1466,21 @@ __declspec(noreturn) void CxbxKrnlInit
|
||||||
|
|
||||||
CxbxInitAudio();
|
CxbxInitAudio();
|
||||||
|
|
||||||
|
// EmuHLEIntercept must be call before MapThunkTable, otherwise scanning for symbols will not work properly.
|
||||||
EmuHLEIntercept(pXbeHeader);
|
EmuHLEIntercept(pXbeHeader);
|
||||||
|
|
||||||
|
// Decode kernel thunk table address :
|
||||||
|
uint32_t kt = CxbxKrnl_Xbe->m_Header.dwKernelImageThunkAddr;
|
||||||
|
kt ^= XOR_KT_KEY[to_underlying(CxbxKrnl_Xbe->GetXbeType())];
|
||||||
|
|
||||||
|
// Process the Kernel thunk table to map Kernel function calls to their actual address :
|
||||||
|
MapThunkTable((uint32_t *)kt, CxbxKrnl_KernelThunkTable);
|
||||||
|
|
||||||
|
// Does this xbe import any other libraries?
|
||||||
|
if (CxbxKrnl_Xbe->m_Header.dwNonKernelImportDirAddr) {
|
||||||
|
ImportLibraries((XbeImportEntry *)CxbxKrnl_Xbe->m_Header.dwNonKernelImportDirAddr);
|
||||||
|
}
|
||||||
|
|
||||||
if (!bLLE_USB) {
|
if (!bLLE_USB) {
|
||||||
SetupXboxDeviceTypes();
|
SetupXboxDeviceTypes();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue