diff --git a/XenonRecomp/recompiler.cpp b/XenonRecomp/recompiler.cpp index fa915279..2ccea2e0 100644 --- a/XenonRecomp/recompiler.cpp +++ b/XenonRecomp/recompiler.cpp @@ -438,7 +438,7 @@ bool Recompiler::Recompile( auto printMidAsmHook = [&]() { bool returnsBool = midAsmHook->second.returnOnFalse || midAsmHook->second.returnOnTrue || - midAsmHook->second.jumpAddressOnFalse != NULL || midAsmHook->second.jumpAddressOnTrue != NULL; + midAsmHook->second.jumpAddressOnFalse != 0 || midAsmHook->second.jumpAddressOnTrue != 0; print("\t"); if (returnsBool) @@ -489,7 +489,7 @@ bool Recompiler::Recompile( if (midAsmHook->second.returnOnTrue) println("\t\treturn;"); - else if (midAsmHook->second.jumpAddressOnTrue != NULL) + else if (midAsmHook->second.jumpAddressOnTrue != 0) println("\t\tgoto loc_{:X};", midAsmHook->second.jumpAddressOnTrue); println("\t}}"); @@ -498,7 +498,7 @@ bool Recompiler::Recompile( if (midAsmHook->second.returnOnFalse) println("\t\treturn;"); - else if (midAsmHook->second.jumpAddressOnFalse != NULL) + else if (midAsmHook->second.jumpAddressOnFalse != 0) println("\t\tgoto loc_{:X};", midAsmHook->second.jumpAddressOnFalse); println("\t}}"); @@ -509,7 +509,7 @@ bool Recompiler::Recompile( if (midAsmHook->second.ret) println("\treturn;"); - else if (midAsmHook->second.jumpAddress != NULL) + else if (midAsmHook->second.jumpAddress != 0) println("\tgoto loc_{:X};", midAsmHook->second.jumpAddress); } }; @@ -2314,7 +2314,7 @@ bool Recompiler::Recompile(const Function& fn) if (midAsmHook != config.midAsmHooks.end()) { if (midAsmHook->second.returnOnFalse || midAsmHook->second.returnOnTrue || - midAsmHook->second.jumpAddressOnFalse != NULL || midAsmHook->second.jumpAddressOnTrue != NULL) + midAsmHook->second.jumpAddressOnFalse != 0 || midAsmHook->second.jumpAddressOnTrue != 0) { print("extern bool "); } @@ -2361,11 +2361,11 @@ bool Recompiler::Recompile(const Function& fn) println(");\n"); - if (midAsmHook->second.jumpAddress != NULL) + if (midAsmHook->second.jumpAddress != 0) labels.emplace(midAsmHook->second.jumpAddress); - if (midAsmHook->second.jumpAddressOnTrue != NULL) + if (midAsmHook->second.jumpAddressOnTrue != 0) labels.emplace(midAsmHook->second.jumpAddressOnTrue); - if (midAsmHook->second.jumpAddressOnFalse != NULL) + if (midAsmHook->second.jumpAddressOnFalse != 0) labels.emplace(midAsmHook->second.jumpAddressOnFalse); } } diff --git a/XenonRecomp/recompiler_config.cpp b/XenonRecomp/recompiler_config.cpp index 81330a47..5fb35a3e 100644 --- a/XenonRecomp/recompiler_config.cpp +++ b/XenonRecomp/recompiler_config.cpp @@ -115,16 +115,16 @@ void RecompilerConfig::Load(const std::string_view& configFilePath) midAsmHook.jumpAddressOnTrue = table["jump_address_on_true"].value_or(0u); midAsmHook.jumpAddressOnFalse = table["jump_address_on_false"].value_or(0u); - if ((midAsmHook.ret && midAsmHook.jumpAddress != NULL) || - (midAsmHook.returnOnTrue && midAsmHook.jumpAddressOnTrue != NULL) || - (midAsmHook.returnOnFalse && midAsmHook.jumpAddressOnFalse != NULL)) + if ((midAsmHook.ret && midAsmHook.jumpAddress != 0) || + (midAsmHook.returnOnTrue && midAsmHook.jumpAddressOnTrue != 0) || + (midAsmHook.returnOnFalse && midAsmHook.jumpAddressOnFalse != 0)) { fmt::println("{}: can't return and jump at the same time", midAsmHook.name); } - if ((midAsmHook.ret || midAsmHook.jumpAddress != NULL) && - (midAsmHook.returnOnFalse != NULL || midAsmHook.returnOnTrue != NULL || - midAsmHook.jumpAddressOnFalse != NULL || midAsmHook.jumpAddressOnTrue != NULL)) + if ((midAsmHook.ret || midAsmHook.jumpAddress != 0) && + (midAsmHook.returnOnFalse != 0 || midAsmHook.returnOnTrue != 0 || + midAsmHook.jumpAddressOnFalse != 0 || midAsmHook.jumpAddressOnTrue != 0)) { fmt::println("{}: can't mix direct and conditional return/jump", midAsmHook.name); } diff --git a/XenonUtils/image.h b/XenonUtils/image.h index be611195..df5d2f3d 100644 --- a/XenonUtils/image.h +++ b/XenonUtils/image.h @@ -11,6 +11,9 @@ struct Image size_t base{}; uint32_t size{}; + uint32_t resource_offset{}; + uint32_t resource_size{}; + size_t entry_point{}; std::set sections{}; SymbolTable symbols{}; diff --git a/XenonUtils/xbox.h b/XenonUtils/xbox.h index 0361b0f4..226e9f43 100644 --- a/XenonUtils/xbox.h +++ b/XenonUtils/xbox.h @@ -93,6 +93,32 @@ struct be set(v); return *this; } + + be& operator++ () + { + set(get() + 1); + return *this; + } + + be operator++ (int) + { + be old = *this; + set(get() + 1); + return old; + } + + be& operator-- () + { + set(get() - 1); + return *this; + } + + be operator-- (int) + { + be old = *this; + set(get() - 1); + return old; + } }; extern "C" void* MmGetHostAddress(uint32_t ptr); @@ -198,13 +224,12 @@ typedef struct _XDISPATCHER_HEADER XLIST_ENTRY WaitListHead; } XDISPATCHER_HEADER, * XPDISPATCHER_HEADER; -// These variables are never accessed in guest code, we can safely use them in little endian typedef struct _XRTL_CRITICAL_SECTION { XDISPATCHER_HEADER Header; - int32_t LockCount; - int32_t RecursionCount; - uint32_t OwningThread; + be LockCount; + be RecursionCount; + be OwningThread; } XRTL_CRITICAL_SECTION; typedef struct _XANSI_STRING { diff --git a/XenonUtils/xex.cpp b/XenonUtils/xex.cpp index 4e79042f..4e0b28b6 100644 --- a/XenonUtils/xex.cpp +++ b/XenonUtils/xex.cpp @@ -258,7 +258,7 @@ Image Xex2LoadImage(const uint8_t* data, size_t dataSize) } image.data = std::move(result); - image.size = security->imageSize; + image.size = imageSize; // Map image const auto* dosHeader = reinterpret_cast(image.data.get()); @@ -270,6 +270,13 @@ Image Xex2LoadImage(const uint8_t* data, size_t dataSize) { image.base = *reinterpret_cast*>(xex2BaseAddressPtr); } + const void* xex2ResourceInfoPtr = getOptHeaderPtr(data, XEX_HEADER_RESOURCE_INFO); + if (xex2ResourceInfoPtr != nullptr) + { + const Xex2ResourceInfo* resourceInfo = reinterpret_cast(xex2ResourceInfoPtr); + image.resource_offset = resourceInfo->offset; + image.resource_size = resourceInfo->sizeOfData; + } const void* xex2EntryPointPtr = getOptHeaderPtr(data, XEX_HEADER_ENTRY_POINT); if (xex2EntryPointPtr != nullptr) {