├── AdjustTheFov ├── FovAdjust.asm ├── AdjustTheFov.vcxproj.filters ├── DllMain.cpp └── AdjustTheFov.vcxproj ├── DisableRuneLoss ├── DllMain.cpp ├── DisableRuneLoss.vcxproj.filters ├── DisableRuneLoss.vcxproj └── documentation.txt ├── UltrawideFix ├── DllMain.cpp ├── UltrawideFix.vcxproj.filters └── UltrawideFix.vcxproj ├── RemoveVignette ├── DllMain.cpp ├── RemoveVignette.vcxproj.filters ├── RemoveVignette.vcxproj └── documentation.txt ├── RemoveChromaticAberration ├── DllMain.cpp ├── RemoveChromaticAberration.vcxproj.filters └── RemoveChromaticAberration.vcxproj ├── IncreaseAnimationDistance ├── DllMain.cpp ├── IncreaseAnimationDistance.vcxproj.filters ├── IncreaseAnimationDistance.vcxproj └── documentation.txt ├── CameraFix ├── CameraFix.vcxproj.filters ├── DllMain.cpp └── CameraFix.vcxproj ├── SkipTheIntro ├── SkipTheIntro.vcxproj.filters ├── DllMain.cpp ├── SkipTheIntro.vcxproj └── documentation.txt ├── UnlockTheFps ├── UnlockTheFps.vcxproj.filters ├── DllMain.cpp └── UnlockTheFps.vcxproj ├── LICENSE ├── PauseTheGame ├── PauseTheGame.vcxproj.filters ├── InputTranslation.h ├── PauseTheGame.vcxproj └── DllMain.cpp ├── README.md ├── EldenRingMods.sln ├── .gitignore ├── ModUtils.h └── ini.h /AdjustTheFov/FovAdjust.asm: -------------------------------------------------------------------------------- 1 | .data 2 | extern fov : xmmword 3 | extern returnAddress : qword 4 | extern resolvedRelativeAddress : qword 5 | 6 | .code 7 | FovAdjust proc 8 | repeat 9 9 | nop 10 | endm 11 | call [resolvedRelativeAddress] 12 | movaps xmm0,xmmword ptr [fov] 13 | jmp qword ptr [returnAddress] 14 | FovAdjust endp 15 | end -------------------------------------------------------------------------------- /DisableRuneLoss/DllMain.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "ModUtils.h" 4 | 5 | using namespace ModUtils; 6 | 7 | DWORD WINAPI MainThread(LPVOID lpParam) 8 | { 9 | Log("Activating DisableRuneLoss..."); 10 | std::string aob = "b0 01 ? 8b ? e8 ? ? ? ? ? 8b ? ? ? 32 c0 ? 83 ? 28 c3"; 11 | std::string expectedBytes = "e8"; 12 | std::string newBytes = "90 90 90 90 90"; 13 | uintptr_t patchAddress = AobScan(aob); 14 | size_t offset = 5; 15 | 16 | if (patchAddress != 0) 17 | { 18 | patchAddress += offset; 19 | ReplaceExpectedBytesAtAddress(patchAddress, expectedBytes, newBytes); 20 | } 21 | CloseLog(); 22 | return 0; 23 | } 24 | 25 | BOOL WINAPI DllMain(HINSTANCE module, DWORD reason, LPVOID) 26 | { 27 | if (reason == DLL_PROCESS_ATTACH) 28 | { 29 | DisableThreadLibraryCalls(module); 30 | CreateThread(0, 0, &MainThread, 0, 0, NULL); 31 | } 32 | return 1; 33 | } -------------------------------------------------------------------------------- /UltrawideFix/DllMain.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "ModUtils.h" 4 | 5 | using namespace ModUtils; 6 | 7 | DWORD WINAPI MainThread(LPVOID lpParam) 8 | { 9 | Log("Activating ultrawide fix..."); 10 | std::string aob = "48 c7 45 b8 fe ff ff ff 48 89 58 10 48 89 70 18 48 89 78 20 0f 29 70 c8 48 8b"; 11 | std::string expectedBytes = "74"; 12 | std::string newBytes = "eb"; 13 | uintptr_t patchAddress = AobScan(aob); 14 | size_t offset = 0x94; 15 | if (patchAddress != 0) 16 | { 17 | patchAddress += offset; 18 | ReplaceExpectedBytesAtAddress(patchAddress, expectedBytes, newBytes); 19 | } 20 | CloseLog(); 21 | return 0; 22 | } 23 | 24 | BOOL WINAPI DllMain(HINSTANCE module, DWORD reason, LPVOID) 25 | { 26 | if (reason == DLL_PROCESS_ATTACH) 27 | { 28 | DisableThreadLibraryCalls(module); 29 | CreateThread(0, 0, &MainThread, 0, 0, NULL); 30 | } 31 | return 1; 32 | } -------------------------------------------------------------------------------- /RemoveVignette/DllMain.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "ModUtils.h" 4 | 5 | using namespace ModUtils; 6 | 7 | DWORD WINAPI MainThread(LPVOID lpParam) 8 | { 9 | Log("Activating RemoveVignette..."); 10 | std::string aob = "f3 0f 10 ? 50 f3 0f 59 ? ? ? ? ? e8 ? ? ? ? f3 ? 0f 5c ? f3 ? 0f 59 ? ? 8d ? ? a0 00 00 00"; 11 | std::string expectedBytes = "f3 ? 0f 59 ?"; 12 | std::string newBytes = "f3 0f 5c c0 90"; 13 | uintptr_t patchAddress = AobScan(aob); 14 | size_t offset = 0x17; 15 | if (patchAddress != 0) 16 | { 17 | patchAddress += offset; 18 | ReplaceExpectedBytesAtAddress(patchAddress, expectedBytes, newBytes); 19 | } 20 | CloseLog(); 21 | return 0; 22 | } 23 | 24 | BOOL WINAPI DllMain(HINSTANCE module, DWORD reason, LPVOID) 25 | { 26 | if (reason == DLL_PROCESS_ATTACH) 27 | { 28 | DisableThreadLibraryCalls(module); 29 | CreateThread(0, 0, &MainThread, 0, 0, NULL); 30 | } 31 | return 1; 32 | } -------------------------------------------------------------------------------- /RemoveChromaticAberration/DllMain.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "ModUtils.h" 4 | 5 | using namespace ModUtils; 6 | 7 | DWORD WINAPI MainThread(LPVOID lpParam) 8 | { 9 | Log("Activating RemoveChromaticAberration..."); 10 | std::string aob = "0f 11 ? 60 ? 8d ? 80 00 00 00 0f 10 ? a0 00 00 00 0f 11 ? f0 ? 8d ? b0 00 00 00 0f 10 ? 0f 11 ? 0f 10 ? 10"; 11 | std::string expectedBytes = "0f 11 ? ?"; 12 | std::string newBytes = "66 0f ef c9"; 13 | uintptr_t patchAddress = AobScan(aob); 14 | size_t offset = 0x2f; 15 | if (patchAddress != 0) 16 | { 17 | patchAddress += offset; 18 | ReplaceExpectedBytesAtAddress(patchAddress, expectedBytes, newBytes); 19 | } 20 | CloseLog(); 21 | return 0; 22 | } 23 | 24 | BOOL WINAPI DllMain(HINSTANCE module, DWORD reason, LPVOID) 25 | { 26 | if (reason == DLL_PROCESS_ATTACH) 27 | { 28 | DisableThreadLibraryCalls(module); 29 | CreateThread(0, 0, &MainThread, 0, 0, NULL); 30 | } 31 | return 1; 32 | } -------------------------------------------------------------------------------- /IncreaseAnimationDistance/DllMain.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "ModUtils.h" 4 | 5 | using namespace ModUtils; 6 | 7 | DWORD WINAPI MainThread(LPVOID lpParam) 8 | { 9 | Log("Activating IncreaseAnimationDistance..."); 10 | std::string aob = "c7 ? ? ? 01 00 00 00 f3 ? 0f 10 ? ? ? f3 ? 0f 10 ? ? ? f3 0f 59 ? ? ? ? ? ? 0f 28 ? f3 ? 0f 5c ? ? 58"; 11 | std::string expectedBytes = "f3 ? 0f 5e ? ? ?"; 12 | std::string newBytes = "0f 57 c9 90 90 90 90"; 13 | uintptr_t patchAddress = AobScan(aob); 14 | size_t offset = 0x48; 15 | 16 | if (patchAddress != 0) 17 | { 18 | patchAddress += offset; 19 | ReplaceExpectedBytesAtAddress(patchAddress, expectedBytes, newBytes); 20 | } 21 | CloseLog(); 22 | return 0; 23 | } 24 | 25 | BOOL WINAPI DllMain(HINSTANCE module, DWORD reason, LPVOID) 26 | { 27 | if (reason == DLL_PROCESS_ATTACH) 28 | { 29 | DisableThreadLibraryCalls(module); 30 | CreateThread(0, 0, &MainThread, 0, 0, NULL); 31 | } 32 | return 1; 33 | } -------------------------------------------------------------------------------- /CameraFix/CameraFix.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | -------------------------------------------------------------------------------- /SkipTheIntro/SkipTheIntro.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | -------------------------------------------------------------------------------- /UltrawideFix/UltrawideFix.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | -------------------------------------------------------------------------------- /UnlockTheFps/UnlockTheFps.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | -------------------------------------------------------------------------------- /RemoveVignette/RemoveVignette.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | -------------------------------------------------------------------------------- /DisableRuneLoss/DisableRuneLoss.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | -------------------------------------------------------------------------------- /IncreaseAnimationDistance/IncreaseAnimationDistance.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | -------------------------------------------------------------------------------- /RemoveChromaticAberration/RemoveChromaticAberration.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Marius Storvik 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /AdjustTheFov/AdjustTheFov.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | 23 | 24 | Source Files 25 | 26 | 27 | -------------------------------------------------------------------------------- /PauseTheGame/PauseTheGame.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | 23 | 24 | Header Files 25 | 26 | 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EldenRingMods 2 | A collection of mods I've made for Elden Ring. For use with [Elden Mod Loader](https://www.nexusmods.com/eldenring/mods/117). 3 | 4 | ## Mods: 5 | - [Unlock the framerate](https://www.nexusmods.com/eldenring/mods/216) 6 | - [Remove chromatic aberration](https://www.nexusmods.com/eldenring/mods/179) 7 | - [Remove vignette](https://www.nexusmods.com/eldenring/mods/177) 8 | - [Remove black bars](https://www.nexusmods.com/eldenring/mods/175) 9 | - [Fix the camera](https://www.nexusmods.com/eldenring/mods/118) 10 | - [Pause the game](https://www.nexusmods.com/eldenring/mods/43) 11 | - [Adjust the FoV](https://www.nexusmods.com/eldenring/mods/325) 12 | - [Increase animation distance](https://www.nexusmods.com/eldenring/mods/349) 13 | - [Disable rune loss](https://www.nexusmods.com/eldenring/mods/376) 14 | - [Skip the intro](https://www.nexusmods.com/eldenring/mods/421) 15 | 16 | ## Compilation 17 | You will get errors. You have to remove the post-build events for the project(s) you want to build: Project Properties -> Build Events -> Post-Build Event -> Command Line. 18 | 19 | ## Credits 20 | - Thanks to **uberhalit** for his [EldenRingFpsUnlockAndMore](https://github.com/uberhalit/EldenRingFpsUnlockAndMore) code. 21 | - Thanks to **gurrgur** for his compilation of hex edits in this repo: [er-patcher](https://github.com/gurrgur/er-patcher). 22 | - Thanks to **iArtorias** for his [new pausing technique](https://github.com/iArtorias/elden_pause). 23 | - Thanks to **giniyat202** for his [Linux fix](https://github.com/techiew/EldenRingMods/pull/9). 24 | -------------------------------------------------------------------------------- /AdjustTheFov/DllMain.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #include "ModUtils.h" 5 | 6 | using namespace ModUtils; 7 | using namespace mINI; 8 | 9 | extern "C" { 10 | void FovAdjust(); 11 | __m128 fov = _mm_setr_ps(48.0f, 0.0f, 0.0f, 0.0f); 12 | uintptr_t returnAddress = 0; 13 | uintptr_t resolvedRelativeAddress = 0; 14 | } 15 | 16 | void ReadConfig() 17 | { 18 | INIFile config(GetModFolderPath() + "\\config.ini"); 19 | INIStructure ini; 20 | 21 | if (config.read(ini)) 22 | { 23 | fov = _mm_setr_ps(std::stof(ini["fov"].get("value")), 0.0f, 0.0f, 0.0f); 24 | } 25 | else 26 | { 27 | ini["fov"]["value"] = "48"; 28 | config.write(ini, true); 29 | } 30 | 31 | Log("Field of view: ", fov.m128_f32[0]); 32 | } 33 | 34 | DWORD WINAPI MainThread(LPVOID lpParam) 35 | { 36 | Log("Activating AdjustTheFov..."); 37 | std::string aob = "8d ? ? ? ? 0f 28 ? e8 ? ? ? ? 80 ? ? ? ? ? ? ? 0f 28 ? f3 ? 0f 10 ? ? ? ? ? ? 0f 57 ? f3 ? 0f 59"; 38 | uintptr_t hookAddress = AobScan(aob); 39 | size_t offset = 1; 40 | 41 | if (hookAddress != 0) 42 | { 43 | ReadConfig(); 44 | hookAddress -= offset; 45 | size_t size = 9; 46 | MemCopy((uintptr_t)&FovAdjust, hookAddress, size); 47 | returnAddress = hookAddress + 14; 48 | resolvedRelativeAddress = RelativeToAbsoluteAddress(hookAddress + 10); 49 | 50 | Hook(hookAddress, (uintptr_t)&FovAdjust); 51 | } 52 | 53 | CloseLog(); 54 | return 0; 55 | } 56 | 57 | BOOL WINAPI DllMain(HINSTANCE module, DWORD reason, LPVOID) 58 | { 59 | if (reason == DLL_PROCESS_ATTACH) 60 | { 61 | DisableThreadLibraryCalls(module); 62 | CreateThread(0, 0, &MainThread, 0, 0, NULL); 63 | } 64 | return 1; 65 | } -------------------------------------------------------------------------------- /UnlockTheFps/DllMain.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #include "ModUtils.h" 5 | 6 | using namespace ModUtils; 7 | using namespace mINI; 8 | 9 | static float fpsLimit = 300; 10 | 11 | void ReadConfig() 12 | { 13 | INIFile config(GetModFolderPath() + "\\config.ini"); 14 | INIStructure ini; 15 | 16 | if (config.read(ini)) 17 | { 18 | fpsLimit = std::stof(ini["unlockthefps"].get("limit")); 19 | } 20 | else 21 | { 22 | ini["unlockthefps"]["limit"] = "300"; 23 | config.write(ini, true); 24 | } 25 | 26 | Log("FPS limit: ", fpsLimit); 27 | } 28 | 29 | DWORD WINAPI MainThread(LPVOID lpParam) 30 | { 31 | Log("Activating UnlockTheFps..."); 32 | { 33 | ReadConfig(); 34 | 35 | std::string aob = "c7 ? ? 89 88 88 3c eb ? 89 ? 18 eb ? 89 ? 18 c7"; 36 | std::string expectedBytes = "89 88 88 3c"; 37 | std::string newBytes = "90 90 90 90"; 38 | size_t offset = 3; 39 | 40 | float frametime = (1000 / fpsLimit) / 1000; 41 | Log("Frametime: ", frametime); 42 | std::vector frametimeBytes(sizeof(float), 0); 43 | MemCopy((uintptr_t)&frametimeBytes[0], (uintptr_t)&frametime, 4); 44 | newBytes = RawAobToStringAob(frametimeBytes); 45 | 46 | uintptr_t patchAddress = AobScan(aob); 47 | if (patchAddress == 0) 48 | { 49 | return 1; 50 | } 51 | 52 | patchAddress += offset; 53 | if (!ReplaceExpectedBytesAtAddress(patchAddress, expectedBytes, newBytes)) 54 | { 55 | return 1; 56 | } 57 | } 58 | 59 | Log("Removing 60 FPS fullscreen limit..."); 60 | { 61 | std::string aob = "c7 ? ef 3c 00 00 00 c7 ? f3 01 00 00 00"; 62 | std::string expectedBytes = aob; 63 | std::string newBytes = "c7 45 ef 00 00 00 00"; 64 | uintptr_t patchAddress = AobScan(aob); 65 | if (patchAddress != 0) 66 | { 67 | ReplaceExpectedBytesAtAddress(patchAddress, expectedBytes, newBytes); 68 | } 69 | } 70 | 71 | CloseLog(); 72 | return 0; 73 | } 74 | 75 | BOOL WINAPI DllMain(HINSTANCE module, DWORD reason, LPVOID) 76 | { 77 | if (reason == DLL_PROCESS_ATTACH) 78 | { 79 | DisableThreadLibraryCalls(module); 80 | CreateThread(0, 0, &MainThread, 0, 0, NULL); 81 | } 82 | return 1; 83 | } -------------------------------------------------------------------------------- /CameraFix/DllMain.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "ModUtils.h" 4 | 5 | using namespace ModUtils; 6 | using namespace mINI; 7 | 8 | bool disableCameraAutoRotate = true; 9 | bool disableCameraReset = true; 10 | 11 | void ReadConfig() 12 | { 13 | INIFile config(GetModFolderPath() + "\\config.ini"); 14 | INIStructure ini; 15 | 16 | if (config.read(ini)) 17 | { 18 | disableCameraAutoRotate = stoi(ini["fix_the_camera"]["disable_camera_auto_rotate"]) > 0; 19 | disableCameraReset = stoi(ini["fix_the_camera"]["disable_camera_reset"]) > 0; 20 | } 21 | else 22 | { 23 | ini["fix_the_camera"]["disable_camera_auto_rotate"] = "1"; 24 | ini["fix_the_camera"]["disable_camera_reset"] = "1"; 25 | config.write(ini, true); 26 | } 27 | 28 | Log("Disable camera auto rotate: ", disableCameraAutoRotate); 29 | Log("Disable camera reset: ", disableCameraReset); 30 | } 31 | 32 | DWORD WINAPI MainThread(LPVOID lpParam) 33 | { 34 | Log("Activating camera fixes..."); 35 | 36 | ReadConfig(); 37 | 38 | if (disableCameraAutoRotate) 39 | { 40 | std::string aob = "0f 29 ? ? ? ? ? ? 0f 28 ? ? 8b ? e8 ? ? ? ? ? 0f b6 ? ? ? ? 0f 28 ? ? 8b ? e8 ? ? ? ? ? 8b ? ? 0f 28 ? ? 8b ? e8 ? ? ? ? ? 8d ? ? ? 8b ? ? 8d"; 41 | std::string newBytes = "90 90 90 90 90 90 90"; 42 | uintptr_t patchAddress = AobScan(aob); 43 | if (patchAddress != 0) 44 | { 45 | ReplaceExpectedBytesAtAddress(patchAddress, aob, newBytes); 46 | } 47 | } 48 | 49 | if (disableCameraReset) 50 | { 51 | std::string aob = "80 ? ? ? ? ? 00 74 ? ? 8b ? e8 ? ? ? ? eb ? 0f 28 ? ? ? ? ? ? 8d"; 52 | std::string expectedBytes = "74"; 53 | std::string newBytes = "eb"; 54 | uintptr_t patchAddress = AobScan(aob); 55 | size_t offset = 7; 56 | if (patchAddress != 0) 57 | { 58 | patchAddress += offset; 59 | ReplaceExpectedBytesAtAddress(patchAddress, expectedBytes, newBytes); 60 | } 61 | } 62 | 63 | CloseLog(); 64 | return 0; 65 | } 66 | 67 | BOOL WINAPI DllMain(HINSTANCE module, DWORD reason, LPVOID) 68 | { 69 | if (reason == DLL_PROCESS_ATTACH) 70 | { 71 | DisableThreadLibraryCalls(module); 72 | CreateThread(0, 0, &MainThread, 0, 0, NULL); 73 | } 74 | return 1; 75 | } -------------------------------------------------------------------------------- /PauseTheGame/InputTranslation.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | 6 | const static std::unordered_map keycodes = { 7 | {"lmb", VK_LBUTTON}, 8 | {"rmb", VK_RBUTTON}, 9 | {"mmb", VK_MBUTTON}, 10 | {"mb1", VK_XBUTTON1}, 11 | {"mb2", VK_XBUTTON2}, 12 | {"backspace", VK_BACK}, 13 | {"tab", VK_TAB}, 14 | {"enter", VK_RETURN}, 15 | {"lshift", VK_LSHIFT}, 16 | {"rshift", VK_RSHIFT}, 17 | {"lctrl", VK_LCONTROL}, 18 | {"rctrl", VK_RCONTROL}, 19 | {"lalt", VK_LMENU}, 20 | {"ralt", VK_RMENU}, 21 | {"pause", VK_PAUSE}, 22 | {"capslock", VK_CAPITAL}, 23 | {"escape", VK_ESCAPE}, 24 | {"spacebar", VK_SPACE}, 25 | {"pageup", VK_PRIOR}, 26 | {"pagedown", VK_NEXT}, 27 | {"end", VK_END}, 28 | {"home", VK_HOME}, 29 | {"leftarrow", VK_LEFT}, 30 | {"uparrow", VK_UP}, 31 | {"rightarrow", VK_RIGHT}, 32 | {"downarrow", VK_DOWN}, 33 | {"printscreen", VK_SNAPSHOT}, 34 | {"insert", VK_INSERT}, 35 | {"delete", VK_DELETE}, 36 | {"0", 0x30}, 37 | {"1", 0x31}, 38 | {"2", 0x32}, 39 | {"3", 0x33}, 40 | {"4", 0x34}, 41 | {"5", 0x35}, 42 | {"6", 0x36}, 43 | {"7", 0x37}, 44 | {"8", 0x38}, 45 | {"9", 0x39}, 46 | {"a", 0x41}, 47 | {"b", 0x42}, 48 | {"c", 0x43}, 49 | {"d", 0x44}, 50 | {"e", 0x45}, 51 | {"f", 0x46}, 52 | {"g", 0x47}, 53 | {"h", 0x48}, 54 | {"i", 0x49}, 55 | {"j", 0x4a}, 56 | {"k", 0x4b}, 57 | {"l", 0x4c}, 58 | {"m", 0x4d}, 59 | {"n", 0x4e}, 60 | {"o", 0x4f}, 61 | {"p", 0x50}, 62 | {"q", 0x51}, 63 | {"r", 0x52}, 64 | {"s", 0x53}, 65 | {"t", 0x54}, 66 | {"u", 0x55}, 67 | {"v", 0x56}, 68 | {"w", 0x57}, 69 | {"x", 0x58}, 70 | {"y", 0x59}, 71 | {"z", 0x5a}, 72 | {"numpad0", VK_NUMPAD0}, 73 | {"numpad1", VK_NUMPAD1}, 74 | {"numpad2", VK_NUMPAD2}, 75 | {"numpad3", VK_NUMPAD3}, 76 | {"numpad4", VK_NUMPAD4}, 77 | {"numpad5", VK_NUMPAD5}, 78 | {"numpad6", VK_NUMPAD6}, 79 | {"numpad7", VK_NUMPAD7}, 80 | {"numpad8", VK_NUMPAD8}, 81 | {"numpad9", VK_NUMPAD9}, 82 | {"multiply", VK_MULTIPLY}, 83 | {"add", VK_ADD}, 84 | {"separator", VK_SEPARATOR}, 85 | {"subtract", VK_SUBTRACT}, 86 | {"decimal", VK_DECIMAL}, 87 | {"divide", VK_DIVIDE}, 88 | {"f1", VK_F1}, 89 | {"f2", VK_F2}, 90 | {"f3", VK_F3}, 91 | {"f4", VK_F4}, 92 | {"f5", VK_F5}, 93 | {"f6", VK_F6}, 94 | {"f7", VK_F7}, 95 | {"f8", VK_F8}, 96 | {"f9", VK_F9}, 97 | {"f10", VK_F10}, 98 | {"f11", VK_F11}, 99 | {"f12", VK_F12}, 100 | {"numlock", VK_NUMLOCK}, 101 | {"scrolllock", VK_SCROLL} 102 | }; 103 | 104 | const static std::unordered_map controllerKeycodes = { 105 | {"dpadup", 0x0001}, 106 | {"dpaddown", 0x0002}, 107 | {"dpadleft", 0x0004}, 108 | {"dpadright", 0x0008}, 109 | {"start", 0x0010}, 110 | {"select", 0x0020}, 111 | {"lthumbpress", 0x0040}, 112 | {"rthumbpress", 0x0080}, 113 | {"lshoulder", 0x0100}, 114 | {"rshoulder", 0x0200}, 115 | {"xa", 0x1000}, 116 | {"xb", 0x2000}, 117 | {"xx", 0x4000}, 118 | {"xy", 0x8000} 119 | }; -------------------------------------------------------------------------------- /CameraFix/CameraFix.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Release 6 | x64 7 | 8 | 9 | 10 | 16.0 11 | Win32Proj 12 | {458b5a7c-0287-413f-bfc1-dc64baa3ef31} 13 | CameraFix 14 | 10.0 15 | 16 | 17 | 18 | DynamicLibrary 19 | false 20 | v143 21 | true 22 | MultiByte 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | false 35 | $(SolutionDir);$(IncludePath) 36 | false 37 | 38 | 39 | 40 | Level3 41 | true 42 | true 43 | true 44 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 45 | true 46 | MultiThreaded 47 | stdcpp17 48 | 49 | 50 | Windows 51 | true 52 | true 53 | false 54 | 55 | 56 | COPY "C:\Programming\Github repositories\EldenRingMods\x64\Release\$(ProjectName).dll" "F:\SteamLibrary\steamapps\common\ELDEN RING\Game\mods\" 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /UnlockTheFps/UnlockTheFps.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Release 6 | x64 7 | 8 | 9 | 10 | 16.0 11 | Win32Proj 12 | {977a2607-cbc3-4969-9a87-4a6ab6532fc4} 13 | UnlockTheFps 14 | 10.0 15 | 16 | 17 | 18 | DynamicLibrary 19 | false 20 | v143 21 | true 22 | MultiByte 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | false 35 | $(SolutionDir);$(IncludePath) 36 | false 37 | 38 | 39 | 40 | Level3 41 | true 42 | true 43 | true 44 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 45 | true 46 | MultiThreaded 47 | stdcpp17 48 | 49 | 50 | Windows 51 | true 52 | true 53 | false 54 | 55 | 56 | COPY "C:\Programming\Github repositories\EldenRingMods\x64\Release\$(ProjectName).dll" "F:\SteamLibrary\steamapps\common\ELDEN RING\Game\mods\" 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /RemoveVignette/RemoveVignette.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Release 6 | x64 7 | 8 | 9 | 10 | 16.0 11 | Win32Proj 12 | {bfea10a1-2cad-43e4-bc12-99ff1a9653e7} 13 | RemoveVignette 14 | 10.0 15 | 16 | 17 | 18 | DynamicLibrary 19 | false 20 | v143 21 | true 22 | MultiByte 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | false 35 | $(SolutionDir);$(IncludePath) 36 | false 37 | 38 | 39 | 40 | Level3 41 | true 42 | true 43 | true 44 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 45 | true 46 | MultiThreaded 47 | stdcpp17 48 | 49 | 50 | Windows 51 | true 52 | true 53 | false 54 | 55 | 56 | COPY "C:\Programming\Github repositories\EldenRingMods\x64\Release\$(ProjectName).dll" "F:\SteamLibrary\steamapps\common\ELDEN RING\Game\mods\" 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /IncreaseAnimationDistance/IncreaseAnimationDistance.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Release 6 | x64 7 | 8 | 9 | 10 | 16.0 11 | Win32Proj 12 | {c2825812-f55a-4da3-9fd4-f1612cc38c04} 13 | IncreaseAnimationDistance 14 | 10.0 15 | 16 | 17 | 18 | DynamicLibrary 19 | false 20 | v143 21 | true 22 | MultiByte 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | false 35 | $(SolutionDir);$(IncludePath) 36 | false 37 | 38 | 39 | 40 | Level3 41 | true 42 | true 43 | true 44 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 45 | true 46 | MultiThreaded 47 | stdcpp17 48 | 49 | 50 | Windows 51 | true 52 | true 53 | true 54 | 55 | 56 | COPY "C:\Programming\Github repositories\EldenRingMods\x64\Release\$(ProjectName).dll" "F:\SteamLibrary\steamapps\common\ELDEN RING\Game\mods\" 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /RemoveChromaticAberration/RemoveChromaticAberration.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Release 6 | x64 7 | 8 | 9 | 10 | 16.0 11 | Win32Proj 12 | {1b0ec86e-b3e2-4acc-ad0c-d32e7878fadc} 13 | RemoveChromaticAberration 14 | 10.0 15 | 16 | 17 | 18 | DynamicLibrary 19 | false 20 | v143 21 | true 22 | MultiByte 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | false 35 | $(SolutionDir);$(IncludePath) 36 | false 37 | 38 | 39 | 40 | Level3 41 | true 42 | true 43 | true 44 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 45 | true 46 | MultiThreaded 47 | stdcpp17 48 | 49 | 50 | Windows 51 | true 52 | true 53 | false 54 | 55 | 56 | COPY "C:\Programming\Github repositories\EldenRingMods\x64\Release\$(ProjectName).dll" "F:\SteamLibrary\steamapps\common\ELDEN RING\Game\mods\" 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /UltrawideFix/UltrawideFix.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Release 6 | x64 7 | 8 | 9 | 10 | 16.0 11 | Win32Proj 12 | {f9ec5802-c250-4d1a-8390-d39e983a6bc1} 13 | UltrawideFix 14 | 10.0 15 | 16 | 17 | 18 | DynamicLibrary 19 | false 20 | v143 21 | true 22 | MultiByte 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | false 35 | $(IncludePath);$(SolutionDir) 36 | $(SourcePath) 37 | false 38 | 39 | 40 | 41 | Level3 42 | true 43 | true 44 | true 45 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 46 | true 47 | MultiThreaded 48 | stdcpp17 49 | 50 | 51 | Windows 52 | true 53 | true 54 | false 55 | 56 | 57 | COPY "C:\Programming\Github repositories\EldenRingMods\x64\Release\$(ProjectName).dll" "F:\SteamLibrary\steamapps\common\ELDEN RING\Game\mods\" 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /PauseTheGame/PauseTheGame.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Release 6 | x64 7 | 8 | 9 | 10 | 16.0 11 | Win32Proj 12 | {90273855-a4bd-4a80-a712-b55b336d928e} 13 | PauseTheGame 14 | 10.0 15 | 16 | 17 | 18 | DynamicLibrary 19 | false 20 | v143 21 | true 22 | MultiByte 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | false 35 | $(SolutionDir);$(IncludePath) 36 | false 37 | 38 | 39 | 40 | Level3 41 | true 42 | true 43 | true 44 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 45 | true 46 | MultiThreaded 47 | stdcpp17 48 | 49 | 50 | Windows 51 | true 52 | true 53 | false 54 | xinput.lib;%(AdditionalDependencies) 55 | 56 | 57 | COPY "C:\Programming\Github repositories\EldenRingMods\x64\Release\$(ProjectName).dll" "F:\SteamLibrary\steamapps\common\ELDEN RING\Game\mods\" 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /AdjustTheFov/AdjustTheFov.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Release 6 | x64 7 | 8 | 9 | 10 | 16.0 11 | Win32Proj 12 | {42def6a1-381d-48cb-8fee-9ef7621ed0eb} 13 | AdjustTheFov 14 | 10.0 15 | 16 | 17 | 18 | DynamicLibrary 19 | false 20 | v143 21 | true 22 | MultiByte 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | false 36 | $(SolutionDir);$(IncludePath) 37 | false 38 | 39 | 40 | 41 | Level3 42 | true 43 | true 44 | true 45 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 46 | true 47 | MultiThreaded 48 | stdcpp17 49 | 50 | 51 | Windows 52 | true 53 | true 54 | false 55 | 56 | 57 | COPY "C:\Programming\Github repositories\EldenRingMods\x64\Release\$(ProjectName).dll" "F:\SteamLibrary\steamapps\common\ELDEN RING\Game\mods\" 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | Document 66 | 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /SkipTheIntro/DllMain.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "ModUtils.h" 4 | 5 | using namespace ModUtils; 6 | using namespace mINI; 7 | 8 | HWND eldenRingWindow = NULL; 9 | HWND antiFlashbangWindow = NULL; 10 | 11 | bool skipIntroLogos = true; 12 | bool hideInitialWhiteScreen = true; 13 | unsigned int hideWhiteScreenDurationMs = 10000; 14 | 15 | void ShowAntiFlashbangWindow() 16 | { 17 | HINSTANCE hInstance = GetModuleHandleA(GetCurrentProcessName().c_str()); 18 | const char className[] = "AntiFlashbang"; 19 | WNDCLASSEX wc; 20 | wc.cbSize = sizeof(WNDCLASSEX); 21 | wc.style = CS_HREDRAW | CS_VREDRAW; 22 | wc.lpfnWndProc = DefWindowProc; 23 | wc.cbClsExtra = 0; 24 | wc.cbWndExtra = 0; 25 | wc.hInstance = hInstance; 26 | wc.hIcon = NULL; 27 | wc.hCursor = LoadCursor(NULL, IDC_ARROW); 28 | wc.hbrBackground = (HBRUSH)(COLOR_BTNTEXT + 1); 29 | wc.lpszMenuName = NULL; 30 | wc.lpszClassName = className; 31 | wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 32 | 33 | RegisterClassEx(&wc); 34 | antiFlashbangWindow = CreateWindowEx( 35 | WS_EX_TOPMOST, 36 | className, 37 | "Anti-flashbang window", 38 | WS_POPUP, 39 | CW_USEDEFAULT, 40 | CW_USEDEFAULT, 41 | 0, 42 | 0, 43 | NULL, 44 | NULL, 45 | hInstance, 46 | NULL); 47 | 48 | RECT eldenRingRect; 49 | GetWindowRect(eldenRingWindow, &eldenRingRect); 50 | int width = eldenRingRect.right - eldenRingRect.left; 51 | int height = eldenRingRect.bottom - eldenRingRect.top; 52 | int x = eldenRingRect.left; 53 | int y = eldenRingRect.top; 54 | 55 | SetWindowPos(antiFlashbangWindow, HWND_TOPMOST, x, y, width, height, NULL); 56 | ShowWindow(antiFlashbangWindow, SW_SHOWNORMAL); 57 | UpdateWindow(antiFlashbangWindow); 58 | } 59 | 60 | void ReadConfigFile() 61 | { 62 | INIFile config(GetModFolderPath() + "\\config.ini"); 63 | INIStructure ini; 64 | 65 | if (config.read(ini)) 66 | { 67 | skipIntroLogos = stoi(ini["skip_the_intro"]["skip_intro_logos"]) > 0; 68 | hideInitialWhiteScreen = stoi(ini["skip_the_intro"]["hide_initial_white_screen"]) > 0; 69 | hideWhiteScreenDurationMs = stoi(ini["skip_the_intro"]["hide_initial_white_screen_duration"]); 70 | } 71 | else 72 | { 73 | ini["skip_the_intro"]["skip_intro_logos"] = "1"; 74 | ini["skip_the_intro"]["hide_initial_white_screen"] = "1"; 75 | ini["skip_the_intro"]["hide_initial_white_screen_duration"] = std::to_string(hideWhiteScreenDurationMs); 76 | config.write(ini, true); 77 | } 78 | 79 | Log("Skip intro logos: ", skipIntroLogos); 80 | Log("Hide initial white screen: ", hideInitialWhiteScreen); 81 | Log("Hide initial white screen duration: ", hideWhiteScreenDurationMs); 82 | } 83 | 84 | DWORD WINAPI MainThread(LPVOID lpParam) 85 | { 86 | ReadConfigFile(); 87 | 88 | if (hideInitialWhiteScreen) 89 | { 90 | if (GetWindowHandle()) 91 | { 92 | eldenRingWindow = muWindow; 93 | } 94 | ShowAntiFlashbangWindow(); 95 | } 96 | 97 | if (skipIntroLogos) 98 | { 99 | Log("Activating SkipTheIntro..."); 100 | std::string aob = "c6 ? ? ? ? ? 01 ? 03 00 00 00 ? 8b ? e8 ? ? ? ? e9 ? ? ? ? ? 8d"; 101 | std::string expectedBytes = "74"; 102 | std::string newBytes = "90 90"; 103 | uintptr_t patchAddress = AobScan(aob); 104 | size_t offset = 60; 105 | if (patchAddress != 0) 106 | { 107 | patchAddress -= offset; 108 | ReplaceExpectedBytesAtAddress(patchAddress, expectedBytes, newBytes); 109 | } 110 | } 111 | 112 | if (hideInitialWhiteScreen) 113 | { 114 | Timer closeWindowTimer(hideWhiteScreenDurationMs); 115 | while (true) 116 | { 117 | if (closeWindowTimer.Check()) 118 | { 119 | Log("Closing window"); 120 | SetWindowPos(antiFlashbangWindow, HWND_BOTTOM, 0, 0, 0, 0, NULL); 121 | ShowWindow(antiFlashbangWindow, SW_HIDE); 122 | PostMessage(antiFlashbangWindow, WM_CLOSE, NULL, NULL); 123 | break; 124 | } 125 | Sleep(10); 126 | } 127 | } 128 | 129 | CloseLog(); 130 | return 0; 131 | } 132 | 133 | BOOL WINAPI DllMain(HINSTANCE module, DWORD reason, LPVOID) 134 | { 135 | if (reason == DLL_PROCESS_ATTACH) 136 | { 137 | DisableThreadLibraryCalls(module); 138 | CreateThread(0, 0, &MainThread, 0, 0, NULL); 139 | } 140 | return 1; 141 | } -------------------------------------------------------------------------------- /PauseTheGame/DllMain.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #include "ModUtils.h" 5 | #include "InputTranslation.h" 6 | 7 | using namespace ModUtils; 8 | using namespace mINI; 9 | 10 | bool gameIsPaused = false; 11 | uintptr_t patchAddress = 0; 12 | size_t offset = 1; 13 | 14 | struct Keybind 15 | { 16 | std::vector keys; 17 | bool isControllerKeybind; 18 | }; 19 | 20 | std::vector pauseKeybinds = { 21 | { { keycodes.at("p") }, false }, 22 | { { controllerKeycodes.at("lthumbpress"), controllerKeycodes.at("xa") }, true } 23 | }; 24 | std::vector unpauseKeybinds = { 25 | { { keycodes.at("p") }, false }, 26 | { { controllerKeycodes.at("lthumbpress"), controllerKeycodes.at("xa") }, true } 27 | }; 28 | 29 | void Pause() 30 | { 31 | Log("Paused"); 32 | ReplaceExpectedBytesAtAddress(patchAddress + offset, "84", "85"); 33 | gameIsPaused = true; 34 | } 35 | 36 | void Unpause() 37 | { 38 | Log("Unpaused"); 39 | ReplaceExpectedBytesAtAddress(patchAddress + offset, "85", "84"); 40 | gameIsPaused = false; 41 | } 42 | 43 | std::vector splitString(std::string str, std::string delimiter) 44 | { 45 | size_t pos = 0; 46 | std::vector list; 47 | while ((pos = str.find(delimiter)) != std::string::npos) 48 | { 49 | std::string token = str.substr(0, pos); 50 | list.push_back(token); 51 | str.erase(0, pos + delimiter.size()); 52 | } 53 | list.push_back(str); 54 | return list; 55 | } 56 | 57 | std::vector TranslateInput(std::string inputString) 58 | { 59 | std::vector keybinds; 60 | std::vector> keybindsToTranslate; 61 | 62 | // Remove spaces 63 | inputString.erase(std::remove_if(inputString.begin(), inputString.end(), std::isspace), inputString.end()); 64 | 65 | // Convert to lowercase 66 | transform(inputString.begin(), inputString.end(), inputString.begin(), ::tolower); 67 | 68 | // Parse individual and combination keybinds and place in list 69 | std::vector splitOnComma = splitString(inputString, ","); 70 | for (auto keybind : splitOnComma) 71 | { 72 | std::vector splitOnPlus = splitString(keybind, "+"); 73 | if (splitOnPlus.size() == 1) 74 | { 75 | keybindsToTranslate.push_back({ keybind }); 76 | } 77 | else 78 | { 79 | std::vector combos; 80 | for (auto combo : splitOnPlus) 81 | { 82 | combos.push_back(combo); 83 | } 84 | keybindsToTranslate.push_back(combos); 85 | } 86 | } 87 | 88 | // Convert raw keybind strings to keycodes 89 | for (auto rawKeybinds : keybindsToTranslate) 90 | { 91 | bool isControllerKeybind = false; 92 | std::vector keybindGroup; 93 | for (std::string rawKeybindString : rawKeybinds) 94 | { 95 | auto search = keycodes.find(rawKeybindString); 96 | if (search != keycodes.end()) 97 | { 98 | isControllerKeybind = false; 99 | keybindGroup.push_back(keycodes.at(rawKeybindString)); 100 | } 101 | else 102 | { 103 | search = controllerKeycodes.find(rawKeybindString); 104 | if (search != controllerKeycodes.end()) 105 | { 106 | isControllerKeybind = true; 107 | keybindGroup.push_back(controllerKeycodes.at(rawKeybindString)); 108 | } 109 | } 110 | } 111 | keybinds.push_back({ keybindGroup, isControllerKeybind }); 112 | } 113 | 114 | return keybinds; 115 | } 116 | 117 | void ReadConfig() 118 | { 119 | INIFile config(GetModFolderPath() + "\\pause_keybinds.ini"); 120 | INIStructure ini; 121 | 122 | if (config.read(ini)) 123 | { 124 | pauseKeybinds = TranslateInput(ini["keybinds"].get("pause_keys")); 125 | unpauseKeybinds = TranslateInput(ini["keybinds"].get("unpause_keys")); 126 | } 127 | else 128 | { 129 | ini["keybinds"]["pause_keys"] = "p, lthumbpress+xa"; 130 | ini["keybinds"]["unpause_keys"] = "p, lthumbpress+xa"; 131 | config.write(ini, true); 132 | } 133 | } 134 | 135 | DWORD WINAPI MainThread(LPVOID lpParam) 136 | { 137 | Log("Activating PauseTheGame..."); 138 | std::string aob = "0f 84 ? ? ? ? c6 ? ? ? ? ? 00 ? 8d ? ? ? ? ? ? 89 ? ? 89 ? ? ? 8b ? ? ? ? ? ? 85 ? 75"; 139 | patchAddress = AobScan(aob); 140 | if (patchAddress == 0) 141 | { 142 | return 1; 143 | } 144 | 145 | ReadConfig(); 146 | 147 | while (true) 148 | { 149 | auto* keybinds = &pauseKeybinds; 150 | if (gameIsPaused) 151 | { 152 | keybinds = &unpauseKeybinds; 153 | } 154 | 155 | for (Keybind keybind : *keybinds) 156 | { 157 | if (AreKeysPressed(keybind.keys, false, keybind.isControllerKeybind)) 158 | { 159 | if (gameIsPaused) 160 | { 161 | Unpause(); 162 | } 163 | else 164 | { 165 | Pause(); 166 | } 167 | } 168 | } 169 | 170 | Sleep(5); 171 | } 172 | 173 | CloseLog(); 174 | return 0; 175 | } 176 | 177 | BOOL WINAPI DllMain(HINSTANCE module, DWORD reason, LPVOID) 178 | { 179 | if (reason == DLL_PROCESS_ATTACH) 180 | { 181 | DisableThreadLibraryCalls(module); 182 | CreateThread(0, 0, &MainThread, 0, 0, NULL); 183 | } 184 | return 1; 185 | } -------------------------------------------------------------------------------- /EldenRingMods.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.5.33516.290 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UltrawideFix", "UltrawideFix\UltrawideFix.vcxproj", "{F9EC5802-C250-4D1A-8390-D39E983A6BC1}" 7 | EndProject 8 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RemoveVignette", "RemoveVignette\RemoveVignette.vcxproj", "{BFEA10A1-2CAD-43E4-BC12-99FF1A9653E7}" 9 | EndProject 10 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RemoveChromaticAberration", "RemoveChromaticAberration\RemoveChromaticAberration.vcxproj", "{1B0EC86E-B3E2-4ACC-AD0C-D32E7878FADC}" 11 | EndProject 12 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnlockTheFps", "UnlockTheFps\UnlockTheFps.vcxproj", "{977A2607-CBC3-4969-9A87-4A6AB6532FC4}" 13 | EndProject 14 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CameraFix", "CameraFix\CameraFix.vcxproj", "{458B5A7C-0287-413F-BFC1-DC64BAA3EF31}" 15 | EndProject 16 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IncreaseAnimationDistance", "IncreaseAnimationDistance\IncreaseAnimationDistance.vcxproj", "{C2825812-F55A-4DA3-9FD4-F1612CC38C04}" 17 | EndProject 18 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AdjustTheFov", "AdjustTheFov\AdjustTheFov.vcxproj", "{42DEF6A1-381D-48CB-8FEE-9EF7621ED0EB}" 19 | EndProject 20 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{91D023D2-0318-40C0-854E-2A3F5BAD5AEC}" 21 | ProjectSection(SolutionItems) = preProject 22 | ini.h = ini.h 23 | ModUtils.h = ModUtils.h 24 | EndProjectSection 25 | EndProject 26 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PauseTheGame", "PauseTheGame\PauseTheGame.vcxproj", "{90273855-A4BD-4A80-A712-B55B336D928E}" 27 | EndProject 28 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DisableRuneLoss", "DisableRuneLoss\DisableRuneLoss.vcxproj", "{E19918AD-EDA8-4FE3-83A7-D00C2D134F9A}" 29 | EndProject 30 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SkipTheIntro", "SkipTheIntro\SkipTheIntro.vcxproj", "{F1C483C1-0878-4719-9044-CA0F9670D097}" 31 | EndProject 32 | Global 33 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 34 | Debug|x64 = Debug|x64 35 | Debug|x86 = Debug|x86 36 | Release|x64 = Release|x64 37 | Release|x86 = Release|x86 38 | EndGlobalSection 39 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 40 | {F9EC5802-C250-4D1A-8390-D39E983A6BC1}.Debug|x64.ActiveCfg = Release|x64 41 | {F9EC5802-C250-4D1A-8390-D39E983A6BC1}.Debug|x64.Build.0 = Release|x64 42 | {F9EC5802-C250-4D1A-8390-D39E983A6BC1}.Debug|x86.ActiveCfg = Release|x64 43 | {F9EC5802-C250-4D1A-8390-D39E983A6BC1}.Debug|x86.Build.0 = Release|x64 44 | {F9EC5802-C250-4D1A-8390-D39E983A6BC1}.Release|x64.ActiveCfg = Release|x64 45 | {F9EC5802-C250-4D1A-8390-D39E983A6BC1}.Release|x86.ActiveCfg = Release|x64 46 | {BFEA10A1-2CAD-43E4-BC12-99FF1A9653E7}.Debug|x64.ActiveCfg = Release|x64 47 | {BFEA10A1-2CAD-43E4-BC12-99FF1A9653E7}.Debug|x64.Build.0 = Release|x64 48 | {BFEA10A1-2CAD-43E4-BC12-99FF1A9653E7}.Debug|x86.ActiveCfg = Release|x64 49 | {BFEA10A1-2CAD-43E4-BC12-99FF1A9653E7}.Debug|x86.Build.0 = Release|x64 50 | {BFEA10A1-2CAD-43E4-BC12-99FF1A9653E7}.Release|x64.ActiveCfg = Release|x64 51 | {BFEA10A1-2CAD-43E4-BC12-99FF1A9653E7}.Release|x86.ActiveCfg = Release|x64 52 | {1B0EC86E-B3E2-4ACC-AD0C-D32E7878FADC}.Debug|x64.ActiveCfg = Release|x64 53 | {1B0EC86E-B3E2-4ACC-AD0C-D32E7878FADC}.Debug|x64.Build.0 = Release|x64 54 | {1B0EC86E-B3E2-4ACC-AD0C-D32E7878FADC}.Debug|x86.ActiveCfg = Release|x64 55 | {1B0EC86E-B3E2-4ACC-AD0C-D32E7878FADC}.Debug|x86.Build.0 = Release|x64 56 | {1B0EC86E-B3E2-4ACC-AD0C-D32E7878FADC}.Release|x64.ActiveCfg = Release|x64 57 | {1B0EC86E-B3E2-4ACC-AD0C-D32E7878FADC}.Release|x86.ActiveCfg = Release|x64 58 | {977A2607-CBC3-4969-9A87-4A6AB6532FC4}.Debug|x64.ActiveCfg = Release|x64 59 | {977A2607-CBC3-4969-9A87-4A6AB6532FC4}.Debug|x64.Build.0 = Release|x64 60 | {977A2607-CBC3-4969-9A87-4A6AB6532FC4}.Debug|x86.ActiveCfg = Release|x64 61 | {977A2607-CBC3-4969-9A87-4A6AB6532FC4}.Debug|x86.Build.0 = Release|x64 62 | {977A2607-CBC3-4969-9A87-4A6AB6532FC4}.Release|x64.ActiveCfg = Release|x64 63 | {977A2607-CBC3-4969-9A87-4A6AB6532FC4}.Release|x86.ActiveCfg = Release|x64 64 | {458B5A7C-0287-413F-BFC1-DC64BAA3EF31}.Debug|x64.ActiveCfg = Release|x64 65 | {458B5A7C-0287-413F-BFC1-DC64BAA3EF31}.Debug|x64.Build.0 = Release|x64 66 | {458B5A7C-0287-413F-BFC1-DC64BAA3EF31}.Debug|x86.ActiveCfg = Release|x64 67 | {458B5A7C-0287-413F-BFC1-DC64BAA3EF31}.Debug|x86.Build.0 = Release|x64 68 | {458B5A7C-0287-413F-BFC1-DC64BAA3EF31}.Release|x64.ActiveCfg = Release|x64 69 | {458B5A7C-0287-413F-BFC1-DC64BAA3EF31}.Release|x86.ActiveCfg = Release|x64 70 | {C2825812-F55A-4DA3-9FD4-F1612CC38C04}.Debug|x64.ActiveCfg = Release|x64 71 | {C2825812-F55A-4DA3-9FD4-F1612CC38C04}.Debug|x64.Build.0 = Release|x64 72 | {C2825812-F55A-4DA3-9FD4-F1612CC38C04}.Debug|x86.ActiveCfg = Release|x64 73 | {C2825812-F55A-4DA3-9FD4-F1612CC38C04}.Debug|x86.Build.0 = Release|x64 74 | {C2825812-F55A-4DA3-9FD4-F1612CC38C04}.Release|x64.ActiveCfg = Release|x64 75 | {C2825812-F55A-4DA3-9FD4-F1612CC38C04}.Release|x64.Build.0 = Release|x64 76 | {C2825812-F55A-4DA3-9FD4-F1612CC38C04}.Release|x86.ActiveCfg = Release|x64 77 | {42DEF6A1-381D-48CB-8FEE-9EF7621ED0EB}.Debug|x64.ActiveCfg = Release|x64 78 | {42DEF6A1-381D-48CB-8FEE-9EF7621ED0EB}.Debug|x64.Build.0 = Release|x64 79 | {42DEF6A1-381D-48CB-8FEE-9EF7621ED0EB}.Debug|x86.ActiveCfg = Release|x64 80 | {42DEF6A1-381D-48CB-8FEE-9EF7621ED0EB}.Debug|x86.Build.0 = Release|x64 81 | {42DEF6A1-381D-48CB-8FEE-9EF7621ED0EB}.Release|x64.ActiveCfg = Release|x64 82 | {42DEF6A1-381D-48CB-8FEE-9EF7621ED0EB}.Release|x86.ActiveCfg = Release|x64 83 | {90273855-A4BD-4A80-A712-B55B336D928E}.Debug|x64.ActiveCfg = Release|x64 84 | {90273855-A4BD-4A80-A712-B55B336D928E}.Debug|x64.Build.0 = Release|x64 85 | {90273855-A4BD-4A80-A712-B55B336D928E}.Debug|x86.ActiveCfg = Release|x64 86 | {90273855-A4BD-4A80-A712-B55B336D928E}.Debug|x86.Build.0 = Release|x64 87 | {90273855-A4BD-4A80-A712-B55B336D928E}.Release|x64.ActiveCfg = Release|x64 88 | {90273855-A4BD-4A80-A712-B55B336D928E}.Release|x86.ActiveCfg = Release|x64 89 | {E19918AD-EDA8-4FE3-83A7-D00C2D134F9A}.Debug|x64.ActiveCfg = Debug|x64 90 | {E19918AD-EDA8-4FE3-83A7-D00C2D134F9A}.Debug|x64.Build.0 = Debug|x64 91 | {E19918AD-EDA8-4FE3-83A7-D00C2D134F9A}.Debug|x86.ActiveCfg = Debug|Win32 92 | {E19918AD-EDA8-4FE3-83A7-D00C2D134F9A}.Debug|x86.Build.0 = Debug|Win32 93 | {E19918AD-EDA8-4FE3-83A7-D00C2D134F9A}.Release|x64.ActiveCfg = Release|x64 94 | {E19918AD-EDA8-4FE3-83A7-D00C2D134F9A}.Release|x86.ActiveCfg = Release|Win32 95 | {E19918AD-EDA8-4FE3-83A7-D00C2D134F9A}.Release|x86.Build.0 = Release|Win32 96 | {F1C483C1-0878-4719-9044-CA0F9670D097}.Debug|x64.ActiveCfg = Debug|x64 97 | {F1C483C1-0878-4719-9044-CA0F9670D097}.Debug|x64.Build.0 = Debug|x64 98 | {F1C483C1-0878-4719-9044-CA0F9670D097}.Debug|x86.ActiveCfg = Debug|Win32 99 | {F1C483C1-0878-4719-9044-CA0F9670D097}.Debug|x86.Build.0 = Debug|Win32 100 | {F1C483C1-0878-4719-9044-CA0F9670D097}.Release|x64.ActiveCfg = Release|x64 101 | {F1C483C1-0878-4719-9044-CA0F9670D097}.Release|x86.ActiveCfg = Release|Win32 102 | {F1C483C1-0878-4719-9044-CA0F9670D097}.Release|x86.Build.0 = Release|Win32 103 | EndGlobalSection 104 | GlobalSection(SolutionProperties) = preSolution 105 | HideSolutionNode = FALSE 106 | EndGlobalSection 107 | GlobalSection(ExtensibilityGlobals) = postSolution 108 | SolutionGuid = {915C58E0-01A3-4269-B4A6-BC27D26E70F1} 109 | EndGlobalSection 110 | EndGlobal 111 | -------------------------------------------------------------------------------- /SkipTheIntro/SkipTheIntro.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 16.0 23 | Win32Proj 24 | {f1c483c1-0878-4719-9044-ca0f9670d097} 25 | SkipTheIntro 26 | 10.0 27 | 28 | 29 | 30 | Application 31 | true 32 | v143 33 | Unicode 34 | 35 | 36 | Application 37 | false 38 | v143 39 | true 40 | Unicode 41 | 42 | 43 | Application 44 | true 45 | v143 46 | Unicode 47 | 48 | 49 | DynamicLibrary 50 | false 51 | v143 52 | true 53 | MultiByte 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | true 74 | 75 | 76 | false 77 | 78 | 79 | true 80 | 81 | 82 | false 83 | $(SolutionDir);$(IncludePath) 84 | 85 | 86 | 87 | Level3 88 | true 89 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 90 | true 91 | 92 | 93 | Console 94 | true 95 | 96 | 97 | 98 | 99 | Level3 100 | true 101 | true 102 | true 103 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 104 | true 105 | 106 | 107 | Console 108 | true 109 | true 110 | true 111 | 112 | 113 | 114 | 115 | Level3 116 | true 117 | _DEBUG;_CONSOLE;%(PreprocessorDefinitions) 118 | true 119 | 120 | 121 | Console 122 | true 123 | 124 | 125 | 126 | 127 | Level3 128 | true 129 | true 130 | true 131 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 132 | true 133 | MultiThreaded 134 | stdcpp17 135 | 136 | 137 | Windows 138 | true 139 | true 140 | false 141 | 142 | 143 | COPY "C:\Programming\Github repositories\EldenRingMods\x64\Release\$(ProjectName).dll" "F:\SteamLibrary\steamapps\common\ELDEN RING\Game\mods\" 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | -------------------------------------------------------------------------------- /DisableRuneLoss/DisableRuneLoss.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 16.0 23 | Win32Proj 24 | {e19918ad-eda8-4fe3-83a7-d00c2d134f9a} 25 | DisableRuneLoss 26 | 10.0 27 | 28 | 29 | 30 | Application 31 | true 32 | v143 33 | Unicode 34 | 35 | 36 | Application 37 | false 38 | v143 39 | true 40 | Unicode 41 | 42 | 43 | Application 44 | true 45 | v143 46 | Unicode 47 | 48 | 49 | DynamicLibrary 50 | false 51 | v143 52 | true 53 | MultiByte 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | true 75 | 76 | 77 | false 78 | 79 | 80 | true 81 | 82 | 83 | false 84 | $(SolutionDir);$(IncludePath) 85 | 86 | 87 | 88 | Level3 89 | true 90 | WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) 91 | true 92 | 93 | 94 | Console 95 | true 96 | 97 | 98 | 99 | 100 | Level3 101 | true 102 | true 103 | true 104 | WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 105 | true 106 | 107 | 108 | Console 109 | true 110 | true 111 | true 112 | 113 | 114 | 115 | 116 | Level3 117 | true 118 | _DEBUG;_CONSOLE;%(PreprocessorDefinitions) 119 | true 120 | 121 | 122 | Console 123 | true 124 | 125 | 126 | 127 | 128 | Level3 129 | true 130 | true 131 | true 132 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions) 133 | true 134 | MultiThreaded 135 | stdcpp17 136 | 137 | 138 | Windows 139 | true 140 | true 141 | false 142 | 143 | 144 | COPY "C:\Programming\Github repositories\EldenRingMods\x64\Release\$(ProjectName).dll" "F:\SteamLibrary\steamapps\common\ELDEN RING\Game\mods\" 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Ww][Ii][Nn]32/ 27 | [Aa][Rr][Mm]/ 28 | [Aa][Rr][Mm]64/ 29 | bld/ 30 | [Bb]in/ 31 | [Oo]bj/ 32 | [Ll]og/ 33 | [Ll]ogs/ 34 | 35 | # Visual Studio 2015/2017 cache/options directory 36 | .vs/ 37 | # Uncomment if you have tasks that create the project's static files in wwwroot 38 | #wwwroot/ 39 | 40 | # Visual Studio 2017 auto generated files 41 | Generated\ Files/ 42 | 43 | # MSTest test Results 44 | [Tt]est[Rr]esult*/ 45 | [Bb]uild[Ll]og.* 46 | 47 | # NUnit 48 | *.VisualState.xml 49 | TestResult.xml 50 | nunit-*.xml 51 | 52 | # Build Results of an ATL Project 53 | [Dd]ebugPS/ 54 | [Rr]eleasePS/ 55 | dlldata.c 56 | 57 | # Benchmark Results 58 | BenchmarkDotNet.Artifacts/ 59 | 60 | # .NET Core 61 | project.lock.json 62 | project.fragment.lock.json 63 | artifacts/ 64 | 65 | # ASP.NET Scaffolding 66 | ScaffoldingReadMe.txt 67 | 68 | # StyleCop 69 | StyleCopReport.xml 70 | 71 | # Files built by Visual Studio 72 | *_i.c 73 | *_p.c 74 | *_h.h 75 | *.ilk 76 | *.meta 77 | *.obj 78 | *.iobj 79 | *.pch 80 | *.pdb 81 | *.ipdb 82 | *.pgc 83 | *.pgd 84 | *.rsp 85 | *.sbr 86 | *.tlb 87 | *.tli 88 | *.tlh 89 | *.tmp 90 | *.tmp_proj 91 | *_wpftmp.csproj 92 | *.log 93 | *.tlog 94 | *.vspscc 95 | *.vssscc 96 | .builds 97 | *.pidb 98 | *.svclog 99 | *.scc 100 | 101 | # Chutzpah Test files 102 | _Chutzpah* 103 | 104 | # Visual C++ cache files 105 | ipch/ 106 | *.aps 107 | *.ncb 108 | *.opendb 109 | *.opensdf 110 | *.sdf 111 | *.cachefile 112 | *.VC.db 113 | *.VC.VC.opendb 114 | 115 | # Visual Studio profiler 116 | *.psess 117 | *.vsp 118 | *.vspx 119 | *.sap 120 | 121 | # Visual Studio Trace Files 122 | *.e2e 123 | 124 | # TFS 2012 Local Workspace 125 | $tf/ 126 | 127 | # Guidance Automation Toolkit 128 | *.gpState 129 | 130 | # ReSharper is a .NET coding add-in 131 | _ReSharper*/ 132 | *.[Rr]e[Ss]harper 133 | *.DotSettings.user 134 | 135 | # TeamCity is a build add-in 136 | _TeamCity* 137 | 138 | # DotCover is a Code Coverage Tool 139 | *.dotCover 140 | 141 | # AxoCover is a Code Coverage Tool 142 | .axoCover/* 143 | !.axoCover/settings.json 144 | 145 | # Coverlet is a free, cross platform Code Coverage Tool 146 | coverage*.json 147 | coverage*.xml 148 | coverage*.info 149 | 150 | # Visual Studio code coverage results 151 | *.coverage 152 | *.coveragexml 153 | 154 | # NCrunch 155 | _NCrunch_* 156 | .*crunch*.local.xml 157 | nCrunchTemp_* 158 | 159 | # MightyMoose 160 | *.mm.* 161 | AutoTest.Net/ 162 | 163 | # Web workbench (sass) 164 | .sass-cache/ 165 | 166 | # Installshield output folder 167 | [Ee]xpress/ 168 | 169 | # DocProject is a documentation generator add-in 170 | DocProject/buildhelp/ 171 | DocProject/Help/*.HxT 172 | DocProject/Help/*.HxC 173 | DocProject/Help/*.hhc 174 | DocProject/Help/*.hhk 175 | DocProject/Help/*.hhp 176 | DocProject/Help/Html2 177 | DocProject/Help/html 178 | 179 | # Click-Once directory 180 | publish/ 181 | 182 | # Publish Web Output 183 | *.[Pp]ublish.xml 184 | *.azurePubxml 185 | # Note: Comment the next line if you want to checkin your web deploy settings, 186 | # but database connection strings (with potential passwords) will be unencrypted 187 | *.pubxml 188 | *.publishproj 189 | 190 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 191 | # checkin your Azure Web App publish settings, but sensitive information contained 192 | # in these scripts will be unencrypted 193 | PublishScripts/ 194 | 195 | # NuGet Packages 196 | *.nupkg 197 | # NuGet Symbol Packages 198 | *.snupkg 199 | # The packages folder can be ignored because of Package Restore 200 | **/[Pp]ackages/* 201 | # except build/, which is used as an MSBuild target. 202 | !**/[Pp]ackages/build/ 203 | # Uncomment if necessary however generally it will be regenerated when needed 204 | #!**/[Pp]ackages/repositories.config 205 | # NuGet v3's project.json files produces more ignorable files 206 | *.nuget.props 207 | *.nuget.targets 208 | 209 | # Microsoft Azure Build Output 210 | csx/ 211 | *.build.csdef 212 | 213 | # Microsoft Azure Emulator 214 | ecf/ 215 | rcf/ 216 | 217 | # Windows Store app package directories and files 218 | AppPackages/ 219 | BundleArtifacts/ 220 | Package.StoreAssociation.xml 221 | _pkginfo.txt 222 | *.appx 223 | *.appxbundle 224 | *.appxupload 225 | 226 | # Visual Studio cache files 227 | # files ending in .cache can be ignored 228 | *.[Cc]ache 229 | # but keep track of directories ending in .cache 230 | !?*.[Cc]ache/ 231 | 232 | # Others 233 | ClientBin/ 234 | ~$* 235 | *~ 236 | *.dbmdl 237 | *.dbproj.schemaview 238 | *.jfm 239 | *.pfx 240 | *.publishsettings 241 | orleans.codegen.cs 242 | 243 | # Including strong name files can present a security risk 244 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 245 | #*.snk 246 | 247 | # Since there are multiple workflows, uncomment next line to ignore bower_components 248 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 249 | #bower_components/ 250 | 251 | # RIA/Silverlight projects 252 | Generated_Code/ 253 | 254 | # Backup & report files from converting an old project file 255 | # to a newer Visual Studio version. Backup files are not needed, 256 | # because we have git ;-) 257 | _UpgradeReport_Files/ 258 | Backup*/ 259 | UpgradeLog*.XML 260 | UpgradeLog*.htm 261 | ServiceFabricBackup/ 262 | *.rptproj.bak 263 | 264 | # SQL Server files 265 | *.mdf 266 | *.ldf 267 | *.ndf 268 | 269 | # Business Intelligence projects 270 | *.rdl.data 271 | *.bim.layout 272 | *.bim_*.settings 273 | *.rptproj.rsuser 274 | *- [Bb]ackup.rdl 275 | *- [Bb]ackup ([0-9]).rdl 276 | *- [Bb]ackup ([0-9][0-9]).rdl 277 | 278 | # Microsoft Fakes 279 | FakesAssemblies/ 280 | 281 | # GhostDoc plugin setting file 282 | *.GhostDoc.xml 283 | 284 | # Node.js Tools for Visual Studio 285 | .ntvs_analysis.dat 286 | node_modules/ 287 | 288 | # Visual Studio 6 build log 289 | *.plg 290 | 291 | # Visual Studio 6 workspace options file 292 | *.opt 293 | 294 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 295 | *.vbw 296 | 297 | # Visual Studio 6 auto-generated project file (contains which files were open etc.) 298 | *.vbp 299 | 300 | # Visual Studio 6 workspace and project file (working project files containing files to include in project) 301 | *.dsw 302 | *.dsp 303 | 304 | # Visual Studio 6 technical files 305 | *.ncb 306 | *.aps 307 | 308 | # Visual Studio LightSwitch build output 309 | **/*.HTMLClient/GeneratedArtifacts 310 | **/*.DesktopClient/GeneratedArtifacts 311 | **/*.DesktopClient/ModelManifest.xml 312 | **/*.Server/GeneratedArtifacts 313 | **/*.Server/ModelManifest.xml 314 | _Pvt_Extensions 315 | 316 | # Paket dependency manager 317 | .paket/paket.exe 318 | paket-files/ 319 | 320 | # FAKE - F# Make 321 | .fake/ 322 | 323 | # CodeRush personal settings 324 | .cr/personal 325 | 326 | # Python Tools for Visual Studio (PTVS) 327 | __pycache__/ 328 | *.pyc 329 | 330 | # Cake - Uncomment if you are using it 331 | # tools/** 332 | # !tools/packages.config 333 | 334 | # Tabs Studio 335 | *.tss 336 | 337 | # Telerik's JustMock configuration file 338 | *.jmconfig 339 | 340 | # BizTalk build output 341 | *.btp.cs 342 | *.btm.cs 343 | *.odx.cs 344 | *.xsd.cs 345 | 346 | # OpenCover UI analysis results 347 | OpenCover/ 348 | 349 | # Azure Stream Analytics local run output 350 | ASALocalRun/ 351 | 352 | # MSBuild Binary and Structured Log 353 | *.binlog 354 | 355 | # NVidia Nsight GPU debugger configuration file 356 | *.nvuser 357 | 358 | # MFractors (Xamarin productivity tool) working folder 359 | .mfractor/ 360 | 361 | # Local History for Visual Studio 362 | .localhistory/ 363 | 364 | # Visual Studio History (VSHistory) files 365 | .vshistory/ 366 | 367 | # BeatPulse healthcheck temp database 368 | healthchecksdb 369 | 370 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 371 | MigrationBackup/ 372 | 373 | # Ionide (cross platform F# VS Code tools) working folder 374 | .ionide/ 375 | 376 | # Fody - auto-generated XML schema 377 | FodyWeavers.xsd 378 | 379 | # VS Code files for those working on multiple tools 380 | .vscode/* 381 | !.vscode/settings.json 382 | !.vscode/tasks.json 383 | !.vscode/launch.json 384 | !.vscode/extensions.json 385 | *.code-workspace 386 | 387 | # Local History for Visual Studio Code 388 | .history/ 389 | 390 | # Windows Installer files from build outputs 391 | *.cab 392 | *.msi 393 | *.msix 394 | *.msm 395 | *.msp 396 | 397 | # JetBrains Rider 398 | *.sln.iml 399 | -------------------------------------------------------------------------------- /DisableRuneLoss/documentation.txt: -------------------------------------------------------------------------------- 1 | SIGNATURE: b0 01 ? 8b ? e8 ? ? ? ? ? 8b ? ? ? 32 c0 ? 83 ? 28 c3 2 | 3 | FUNCTION ABOVE: 4 | 5 | eldenring.exe+584996 - 48 8B 03 - mov rax,[rbx] 6 | eldenring.exe+584999 - 53 - push rbx 7 | eldenring.exe+58499A - 59 - pop rcx 8 | eldenring.exe+58499B - E9 7107A101 - jmp eldenring.exe+1F95111 9 | eldenring.exe+5849A0 - 40 53 - push rbx 10 | eldenring.exe+5849A2 - 48 83 EC 20 - sub rsp,20 { 32 } 11 | eldenring.exe+5849A6 - 48 8B 0D 3B5E6803 - mov rcx,[eldenring.exe+3C0A7E8] { (0) } 12 | eldenring.exe+5849AD - 8B DA - mov ebx,edx 13 | eldenring.exe+5849AF - 48 85 C9 - test rcx,rcx 14 | eldenring.exe+5849B2 - 75 2E - jne eldenring.exe+5849E2 15 | eldenring.exe+5849B4 - 48 8D 0D 47856703 - lea rcx,[eldenring.exe+3BFCF02] { (0) } 16 | eldenring.exe+5849BB - E8 002D8801 - call eldenring.exe+1E076C0 17 | eldenring.exe+5849C0 - 4C 8B C8 - mov r9,rax 18 | eldenring.exe+5849C3 - 4C 8D 05 5E69C102 - lea r8,[eldenring.exe+319B328] { (-1774554331) } 19 | eldenring.exe+5849CA - BA B4000000 - mov edx,000000B4 { 180 } 20 | eldenring.exe+5849CF - 48 8D 0D 4A803602 - lea rcx,[eldenring.exe+28ECA20] { ("w:\gr\patch104\source\library\fd4\dist_win64_vc2015\include\Cor") } 21 | eldenring.exe+5849D6 - E8 A5B08701 - call eldenring.exe+1DFFA80 22 | eldenring.exe+5849DB - 48 8B 0D 065E6803 - mov rcx,[eldenring.exe+3C0A7E8] { (0) } 23 | eldenring.exe+5849E2 - 48 8B 49 60 - mov rcx,[rcx+60] 24 | eldenring.exe+5849E6 - 8B D3 - mov edx,ebx 25 | eldenring.exe+5849E8 - 48 83 C4 20 - add rsp,20 { 32 } 26 | eldenring.exe+5849EC - 5B - pop rbx 27 | eldenring.exe+5849ED - E9 8EA10600 - jmp eldenring.exe+5EEB80 28 | eldenring.exe+5849F2 - 48 85 DB - test rbx,rbx 29 | eldenring.exe+5849F5 - 0F85 76A4BEFF - jne eldenring.exe+16EE71 30 | eldenring.exe+5849FB - E9 C2DAE604 - jmp eldenring.exe+53F24C2 31 | eldenring.exe+584A00 - E9 8B690500 - jmp eldenring.exe+5DB390 32 | eldenring.exe+584A05 - CC - int 3 33 | 34 | RELEVANT FUNCTION: 35 | 36 | eldenring.exe+584A06 - 70 5B - jo eldenring.exe+584A63 37 | eldenring.exe+584A08 - 7F 85 - jg eldenring.exe+58498F 38 | eldenring.exe+584A0A - ED - in eax,dx 39 | eldenring.exe+584A0B - 17 - pop ss 40 | eldenring.exe+584A0C - E3 5A - jecxz eldenring.exe+584A68 41 | eldenring.exe+584A0E - B2 59 - mov dl,59 { 89 } 42 | eldenring.exe+584A10 - 48 83 C1 30 - add rcx,30 { 48 } 43 | eldenring.exe+584A14 - E9 97D00100 - jmp eldenring.exe+5A1AB0 44 | eldenring.exe+584A19 - 6A 18 - push 18 { 24 } 45 | eldenring.exe+584A1B - E9 64D7A800 - jmp eldenring.exe+1012184 46 | eldenring.exe+584A20 - 48 83 EC 28 - sub rsp,28 { 40 } 47 | eldenring.exe+584A24 - 48 8B 0D BD5D6803 - mov rcx,[eldenring.exe+3C0A7E8] { (0) } 48 | eldenring.exe+584A2B - 48 85 C9 - test rcx,rcx 49 | eldenring.exe+584A2E - 0F84 97000000 - je eldenring.exe+584ACB 50 | eldenring.exe+584A34 - 48 8B 05 AD366803 - mov rax,[eldenring.exe+3C080E8] { (0) } 51 | eldenring.exe+584A3B - 48 89 5C 24 20 - mov [rsp+20],rbx 52 | eldenring.exe+584A40 - 48 85 C0 - test rax,rax 53 | eldenring.exe+584A43 - 75 35 - jne eldenring.exe+584A7A 54 | eldenring.exe+584A45 - 48 8D 0D 80846703 - lea rcx,[eldenring.exe+3BFCECC] { (0) } 55 | eldenring.exe+584A4C - E8 6F2C8801 - call eldenring.exe+1E076C0 56 | eldenring.exe+584A51 - 4C 8B C8 - mov r9,rax 57 | eldenring.exe+584A54 - 4C 8D 05 CD68C102 - lea r8,[eldenring.exe+319B328] { (-1774554331) } 58 | eldenring.exe+584A5B - BA B4000000 - mov edx,000000B4 { 180 } 59 | eldenring.exe+584A60 - 48 8D 0D B97F3602 - lea rcx,[eldenring.exe+28ECA20] { ("w:\gr\patch104\source\library\fd4\dist_win64_vc2015\include\Cor") } 60 | eldenring.exe+584A67 - E8 14B08701 - call eldenring.exe+1DFFA80 61 | eldenring.exe+584A6C - 48 8B 0D 755D6803 - mov rcx,[eldenring.exe+3C0A7E8] { (0) } 62 | eldenring.exe+584A73 - 48 8B 05 6E366803 - mov rax,[eldenring.exe+3C080E8] { (0) } 63 | eldenring.exe+584A7A - 48 8B 98 68840100 - mov rbx,[rax+00018468] 64 | eldenring.exe+584A81 - 48 85 C9 - test rcx,rcx 65 | eldenring.exe+584A84 - 75 2E - jne eldenring.exe+584AB4 66 | eldenring.exe+584A86 - 48 8D 0D 75846703 - lea rcx,[eldenring.exe+3BFCF02] { (0) } 67 | eldenring.exe+584A8D - E8 2E2C8801 - call eldenring.exe+1E076C0 68 | eldenring.exe+584A92 - 4C 8B C8 - mov r9,rax 69 | eldenring.exe+584A95 - 4C 8D 05 8C68C102 - lea r8,[eldenring.exe+319B328] { (-1774554331) } 70 | eldenring.exe+584A9C - BA B4000000 - mov edx,000000B4 { 180 } 71 | eldenring.exe+584AA1 - 48 8D 0D 787F3602 - lea rcx,[eldenring.exe+28ECA20] { ("w:\gr\patch104\source\library\fd4\dist_win64_vc2015\include\Cor") } 72 | eldenring.exe+584AA8 - E8 D3AF8701 - call eldenring.exe+1DFFA80 73 | eldenring.exe+584AAD - 48 8B 0D 345D6803 - mov rcx,[eldenring.exe+3C0A7E8] { (0) } 74 | eldenring.exe+584AB4 - 48 8B 89 80000000 - mov rcx,[rcx+00000080] 75 | eldenring.exe+584ABB - 41 B0 01 - mov r8l,01 { 1 } 76 | eldenring.exe+584ABE - 48 8B D3 - mov rdx,rbx 77 | eldenring.exe+584AC1 - E8 4AB70500 - call eldenring.exe+5E0210 <----- NOP THIS 78 | eldenring.exe+584AC6 - 48 8B 5C 24 20 - mov rbx,[rsp+20] 79 | eldenring.exe+584ACB - 32 C0 - xor al,al 80 | eldenring.exe+584ACD - 48 83 C4 28 - add rsp,28 { 40 } 81 | eldenring.exe+584AD1 - C3 - ret 82 | 83 | FUNCTION BELOW: 84 | 85 | eldenring.exe+584AD2 - 48 89 14 24 - mov [rsp],rdx 86 | eldenring.exe+584AD6 - 48 8B 4C 24 10 - mov rcx,[rsp+10] 87 | eldenring.exe+584ADB - E9 73504604 - jmp eldenring.exe+49E9B53 88 | eldenring.exe+584AE0 - 48 8B C4 - mov rax,rsp 89 | eldenring.exe+584AE3 - 57 - push rdi 90 | eldenring.exe+584AE4 - 48 81 EC 80000000 - sub rsp,00000080 { 128 } 91 | eldenring.exe+584AEB - 48 8B F9 - mov rdi,rcx 92 | eldenring.exe+584AEE - 4C 89 78 D8 - mov [rax-28],r15 93 | eldenring.exe+584AF2 - 48 83 C1 71 - add rcx,71 { 113 } 94 | eldenring.exe+584AF6 - 48 C7 40 C8 FFFFFFFF - mov qword ptr [rax-38],FFFFFFFFFFFFFFFF { -1 } 95 | eldenring.exe+584AFE - 4C 8D 40 08 - lea r8,[rax+08] 96 | eldenring.exe+584B02 - 48 C7 40 D0 FFFFFFFF - mov qword ptr [rax-30],FFFFFFFFFFFFFFFF { -1 } 97 | eldenring.exe+584B0A - 48 8D 50 C8 - lea rdx,[rax-38] 98 | eldenring.exe+584B0E - C7 40 08 FFFFFFFF - mov [rax+08],FFFFFFFF { -1 } 99 | eldenring.exe+584B15 - E8 46476900 - call eldenring.exe+C19260 100 | eldenring.exe+584B1A - 84 C0 - test al,al 101 | eldenring.exe+584B1C - 0F84 C0000000 - je eldenring.exe+584BE2 102 | eldenring.exe+584B22 - 48 89 9C 24 98000000 - mov [rsp+00000098],rbx 103 | eldenring.exe+584B2A - 4C 89 64 24 70 - mov [rsp+70],r12 104 | eldenring.exe+584B2F - 45 33 E4 - xor r12d,r12d 105 | eldenring.exe+584B32 - 48 89 AC 24 A0000000 - mov [rsp+000000A0],rbp 106 | eldenring.exe+584B3A - 48 89 74 24 78 - mov [rsp+78],rsi 107 | eldenring.exe+584B3F - 4C 89 74 24 68 - mov [rsp+68],r14 108 | eldenring.exe+584B44 - 8B 5C 24 50 - mov ebx,[rsp+50] 109 | eldenring.exe+584B48 - 83 FB 47 - cmp ebx,47 { 71 } 110 | eldenring.exe+584B4B - 77 5C - ja eldenring.exe+584BA9 111 | eldenring.exe+584B4D - 8B 84 24 90000000 - mov eax,[rsp+00000090] 112 | eldenring.exe+584B54 - 48 8D 4F 30 - lea rcx,[rdi+30] 113 | eldenring.exe+584B58 - 8B 6C 24 58 - mov ebp,[rsp+58] 114 | eldenring.exe+584B5C - 8B D3 - mov edx,ebx 115 | eldenring.exe+584B5E - 44 8B 74 24 54 - mov r14d,[rsp+54] 116 | eldenring.exe+584B63 - 44 8B CD - mov r9d,ebp 117 | eldenring.exe+584B66 - 8B 74 24 5C - mov esi,[rsp+5C] 118 | eldenring.exe+584B6A - 45 8B C6 - mov r8d,r14d 119 | eldenring.exe+584B6D - C6 44 24 40 01 - mov byte ptr [rsp+40],01 { 1 } 120 | eldenring.exe+584B72 - 89 44 24 38 - mov [rsp+38],eax 121 | eldenring.exe+584B76 - 48 89 7C 24 30 - mov [rsp+30],rdi 122 | eldenring.exe+584B7B - 4C 89 64 24 28 - mov [rsp+28],r12 123 | eldenring.exe+584B80 - 89 74 24 20 - mov [rsp+20],esi 124 | eldenring.exe+584B84 - E8 E7D30100 - call eldenring.exe+5A1F70 125 | eldenring.exe+584B89 - 48 8B 0D B8536803 - mov rcx,[eldenring.exe+3C09F48] { (0) } 126 | eldenring.exe+584B90 - 48 85 C9 - test rcx,rcx 127 | eldenring.exe+584B93 - 74 14 - je eldenring.exe+584BA9 128 | eldenring.exe+584B95 - 48 8B 09 - mov rcx,[rcx] 129 | eldenring.exe+584B98 - 44 8B CD - mov r9d,ebp 130 | eldenring.exe+584B9B - 45 8B C6 - mov r8d,r14d 131 | eldenring.exe+584B9E - 89 74 24 20 - mov [rsp+20],esi 132 | eldenring.exe+584BA2 - 8B D3 - mov edx,ebx 133 | eldenring.exe+584BA4 - E8 57BDFFFF - call eldenring.exe+580900 134 | eldenring.exe+584BA9 - 4C 8D 84 24 90000000 - lea r8,[rsp+00000090] 135 | eldenring.exe+584BB1 - 48 8D 54 24 50 - lea rdx,[rsp+50] 136 | eldenring.exe+584BB6 - 48 8D 4F 71 - lea rcx,[rdi+71] 137 | eldenring.exe+584BBA - E8 A1466900 - call eldenring.exe+C19260 138 | eldenring.exe+584BBF - 84 C0 - test al,al 139 | eldenring.exe+584BC1 - 75 81 - jne eldenring.exe+584B44 140 | eldenring.exe+584BC3 - 4C 8B 74 24 68 - mov r14,[rsp+68] 141 | eldenring.exe+584BC8 - 4C 8B 64 24 70 - mov r12,[rsp+70] 142 | eldenring.exe+584BCD - 48 8B 74 24 78 - mov rsi,[rsp+78] 143 | eldenring.exe+584BD2 - 48 8B AC 24 A0000000 - mov rbp,[rsp+000000A0] 144 | eldenring.exe+584BDA - 48 8B 9C 24 98000000 - mov rbx,[rsp+00000098] 145 | eldenring.exe+584BE2 - 48 8B 05 7FAE6803 - mov rax,[eldenring.exe+3C0FA68] { (0) } 146 | eldenring.exe+584BE9 - 4C 8B 7C 24 60 - mov r15,[rsp+60] 147 | eldenring.exe+584BEE - 48 85 C0 - test rax,rax 148 | eldenring.exe+584BF1 - 75 2E - jne eldenring.exe+584C21 149 | eldenring.exe+584BF3 - 48 8D 0D 97046803 - lea rcx,[eldenring.exe+3C05091] { (0) } 150 | eldenring.exe+584BFA - E8 C12A8801 - call eldenring.exe+1E076C0 151 | eldenring.exe+584BFF - 4C 8B C8 - mov r9,rax 152 | eldenring.exe+584C02 - 4C 8D 05 1F67C102 - lea r8,[eldenring.exe+319B328] { (-1774554331) } 153 | eldenring.exe+584C09 - BA B4000000 - mov edx,000000B4 { 180 } 154 | eldenring.exe+584C0E - 48 8D 0D 0B7E3602 - lea rcx,[eldenring.exe+28ECA20] { ("w:\gr\patch104\source\library\fd4\dist_win64_vc2015\include\Cor") } 155 | eldenring.exe+584C15 - E8 66AE8701 - call eldenring.exe+1DFFA80 156 | eldenring.exe+584C1A - 48 8B 05 47AE6803 - mov rax,[eldenring.exe+3C0FA68] { (0) } 157 | eldenring.exe+584C21 - 0FB6 4F 75 - movzx ecx,byte ptr [rdi+75] 158 | eldenring.exe+584C25 - 88 88 85000000 - mov [rax+00000085],cl 159 | eldenring.exe+584C2B - 48 81 C4 80000000 - add rsp,00000080 { 128 } 160 | eldenring.exe+584C32 - 5F - pop rdi 161 | 162 | 163 | -------------------------------------------------------------------------------- /RemoveVignette/documentation.txt: -------------------------------------------------------------------------------- 1 | f3 0f 10 ? ? f3 0f 59 ? ? ? ? ? e8 ? ? ? ? f3 41 0f ? ? f3 45 0f ? ? 4c 8d ? ? ? ? ? ? 48 2 | 3 | FUNCTION ABOVE: 4 | 5 | 7FF726E3F530 - 48 81 EC 00010000 - sub rsp,00000100 6 | 7FF726E3F537 - 0F10 81 90000000 - movups xmm0,[rcx+00000090] 7 | 7FF726E3F53E - 4C 8D 4D 17 - lea r9,[rbp+17] 8 | 7FF726E3F542 - 48 8B F9 - mov rdi,rcx 9 | 7FF726E3F545 - F3 0F10 49 78 - movss xmm1,[rcx+78] 10 | 7FF726E3F54A - 48 8B DA - mov rbx,rdx 11 | 7FF726E3F54D - F3 0F10 51 7C - movss xmm2,[rcx+7C] 12 | 7FF726E3F552 - F3 0F59 0D 92FB6E01 - mulss xmm1,[7FF72852F0EC] 13 | 7FF726E3F55A - 0F29 45 37 - movaps [rbp+37],xmm0 14 | 7FF726E3F55E - 0F10 81 80000000 - movups xmm0,[rcx+00000080] 15 | 7FF726E3F565 - 48 8D 4D D7 - lea rcx,[rbp-29] 16 | 7FF726E3F569 - 0F29 70 E8 - movaps [rax-18],xmm6 17 | 7FF726E3F56D - 48 8D 45 37 - lea rax,[rbp+37] 18 | 7FF726E3F571 - 0F29 45 17 - movaps [rbp+17],xmm0 19 | 7FF726E3F575 - 48 89 44 24 20 - mov [rsp+20],rax 20 | 7FF726E3F57A - E8 61E60A00 - call 7FF726EEDBE0 21 | 7FF726E3F57F - F3 0F10 35 B1FB6E01 - movss xmm6,[7FF72852F138] 22 | 7FF726E3F587 - 0F28 50 20 - movaps xmm2,[rax+20] 23 | 7FF726E3F58B - 0F28 00 - movaps xmm0,[rax] 24 | 7FF726E3F58E - 0F28 48 10 - movaps xmm1,[rax+10] 25 | 7FF726E3F592 - 0F28 58 30 - movaps xmm3,[rax+30] 26 | 7FF726E3F596 - 0F29 03 - movaps [rbx],xmm0 27 | 7FF726E3F599 - 0F29 4B 10 - movaps [rbx+10],xmm1 28 | 7FF726E3F59D - 0F29 53 20 - movaps [rbx+20],xmm2 29 | 7FF726E3F5A1 - 0F29 5B 30 - movaps [rbx+30],xmm3 30 | 7FF726E3F5A5 - F3 0F10 97 A0000000 - movss xmm2,[rdi+000000A0] 31 | 7FF726E3F5AD - 0F2E D6 - ucomiss xmm2,xmm6 32 | 7FF726E3F5B0 - 7A 02 - jp 7FF726E3F5B4 33 | 7FF726E3F5B2 - 74 4D - je 7FF726E3F601 34 | 7FF726E3F5B4 - 0F57 C0 - xorps xmm0,xmm0 35 | 7FF726E3F5B7 - 48 8D 55 D7 - lea rdx,[rbp-29] 36 | 7FF726E3F5BB - 0F28 E2 - movaps xmm4,xmm2 37 | 7FF726E3F5BE - 0F57 C9 - xorps xmm1,xmm1 38 | 7FF726E3F5C1 - 0F14 E0 - unpcklps xmm4,xmm0 39 | 7FF726E3F5C4 - 0F57 DB - xorps xmm3,xmm3 40 | 7FF726E3F5C7 - 0F14 E1 - unpcklps xmm4,xmm1 41 | 7FF726E3F5CA - 48 8B CB - mov rcx,rbx 42 | 7FF726E3F5CD - 0F28 CA - movaps xmm1,xmm2 43 | 7FF726E3F5D0 - 0F29 65 D7 - movaps [rbp-29],xmm4 44 | 7FF726E3F5D4 - 0F14 C8 - unpcklps xmm1,xmm0 45 | 7FF726E3F5D7 - 0F28 C2 - movaps xmm0,xmm2 46 | 7FF726E3F5DA - 0F57 D2 - xorps xmm2,xmm2 47 | 7FF726E3F5DD - 0F14 D9 - unpcklps xmm3,xmm1 48 | 7FF726E3F5E0 - 0F14 D0 - unpcklps xmm2,xmm0 49 | 7FF726E3F5E3 - 0F57 C9 - xorps xmm1,xmm1 50 | 7FF726E3F5E6 - 0F28 05 A3A86C01 - movaps xmm0,[7FF728509E90] 51 | 7FF726E3F5ED - 0F14 D1 - unpcklps xmm2,xmm1 52 | 7FF726E3F5F0 - 0F29 55 F7 - movaps [rbp-09],xmm2 53 | 7FF726E3F5F4 - 0F29 5D E7 - movaps [rbp-19],xmm3 54 | 7FF726E3F5F8 - 0F29 45 07 - movaps [rbp+07],xmm0 55 | 7FF726E3F5FC - E8 2F5969FE - call 7FF7254D4F30 56 | 7FF726E3F601 - F3 0F10 87 A4000000 - movss xmm0,[rdi+000000A4] 57 | 7FF726E3F609 - 0F2E C6 - ucomiss xmm0,xmm6 58 | 7FF726E3F60C - 7A 06 - jp 7FF726E3F614 59 | 7FF726E3F60E - 0F84 84000000 - je 7FF726E3F698 60 | 7FF726E3F614 - F3 0F5C F0 - subss xmm6,xmm0 61 | 7FF726E3F618 - F3 0F11 45 9B - movss [rbp-65],xmm0 62 | 7FF726E3F61D - F3 0F11 45 87 - movss [rbp-79],xmm0 63 | 7FF726E3F622 - 48 8D 55 D7 - lea rdx,[rbp-29] 64 | 7FF726E3F626 - F3 0F11 45 AF - movss [rbp-51],xmm0 65 | 7FF726E3F62B - 48 8B CB - mov rcx,rbx 66 | 7FF726E3F62E - 48 C7 45 93 00000000 - mov qword ptr [rbp-6D],00000000 67 | 7FF726E3F636 - 48 C7 45 8B 00000000 - mov qword ptr [rbp-75],00000000 68 | 7FF726E3F63E - F3 0F59 35 DAFA6E01 - mulss xmm6,[7FF72852F120] 69 | 7FF726E3F646 - 48 C7 45 9F 00000000 - mov qword ptr [rbp-61],00000000 70 | 7FF726E3F64E - 0F28 45 87 - movaps xmm0,[rbp-79] 71 | 7FF726E3F652 - 0F28 4D 97 - movaps xmm1,[rbp-69] 72 | 7FF726E3F656 - 0F29 45 D7 - movaps [rbp-29],xmm0 73 | 7FF726E3F65A - 0F29 4D E7 - movaps [rbp-19],xmm1 74 | 7FF726E3F65E - F3 0F11 75 B7 - movss [rbp-49],xmm6 75 | 7FF726E3F663 - F3 0F11 75 BB - movss [rbp-45],xmm6 76 | 7FF726E3F668 - F3 0F11 75 BF - movss [rbp-41],xmm6 77 | 7FF726E3F66D - 48 C7 45 A7 00000000 - mov qword ptr [rbp-59],00000000 78 | 7FF726E3F675 - C7 45 B3 00000000 - mov [rbp-4D],00000000 79 | 7FF726E3F67C - 0F28 45 A7 - movaps xmm0,[rbp-59] 80 | 7FF726E3F680 - C7 45 C3 0000803F - mov [rbp-3D],3F800000 81 | 7FF726E3F687 - 0F28 4D B7 - movaps xmm1,[rbp-49] 82 | 7FF726E3F68B - 0F29 4D 07 - movaps [rbp+07],xmm1 83 | 7FF726E3F68F - 0F29 45 F7 - movaps [rbp-09],xmm0 84 | 7FF726E3F693 - E8 985869FE - call 7FF7254D4F30 85 | 7FF726E3F698 - 4C 8D 9C 24 00010000 - lea r11,[rsp+00000100] 86 | 7FF726E3F6A0 - 48 8B C3 - mov rax,rbx 87 | 7FF726E3F6A3 - 49 8B 5B 20 - mov rbx,[r11+20] 88 | 7FF726E3F6A7 - 49 8B 7B 28 - mov rdi,[r11+28] 89 | 7FF726E3F6AB - 41 0F28 73 F0 - movaps xmm6,[r11-10] 90 | 7FF726E3F6B0 - 49 8B E3 - mov rsp,r11 91 | 7FF726E3F6B3 - 5D - pop rbp 92 | 7FF726E3F6B4 - C3 - ret 93 | 94 | 95 | RELEVANT FUNCTION: 96 | 97 | 7FF726E3F6B6 - 4C 87 76 08 - xchg [rsi+08],r14 98 | 7FF726E3F6BA - EB 73 - jmp 7FF726E3F72F 99 | 7FF726E3F6BC - 0D 7A237348 - or eax,4873237A 100 | 7FF726E3F6C1 - 8B C4 - mov eax,esp 101 | 7FF726E3F6C3 - 53 - push rbx 102 | 7FF726E3F6C4 - 48 81 EC A0000000 - sub rsp,000000A0 103 | 7FF726E3F6CB - 0F29 78 E8 - movaps [rax-18],xmm7 104 | 7FF726E3F6CF - 0F57 C9 - xorps xmm1,xmm1 105 | 7FF726E3F6D2 - 44 0F29 40 D8 - movaps [rax-28],xmm8 106 | 7FF726E3F6D7 - 48 8B D9 - mov rbx,rcx 107 | 7FF726E3F6DA - 44 0F29 48 C8 - movaps [rax-38],xmm9 108 | 7FF726E3F6DF - 44 0F29 50 B8 - movaps [rax-48],xmm10 109 | 7FF726E3F6E4 - F3 44 0F10 52 6C - movss xmm10,[rdx+6C] 110 | 7FF726E3F6EA - 44 0F2E D1 - ucomiss xmm10,xmm1 111 | 7FF726E3F6EE - 44 0F29 58 A8 - movaps [rax-58],xmm11 112 | 7FF726E3F6F3 - 44 0F28 DB - movaps xmm11,xmm3 113 | 7FF726E3F6F7 - 44 0F29 60 98 - movaps [rax-68],xmm12 114 | 7FF726E3F6FC - 44 0F28 E2 - movaps xmm12,xmm2 115 | 7FF726E3F700 - 7A 1E - jp 7FF726E3F720 116 | 7FF726E3F702 - 75 1C - jne 7FF726E3F720 117 | 7FF726E3F704 - 8B 42 5C - mov eax,[rdx+5C] 118 | 7FF726E3F707 - 45 0F57 D2 - xorps xmm10,xmm10 119 | 7FF726E3F70B - 0F57 C0 - xorps xmm0,xmm0 120 | 7FF726E3F70E - F3 4C 0F2A D0 - cvtsi2ss xmm10,rax 121 | 7FF726E3F713 - 8B 42 60 - mov eax,[rdx+60] 122 | 7FF726E3F716 - F3 48 0F2A C0 - cvtsi2ss xmm0,rax 123 | 7FF726E3F71B - F3 44 0F5E D0 - divss xmm10,xmm0 124 | 7FF726E3F720 - F3 0F10 BC 24 D0000000 - movss xmm7,[rsp+000000D0] 125 | 7FF726E3F729 - 0F2F F9 - comiss xmm7,xmm1 126 | 7FF726E3F72C - F3 44 0F10 0D 03FA6E01 - movss xmm9,[7FF72852F138] 127 | 7FF726E3F735 - 45 0F28 C1 - movaps xmm8,xmm9 128 | 7FF726E3F739 - 76 0C - jna 7FF726E3F747 129 | 7FF726E3F73B - F3 41 0F58 F9 - addss xmm7,xmm9 130 | 7FF726E3F740 - F3 44 0F5E C7 - divss xmm8,xmm7 131 | 7FF726E3F745 - EB 0E - jmp 7FF726E3F755 132 | 7FF726E3F747 - F3 44 0F5C C7 - subss xmm8,xmm7 133 | 7FF726E3F74C - 41 0F28 F9 - movaps xmm7,xmm9 134 | 7FF726E3F750 - F3 41 0F5E F8 - divss xmm7,xmm8 135 | 7FF726E3F755 - F3 0F10 42 50 - movss xmm0,[rdx+50] <----- SIGNATURE 136 | 7FF726E3F75A - F3 0F59 05 BEF96E01 - mulss xmm0,[7FF72852F120] 137 | 7FF726E3F762 - E8 994D9900 - call 7FF7277D4500 138 | 7FF726E3F767 - F3 41 0F5C C1 - subss xmm0,xmm9 139 | 7FF726E3F76C - F3 45 0F59 C2 - mulss xmm8,xmm10 <----- CHANGE TO 0xf3 0x0f 0x5c 0xc0 0x90 140 | 7FF726E3F771 - 4C 8D 9C 24 A0000000 - lea r11,[rsp+000000A0] 141 | 7FF726E3F779 - 48 8B C3 - mov rax,rbx 142 | 7FF726E3F77C - 45 0F28 53 C0 - movaps xmm10,[r11-40] 143 | 7FF726E3F781 - F3 45 0F5E E3 - divss xmm12,xmm11 144 | 7FF726E3F786 - F3 0F59 84 24 D8000000 - mulss xmm0,[rsp+000000D8] 145 | 7FF726E3F78F - F3 44 0F11 64 24 28 - movss [rsp+28],xmm12 146 | 7FF726E3F796 - 45 0F28 63 A0 - movaps xmm12,[r11-60] 147 | 7FF726E3F79B - F3 41 0F58 C1 - addss xmm0,xmm9 148 | 7FF726E3F7A0 - F3 44 0F59 C0 - mulss xmm8,xmm0 149 | 7FF726E3F7A5 - F3 0F59 C7 - mulss xmm0,xmm7 150 | 7FF726E3F7A9 - 41 0F28 7B F0 - movaps xmm7,[r11-10] 151 | 7FF726E3F7AE - F3 44 0F11 44 24 20 - movss [rsp+20],xmm8 152 | 7FF726E3F7B5 - 45 0F28 43 E0 - movaps xmm8,[r11-20] 153 | 7FF726E3F7BA - F3 0F11 44 24 24 - movss [rsp+24],xmm0 154 | 7FF726E3F7C0 - 41 0F28 C3 - movaps xmm0,xmm11 155 | 7FF726E3F7C4 - F3 0F59 05 54F96E01 - mulss xmm0,[7FF72852F120] 156 | 7FF726E3F7CC - F3 44 0F5C C8 - subss xmm9,xmm0 157 | 7FF726E3F7D1 - F3 45 0F5E CB - divss xmm9,xmm11 158 | 7FF726E3F7D6 - 45 0F28 5B B0 - movaps xmm11,[r11-50] 159 | 7FF726E3F7DB - 44 0F57 0D 4D076F01 - xorps xmm9,[7FF72852FF30] 160 | 7FF726E3F7E3 - F3 44 0F11 4C 24 2C - movss [rsp+2C],xmm9 161 | 7FF726E3F7EA - 0F28 44 24 20 - movaps xmm0,[rsp+20] 162 | 7FF726E3F7EF - 45 0F28 4B D0 - movaps xmm9,[r11-30] 163 | 7FF726E3F7F4 - 0F11 03 - movups [rbx],xmm0 164 | 7FF726E3F7F7 - 49 8B E3 - mov rsp,r11 165 | 7FF726E3F7FA - 5B - pop rbx 166 | 7FF726E3F7FB - C3 - ret 167 | 168 | 169 | FUNCTION BELOW: 170 | 171 | 7FF726E3F7FC - 90 - nop 172 | 7FF726E3F7FD - 8B 01 - mov eax,[rcx] 173 | 7FF726E3F7FF - 39 0F - cmp [rdi],ecx 174 | 7FF726E3F801 - 28 05 A9FA6E01 - sub [7FF72852F2B0],al 175 | 7FF726E3F807 - 48 8D 91 AC000000 - lea rdx,[rcx+000000AC] 176 | 7FF726E3F80E - 45 33 D2 - xor r10d,r10d 177 | 7FF726E3F811 - C7 41 04 0000803F - mov [rcx+04],3F800000 178 | 7FF726E3F818 - 48 8D 42 08 - lea rax,[rdx+08] 179 | 7FF726E3F81C - 44 89 11 - mov [rcx],r10d 180 | 7FF726E3F81F - 48 3B D0 - cmp rdx,rax 181 | 7FF726E3F822 - C7 41 20 07000000 - mov [rcx+20],00000007 182 | 7FF726E3F829 - 41 B9 02000000 - mov r9d,00000002 183 | 7FF726E3F82F - C7 41 24 0000003F - mov [rcx+24],3F000000 184 | 7FF726E3F836 - 45 0F47 CA - cmova r9d,r10d 185 | 7FF726E3F83A - C7 41 30 CDCC0C40 - mov [rcx+30],400CCCCD 186 | 7FF726E3F841 - 0F11 41 10 - movups [rcx+10],xmm0 187 | 7FF726E3F845 - C7 41 34 00007A43 - mov [rcx+34],437A0000 188 | 7FF726E3F84C - 45 8B C2 - mov r8d,r10d 189 | 7FF726E3F84F - C7 41 28 CDCCCC3F - mov [rcx+28],3FCCCCCD 190 | 7FF726E3F856 - C7 41 2C 9A99D93F - mov [rcx+2C],3FD9999A 191 | 7FF726E3F85D - 66 C7 81 E8000000 0101 - mov word ptr [rcx+000000E8],0101 192 | 7FF726E3F866 - 44 88 51 38 - mov [rcx+38],r10l 193 | 7FF726E3F86A - C7 41 3C 000000C0 - mov [rcx+3C],C0000000 194 | 7FF726E3F871 - C7 41 40 0000803F - mov [rcx+40],3F800000 195 | 7FF726E3F878 - C7 41 44 0000003F - mov [rcx+44],3F000000 196 | 7FF726E3F87F - C7 41 48 00008040 - mov [rcx+48],40800000 197 | 7FF726E3F886 - C7 41 4C 00000041 - mov [rcx+4C],41000000 198 | 7FF726E3F88D - C7 41 50 000000C1 - mov [rcx+50],C1000000 199 | 7FF726E3F894 - 66 44 89 51 54 - mov [rcx+54],r10w 200 | 7FF726E3F899 - C7 41 58 07000000 - mov [rcx+58],00000007 201 | 7FF726E3F8A0 - C7 41 64 0000803F - mov [rcx+64],3F800000 202 | 7FF726E3F8A7 - C7 41 60 0000003F - mov [rcx+60],3F000000 203 | 7FF726E3F8AE - C7 41 6C 0000803F - mov [rcx+6C],3F800000 204 | 7FF726E3F8B5 - C7 41 5C 0000803F - mov [rcx+5C],3F800000 205 | 7FF726E3F8BC - 44 89 51 68 - mov [rcx+68],r10d 206 | 7FF726E3F8C0 - C7 41 70 CDCC4C3F - mov [rcx+70],3F4CCCCD 207 | 7FF726E3F8C7 - 48 C7 41 74 CDCC4C3F - mov qword ptr [rcx+74],3F4CCCCD 208 | 7FF726E3F8CF - C7 41 7C 0000803F - mov [rcx+7C],3F800000 209 | 7FF726E3F8D6 - 0F11 81 80000000 - movups [rcx+00000080],xmm0 210 | 7FF726E3F8DD - C7 81 A0000000 0000803F - mov [rcx+000000A0],3F800000 211 | 7FF726E3F8E7 - 0F11 81 90000000 - movups [rcx+00000090],xmm0 212 | 7FF726E3F8EE - C7 81 A4000000 0000803F - mov [rcx+000000A4],3F800000 213 | 7FF726E3F8F8 - 44 88 91 A8000000 - mov [rcx+000000A8],r10l 214 | 7FF726E3F8FF - 77 0F - ja 7FF726E3F910 215 | 7FF726E3F901 - 49 FF C0 - inc r8 216 | 7FF726E3F904 - 44 89 12 - mov [rdx],r10d 217 | 7FF726E3F907 - 48 8D 52 04 - lea rdx,[rdx+04] 218 | 7FF726E3F90B - 4D 3B C1 - cmp r8,r9 219 | 7FF726E3F90E - 75 F1 - jne 7FF726E3F901 220 | 7FF726E3F910 - C7 81 B4000000 0000803F - mov [rcx+000000B4],3F800000 221 | 7FF726E3F91A - 48 C7 81 B8000000 0000003F - mov qword ptr [rcx+000000B8],3F000000 222 | 7FF726E3F925 - 44 89 91 C0000000 - mov [rcx+000000C0],r10d 223 | 7FF726E3F92C - 48 C7 81 C4000000 07000000 - mov qword ptr [rcx+000000C4],00000007 224 | 7FF726E3F937 - 44 88 91 CC000000 - mov [rcx+000000CC],r10l 225 | 7FF726E3F93E - 44 89 91 D0000000 - mov [rcx+000000D0],r10d 226 | 7FF726E3F945 - 48 C7 81 D4000000 0000003F - mov qword ptr [rcx+000000D4],3F000000 227 | 7FF726E3F950 - 48 C7 81 DC000000 CDCCCC3E - mov qword ptr [rcx+000000DC],3ECCCCCD 228 | 7FF726E3F95B - 44 89 91 E4000000 - mov [rcx+000000E4],r10d 229 | 7FF726E3F962 - C3 - ret 230 | 231 | -------------------------------------------------------------------------------- /ModUtils.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | #include "ini.h" 17 | 18 | namespace ModUtils 19 | { 20 | static HWND muWindow = NULL; 21 | static std::string muGameName = "ELDEN RING"; 22 | static std::string muExpectedWindowName = "ELDEN RING™"; 23 | static std::ofstream muLogFile; 24 | static const std::string muAobMask = "?"; 25 | 26 | class Timer 27 | { 28 | public: 29 | Timer(unsigned int intervalMs) 30 | { 31 | this->intervalMs = intervalMs; 32 | } 33 | 34 | bool Check() 35 | { 36 | if (firstCheck) 37 | { 38 | Reset(); 39 | firstCheck = false; 40 | } 41 | 42 | auto now = std::chrono::system_clock::now(); 43 | auto diff = std::chrono::duration_cast(now - lastPassedCheckTime); 44 | if (diff.count() >= intervalMs) 45 | { 46 | lastPassedCheckTime = now; 47 | return true; 48 | } 49 | 50 | return false; 51 | } 52 | 53 | void Reset() 54 | { 55 | lastPassedCheckTime = std::chrono::system_clock::now(); 56 | } 57 | 58 | private: 59 | unsigned int intervalMs = 0; 60 | bool firstCheck = true; 61 | std::chrono::system_clock::time_point lastPassedCheckTime; 62 | }; 63 | 64 | static std::string _GetModuleName(bool mainProcessModule) 65 | { 66 | HMODULE module = NULL; 67 | 68 | if (!mainProcessModule) 69 | { 70 | static char dummyStaticVarToGetModuleHandle = 'x'; 71 | GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, &dummyStaticVarToGetModuleHandle, &module); 72 | } 73 | 74 | char lpFilename[MAX_PATH]; 75 | GetModuleFileNameA(module, lpFilename, sizeof(lpFilename)); 76 | std::string moduleName = strrchr(lpFilename, '\\'); 77 | moduleName = moduleName.substr(1, moduleName.length()); 78 | 79 | if (!mainProcessModule) 80 | { 81 | moduleName.erase(moduleName.find(".dll"), moduleName.length()); 82 | } 83 | 84 | return moduleName; 85 | } 86 | 87 | static std::string GetCurrentProcessName() 88 | { 89 | return _GetModuleName(true); 90 | } 91 | 92 | static std::string GetCurrentModName() 93 | { 94 | static std::string currentModName = "NULL"; 95 | if (currentModName == "NULL") 96 | { 97 | currentModName = _GetModuleName(false); 98 | } 99 | return currentModName; 100 | } 101 | 102 | static std::string GetModFolderPath() 103 | { 104 | return std::string("mods\\" + GetCurrentModName()); 105 | } 106 | 107 | static void OpenModLogFile() 108 | { 109 | if (!muLogFile.is_open()) 110 | { 111 | CreateDirectoryA(std::string("mods\\" + GetCurrentModName()).c_str(), NULL); 112 | muLogFile.open("mods\\" + GetCurrentModName() + "\\log.txt"); 113 | } 114 | } 115 | 116 | template 117 | static void Log(Types... args) 118 | { 119 | OpenModLogFile(); 120 | 121 | std::stringstream stream; 122 | stream << GetCurrentModName() << " > "; 123 | (stream << ... << args) << std::endl; 124 | std::cout << stream.str(); 125 | 126 | if (muLogFile.is_open()) 127 | { 128 | muLogFile << stream.str(); 129 | muLogFile.flush(); 130 | } 131 | } 132 | 133 | static void CloseLog() 134 | { 135 | if (muLogFile.is_open()) 136 | { 137 | muLogFile.close(); 138 | } 139 | } 140 | 141 | static void ShowErrorPopup(std::string error) 142 | { 143 | GetCurrentModName(); 144 | Log("Error popup: ", error); 145 | MessageBox(NULL, error.c_str(), GetCurrentModName().c_str(), MB_OK | MB_ICONERROR | MB_SYSTEMMODAL); 146 | } 147 | 148 | static DWORD_PTR GetProcessBaseAddress(DWORD processId) 149 | { 150 | DWORD_PTR baseAddress = 0; 151 | HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId); 152 | HMODULE* moduleArray = nullptr; 153 | LPBYTE moduleArrayBytes = 0; 154 | DWORD bytesRequired = 0; 155 | 156 | if (processHandle) 157 | { 158 | if (EnumProcessModules(processHandle, NULL, 0, &bytesRequired)) 159 | { 160 | if (bytesRequired) 161 | { 162 | moduleArrayBytes = (LPBYTE)LocalAlloc(LPTR, bytesRequired); 163 | if (moduleArrayBytes) 164 | { 165 | unsigned int moduleCount; 166 | moduleCount = bytesRequired / sizeof(HMODULE); 167 | moduleArray = (HMODULE*)moduleArrayBytes; 168 | if (EnumProcessModules(processHandle, moduleArray, bytesRequired, &bytesRequired)) 169 | { 170 | baseAddress = (DWORD_PTR)moduleArray[0]; 171 | } 172 | LocalFree(moduleArrayBytes); 173 | } 174 | } 175 | } 176 | CloseHandle(processHandle); 177 | } 178 | return baseAddress; 179 | } 180 | 181 | static void ToggleMemoryProtection(bool protectionEnabled, uintptr_t address, size_t size) 182 | { 183 | static std::map protectionHistory; 184 | if (protectionEnabled && protectionHistory.find(address) != protectionHistory.end()) 185 | { 186 | VirtualProtect((void*)address, size, protectionHistory[address], &protectionHistory[address]); 187 | protectionHistory.erase(address); 188 | } 189 | else if (!protectionEnabled && protectionHistory.find(address) == protectionHistory.end()) 190 | { 191 | DWORD oldProtection = 0; 192 | VirtualProtect((void*)address, size, PAGE_EXECUTE_READWRITE, &oldProtection); 193 | protectionHistory[address] = oldProtection; 194 | } 195 | } 196 | 197 | static void MemCopy(uintptr_t destination, uintptr_t source, size_t numBytes) 198 | { 199 | ToggleMemoryProtection(false, destination, numBytes); 200 | ToggleMemoryProtection(false, source, numBytes); 201 | memcpy((void*)destination, (void*)source, numBytes); 202 | ToggleMemoryProtection(true, source, numBytes); 203 | ToggleMemoryProtection(true, destination, numBytes); 204 | } 205 | 206 | static void MemSet(uintptr_t address, unsigned char byte, size_t numBytes) 207 | { 208 | ToggleMemoryProtection(false, address, numBytes); 209 | memset((void*)address, byte, numBytes); 210 | ToggleMemoryProtection(true, address, numBytes); 211 | } 212 | 213 | static uintptr_t RelativeToAbsoluteAddress(uintptr_t relativeAddressLocation) 214 | { 215 | uintptr_t absoluteAddress = 0; 216 | intptr_t relativeAddress = 0; 217 | MemCopy((uintptr_t)&relativeAddress, relativeAddressLocation, 4); 218 | absoluteAddress = relativeAddressLocation + 4 + relativeAddress; 219 | return absoluteAddress; 220 | } 221 | 222 | static std::vector TokenifyAobString(std::string aob) 223 | { 224 | std::istringstream iss(aob); 225 | std::vector aobTokens { 226 | std::istream_iterator{iss}, 227 | std::istream_iterator{} 228 | }; 229 | return aobTokens; 230 | } 231 | 232 | static bool IsAobValid(std::vector aobTokens) 233 | { 234 | for (auto byte : aobTokens) 235 | { 236 | if (byte == muAobMask) 237 | { 238 | continue; 239 | } 240 | 241 | if (byte.length() != 2) 242 | { 243 | return false; 244 | } 245 | 246 | std::string whitelist = "0123456789abcdef"; 247 | if (byte.find_first_not_of(whitelist) != std::string::npos) 248 | { 249 | return false; 250 | } 251 | } 252 | return true; 253 | } 254 | 255 | static bool VerifyAob(std::string aob) 256 | { 257 | std::vector aobTokens = TokenifyAobString(aob); 258 | if (!IsAobValid(aobTokens)) 259 | { 260 | ShowErrorPopup("AOB is invalid! (" + aob + ")"); 261 | return false; 262 | }; 263 | return true; 264 | } 265 | 266 | static bool VerifyAobs(std::vector aobs) 267 | { 268 | for (auto aob : aobs) 269 | { 270 | if (!VerifyAob(aob)) 271 | { 272 | return false; 273 | } 274 | } 275 | return true; 276 | } 277 | 278 | template 279 | static std::string NumberToHexString(T number) 280 | { 281 | std::stringstream stream; 282 | stream 283 | << std::setfill('0') 284 | << std::setw(sizeof(T) * 2) 285 | << std::hex 286 | << number; 287 | return stream.str(); 288 | } 289 | 290 | static std::string NumberToHexString(unsigned char number) 291 | { 292 | std::stringstream stream; 293 | stream 294 | << std::setw(2) 295 | << std::setfill('0') 296 | << std::hex 297 | << (unsigned int)number; // The << operator overload for unsigned chars screws us over unless this cast is done 298 | return stream.str(); 299 | } 300 | 301 | static uintptr_t AobScan(std::string aob) 302 | { 303 | std::vector aobTokens = TokenifyAobString(aob); 304 | 305 | DWORD processId = GetCurrentProcessId(); 306 | uintptr_t regionStart = GetProcessBaseAddress(processId); 307 | Log("Process name: ", GetCurrentProcessName()); 308 | Log("Process ID: ", processId); 309 | Log("Process base address: ", NumberToHexString(regionStart)); 310 | Log("AOB: ", aob); 311 | 312 | if (!VerifyAob(aob)) 313 | { 314 | return 0; 315 | }; 316 | 317 | size_t numRegionsChecked = 0; 318 | size_t maxRegionsToCheck = 10000; 319 | uintptr_t currentAddress = 0; 320 | while (numRegionsChecked < maxRegionsToCheck) 321 | { 322 | MEMORY_BASIC_INFORMATION memoryInfo = { 0 }; 323 | if (VirtualQuery((void*)regionStart, &memoryInfo, sizeof(MEMORY_BASIC_INFORMATION)) == 0) 324 | { 325 | DWORD error = GetLastError(); 326 | if (error == ERROR_INVALID_PARAMETER) 327 | { 328 | Log("Reached end of scannable memory."); 329 | } 330 | else 331 | { 332 | Log("VirtualQuery failed, error code: ", error); 333 | } 334 | break; 335 | } 336 | regionStart = (uintptr_t)memoryInfo.BaseAddress; 337 | uintptr_t regionSize = (uintptr_t)memoryInfo.RegionSize; 338 | uintptr_t regionEnd = regionStart + regionSize; 339 | uintptr_t protection = (uintptr_t)memoryInfo.Protect; 340 | uintptr_t state = (uintptr_t)memoryInfo.State; 341 | 342 | bool isMemoryReadable = ( 343 | protection == PAGE_EXECUTE_READWRITE 344 | || protection == PAGE_READWRITE 345 | || protection == PAGE_READONLY 346 | || protection == PAGE_WRITECOPY 347 | || protection == PAGE_EXECUTE_WRITECOPY) 348 | && state == MEM_COMMIT; 349 | if (isMemoryReadable) 350 | { 351 | Log("Checking region: ", NumberToHexString(regionStart)); 352 | currentAddress = regionStart; 353 | while (currentAddress < regionEnd - aobTokens.size()) 354 | { 355 | for (size_t i = 0; i < aobTokens.size(); i++) 356 | { 357 | if (aobTokens[i] == muAobMask) 358 | { 359 | currentAddress++; 360 | continue; 361 | } 362 | else if (*(unsigned char*)currentAddress != (unsigned char)std::stoul(aobTokens[i], nullptr, 16)) 363 | { 364 | currentAddress++; 365 | break; 366 | } 367 | else if (i == aobTokens.size() - 1) 368 | { 369 | uintptr_t signature = currentAddress - aobTokens.size() + 1; 370 | Log("Found signature at ", NumberToHexString(signature)); 371 | return signature; 372 | } 373 | currentAddress++; 374 | } 375 | } 376 | } 377 | else 378 | { 379 | Log("Skipped region: ", NumberToHexString(regionStart)); 380 | } 381 | 382 | numRegionsChecked++; 383 | regionStart += memoryInfo.RegionSize; 384 | } 385 | 386 | Log("Stopped at: ", NumberToHexString(currentAddress), ", num regions checked: ", numRegionsChecked); 387 | ShowErrorPopup("Could not find signature!"); 388 | return 0; 389 | } 390 | 391 | static std::vector StringAobToRawAob(std::string aob) 392 | { 393 | std::vector rawAob; 394 | std::vector tokenifiedAob = TokenifyAobString(aob); 395 | for (size_t i = 0; i < tokenifiedAob.size(); i++) 396 | { 397 | if (tokenifiedAob[i] == muAobMask) 398 | { 399 | ShowErrorPopup("Cannot convert AOB with mask to raw AOB"); 400 | return std::vector(); 401 | } 402 | 403 | unsigned char byte = (unsigned char)std::stoul(tokenifiedAob[i], nullptr, 16); 404 | rawAob.push_back(byte); 405 | } 406 | return rawAob; 407 | } 408 | 409 | static std::string RawAobToStringAob(std::vector rawAob) 410 | { 411 | std::string aob; 412 | for (auto byte : rawAob) 413 | { 414 | std::string string = NumberToHexString(byte); 415 | aob += string + " "; 416 | } 417 | aob.pop_back(); 418 | return aob; 419 | } 420 | 421 | static bool CheckIfAobsMatch(std::string aob1, std::string aob2) 422 | { 423 | std::vector aob1Tokens = TokenifyAobString(aob1); 424 | std::vector aob2Tokens = TokenifyAobString(aob2); 425 | 426 | size_t shortestAobLength = aob1Tokens.size() < aob2Tokens.size() ? aob1Tokens.size() : aob2Tokens.size(); 427 | for (size_t i = 0; i < shortestAobLength; i++) 428 | { 429 | bool tokenIsMasked = aob1Tokens[i] == muAobMask || aob2Tokens[i] == muAobMask; 430 | if (tokenIsMasked) 431 | { 432 | continue; 433 | } 434 | 435 | if (aob1Tokens[i] != aob2Tokens[i]) 436 | { 437 | ShowErrorPopup("Bytes do not match!"); 438 | return false; 439 | } 440 | } 441 | return true; 442 | } 443 | 444 | static bool ReplaceExpectedBytesAtAddress(uintptr_t address, std::string expectedBytes, std::string newBytes) 445 | { 446 | if (!VerifyAobs({ expectedBytes, newBytes })) 447 | { 448 | return false; 449 | } 450 | 451 | std::vector expectedBytesTokens = TokenifyAobString(expectedBytes); 452 | std::vector existingBytesBuffer(expectedBytesTokens.size(), 0); 453 | MemCopy((uintptr_t)&existingBytesBuffer[0], address, existingBytesBuffer.size()); 454 | std::string existingBytes = RawAobToStringAob(existingBytesBuffer); 455 | 456 | Log("Bytes at address: ", existingBytes); 457 | Log("Expected bytes: ", expectedBytes); 458 | Log("New bytes: ", newBytes); 459 | 460 | if (CheckIfAobsMatch(existingBytes, expectedBytes)) 461 | { 462 | Log("Bytes match"); 463 | std::vector rawNewBytes = StringAobToRawAob(newBytes); 464 | MemCopy(address, (uintptr_t)&rawNewBytes[0], rawNewBytes.size()); 465 | Log("Patch applied"); 466 | return true; 467 | } 468 | 469 | return false; 470 | } 471 | 472 | static void GetWindowHandleByName(std::string windowName) 473 | { 474 | HWND hwnd = FindWindowExA(NULL, NULL, NULL, windowName.c_str()); 475 | DWORD processId = 0; 476 | GetWindowThreadProcessId(hwnd, &processId); 477 | if (processId == GetCurrentProcessId()) 478 | { 479 | muWindow = hwnd; 480 | Log("FindWindowExA: found window handle"); 481 | } 482 | } 483 | 484 | static BOOL CALLBACK EnumWindowHandles(HWND hwnd, LPARAM lParam) 485 | { 486 | DWORD processId = NULL; 487 | GetWindowThreadProcessId(hwnd, &processId); 488 | if (processId == GetCurrentProcessId()) 489 | { 490 | char buffer[100]; 491 | GetWindowTextA(hwnd, buffer, 100); 492 | Log("Found window belonging to ER: ", buffer); 493 | if (std::string(buffer).find(muGameName) != std::string::npos) 494 | { 495 | Log(buffer, " handle selected"); 496 | muWindow = hwnd; 497 | return false; 498 | } 499 | } 500 | return true; 501 | } 502 | 503 | static void GetWindowHandleByEnumeration() 504 | { 505 | Log("Enumerating windows..."); 506 | EnumWindows(&EnumWindowHandles, NULL); 507 | if (muWindow != NULL) 508 | { 509 | return; 510 | } 511 | } 512 | 513 | static bool GetWindowHandle() 514 | { 515 | Log("Finding application window..."); 516 | 517 | // From experience it can be tricky to find the game window consistently using only one technique, 518 | // (seems to differ from machine to machine for some reason) so we attempt multiple techniques. 519 | bool lookingForWindowHandle = true; 520 | unsigned int maxAttempts = 10000; 521 | unsigned int attempts = 0; 522 | while (lookingForWindowHandle) 523 | { 524 | if (muWindow == NULL) 525 | { 526 | GetWindowHandleByName(muExpectedWindowName); 527 | } 528 | 529 | if (muWindow == NULL) 530 | { 531 | GetWindowHandleByEnumeration(); 532 | } 533 | 534 | if (attempts >= maxAttempts || muWindow != NULL) 535 | { 536 | lookingForWindowHandle = false; 537 | } 538 | else 539 | { 540 | attempts++; 541 | Sleep(1); 542 | } 543 | } 544 | 545 | return (muWindow == NULL) ? false : true; 546 | } 547 | 548 | static void AttemptToGetWindowHandle() 549 | { 550 | static bool hasAttemptedToGetWindowHandle = false; 551 | 552 | if (!hasAttemptedToGetWindowHandle) 553 | { 554 | if (GetWindowHandle()) 555 | { 556 | char buffer[100]; 557 | GetWindowTextA(muWindow, buffer, 100); 558 | Log("Found application window: ", buffer); 559 | } 560 | else 561 | { 562 | Log("Failed to get window handle, inputs will be detected globally!"); 563 | } 564 | hasAttemptedToGetWindowHandle = true; 565 | } 566 | } 567 | 568 | static bool AreKeysPressed(std::vector keys, bool trueWhileHolding = false, bool checkController = false) 569 | { 570 | static std::vector> notReleasedKeys; 571 | 572 | AttemptToGetWindowHandle(); 573 | 574 | bool ignoreOutOfFocusInput = muWindow != NULL && muWindow != GetForegroundWindow(); 575 | if(ignoreOutOfFocusInput) 576 | { 577 | return false; 578 | } 579 | 580 | size_t numKeys = keys.size(); 581 | size_t numKeysBeingPressed = 0; 582 | 583 | if (checkController) 584 | { 585 | for (DWORD controllerIndex = 0; controllerIndex < XUSER_MAX_COUNT; controllerIndex++) 586 | { 587 | XINPUT_STATE state = { 0 }; 588 | DWORD result = XInputGetState(controllerIndex, &state); 589 | if (result == ERROR_SUCCESS) 590 | { 591 | for (auto key : keys) 592 | { 593 | if ((key & state.Gamepad.wButtons) == key) 594 | { 595 | numKeysBeingPressed++; 596 | } 597 | } 598 | } 599 | } 600 | } 601 | else 602 | { 603 | for (auto key : keys) 604 | { 605 | if (GetAsyncKeyState(key)) 606 | { 607 | numKeysBeingPressed++; 608 | } 609 | } 610 | } 611 | 612 | auto iterator = std::find(notReleasedKeys.begin(), notReleasedKeys.end(), keys); 613 | bool keysBeingHeld = iterator != notReleasedKeys.end(); 614 | if (numKeysBeingPressed == numKeys) 615 | { 616 | if (keysBeingHeld) 617 | { 618 | if (!trueWhileHolding) 619 | { 620 | return false; 621 | } 622 | } 623 | else 624 | { 625 | notReleasedKeys.push_back(keys); 626 | } 627 | } 628 | else 629 | { 630 | if (keysBeingHeld) 631 | { 632 | notReleasedKeys.erase(iterator); 633 | } 634 | return false; 635 | } 636 | 637 | return true; 638 | } 639 | 640 | static bool AreKeysPressed(unsigned short key, bool trueWhileHolding = false, bool checkController = false) 641 | { 642 | return AreKeysPressed({ key }, trueWhileHolding, checkController); 643 | } 644 | 645 | static void Hook(uintptr_t address, uintptr_t destination, size_t extraClearance = 0) 646 | { 647 | size_t clearance = 14 + extraClearance; 648 | MemSet(address, 0x90, clearance); 649 | *(uintptr_t*)address = 0x0000000025ff; 650 | MemCopy((address + 6), (uintptr_t)&destination, 8); 651 | Log("Created jump from ", NumberToHexString(address), " to ", NumberToHexString(destination), " with a clearance of ", clearance); 652 | } 653 | } 654 | -------------------------------------------------------------------------------- /ini.h: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License (MIT) 3 | * Copyright (c) 2018 Danijel Durakovic 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | * this software and associated documentation files (the "Software"), to deal in 7 | * the Software without restriction, including without limitation the rights to 8 | * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 9 | * of the Software, and to permit persons to whom the Software is furnished to do 10 | * so, subject to the following conditions: 11 | * 12 | * The above copyright notice and this permission notice shall be included in all 13 | * copies or substantial portions of the Software. 14 | * 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | * 22 | */ 23 | 24 | /////////////////////////////////////////////////////////////////////////////// 25 | // 26 | // /mINI/ v0.9.11 27 | // An INI file reader and writer for the modern age. 28 | // 29 | /////////////////////////////////////////////////////////////////////////////// 30 | // 31 | // A tiny utility library for manipulating INI files with a straightforward 32 | // API and a minimal footprint. It conforms to the (somewhat) standard INI 33 | // format - sections and keys are case insensitive and all leading and 34 | // trailing whitespace is ignored. Comments are lines that begin with a 35 | // semicolon. Trailing comments are allowed on section lines. 36 | // 37 | // Files are read on demand, upon which data is kept in memory and the file 38 | // is closed. This utility supports lazy writing, which only writes changes 39 | // and updates to a file and preserves custom formatting and comments. A lazy 40 | // write invoked by a write() call will read the output file, find what 41 | // changes have been made and update the file accordingly. If you only need to 42 | // generate files, use generate() instead. Section and key order is preserved 43 | // on read, write and insert. 44 | // 45 | /////////////////////////////////////////////////////////////////////////////// 46 | // 47 | // /* BASIC USAGE EXAMPLE: */ 48 | // 49 | // /* read from file */ 50 | // mINI::INIFile file("myfile.ini"); 51 | // mINI::INIStructure ini; 52 | // file.read(ini); 53 | // 54 | // /* read value; gets a reference to actual value in the structure. 55 | // if key or section don't exist, a new empty value will be created */ 56 | // std::string& value = ini["section"]["key"]; 57 | // 58 | // /* read value safely; gets a copy of value in the structure. 59 | // does not alter the structure */ 60 | // std::string value = ini.get("section").get("key"); 61 | // 62 | // /* set or update values */ 63 | // ini["section"]["key"] = "value"; 64 | // 65 | // /* set multiple values */ 66 | // ini["section2"].set({ 67 | // {"key1", "value1"}, 68 | // {"key2", "value2"} 69 | // }); 70 | // 71 | // /* write updates back to file, preserving comments and formatting */ 72 | // file.write(ini); 73 | // 74 | // /* or generate a file (overwrites the original) */ 75 | // file.generate(ini); 76 | // 77 | /////////////////////////////////////////////////////////////////////////////// 78 | // 79 | // Long live the INI file!!! 80 | // 81 | /////////////////////////////////////////////////////////////////////////////// 82 | 83 | #ifndef MINI_INI_H_ 84 | #define MINI_INI_H_ 85 | 86 | #include 87 | #include 88 | #include 89 | #include 90 | #include 91 | #include 92 | #include 93 | #include 94 | #include 95 | #include 96 | 97 | namespace mINI 98 | { 99 | namespace INIStringUtil 100 | { 101 | const char* const whitespaceDelimiters = " \t\n\r\f\v"; 102 | inline void trim(std::string& str) 103 | { 104 | str.erase(str.find_last_not_of(whitespaceDelimiters) + 1); 105 | str.erase(0, str.find_first_not_of(whitespaceDelimiters)); 106 | } 107 | #ifndef MINI_CASE_SENSITIVE 108 | inline void toLower(std::string& str) 109 | { 110 | std::transform(str.begin(), str.end(), str.begin(), [](const char c) { 111 | return static_cast(std::tolower(c)); 112 | }); 113 | } 114 | #endif 115 | inline void replace(std::string& str, std::string const& a, std::string const& b) 116 | { 117 | if (!a.empty()) 118 | { 119 | std::size_t pos = 0; 120 | while ((pos = str.find(a, pos)) != std::string::npos) 121 | { 122 | str.replace(pos, a.size(), b); 123 | pos += b.size(); 124 | } 125 | } 126 | } 127 | #ifdef _WIN32 128 | const char* const endl = "\r\n"; 129 | #else 130 | const char* const endl = "\n"; 131 | #endif 132 | } 133 | 134 | template 135 | class INIMap 136 | { 137 | private: 138 | using T_DataIndexMap = std::unordered_map; 139 | using T_DataItem = std::pair; 140 | using T_DataContainer = std::vector; 141 | using T_MultiArgs = typename std::vector>; 142 | 143 | T_DataIndexMap dataIndexMap; 144 | T_DataContainer data; 145 | 146 | inline std::size_t setEmpty(std::string& key) 147 | { 148 | std::size_t index = data.size(); 149 | dataIndexMap[key] = index; 150 | data.emplace_back(key, T()); 151 | return index; 152 | } 153 | 154 | public: 155 | using const_iterator = typename T_DataContainer::const_iterator; 156 | 157 | INIMap() { } 158 | 159 | INIMap(INIMap const& other) 160 | { 161 | std::size_t data_size = other.data.size(); 162 | for (std::size_t i = 0; i < data_size; ++i) 163 | { 164 | auto const& key = other.data[i].first; 165 | auto const& obj = other.data[i].second; 166 | data.emplace_back(key, obj); 167 | } 168 | dataIndexMap = T_DataIndexMap(other.dataIndexMap); 169 | } 170 | 171 | T& operator[](std::string key) 172 | { 173 | INIStringUtil::trim(key); 174 | #ifndef MINI_CASE_SENSITIVE 175 | INIStringUtil::toLower(key); 176 | #endif 177 | auto it = dataIndexMap.find(key); 178 | bool hasIt = (it != dataIndexMap.end()); 179 | std::size_t index = (hasIt) ? it->second : setEmpty(key); 180 | return data[index].second; 181 | } 182 | T get(std::string key) const 183 | { 184 | INIStringUtil::trim(key); 185 | #ifndef MINI_CASE_SENSITIVE 186 | INIStringUtil::toLower(key); 187 | #endif 188 | auto it = dataIndexMap.find(key); 189 | if (it == dataIndexMap.end()) 190 | { 191 | return T(); 192 | } 193 | return T(data[it->second].second); 194 | } 195 | bool has(std::string key) const 196 | { 197 | INIStringUtil::trim(key); 198 | #ifndef MINI_CASE_SENSITIVE 199 | INIStringUtil::toLower(key); 200 | #endif 201 | return (dataIndexMap.count(key) == 1); 202 | } 203 | void set(std::string key, T obj) 204 | { 205 | INIStringUtil::trim(key); 206 | #ifndef MINI_CASE_SENSITIVE 207 | INIStringUtil::toLower(key); 208 | #endif 209 | auto it = dataIndexMap.find(key); 210 | if (it != dataIndexMap.end()) 211 | { 212 | data[it->second].second = obj; 213 | } 214 | else 215 | { 216 | dataIndexMap[key] = data.size(); 217 | data.emplace_back(key, obj); 218 | } 219 | } 220 | void set(T_MultiArgs const& multiArgs) 221 | { 222 | for (auto const& it : multiArgs) 223 | { 224 | auto const& key = it.first; 225 | auto const& obj = it.second; 226 | set(key, obj); 227 | } 228 | } 229 | bool remove(std::string key) 230 | { 231 | INIStringUtil::trim(key); 232 | #ifndef MINI_CASE_SENSITIVE 233 | INIStringUtil::toLower(key); 234 | #endif 235 | auto it = dataIndexMap.find(key); 236 | if (it != dataIndexMap.end()) 237 | { 238 | std::size_t index = it->second; 239 | data.erase(data.begin() + index); 240 | dataIndexMap.erase(it); 241 | for (auto& it2 : dataIndexMap) 242 | { 243 | auto& vi = it2.second; 244 | if (vi > index) 245 | { 246 | vi--; 247 | } 248 | } 249 | return true; 250 | } 251 | return false; 252 | } 253 | void clear() 254 | { 255 | data.clear(); 256 | dataIndexMap.clear(); 257 | } 258 | std::size_t size() const 259 | { 260 | return data.size(); 261 | } 262 | const_iterator begin() const { return data.begin(); } 263 | const_iterator end() const { return data.end(); } 264 | }; 265 | 266 | using INIStructure = INIMap>; 267 | 268 | namespace INIParser 269 | { 270 | using T_ParseValues = std::pair; 271 | 272 | enum class PDataType : char 273 | { 274 | PDATA_NONE, 275 | PDATA_COMMENT, 276 | PDATA_SECTION, 277 | PDATA_KEYVALUE, 278 | PDATA_UNKNOWN 279 | }; 280 | 281 | inline PDataType parseLine(std::string line, T_ParseValues& parseData) 282 | { 283 | parseData.first.clear(); 284 | parseData.second.clear(); 285 | INIStringUtil::trim(line); 286 | if (line.empty()) 287 | { 288 | return PDataType::PDATA_NONE; 289 | } 290 | char firstCharacter = line[0]; 291 | if (firstCharacter == ';') 292 | { 293 | return PDataType::PDATA_COMMENT; 294 | } 295 | if (firstCharacter == '[') 296 | { 297 | auto commentAt = line.find_first_of(';'); 298 | if (commentAt != std::string::npos) 299 | { 300 | line = line.substr(0, commentAt); 301 | } 302 | auto closingBracketAt = line.find_last_of(']'); 303 | if (closingBracketAt != std::string::npos) 304 | { 305 | auto section = line.substr(1, closingBracketAt - 1); 306 | INIStringUtil::trim(section); 307 | parseData.first = section; 308 | return PDataType::PDATA_SECTION; 309 | } 310 | } 311 | auto lineNorm = line; 312 | INIStringUtil::replace(lineNorm, "\\=", " "); 313 | auto equalsAt = lineNorm.find_first_of('='); 314 | if (equalsAt != std::string::npos) 315 | { 316 | auto key = line.substr(0, equalsAt); 317 | INIStringUtil::trim(key); 318 | INIStringUtil::replace(key, "\\=", "="); 319 | auto value = line.substr(equalsAt + 1); 320 | INIStringUtil::trim(value); 321 | parseData.first = key; 322 | parseData.second = value; 323 | return PDataType::PDATA_KEYVALUE; 324 | } 325 | return PDataType::PDATA_UNKNOWN; 326 | } 327 | } 328 | 329 | class INIReader 330 | { 331 | public: 332 | using T_LineData = std::vector; 333 | using T_LineDataPtr = std::shared_ptr; 334 | 335 | private: 336 | std::ifstream fileReadStream; 337 | T_LineDataPtr lineData; 338 | 339 | T_LineData readFile() 340 | { 341 | std::string fileContents; 342 | fileReadStream.seekg(0, std::ios::end); 343 | fileContents.resize(static_cast(fileReadStream.tellg())); 344 | fileReadStream.seekg(0, std::ios::beg); 345 | std::size_t fileSize = fileContents.size(); 346 | fileReadStream.read(&fileContents[0], fileSize); 347 | fileReadStream.close(); 348 | T_LineData output; 349 | if (fileSize == 0) 350 | { 351 | return output; 352 | } 353 | std::string buffer; 354 | buffer.reserve(50); 355 | for (std::size_t i = 0; i < fileSize; ++i) 356 | { 357 | char& c = fileContents[i]; 358 | if (c == '\n') 359 | { 360 | output.emplace_back(buffer); 361 | buffer.clear(); 362 | continue; 363 | } 364 | if (c != '\0' && c != '\r') 365 | { 366 | buffer += c; 367 | } 368 | } 369 | output.emplace_back(buffer); 370 | return output; 371 | } 372 | 373 | public: 374 | INIReader(std::string const& filename, bool keepLineData = false) 375 | { 376 | fileReadStream.open(filename, std::ios::in | std::ios::binary); 377 | if (keepLineData) 378 | { 379 | lineData = std::make_shared(); 380 | } 381 | } 382 | ~INIReader() { } 383 | 384 | bool operator>>(INIStructure& data) 385 | { 386 | if (!fileReadStream.is_open()) 387 | { 388 | return false; 389 | } 390 | T_LineData fileLines = readFile(); 391 | std::string section; 392 | bool inSection = false; 393 | INIParser::T_ParseValues parseData; 394 | for (auto const& line : fileLines) 395 | { 396 | auto parseResult = INIParser::parseLine(line, parseData); 397 | if (parseResult == INIParser::PDataType::PDATA_SECTION) 398 | { 399 | inSection = true; 400 | data[section = parseData.first]; 401 | } 402 | else if (inSection && parseResult == INIParser::PDataType::PDATA_KEYVALUE) 403 | { 404 | auto const& key = parseData.first; 405 | auto const& value = parseData.second; 406 | data[section][key] = value; 407 | } 408 | if (lineData && parseResult != INIParser::PDataType::PDATA_UNKNOWN) 409 | { 410 | if (parseResult == INIParser::PDataType::PDATA_KEYVALUE && !inSection) 411 | { 412 | continue; 413 | } 414 | lineData->emplace_back(line); 415 | } 416 | } 417 | return true; 418 | } 419 | T_LineDataPtr getLines() 420 | { 421 | return lineData; 422 | } 423 | }; 424 | 425 | class INIGenerator 426 | { 427 | private: 428 | std::ofstream fileWriteStream; 429 | 430 | public: 431 | bool prettyPrint = false; 432 | 433 | INIGenerator(std::string const& filename) 434 | { 435 | fileWriteStream.open(filename, std::ios::out | std::ios::binary); 436 | } 437 | ~INIGenerator() { } 438 | 439 | bool operator<<(INIStructure const& data) 440 | { 441 | if (!fileWriteStream.is_open()) 442 | { 443 | return false; 444 | } 445 | if (!data.size()) 446 | { 447 | return true; 448 | } 449 | auto it = data.begin(); 450 | for (;;) 451 | { 452 | auto const& section = it->first; 453 | auto const& collection = it->second; 454 | fileWriteStream 455 | << "[" 456 | << section 457 | << "]"; 458 | if (collection.size()) 459 | { 460 | fileWriteStream << INIStringUtil::endl; 461 | auto it2 = collection.begin(); 462 | for (;;) 463 | { 464 | auto key = it2->first; 465 | INIStringUtil::replace(key, "=", "\\="); 466 | auto value = it2->second; 467 | INIStringUtil::trim(value); 468 | fileWriteStream 469 | << key 470 | << ((prettyPrint) ? " = " : "=") 471 | << value; 472 | if (++it2 == collection.end()) 473 | { 474 | break; 475 | } 476 | fileWriteStream << INIStringUtil::endl; 477 | } 478 | } 479 | if (++it == data.end()) 480 | { 481 | break; 482 | } 483 | fileWriteStream << INIStringUtil::endl; 484 | if (prettyPrint) 485 | { 486 | fileWriteStream << INIStringUtil::endl; 487 | } 488 | } 489 | return true; 490 | } 491 | }; 492 | 493 | class INIWriter 494 | { 495 | private: 496 | using T_LineData = std::vector; 497 | using T_LineDataPtr = std::shared_ptr; 498 | 499 | std::string filename; 500 | 501 | T_LineData getLazyOutput(T_LineDataPtr const& lineData, INIStructure& data, INIStructure& original) 502 | { 503 | T_LineData output; 504 | INIParser::T_ParseValues parseData; 505 | std::string sectionCurrent; 506 | bool parsingSection = false; 507 | bool continueToNextSection = false; 508 | bool discardNextEmpty = false; 509 | bool writeNewKeys = false; 510 | std::size_t lastKeyLine = 0; 511 | for (auto line = lineData->begin(); line != lineData->end(); ++line) 512 | { 513 | if (!writeNewKeys) 514 | { 515 | auto parseResult = INIParser::parseLine(*line, parseData); 516 | if (parseResult == INIParser::PDataType::PDATA_SECTION) 517 | { 518 | if (parsingSection) 519 | { 520 | writeNewKeys = true; 521 | parsingSection = false; 522 | --line; 523 | continue; 524 | } 525 | sectionCurrent = parseData.first; 526 | if (data.has(sectionCurrent)) 527 | { 528 | parsingSection = true; 529 | continueToNextSection = false; 530 | discardNextEmpty = false; 531 | output.emplace_back(*line); 532 | lastKeyLine = output.size(); 533 | } 534 | else 535 | { 536 | continueToNextSection = true; 537 | discardNextEmpty = true; 538 | continue; 539 | } 540 | } 541 | else if (parseResult == INIParser::PDataType::PDATA_KEYVALUE) 542 | { 543 | if (continueToNextSection) 544 | { 545 | continue; 546 | } 547 | if (data.has(sectionCurrent)) 548 | { 549 | auto& collection = data[sectionCurrent]; 550 | auto const& key = parseData.first; 551 | auto const& value = parseData.second; 552 | if (collection.has(key)) 553 | { 554 | auto outputValue = collection[key]; 555 | if (value == outputValue) 556 | { 557 | output.emplace_back(*line); 558 | } 559 | else 560 | { 561 | INIStringUtil::trim(outputValue); 562 | auto lineNorm = *line; 563 | INIStringUtil::replace(lineNorm, "\\=", " "); 564 | auto equalsAt = lineNorm.find_first_of('='); 565 | auto valueAt = lineNorm.find_first_not_of( 566 | INIStringUtil::whitespaceDelimiters, 567 | equalsAt + 1 568 | ); 569 | std::string outputLine = line->substr(0, valueAt); 570 | if (prettyPrint && equalsAt + 1 == valueAt) 571 | { 572 | outputLine += " "; 573 | } 574 | outputLine += outputValue; 575 | output.emplace_back(outputLine); 576 | } 577 | lastKeyLine = output.size(); 578 | } 579 | } 580 | } 581 | else 582 | { 583 | if (discardNextEmpty && line->empty()) 584 | { 585 | discardNextEmpty = false; 586 | } 587 | else if (parseResult != INIParser::PDataType::PDATA_UNKNOWN) 588 | { 589 | output.emplace_back(*line); 590 | } 591 | } 592 | } 593 | if (writeNewKeys || std::next(line) == lineData->end()) 594 | { 595 | T_LineData linesToAdd; 596 | if (data.has(sectionCurrent) && original.has(sectionCurrent)) 597 | { 598 | auto const& collection = data[sectionCurrent]; 599 | auto const& collectionOriginal = original[sectionCurrent]; 600 | for (auto const& it : collection) 601 | { 602 | auto key = it.first; 603 | if (collectionOriginal.has(key)) 604 | { 605 | continue; 606 | } 607 | auto value = it.second; 608 | INIStringUtil::replace(key, "=", "\\="); 609 | INIStringUtil::trim(value); 610 | linesToAdd.emplace_back( 611 | key + ((prettyPrint) ? " = " : "=") + value 612 | ); 613 | } 614 | } 615 | if (!linesToAdd.empty()) 616 | { 617 | output.insert( 618 | output.begin() + lastKeyLine, 619 | linesToAdd.begin(), 620 | linesToAdd.end() 621 | ); 622 | } 623 | if (writeNewKeys) 624 | { 625 | writeNewKeys = false; 626 | --line; 627 | } 628 | } 629 | } 630 | for (auto const& it : data) 631 | { 632 | auto const& section = it.first; 633 | if (original.has(section)) 634 | { 635 | continue; 636 | } 637 | if (prettyPrint && output.size() > 0 && !output.back().empty()) 638 | { 639 | output.emplace_back(); 640 | } 641 | output.emplace_back("[" + section + "]"); 642 | auto const& collection = it.second; 643 | for (auto const& it2 : collection) 644 | { 645 | auto key = it2.first; 646 | auto value = it2.second; 647 | INIStringUtil::replace(key, "=", "\\="); 648 | INIStringUtil::trim(value); 649 | output.emplace_back( 650 | key + ((prettyPrint) ? " = " : "=") + value 651 | ); 652 | } 653 | } 654 | return output; 655 | } 656 | 657 | public: 658 | bool prettyPrint = false; 659 | 660 | INIWriter(std::string const& filename) 661 | : filename(filename) 662 | { 663 | } 664 | ~INIWriter() { } 665 | 666 | bool operator<<(INIStructure& data) 667 | { 668 | struct stat buf; 669 | bool fileExists = (stat(filename.c_str(), &buf) == 0); 670 | if (!fileExists) 671 | { 672 | INIGenerator generator(filename); 673 | generator.prettyPrint = prettyPrint; 674 | return generator << data; 675 | } 676 | INIStructure originalData; 677 | T_LineDataPtr lineData; 678 | bool readSuccess = false; 679 | { 680 | INIReader reader(filename, true); 681 | if ((readSuccess = reader >> originalData)) 682 | { 683 | lineData = reader.getLines(); 684 | } 685 | } 686 | if (!readSuccess) 687 | { 688 | return false; 689 | } 690 | T_LineData output = getLazyOutput(lineData, data, originalData); 691 | std::ofstream fileWriteStream(filename, std::ios::out | std::ios::binary); 692 | if (fileWriteStream.is_open()) 693 | { 694 | if (output.size()) 695 | { 696 | auto line = output.begin(); 697 | for (;;) 698 | { 699 | fileWriteStream << *line; 700 | if (++line == output.end()) 701 | { 702 | break; 703 | } 704 | fileWriteStream << INIStringUtil::endl; 705 | } 706 | } 707 | return true; 708 | } 709 | return false; 710 | } 711 | }; 712 | 713 | class INIFile 714 | { 715 | private: 716 | std::string filename; 717 | 718 | public: 719 | INIFile(std::string const& filename) 720 | : filename(filename) 721 | { } 722 | 723 | ~INIFile() { } 724 | 725 | bool read(INIStructure& data) const 726 | { 727 | if (data.size()) 728 | { 729 | data.clear(); 730 | } 731 | if (filename.empty()) 732 | { 733 | return false; 734 | } 735 | INIReader reader(filename); 736 | return reader >> data; 737 | } 738 | bool generate(INIStructure const& data, bool pretty = false) const 739 | { 740 | if (filename.empty()) 741 | { 742 | return false; 743 | } 744 | INIGenerator generator(filename); 745 | generator.prettyPrint = pretty; 746 | return generator << data; 747 | } 748 | bool write(INIStructure& data, bool pretty = false) const 749 | { 750 | if (filename.empty()) 751 | { 752 | return false; 753 | } 754 | INIWriter writer(filename); 755 | writer.prettyPrint = pretty; 756 | return writer << data; 757 | } 758 | }; 759 | } 760 | 761 | #endif // MINI_INI_H_ 762 | -------------------------------------------------------------------------------- /IncreaseAnimationDistance/documentation.txt: -------------------------------------------------------------------------------- 1 | 0xC7, 0x44, 0x24, 0x40, 0x01, 0x00, 0x00, 0x00, 0xf3, 0x45, 0x0f, 0x10, 0x4c, 0x24, 0x5c, 0xf3, 0x41, 0x0f, 0x10, 0x74, 0x24, 0x50, 0xf3, 0x0f, 0x59, 0x35, MASKED, MASKED, MASKED, MASKED, 0x41, 0x0f, 0x28, 0xc9, 0xf3, 0x41, 0x0f, 0x5c, 0x4c, 0x24, 0x58, 0xf3, 0x44, 0x0f, 0x5e, 0xc9, 0x0f, 0x28, 0xc6 2 | 3 | 4 | FUNCTION ABOVE: 5 | 6 | eldenring.exe+AB4B94 - C7 45 08 00000000 - mov [rbp+08],00000000 7 | eldenring.exe+AB4B9B - E9 94970504 - jmp eldenring.exe+4B0E334 8 | eldenring.exe+AB4BA0 - 48 8B C4 - mov rax,rsp 9 | eldenring.exe+AB4BA3 - 48 89 50 10 - mov [rax+10],rdx 10 | eldenring.exe+AB4BA7 - 57 - push rdi 11 | eldenring.exe+AB4BA8 - 48 81 EC 80000000 - sub rsp,00000080 12 | eldenring.exe+AB4BAF - 48 C7 40 B0 FEFFFFFF - mov qword ptr [rax-50],FFFFFFFFFFFFFFFE 13 | eldenring.exe+AB4BB7 - 48 89 58 08 - mov [rax+08],rbx 14 | eldenring.exe+AB4BBB - 0F29 70 E8 - movaps [rax-18],xmm6 15 | eldenring.exe+AB4BBF - 0F29 78 D8 - movaps [rax-28],xmm7 16 | eldenring.exe+AB4BC3 - 44 0F29 48 C8 - movaps [rax-38],xmm9 17 | eldenring.exe+AB4BC8 - 48 8B FA - mov rdi,rdx 18 | eldenring.exe+AB4BCB - 48 8B D9 - mov rbx,rcx 19 | eldenring.exe+AB4BCE - C7 40 A8 00000000 - mov [rax-58],00000000 20 | eldenring.exe+AB4BD5 - 48 8D 05 449E6BFF - lea rax,[eldenring.exe+16EA20] 21 | eldenring.exe+AB4BDC - 48 89 44 24 20 - mov [rsp+20],rax 22 | eldenring.exe+AB4BE1 - 4C 8D 0D 289E6BFF - lea r9,[eldenring.exe+16EA10] 23 | eldenring.exe+AB4BE8 - BA 10000000 - mov edx,00000010 24 | eldenring.exe+AB4BED - 44 8D 42 F6 - lea r8d,[rdx-0A] 25 | eldenring.exe+AB4BF1 - 48 8B CF - mov rcx,rdi 26 | eldenring.exe+AB4BF4 - E8 EB2A9A01 - call eldenring.exe+24576E4 27 | eldenring.exe+AB4BF9 - 90 - nop 28 | eldenring.exe+AB4BFA - C7 44 24 30 01000000 - mov [rsp+30],00000001 29 | eldenring.exe+AB4C02 - F3 44 0F10 4B 5C - movss xmm9,[rbx+5C] 30 | eldenring.exe+AB4C08 - F3 0F10 73 50 - movss xmm6,[rbx+50] 31 | eldenring.exe+AB4C0D - F3 0F59 35 0BA57202 - mulss xmm6,[eldenring.exe+31DF120] 32 | eldenring.exe+AB4C15 - 41 0F28 C9 - movaps xmm1,xmm9 33 | eldenring.exe+AB4C19 - F3 0F5C 4B 58 - subss xmm1,[rbx+58] 34 | eldenring.exe+AB4C1E - F3 44 0F5E C9 - divss xmm9,xmm1 35 | eldenring.exe+AB4C23 - 0F28 C6 - movaps xmm0,xmm6 36 | eldenring.exe+AB4C26 - E8 C5739C01 - call eldenring.exe+247BFF0 37 | eldenring.exe+AB4C2B - 0F28 F8 - movaps xmm7,xmm0 38 | eldenring.exe+AB4C2E - 0F28 C6 - movaps xmm0,xmm6 39 | eldenring.exe+AB4C31 - E8 BA789C01 - call eldenring.exe+247C4F0 40 | eldenring.exe+AB4C36 - F3 0F5E F8 - divss xmm7,xmm0 41 | eldenring.exe+AB4C3A - 0F28 CF - movaps xmm1,xmm7 42 | eldenring.exe+AB4C3D - F3 0F5E 4B 54 - divss xmm1,[rbx+54] 43 | eldenring.exe+AB4C42 - 41 0F28 D1 - movaps xmm2,xmm9 44 | eldenring.exe+AB4C46 - F3 0F59 53 58 - mulss xmm2,[rbx+58] 45 | eldenring.exe+AB4C4B - 0F57 15 DEB27202 - xorps xmm2,[eldenring.exe+31DFF30] 46 | eldenring.exe+AB4C52 - F3 0F11 4C 24 40 - movss [rsp+40],xmm1 47 | eldenring.exe+AB4C58 - F3 0F11 7C 24 44 - movss [rsp+44],xmm7 48 | eldenring.exe+AB4C5E - F3 44 0F11 4C 24 48 - movss [rsp+48],xmm9 49 | eldenring.exe+AB4C65 - F3 0F11 54 24 4C - movss [rsp+4C],xmm2 50 | eldenring.exe+AB4C6B - 0F57 FF - xorps xmm7,xmm7 51 | eldenring.exe+AB4C6E - 0F28 F7 - movaps xmm6,xmm7 52 | eldenring.exe+AB4C71 - 0F28 44 24 40 - movaps xmm0,[rsp+40] 53 | eldenring.exe+AB4C76 - F3 0F10 F0 - movss xmm6,xmm0 54 | eldenring.exe+AB4C7A - 0F28 D0 - movaps xmm2,xmm0 55 | eldenring.exe+AB4C7D - 0F54 15 DC517002 - andps xmm2,[eldenring.exe+31B9E60] 56 | eldenring.exe+AB4C84 - 0FC6 05 04527002 EE - shufps xmm0,[eldenring.exe+31B9E90],-12 57 | eldenring.exe+AB4C8C - 0F28 DF - movaps xmm3,xmm7 58 | eldenring.exe+AB4C8F - 0FC6 D8 C0 - shufps xmm3,xmm0,-40 59 | eldenring.exe+AB4C93 - 0F28 CB - movaps xmm1,xmm3 60 | eldenring.exe+AB4C96 - 0FC6 C8 90 - shufps xmm1,xmm0,-70 61 | eldenring.exe+AB4C9A - 0F28 EE - movaps xmm5,xmm6 62 | eldenring.exe+AB4C9D - 0FC6 EA 44 - shufps xmm5,xmm2,44 63 | eldenring.exe+AB4CA1 - 0FC6 F2 EE - shufps xmm6,xmm2,-12 64 | eldenring.exe+AB4CA5 - 0F28 C3 - movaps xmm0,xmm3 65 | eldenring.exe+AB4CA8 - 0FC6 C1 44 - shufps xmm0,xmm1,44 66 | eldenring.exe+AB4CAC - 0FC6 D9 EE - shufps xmm3,xmm1,-12 67 | eldenring.exe+AB4CB0 - 0F28 D5 - movaps xmm2,xmm5 68 | eldenring.exe+AB4CB3 - 0FC6 D0 88 - shufps xmm2,xmm0,-78 69 | eldenring.exe+AB4CB7 - 0FC6 E8 DD - shufps xmm5,xmm0,-23 70 | eldenring.exe+AB4CBB - 0F28 E6 - movaps xmm4,xmm6 71 | eldenring.exe+AB4CBE - 0FC6 E3 88 - shufps xmm4,xmm3,-78 72 | eldenring.exe+AB4CC2 - 0FC6 F3 DD - shufps xmm6,xmm3,-23 73 | eldenring.exe+AB4CC6 - 0F28 CE - movaps xmm1,xmm6 74 | eldenring.exe+AB4CC9 - 0F58 CA - addps xmm1,xmm2 75 | eldenring.exe+AB4CCC - 0F28 C7 - movaps xmm0,xmm7 76 | eldenring.exe+AB4CCF - 0F5C C1 - subps xmm0,xmm1 77 | eldenring.exe+AB4CD2 - 0F29 07 - movaps [rdi],xmm0 78 | eldenring.exe+AB4CD5 - 0F28 CE - movaps xmm1,xmm6 79 | eldenring.exe+AB4CD8 - 0F5C CA - subps xmm1,xmm2 80 | eldenring.exe+AB4CDB - 0F28 C7 - movaps xmm0,xmm7 81 | eldenring.exe+AB4CDE - 0F5C C1 - subps xmm0,xmm1 82 | eldenring.exe+AB4CE1 - 0F29 47 10 - movaps [rdi+10],xmm0 83 | eldenring.exe+AB4CE5 - 0F28 C6 - movaps xmm0,xmm6 84 | eldenring.exe+AB4CE8 - 0F58 C5 - addps xmm0,xmm5 85 | eldenring.exe+AB4CEB - 0F28 CF - movaps xmm1,xmm7 86 | eldenring.exe+AB4CEE - 0F5C C8 - subps xmm1,xmm0 87 | eldenring.exe+AB4CF1 - 0F29 4F 20 - movaps [rdi+20],xmm1 88 | eldenring.exe+AB4CF5 - 0F28 C6 - movaps xmm0,xmm6 89 | eldenring.exe+AB4CF8 - 0F5C C5 - subps xmm0,xmm5 90 | eldenring.exe+AB4CFB - 0F28 CF - movaps xmm1,xmm7 91 | eldenring.exe+AB4CFE - 0F5C C8 - subps xmm1,xmm0 92 | eldenring.exe+AB4D01 - 0F29 4F 30 - movaps [rdi+30],xmm1 93 | eldenring.exe+AB4D05 - 0F28 C7 - movaps xmm0,xmm7 94 | eldenring.exe+AB4D08 - 0F5C C4 - subps xmm0,xmm4 95 | eldenring.exe+AB4D0B - 0F29 47 40 - movaps [rdi+40],xmm0 96 | eldenring.exe+AB4D0F - 0F5C F4 - subps xmm6,xmm4 97 | eldenring.exe+AB4D12 - 0F5C FE - subps xmm7,xmm6 98 | eldenring.exe+AB4D15 - 0F29 7F 50 - movaps [rdi+50],xmm7 99 | eldenring.exe+AB4D19 - 48 8B C7 - mov rax,rdi 100 | eldenring.exe+AB4D1C - 48 8B 9C 24 90000000 - mov rbx,[rsp+00000090] 101 | eldenring.exe+AB4D24 - 0F28 74 24 70 - movaps xmm6,[rsp+70] 102 | eldenring.exe+AB4D29 - 0F28 7C 24 60 - movaps xmm7,[rsp+60] 103 | eldenring.exe+AB4D2E - 44 0F28 4C 24 50 - movaps xmm9,[rsp+50] 104 | eldenring.exe+AB4D34 - 48 81 C4 80000000 - add rsp,00000080 105 | eldenring.exe+AB4D3B - 5F - pop rdi 106 | eldenring.exe+AB4D3C - C3 - ret 107 | 108 | 109 | RELEVANT FUNCTION: 110 | 111 | eldenring.exe+AB4D3F - 48 48 - dec rax 112 | eldenring.exe+AB4D41 - 8B C4 - mov eax,esp 113 | eldenring.exe+AB4D43 - 48 89 50 10 - mov [rax+10],rdx 114 | eldenring.exe+AB4D47 - 55 - push rbp 115 | eldenring.exe+AB4D48 - 41 54 - push r12 116 | eldenring.exe+AB4D4A - 41 55 - push r13 117 | eldenring.exe+AB4D4C - 41 56 - push r14 118 | eldenring.exe+AB4D4E - 41 57 - push r15 119 | eldenring.exe+AB4D50 - 48 8D 68 C8 - lea rbp,[rax-38] 120 | eldenring.exe+AB4D54 - 48 81 EC 10010000 - sub rsp,00000110 121 | eldenring.exe+AB4D5B - 48 C7 45 90 FEFFFFFF - mov qword ptr [rbp-70],FFFFFFFFFFFFFFFE 122 | eldenring.exe+AB4D63 - 48 89 58 08 - mov [rax+08],rbx 123 | eldenring.exe+AB4D67 - 48 89 70 18 - mov [rax+18],rsi 124 | eldenring.exe+AB4D6B - 48 89 78 20 - mov [rax+20],rdi 125 | eldenring.exe+AB4D6F - 0F29 70 C8 - movaps [rax-38],xmm6 126 | eldenring.exe+AB4D73 - 0F29 78 B8 - movaps [rax-48],xmm7 127 | eldenring.exe+AB4D77 - 44 0F29 48 A8 - movaps [rax-58],xmm9 128 | eldenring.exe+AB4D7C - 4C 8B EA - mov r13,rdx 129 | eldenring.exe+AB4D7F - 4C 8B E1 - mov r12,rcx 130 | eldenring.exe+AB4D82 - C7 44 24 40 00000000 - mov [rsp+40],00000000 131 | eldenring.exe+AB4D8A - 48 8D 05 8F9C6BFF - lea rax,[eldenring.exe+16EA20] 132 | eldenring.exe+AB4D91 - 48 89 44 24 20 - mov [rsp+20],rax 133 | eldenring.exe+AB4D96 - 4C 8D 0D 739C6BFF - lea r9,[eldenring.exe+16EA10] 134 | eldenring.exe+AB4D9D - BA 10000000 - mov edx,00000010 135 | eldenring.exe+AB4DA2 - 44 8D 42 F6 - lea r8d,[rdx-0A] 136 | eldenring.exe+AB4DA6 - 49 8B CD - mov rcx,r13 137 | eldenring.exe+AB4DA9 - E8 36299A01 - call eldenring.exe+24576E4 138 | eldenring.exe+AB4DAE - 90 - nop 139 | eldenring.exe+AB4DAF - C7 44 24 40 01000000 - mov [rsp+40],00000001 140 | eldenring.exe+AB4DB7 - F3 45 0F10 4C 24 5C - movss xmm9,[r12+5C] 141 | eldenring.exe+AB4DBE - F3 41 0F10 74 24 50 - movss xmm6,[r12+50] 142 | eldenring.exe+AB4DC5 - F3 0F59 35 53A37202 - mulss xmm6,[eldenring.exe+31DF120] 143 | eldenring.exe+AB4DCD - 41 0F28 C9 - movaps xmm1,xmm9 144 | eldenring.exe+AB4DD1 - F3 41 0F5C 4C 24 58 - subss xmm1,[r12+58] 145 | eldenring.exe+AB4DD8 - F3 44 0F5E C9 - divss xmm9,xmm1 146 | eldenring.exe+AB4DDD - 0F28 C6 - movaps xmm0,xmm6 147 | eldenring.exe+AB4DE0 - E8 0B729C01 - call eldenring.exe+247BFF0 148 | eldenring.exe+AB4DE5 - 0F28 F8 - movaps xmm7,xmm0 149 | eldenring.exe+AB4DE8 - 0F28 C6 - movaps xmm0,xmm6 150 | eldenring.exe+AB4DEB - E8 00779C01 - call eldenring.exe+247C4F0 151 | eldenring.exe+AB4DF0 - F3 0F5E F8 - divss xmm7,xmm0 152 | eldenring.exe+AB4DF4 - 0F28 CF - movaps xmm1,xmm7 153 | eldenring.exe+AB4DF7 - F3 41 0F5E 4C 24 54 - divss xmm1,[r12+54] <----- CHANGE TO 0x0f 0x57 0xc9 0x90 0x90 0x90 0x90 154 | eldenring.exe+AB4DFE - 41 0F28 D1 - movaps xmm2,xmm9 155 | eldenring.exe+AB4E02 - F3 41 0F59 54 24 58 - mulss xmm2,[r12+58] 156 | eldenring.exe+AB4E09 - 0F57 15 20B17202 - xorps xmm2,[eldenring.exe+31DFF30] 157 | eldenring.exe+AB4E10 - F3 0F11 4C 24 30 - movss [rsp+30],xmm1 158 | eldenring.exe+AB4E16 - F3 0F11 7C 24 34 - movss [rsp+34],xmm7 159 | eldenring.exe+AB4E1C - F3 44 0F11 4C 24 38 - movss [rsp+38],xmm9 160 | eldenring.exe+AB4E23 - F3 0F11 54 24 3C - movss [rsp+3C],xmm2 161 | eldenring.exe+AB4E29 - 0F57 FF - xorps xmm7,xmm7 162 | eldenring.exe+AB4E2C - 0F28 F7 - movaps xmm6,xmm7 163 | eldenring.exe+AB4E2F - 0F28 44 24 30 - movaps xmm0,[rsp+30] 164 | eldenring.exe+AB4E34 - F3 0F10 F0 - movss xmm6,xmm0 165 | eldenring.exe+AB4E38 - 0F28 D0 - movaps xmm2,xmm0 166 | eldenring.exe+AB4E3B - 0F54 15 1E507002 - andps xmm2,[eldenring.exe+31B9E60] 167 | eldenring.exe+AB4E42 - 0FC6 05 46507002 EE - shufps xmm0,[eldenring.exe+31B9E90],-12 168 | eldenring.exe+AB4E4A - 0F28 DF - movaps xmm3,xmm7 169 | eldenring.exe+AB4E4D - 0FC6 D8 C0 - shufps xmm3,xmm0,-40 170 | eldenring.exe+AB4E51 - 0F28 CB - movaps xmm1,xmm3 171 | eldenring.exe+AB4E54 - 0FC6 C8 90 - shufps xmm1,xmm0,-70 172 | eldenring.exe+AB4E58 - 0F28 EE - movaps xmm5,xmm6 173 | eldenring.exe+AB4E5B - 0FC6 EA 44 - shufps xmm5,xmm2,44 174 | eldenring.exe+AB4E5F - 0FC6 F2 EE - shufps xmm6,xmm2,-12 175 | eldenring.exe+AB4E63 - 0F28 C3 - movaps xmm0,xmm3 176 | eldenring.exe+AB4E66 - 0FC6 C1 44 - shufps xmm0,xmm1,44 177 | eldenring.exe+AB4E6A - 0FC6 D9 EE - shufps xmm3,xmm1,-12 178 | eldenring.exe+AB4E6E - 0F28 D5 - movaps xmm2,xmm5 179 | eldenring.exe+AB4E71 - 0FC6 D0 88 - shufps xmm2,xmm0,-78 180 | eldenring.exe+AB4E75 - 0FC6 E8 DD - shufps xmm5,xmm0,-23 181 | eldenring.exe+AB4E79 - 0F28 E6 - movaps xmm4,xmm6 182 | eldenring.exe+AB4E7C - 0FC6 E3 88 - shufps xmm4,xmm3,-78 183 | eldenring.exe+AB4E80 - 0FC6 F3 DD - shufps xmm6,xmm3,-23 184 | eldenring.exe+AB4E84 - 0F28 CE - movaps xmm1,xmm6 185 | eldenring.exe+AB4E87 - 0F58 CA - addps xmm1,xmm2 186 | eldenring.exe+AB4E8A - 0F28 C7 - movaps xmm0,xmm7 187 | eldenring.exe+AB4E8D - 0F5C C1 - subps xmm0,xmm1 188 | eldenring.exe+AB4E90 - 41 0F29 45 00 - movaps [r13+00],xmm0 189 | eldenring.exe+AB4E95 - 0F28 CE - movaps xmm1,xmm6 190 | eldenring.exe+AB4E98 - 0F5C CA - subps xmm1,xmm2 191 | eldenring.exe+AB4E9B - 0F28 C7 - movaps xmm0,xmm7 192 | eldenring.exe+AB4E9E - 0F5C C1 - subps xmm0,xmm1 193 | eldenring.exe+AB4EA1 - 41 0F29 45 10 - movaps [r13+10],xmm0 194 | eldenring.exe+AB4EA6 - 0F28 C6 - movaps xmm0,xmm6 195 | eldenring.exe+AB4EA9 - 0F58 C5 - addps xmm0,xmm5 196 | eldenring.exe+AB4EAC - 0F28 CF - movaps xmm1,xmm7 197 | eldenring.exe+AB4EAF - 0F5C C8 - subps xmm1,xmm0 198 | eldenring.exe+AB4EB2 - 41 0F29 4D 20 - movaps [r13+20],xmm1 199 | eldenring.exe+AB4EB7 - 0F28 C6 - movaps xmm0,xmm6 200 | eldenring.exe+AB4EBA - 0F5C C5 - subps xmm0,xmm5 201 | eldenring.exe+AB4EBD - 0F28 CF - movaps xmm1,xmm7 202 | eldenring.exe+AB4EC0 - 0F5C C8 - subps xmm1,xmm0 203 | eldenring.exe+AB4EC3 - 41 0F29 4D 30 - movaps [r13+30],xmm1 204 | eldenring.exe+AB4EC8 - 0F28 C7 - movaps xmm0,xmm7 205 | eldenring.exe+AB4ECB - 0F5C C4 - subps xmm0,xmm4 206 | eldenring.exe+AB4ECE - 41 0F29 45 40 - movaps [r13+40],xmm0 207 | eldenring.exe+AB4ED3 - 0F5C F4 - subps xmm6,xmm4 208 | eldenring.exe+AB4ED6 - 0F5C FE - subps xmm7,xmm6 209 | eldenring.exe+AB4ED9 - 41 0F29 7D 50 - movaps [r13+50],xmm7 210 | eldenring.exe+AB4EDE - 41 0F28 6C 24 10 - movaps xmm5,[r12+10] 211 | eldenring.exe+AB4EE4 - 0F28 E5 - movaps xmm4,xmm5 212 | eldenring.exe+AB4EE7 - 41 0FC6 64 24 20 44 - shufps xmm4,[r12+20],44 213 | eldenring.exe+AB4EEE - 41 0FC6 6C 24 20 EE - shufps xmm5,[r12+20],-12 214 | eldenring.exe+AB4EF5 - 41 0F28 5C 24 30 - movaps xmm3,[r12+30] 215 | eldenring.exe+AB4EFB - 0F28 CB - movaps xmm1,xmm3 216 | eldenring.exe+AB4EFE - 41 0FC6 4C 24 40 44 - shufps xmm1,[r12+40],44 217 | eldenring.exe+AB4F05 - 41 0FC6 5C 24 40 EE - shufps xmm3,[r12+40],-12 218 | eldenring.exe+AB4F0C - 0F28 D4 - movaps xmm2,xmm4 219 | eldenring.exe+AB4F0F - 0FC6 D1 88 - shufps xmm2,xmm1,-78 220 | eldenring.exe+AB4F13 - 0FC6 E1 DD - shufps xmm4,xmm1,-23 221 | eldenring.exe+AB4F17 - 0F28 C5 - movaps xmm0,xmm5 222 | eldenring.exe+AB4F1A - 0FC6 C3 88 - shufps xmm0,xmm3,-78 223 | eldenring.exe+AB4F1E - 0FC6 EB DD - shufps xmm5,xmm3,-23 224 | eldenring.exe+AB4F22 - 0F29 54 24 50 - movaps [rsp+50],xmm2 225 | eldenring.exe+AB4F27 - 0F29 64 24 60 - movaps [rsp+60],xmm4 226 | eldenring.exe+AB4F2C - 0F29 44 24 70 - movaps [rsp+70],xmm0 227 | eldenring.exe+AB4F31 - 0F29 6D 80 - movaps [rbp-80],xmm5 228 | eldenring.exe+AB4F35 - 4C 8D 44 24 50 - lea r8,[rsp+50] 229 | eldenring.exe+AB4F3A - 48 8D 54 24 30 - lea rdx,[rsp+30] 230 | eldenring.exe+AB4F3F - 48 8D 4D A0 - lea rcx,[rbp-60] 231 | eldenring.exe+AB4F43 - E8 483869FF - call eldenring.exe+148790 232 | eldenring.exe+AB4F48 - 0F28 45 A0 - movaps xmm0,[rbp-60] 233 | eldenring.exe+AB4F4C - 0F29 44 24 50 - movaps [rsp+50],xmm0 234 | eldenring.exe+AB4F51 - 0F28 4D B0 - movaps xmm1,[rbp-50] 235 | eldenring.exe+AB4F55 - 0F29 4C 24 60 - movaps [rsp+60],xmm1 236 | eldenring.exe+AB4F5A - 0F28 45 C0 - movaps xmm0,[rbp-40] 237 | eldenring.exe+AB4F5E - 0F29 44 24 70 - movaps [rsp+70],xmm0 238 | eldenring.exe+AB4F63 - 0F28 4D D0 - movaps xmm1,[rbp-30] 239 | eldenring.exe+AB4F67 - 0F29 4D 80 - movaps [rbp-80],xmm1 240 | eldenring.exe+AB4F6B - 4C 8D 44 24 50 - lea r8,[rsp+50] 241 | eldenring.exe+AB4F70 - 49 8B D5 - mov rdx,r13 242 | eldenring.exe+AB4F73 - 48 8D 4C 24 30 - lea rcx,[rsp+30] 243 | eldenring.exe+AB4F78 - E8 33070000 - call eldenring.exe+AB56B0 244 | eldenring.exe+AB4F7D - 0F28 00 - movaps xmm0,[rax] 245 | eldenring.exe+AB4F80 - 66 41 0F7F 45 00 - movdqa [r13+00],xmm0 246 | eldenring.exe+AB4F86 - 4C 8D 44 24 50 - lea r8,[rsp+50] 247 | eldenring.exe+AB4F8B - 49 8D 55 10 - lea rdx,[r13+10] 248 | eldenring.exe+AB4F8F - 48 8D 4C 24 30 - lea rcx,[rsp+30] 249 | eldenring.exe+AB4F94 - E8 17070000 - call eldenring.exe+AB56B0 250 | eldenring.exe+AB4F99 - 0F28 00 - movaps xmm0,[rax] 251 | eldenring.exe+AB4F9C - 66 41 0F7F 45 10 - movdqa [r13+10],xmm0 252 | eldenring.exe+AB4FA2 - 4C 8D 44 24 50 - lea r8,[rsp+50] 253 | eldenring.exe+AB4FA7 - 49 8D 55 20 - lea rdx,[r13+20] 254 | eldenring.exe+AB4FAB - 48 8D 4C 24 30 - lea rcx,[rsp+30] 255 | eldenring.exe+AB4FB0 - E8 FB060000 - call eldenring.exe+AB56B0 256 | eldenring.exe+AB4FB5 - 0F28 00 - movaps xmm0,[rax] 257 | eldenring.exe+AB4FB8 - 66 41 0F7F 45 20 - movdqa [r13+20],xmm0 258 | eldenring.exe+AB4FBE - 4C 8D 44 24 50 - lea r8,[rsp+50] 259 | eldenring.exe+AB4FC3 - 49 8D 55 30 - lea rdx,[r13+30] 260 | eldenring.exe+AB4FC7 - 48 8D 4C 24 30 - lea rcx,[rsp+30] 261 | eldenring.exe+AB4FCC - E8 DF060000 - call eldenring.exe+AB56B0 262 | eldenring.exe+AB4FD1 - 0F28 00 - movaps xmm0,[rax] 263 | eldenring.exe+AB4FD4 - 66 41 0F7F 45 30 - movdqa [r13+30],xmm0 264 | eldenring.exe+AB4FDA - 4C 8D 44 24 50 - lea r8,[rsp+50] 265 | eldenring.exe+AB4FDF - 49 8D 55 40 - lea rdx,[r13+40] 266 | eldenring.exe+AB4FE3 - 48 8D 4C 24 30 - lea rcx,[rsp+30] 267 | eldenring.exe+AB4FE8 - E8 C3060000 - call eldenring.exe+AB56B0 268 | eldenring.exe+AB4FED - 0F28 00 - movaps xmm0,[rax] 269 | eldenring.exe+AB4FF0 - 66 41 0F7F 45 40 - movdqa [r13+40],xmm0 270 | eldenring.exe+AB4FF6 - 4C 8D 44 24 50 - lea r8,[rsp+50] 271 | eldenring.exe+AB4FFB - 49 8D 55 50 - lea rdx,[r13+50] 272 | eldenring.exe+AB4FFF - 48 8D 4C 24 30 - lea rcx,[rsp+30] 273 | eldenring.exe+AB5004 - E8 A7060000 - call eldenring.exe+AB56B0 274 | eldenring.exe+AB5009 - 0F28 00 - movaps xmm0,[rax] 275 | eldenring.exe+AB500C - 66 41 0F7F 45 50 - movdqa [r13+50],xmm0 276 | eldenring.exe+AB5012 - 49 8B C5 - mov rax,r13 277 | eldenring.exe+AB5015 - 4C 8D 9C 24 10010000 - lea r11,[rsp+00000110] 278 | eldenring.exe+AB501D - 49 8B 5B 30 - mov rbx,[r11+30] 279 | eldenring.exe+AB5021 - 49 8B 73 40 - mov rsi,[r11+40] 280 | eldenring.exe+AB5025 - 49 8B 7B 48 - mov rdi,[r11+48] 281 | eldenring.exe+AB5029 - 41 0F28 73 F0 - movaps xmm6,[r11-10] 282 | eldenring.exe+AB502E - 41 0F28 7B E0 - movaps xmm7,[r11-20] 283 | eldenring.exe+AB5033 - 45 0F28 4B D0 - movaps xmm9,[r11-30] 284 | eldenring.exe+AB5038 - 49 8B E3 - mov rsp,r11 285 | eldenring.exe+AB503B - 41 5F - pop r15 286 | eldenring.exe+AB503D - 41 5E - pop r14 287 | eldenring.exe+AB503F - 41 5D - pop r13 288 | eldenring.exe+AB5041 - 41 5C - pop r12 289 | eldenring.exe+AB5043 - 5D - pop rbp 290 | eldenring.exe+AB5044 - C3 - ret 291 | 292 | 293 | FUNCTION BELOW: 294 | 295 | eldenring.exe+AB5046 - 48 83 47 10 10 - add qword ptr [rdi+10],10 { 16 } 296 | eldenring.exe+AB504B - E9 CA124D01 - jmp eldenring.exe+1F8631A 297 | eldenring.exe+AB5050 - E9 7AAF8904 - jmp eldenring.exe+534FFCF 298 | eldenring.exe+AB5055 - 4C 8B C8 - mov r9,rax 299 | eldenring.exe+AB5058 - 45 84 D2 - test r10l,r10l 300 | eldenring.exe+AB505B - 48 89 6C 24 F8 - mov [rsp-08],rbp 301 | eldenring.exe+AB5060 - 48 8D 64 24 F8 - lea rsp,[rsp-08] 302 | eldenring.exe+AB5065 - 48 BD 183278B9F67F0000 - mov rbp,eldenring.exe+1EE3218 { (-1.43) } 303 | eldenring.exe+AB506F - 48 87 2C 24 - xchg [rsp],rbp 304 | eldenring.exe+AB5073 - 48 8D 64 24 F8 - lea rsp,[rsp-08] 305 | eldenring.exe+AB5078 - 48 89 1C 24 - mov [rsp],rbx 306 | eldenring.exe+AB507C - 48 8D 64 24 F8 - lea rsp,[rsp-08] 307 | eldenring.exe+AB5081 - 48 89 04 24 - mov [rsp],rax 308 | eldenring.exe+AB5085 - 48 8B 5C 24 10 - mov rbx,[rsp+10] 309 | eldenring.exe+AB508A - 48 B8 223278B9F67F0000 - mov rax,eldenring.exe+1EE3222 { (233) } 310 | eldenring.exe+AB5094 - 48 0F44 D8 - cmove rbx,rax 311 | eldenring.exe+AB5098 - 48 89 5C 24 10 - mov [rsp+10],rbx 312 | eldenring.exe+AB509D - 48 8B 04 24 - mov rax,[rsp] 313 | eldenring.exe+AB50A1 - 48 8D 64 24 08 - lea rsp,[rsp+08] 314 | eldenring.exe+AB50A6 - 48 8B 1C 24 - mov rbx,[rsp] 315 | eldenring.exe+AB50AA - 48 8D 64 24 08 - lea rsp,[rsp+08] 316 | eldenring.exe+AB50AF - 48 8D 64 24 08 - lea rsp,[rsp+08] 317 | eldenring.exe+AB50B4 - FF 64 24 F8 - jmp qword ptr [rsp-08] 318 | eldenring.exe+AB50B8 - E9 5BE14201 - jmp eldenring.exe+1EE3218 319 | eldenring.exe+AB50BD - E8 22269A01 - call eldenring.exe+24576E4 320 | eldenring.exe+AB50C2 - 90 - nop 321 | eldenring.exe+AB50C3 - E9 4D1A0804 - jmp eldenring.exe+4B36B15 322 | eldenring.exe+AB50C8 - F3 41 0F10 4C 12 0C - movss xmm1,[r10+rdx+0C] 323 | eldenring.exe+AB50CF - E9 C502A401 - jmp eldenring.exe+24F5399 324 | eldenring.exe+AB50D4 - E9 FBFFA9FF - jmp eldenring.exe+5550D4 325 | eldenring.exe+AB50D9 - CC - int 3 326 | eldenring.exe+AB50DA - 14 E9 - adc al,-17 { 233 } 327 | eldenring.exe+AB50DC - 8C D2 - mov dx,ss 328 | eldenring.exe+AB50DE - 7D 04 - jnl eldenring.exe+AB50E4 329 | eldenring.exe+AB50E0 - 48 83 EC 28 - sub rsp,28 { 40 } 330 | eldenring.exe+AB50E4 - 41 B8 02000000 - mov r8d,00000002 { 2 } 331 | eldenring.exe+AB50EA - 48 8D 15 5F6F2502 - lea rdx,[eldenring.exe+2D0C050] { ("s11n.TypeHasher") } 332 | eldenring.exe+AB50F1 - 48 8D 0D 78ADA003 - lea rcx,[eldenring.exe+44BFE70] { (7FF6BBD5FE80) } 333 | eldenring.exe+AB50F8 - E9 5BF163FF - jmp eldenring.exe+F4258 334 | eldenring.exe+AB50FD - E8 EE6E9C01 - call eldenring.exe+247BFF0 335 | eldenring.exe+AB5102 - 90 - nop 336 | eldenring.exe+AB5103 - E9 8DD166FF - jmp eldenring.exe+122295 337 | eldenring.exe+AB5108 - E8 E3739C01 - call eldenring.exe+247C4F0 338 | eldenring.exe+AB510D - 90 - nop 339 | eldenring.exe+AB510E - E9 4050FB03 - jmp eldenring.exe+4A6A153 340 | eldenring.exe+AB5113 - 48 03 64 24 08 - add rsp,[rsp+08] 341 | 342 | -------------------------------------------------------------------------------- /SkipTheIntro/documentation.txt: -------------------------------------------------------------------------------- 1 | SIGNATURE: c6 ? ? ? ? ? 01 ? 03 00 00 00 ? 8b ? e8 ? ? ? ? e9 ? ? ? ? ? 8d 2 | 3 | 4 | FUNCTION ABOVE: 5 | 6 | 7FF7C5E100F9 - BA EC125E78 - mov edx,785E12EC { 2019431148 } 7 | 7FF7C5E100FE - EF - out dx,eax 8 | 7FF7C5E100FF - 7B 32 - jnp 7FF7C5E10133 9 | 7FF7C5E10101 - C0 C3 90 - rol bl,-70 { 144 } 10 | 7FF7C5E10104 - 1C B1 - sbb al,-4F { 177 } 11 | 7FF7C5E10106 - E8 4ABAEF7C - call 7FF842D0BB55 12 | 7FF7C5E1010B - 76 B7 - jna 7FF7C5E100C4 13 | 7FF7C5E1010D - 55 - push rbp 14 | 7FF7C5E1010E - C9 - leave 15 | 7FF7C5E1010F - 0F32 - rdmsr 16 | 7FF7C5E10111 - C0 C3 90 - rol bl,-70 { 144 } 17 | 7FF7C5E10114 - 80 4D 8B 86 - or byte ptr [rbp-75],-7A { 134 } 18 | 7FF7C5E10118 - 80 00 00 - add byte ptr [rax],00 { 0 } 19 | 7FF7C5E1011B - 00 49 83 - add [rcx-7D],cl 20 | 7FF7C5E1011E - C0 08 32 - ror byte ptr [rax],32 { 50 } 21 | 7FF7C5E10121 - C0 C3 CC - rol bl,-34 { 204 } 22 | 7FF7C5E10124 - 83 BA 98000000 00 - cmp dword ptr [rdx+00000098],00 { 0 } 23 | 7FF7C5E1012B - 48 8D 64 24 F8 - lea rsp,[rsp-08] 24 | 7FF7C5E10130 - 32 C0 - xor al,al 25 | 7FF7C5E10132 - C3 - ret 26 | 27 | 28 | RELEVANT FUNCTION: 29 | 30 | 7FF7C5E10134 - EB 74 - jmp 7FF7C5E101AA 31 | 7FF7C5E10136 - 02 4B EF - add cl,[rbx-11] 32 | 7FF7C5E10139 - 4A 77 23 - ja 7FF7C5E1015F 33 | 7FF7C5E1013C - 72 61 - jb 7FF7C5E1019F 34 | 7FF7C5E1013E - B2 C7 - mov dl,-39 { 199 } 35 | 7FF7C5E10140 - 48 83 C1 18 - add rcx,18 { 24 } 36 | 7FF7C5E10144 - E9 5738B001 - jmp 7FF7C79139A0 37 | 7FF7C5E10149 - 90 - nop 38 | 7FF7C5E1014A - 7F 37 - jg 7FF7C5E10183 39 | 7FF7C5E1014C - 1E - push ds 40 | 7FF7C5E1014D - E4 89 - in al,-77 { 137 } 41 | 7FF7C5E1014F - 27 - daa 42 | 7FF7C5E10150 - 40 55 - push rbp 43 | 7FF7C5E10152 - 56 - push rsi 44 | 7FF7C5E10153 - 57 - push rdi 45 | 7FF7C5E10154 - 48 8D 6C 24 B9 - lea rbp,[rsp-47] 46 | 7FF7C5E10159 - 48 81 EC B0000000 - sub rsp,000000B0 { 176 } 47 | 7FF7C5E10160 - 48 C7 45 0F FEFFFFFF - mov qword ptr [rbp+0F],FFFFFFFFFFFFFFFE { -2 } 48 | 7FF7C5E10168 - 48 89 9C 24 D8000000 - mov [rsp+000000D8],rbx 49 | 7FF7C5E10170 - 48 8B F9 - mov rdi,rcx 50 | 7FF7C5E10173 - 48 8B 0D 4E6B9D03 - mov rcx,[7FF7C97E6CC8] { (7FF2D8F40010) } 51 | 7FF7C5E1017A - 48 85 C9 - test rcx,rcx 52 | 7FF7C5E1017D - 75 2E - jne 7FF7C5E101AD 53 | 7FF7C5E1017F - 48 8D 0D 03CC1A03 - lea rcx,[7FF7C8FBCD89] { (0) } 54 | 7FF7C5E10186 - E8 C5F83601 - call 7FF7C717FA50 55 | 7FF7C5E1018B - 4C 8B C8 - mov r9,rax 56 | 7FF7C5E1018E - 4C 8D 05 53347202 - lea r8,[7FF7C85335E8] { (-1774554331) } 57 | 7FF7C5E10195 - BA B4000000 - mov edx,000000B4 { 180 } 58 | 7FF7C5E1019A - 48 8D 0D 7F68E601 - lea rcx,[7FF7C7C76A20] { ("w:\gr\patch103\source\library\fd4\dist_win64_vc2015\include\Cor") } 59 | 7FF7C5E101A1 - E8 6A7C3601 - call 7FF7C7177E10 60 | 7FF7C5E101A6 - 48 8B 0D 1B6B9D03 - mov rcx,[7FF7C97E6CC8] { (7FF2D8F40010) } 61 | 7FF7C5E101AD - B2 01 - mov dl,01 { 1 } 62 | 7FF7C5E101AF - E8 8C4F3300 - call 7FF7C6145140 63 | 7FF7C5E101B4 - 48 8B 05 45A51B03 - mov rax,[7FF7C8FCA700] { (7FF2D9E4B2A0) } 64 | 7FF7C5E101BB - 48 85 C0 - test rax,rax 65 | 7FF7C5E101BE - 75 2E - jne 7FF7C5E101EE 66 | 7FF7C5E101C0 - 48 8D 0D 169B1A03 - lea rcx,[7FF7C8FB9CDD] { (0) } 67 | 7FF7C5E101C7 - E8 84F83601 - call 7FF7C717FA50 68 | 7FF7C5E101CC - 4C 8B C8 - mov r9,rax 69 | 7FF7C5E101CF - 4C 8D 05 12347202 - lea r8,[7FF7C85335E8] { (-1774554331) } 70 | 7FF7C5E101D6 - BA B4000000 - mov edx,000000B4 { 180 } 71 | 7FF7C5E101DB - 48 8D 0D 3E68E601 - lea rcx,[7FF7C7C76A20] { ("w:\gr\patch103\source\library\fd4\dist_win64_vc2015\include\Cor") } 72 | 7FF7C5E101E2 - E8 297C3601 - call 7FF7C7177E10 73 | 7FF7C5E101E7 - 48 8B 05 12A51B03 - mov rax,[7FF7C8FCA700] { (7FF2D9E4B2A0) } 74 | 7FF7C5E101EE - 48 8B 90 80000000 - mov rdx,[rax+00000080] { Hook point } <------ CODE CAVE HERE 75 | 7FF7C5E101F5 - 48 85 D2 - test rdx,rdx 76 | 7FF7C5E101F8 - 74 07 - je 7FF7C5E10201 77 | 7FF7C5E101FA - C6 82 80020000 00 - mov byte ptr [rdx+00000280],00 { 0 } 78 | 7FF7C5E10201 - E8 6A6DBAFF - call 7FF7C59B6F70 79 | 7FF7C5E10206 - 80 BF B8000000 00 - cmp byte ptr [rdi+000000B8],00 { 0 } 80 | 7FF7C5E1020D - 74 53 - je 7FF7C5E10262 <----- NOP THIS JUMP 81 | 7FF7C5E1020F - 48 8B 05 EAA41B03 - mov rax,[7FF7C8FCA700] { (7FF2D9E4B2A0) } 82 | 7FF7C5E10216 - 48 85 C0 - test rax,rax 83 | 7FF7C5E10219 - 75 2E - jne 7FF7C5E10249 84 | 7FF7C5E1021B - 48 8D 0D BB9A1A03 - lea rcx,[7FF7C8FB9CDD] { (0) } 85 | 7FF7C5E10222 - E8 29F83601 - call 7FF7C717FA50 86 | 7FF7C5E10227 - 4C 8B C8 - mov r9,rax 87 | 7FF7C5E1022A - 4C 8D 05 B7337202 - lea r8,[7FF7C85335E8] { (-1774554331) } 88 | 7FF7C5E10231 - BA B4000000 - mov edx,000000B4 { 180 } 89 | 7FF7C5E10236 - 48 8D 0D E367E601 - lea rcx,[7FF7C7C76A20] { ("w:\gr\patch103\source\library\fd4\dist_win64_vc2015\include\Cor") } 90 | 7FF7C5E1023D - E8 CE7B3601 - call 7FF7C7177E10 91 | 7FF7C5E10242 - 48 8B 05 B7A41B03 - mov rax,[7FF7C8FCA700] { (7FF2D9E4B2A0) } 92 | 7FF7C5E10249 - C6 80 A8060000 01 - mov byte ptr [rax+000006A8],01 { Signature location } <---- PATTERN 93 | 7FF7C5E10250 - BA 03000000 - mov edx,00000003 { 3 } 94 | 7FF7C5E10255 - 48 8B CF - mov rcx,rdi 95 | 7FF7C5E10258 - E8 B3140000 - call 7FF7C5E11710 96 | 7FF7C5E1025D - E9 6F010000 - jmp 7FF7C5E103D1 97 | 7FF7C5E10262 - 48 8D 45 C7 - lea rax,[rbp-39] 98 | 7FF7C5E10266 - 48 89 45 17 - mov [rbp+17],rax 99 | 7FF7C5E1026A - 48 8D 45 BF - lea rax,[rbp-41] 100 | 7FF7C5E1026E - 48 89 45 1F - mov [rbp+1F],rax 101 | 7FF7C5E10272 - 48 8D 45 CF - lea rax,[rbp-31] 102 | 7FF7C5E10276 - 48 89 45 27 - mov [rbp+27],rax 103 | 7FF7C5E1027A - 33 F6 - xor esi,esi 104 | 7FF7C5E1027C - 48 89 75 07 - mov [rbp+07],rsi 105 | 7FF7C5E10280 - 48 8D 45 CF - lea rax,[rbp-31] 106 | 7FF7C5E10284 - 48 89 45 2F - mov [rbp+2F],rax 107 | 7FF7C5E10288 - 48 8D 45 CF - lea rax,[rbp-31] 108 | 7FF7C5E1028C - 48 89 45 37 - mov [rbp+37],rax 109 | 7FF7C5E10290 - 48 8D 05 D90DE801 - lea rax,[7FF7C7C91070] { (7FF7C77D8CB0) } 110 | 7FF7C5E10297 - 48 89 45 CF - mov [rbp-31],rax 111 | 7FF7C5E1029B - 48 8D 05 B6E3FF01 - lea rax,[7FF7C7E0E658] { (7FF7C5E11960) } 112 | 7FF7C5E102A2 - 48 89 45 CF - mov [rbp-31],rax 113 | 7FF7C5E102A6 - 48 89 7D D7 - mov [rbp-29],rdi 114 | 7FF7C5E102AA - 48 8D 45 CF - lea rax,[rbp-31] 115 | 7FF7C5E102AE - 48 89 45 07 - mov [rbp+07],rax 116 | 7FF7C5E102B2 - 45 33 C0 - xor r8d,r8d 117 | 7FF7C5E102B5 - 8D 56 02 - lea edx,[rsi+02] 118 | 7FF7C5E102B8 - 48 8D 4D B7 - lea rcx,[rbp-49] 119 | 7FF7C5E102BC - E8 EFF6CCFF - call 7FF7C5ADF9B0 120 | 7FF7C5E102C1 - 90 - nop 121 | 7FF7C5E102C2 - 4C 8B 45 B7 - mov r8,[rbp-49] 122 | 7FF7C5E102C6 - 48 8D 55 CF - lea rdx,[rbp-31] 123 | 7FF7C5E102CA - 48 8D 4D 7F - lea rcx,[rbp+7F] 124 | 7FF7C5E102CE - E8 BDF4C6FF - call 7FF7C5A7F790 125 | 7FF7C5E102D3 - 90 - nop 126 | 7FF7C5E102D4 - 48 8D 55 BF - lea rdx,[rbp-41] 127 | 7FF7C5E102D8 - 48 8B C8 - mov rcx,rax 128 | 7FF7C5E102DB - E8 50E0CCFF - call 7FF7C5ADE330 129 | 7FF7C5E102E0 - 48 8B D8 - mov rbx,rax 130 | 7FF7C5E102E3 - 48 8D 97 E0000000 - lea rdx,[rdi+000000E0] 131 | 7FF7C5E102EA - 48 8D 4D 77 - lea rcx,[rbp+77] 132 | 7FF7C5E102EE - E8 1DB8D5FF - call 7FF7C5B6BB10 133 | 7FF7C5E102F3 - 90 - nop 134 | 7FF7C5E102F4 - 4C 8B C3 - mov r8,rbx 135 | 7FF7C5E102F7 - 48 8D 55 67 - lea rdx,[rbp+67] 136 | 7FF7C5E102FB - 48 8B C8 - mov rcx,rax 137 | 7FF7C5E102FE - E8 7DE0CCFF - call 7FF7C5ADE380 138 | 7FF7C5E10303 - 90 - nop 139 | 7FF7C5E10304 - 48 8D 55 C7 - lea rdx,[rbp-39] 140 | 7FF7C5E10308 - 48 8B C8 - mov rcx,rax 141 | 7FF7C5E1030B - E8 20E0CCFF - call 7FF7C5ADE330 142 | 7FF7C5E10310 - 90 - nop 143 | 7FF7C5E10311 - 48 8B D0 - mov rdx,rax 144 | 7FF7C5E10314 - 48 8B CF - mov rcx,rdi 145 | 7FF7C5E10317 - E8 C41F0000 - call 7FF7C5E122E0 146 | 7FF7C5E1031C - 90 - nop 147 | 7FF7C5E1031D - 48 8B 5D 67 - mov rbx,[rbp+67] 148 | 7FF7C5E10321 - 48 85 DB - test rbx,rbx 149 | 7FF7C5E10324 - 74 33 - je 7FF7C5E10359 150 | 7FF7C5E10326 - 48 8D 4B 08 - lea rcx,[rbx+08] 151 | 7FF7C5E1032A - E8 41853601 - call 7FF7C7178870 152 | 7FF7C5E1032F - 83 F8 01 - cmp eax,01 { 1 } 153 | 7FF7C5E10332 - 75 0A - jne 7FF7C5E1033E 154 | 7FF7C5E10334 - 48 8B 03 - mov rax,[rbx] 155 | 7FF7C5E10337 - 48 8B CB - mov rcx,rbx 156 | 7FF7C5E1033A - FF 10 - call qword ptr [rax] 157 | 7FF7C5E1033C - EB 17 - jmp 7FF7C5E10355 158 | 7FF7C5E1033E - 85 C0 - test eax,eax 159 | 7FF7C5E10340 - 7F 13 - jg 7FF7C5E10355 160 | 7FF7C5E10342 - 4C 8D 05 F7467202 - lea r8,[7FF7C8534A40] { ("DLReferenceCountObject: Invalid Unref() call. m_nRefCount is 0 ") } 161 | 7FF7C5E10349 - BA 3E000000 - mov edx,0000003E { 62 } 162 | 7FF7C5E1034E - 33 C9 - xor ecx,ecx 163 | 7FF7C5E10350 - E8 BB7A3601 - call 7FF7C7177E10 164 | 7FF7C5E10355 - 48 89 75 67 - mov [rbp+67],rsi 165 | 7FF7C5E10359 - 48 8B 5D 77 - mov rbx,[rbp+77] 166 | 7FF7C5E1035D - 48 85 DB - test rbx,rbx 167 | 7FF7C5E10360 - 74 33 - je 7FF7C5E10395 168 | 7FF7C5E10362 - 48 8D 4B 08 - lea rcx,[rbx+08] 169 | 7FF7C5E10366 - E8 05853601 - call 7FF7C7178870 170 | 7FF7C5E1036B - 83 F8 01 - cmp eax,01 { 1 } 171 | 7FF7C5E1036E - 75 0A - jne 7FF7C5E1037A 172 | 7FF7C5E10370 - 48 8B 03 - mov rax,[rbx] 173 | 7FF7C5E10373 - 48 8B CB - mov rcx,rbx 174 | 7FF7C5E10376 - FF 10 - call qword ptr [rax] 175 | 7FF7C5E10378 - EB 17 - jmp 7FF7C5E10391 176 | 7FF7C5E1037A - 85 C0 - test eax,eax 177 | 7FF7C5E1037C - 7F 13 - jg 7FF7C5E10391 178 | 7FF7C5E1037E - 4C 8D 05 BB467202 - lea r8,[7FF7C8534A40] { ("DLReferenceCountObject: Invalid Unref() call. m_nRefCount is 0 ") } 179 | 7FF7C5E10385 - BA 3E000000 - mov edx,0000003E { 62 } 180 | 7FF7C5E1038A - 33 C9 - xor ecx,ecx 181 | 7FF7C5E1038C - E8 7F7A3601 - call 7FF7C7177E10 182 | 7FF7C5E10391 - 48 89 75 77 - mov [rbp+77],rsi 183 | 7FF7C5E10395 - 48 8B 5D 7F - mov rbx,[rbp+7F] 184 | 7FF7C5E10399 - 48 85 DB - test rbx,rbx 185 | 7FF7C5E1039C - 74 33 - je 7FF7C5E103D1 186 | 7FF7C5E1039E - 48 8D 4B 08 - lea rcx,[rbx+08] 187 | 7FF7C5E103A2 - E8 C9843601 - call 7FF7C7178870 188 | 7FF7C5E103A7 - 83 F8 01 - cmp eax,01 { 1 } 189 | 7FF7C5E103AA - 75 0A - jne 7FF7C5E103B6 190 | 7FF7C5E103AC - 48 8B 03 - mov rax,[rbx] 191 | 7FF7C5E103AF - 48 8B CB - mov rcx,rbx 192 | 7FF7C5E103B2 - FF 10 - call qword ptr [rax] 193 | 7FF7C5E103B4 - EB 17 - jmp 7FF7C5E103CD 194 | 7FF7C5E103B6 - 85 C0 - test eax,eax 195 | 7FF7C5E103B8 - 7F 13 - jg 7FF7C5E103CD 196 | 7FF7C5E103BA - 4C 8D 05 7F467202 - lea r8,[7FF7C8534A40] { ("DLReferenceCountObject: Invalid Unref() call. m_nRefCount is 0 ") } 197 | 7FF7C5E103C1 - BA 3E000000 - mov edx,0000003E { 62 } 198 | 7FF7C5E103C6 - 33 C9 - xor ecx,ecx 199 | 7FF7C5E103C8 - E8 437A3601 - call 7FF7C7177E10 200 | 7FF7C5E103CD - 48 89 75 7F - mov [rbp+7F],rsi 201 | 7FF7C5E103D1 - 48 8B 9C 24 D8000000 - mov rbx,[rsp+000000D8] 202 | 7FF7C5E103D9 - 48 81 C4 B0000000 - add rsp,000000B0 { 176 } 203 | 7FF7C5E103E0 - 5F - pop rdi 204 | 7FF7C5E103E1 - 5E - pop rsi 205 | 7FF7C5E103E2 - 5D - pop rbp 206 | 7FF7C5E103E3 - C3 - ret 207 | 208 | 209 | FUNCTION BELOW: 210 | 211 | 7FF7C5E103E4 - 48 8B 4D 3F - mov rcx,[rbp+3F] 212 | 7FF7C5E103E8 - 48 33 CC - xor rcx,rsp 213 | 7FF7C5E103EB - E9 25BBB501 - jmp 7FF7C796BF15 214 | 7FF7C5E103F0 - 40 53 - push rbx 215 | 7FF7C5E103F2 - 48 83 EC 20 - sub rsp,20 { 32 } 216 | 7FF7C5E103F6 - 48 8B 05 03A31B03 - mov rax,[7FF7C8FCA700] { (7FF2D9E4B2A0) } 217 | 7FF7C5E103FD - 48 8B D9 - mov rbx,rcx 218 | 7FF7C5E10400 - 48 85 C0 - test rax,rax 219 | 7FF7C5E10403 - 75 2E - jne 7FF7C5E10433 220 | 7FF7C5E10405 - 48 8D 0D D1981A03 - lea rcx,[7FF7C8FB9CDD] { (0) } 221 | 7FF7C5E1040C - E8 3FF63601 - call 7FF7C717FA50 222 | 7FF7C5E10411 - 4C 8B C8 - mov r9,rax 223 | 7FF7C5E10414 - 4C 8D 05 CD317202 - lea r8,[7FF7C85335E8] { (-1774554331) } 224 | 7FF7C5E1041B - BA B4000000 - mov edx,000000B4 { 180 } 225 | 7FF7C5E10420 - 48 8D 0D F965E601 - lea rcx,[7FF7C7C76A20] { ("w:\gr\patch103\source\library\fd4\dist_win64_vc2015\include\Cor") } 226 | 7FF7C5E10427 - E8 E4793601 - call 7FF7C7177E10 227 | 7FF7C5E1042C - 48 8B 05 CDA21B03 - mov rax,[7FF7C8FCA700] { (7FF2D9E4B2A0) } 228 | 7FF7C5E10433 - C6 80 A8060000 01 - mov byte ptr [rax+000006A8],01 { 1 } 229 | 7FF7C5E1043A - E8 C1AAC4FF - call 7FF7C5A5AF00 230 | 7FF7C5E1043F - BA 05000000 - mov edx,00000005 { 5 } 231 | 7FF7C5E10444 - 89 83 BC000000 - mov [rbx+000000BC],eax 232 | 7FF7C5E1044A - 48 8B CB - mov rcx,rbx 233 | 7FF7C5E1044D - E8 BE120000 - call 7FF7C5E11710 234 | 7FF7C5E10452 - C6 83 E0030000 01 - mov byte ptr [rbx+000003E0],01 { 1 } 235 | 7FF7C5E10459 - 48 83 C4 20 - add rsp,20 { 32 } 236 | 7FF7C5E1045D - 5B - pop rbx 237 | 7FF7C5E1045E - C3 - ret 238 | 7FF7C5E1045F - CC - int 3 239 | 7FF7C5E10460 - 40 55 - push rbp 240 | 7FF7C5E10462 - 53 - push rbx 241 | 7FF7C5E10463 - 56 - push rsi 242 | 7FF7C5E10464 - 57 - push rdi 243 | 7FF7C5E10465 - 41 56 - push r14 244 | 7FF7C5E10467 - 48 8D 6C 24 B0 - lea rbp,[rsp-50] 245 | 7FF7C5E1046C - 48 81 EC 50010000 - sub rsp,00000150 { 336 } 246 | 7FF7C5E10473 - 48 C7 45 F8 FEFFFFFF - mov qword ptr [rbp-08],FFFFFFFFFFFFFFFE { -2 } 247 | 7FF7C5E1047B - 48 8B F1 - mov rsi,rcx 248 | 7FF7C5E1047E - E8 FD87BAFF - call 7FF7C59B8C80 249 | 7FF7C5E10483 - E8 0805CBFF - call 7FF7C5AC0990 250 | 7FF7C5E10488 - 66 C7 86 E0030000 0000 - mov word ptr [rsi+000003E0],0000 { 0 } 251 | 7FF7C5E10491 - 48 8D 44 24 50 - lea rax,[rsp+50] 252 | 7FF7C5E10496 - 48 89 45 00 - mov [rbp+00],rax 253 | 7FF7C5E1049A - 48 8D 44 24 30 - lea rax,[rsp+30] 254 | 7FF7C5E1049F - 48 89 45 08 - mov [rbp+08],rax 255 | 7FF7C5E104A3 - 48 8D 44 24 78 - lea rax,[rsp+78] 256 | 7FF7C5E104A8 - 48 89 45 10 - mov [rbp+10],rax 257 | 7FF7C5E104AC - 48 8D 44 24 40 - lea rax,[rsp+40] 258 | 7FF7C5E104B1 - 48 89 45 18 - mov [rbp+18],rax 259 | 7FF7C5E104B5 - 48 8D 45 B8 - lea rax,[rbp-48] 260 | 7FF7C5E104B9 - 48 89 45 20 - mov [rbp+20],rax 261 | 7FF7C5E104BD - 48 8D 44 24 48 - lea rax,[rsp+48] 262 | 7FF7C5E104C2 - 48 89 45 28 - mov [rbp+28],rax 263 | 7FF7C5E104C6 - 45 33 F6 - xor r14d,r14d 264 | 7FF7C5E104C9 - 4C 89 75 B0 - mov [rbp-50],r14 265 | 7FF7C5E104CD - 48 8D 44 24 78 - lea rax,[rsp+78] 266 | 7FF7C5E104D2 - 48 89 44 24 58 - mov [rsp+58],rax 267 | 7FF7C5E104D7 - 48 8D 44 24 78 - lea rax,[rsp+78] 268 | 7FF7C5E104DC - 48 89 44 24 60 - mov [rsp+60],rax 269 | 7FF7C5E104E1 - 48 8D 1D 880BE801 - lea rbx,[7FF7C7C91070] { (7FF7C77D8CB0) } 270 | 7FF7C5E104E8 - 48 89 5C 24 78 - mov [rsp+78],rbx 271 | 7FF7C5E104ED - 48 8D 05 D4E1FF01 - lea rax,[7FF7C7E0E6C8] { (7FF7C5E118A0) } 272 | 7FF7C5E104F4 - 48 89 44 24 78 - mov [rsp+78],rax 273 | 7FF7C5E104F9 - 48 89 75 80 - mov [rbp-80],rsi 274 | 7FF7C5E104FD - 48 8D 44 24 78 - lea rax,[rsp+78] 275 | 7FF7C5E10502 - 48 89 45 B0 - mov [rbp-50],rax 276 | 7FF7C5E10506 - 45 33 C0 - xor r8d,r8d 277 | 7FF7C5E10509 - 41 8D 56 02 - lea edx,[r14+02] 278 | 7FF7C5E1050D - 48 8D 4C 24 28 - lea rcx,[rsp+28] 279 | 7FF7C5E10512 - E8 99F4CCFF - call 7FF7C5ADF9B0 280 | 7FF7C5E10517 - 90 - nop 281 | 7FF7C5E10518 - 4C 8B 44 24 28 - mov r8,[rsp+28] 282 | 7FF7C5E1051D - 48 8D 54 24 78 - lea rdx,[rsp+78] 283 | 7FF7C5E10522 - 48 8D 4C 24 20 - lea rcx,[rsp+20] 284 | 7FF7C5E10527 - E8 64F2C6FF - call 7FF7C5A7F790 285 | 7FF7C5E1052C - 90 - nop 286 | 7FF7C5E1052D - 48 8D 54 24 30 - lea rdx,[rsp+30] 287 | 7FF7C5E10532 - 48 8B C8 - mov rcx,rax 288 | 7FF7C5E10535 - E8 F6DDCCFF - call 7FF7C5ADE330 289 | 7FF7C5E1053A - 48 8B F8 - mov rdi,rax 290 | 7FF7C5E1053D - 4C 89 75 F0 - mov [rbp-10],r14 291 | 7FF7C5E10541 - 48 8D 45 B8 - lea rax,[rbp-48] 292 | 7FF7C5E10545 - 48 89 44 24 60 - mov [rsp+60],rax 293 | 7FF7C5E1054A - 48 8D 45 B8 - lea rax,[rbp-48] 294 | 7FF7C5E1054E - 48 89 44 24 58 - mov [rsp+58],rax 295 | 7FF7C5E10553 - 48 89 5D B8 - mov [rbp-48],rbx 296 | 7FF7C5E10557 - 48 8D 05 32E1FF01 - lea rax,[7FF7C7E0E690] { (7FF7C5E119E0) } 297 | 7FF7C5E1055E - 48 89 45 B8 - mov [rbp-48],rax 298 | 7FF7C5E10562 - 48 89 75 C0 - mov [rbp-40],rsi 299 | 7FF7C5E10566 - 48 8D 45 B8 - lea rax,[rbp-48] 300 | 7FF7C5E1056A - 48 89 45 F0 - mov [rbp-10],rax 301 | 7FF7C5E1056E - 45 33 C0 - xor r8d,r8d 302 | 7FF7C5E10571 - 41 8D 56 02 - lea edx,[r14+02] 303 | 7FF7C5E10575 - 48 8D 4C 24 38 - lea rcx,[rsp+38] 304 | 7FF7C5E1057A - E8 31F4CCFF - call 7FF7C5ADF9B0 305 | 7FF7C5E1057F - 90 - nop 306 | 7FF7C5E10580 - 4C 8B 44 24 38 - mov r8,[rsp+38] 307 | 7FF7C5E10585 - 48 8D 55 B8 - lea rdx,[rbp-48] 308 | 7FF7C5E10589 - 48 8D 8D 98000000 - lea rcx,[rbp+00000098] 309 | 7FF7C5E10590 - E8 FBF1C6FF - call 7FF7C5A7F790 310 | 7FF7C5E10595 - 90 - nop 311 | 7FF7C5E10596 - 48 8D 54 24 40 - lea rdx,[rsp+40] 312 | 7FF7C5E1059B - 48 8B C8 - mov rcx,rax 313 | 7FF7C5E1059E - E8 8DDDCCFF - call 7FF7C5ADE330 314 | 7FF7C5E105A3 - 48 8B D8 - mov rbx,rax 315 | 7FF7C5E105A6 - 4C 8D 86 38010000 - lea r8,[rsi+00000138] 316 | 7FF7C5E105AD - 48 8D 96 E0000000 - lea rdx,[rsi+000000E0] 317 | 7FF7C5E105B4 - 48 8D 8D 90000000 - lea rcx,[rbp+00000090] 318 | 7FF7C5E105BB - E8 50C2D5FF - call 7FF7C5B6C810 319 | 7FF7C5E105C0 - 90 - nop 320 | 7FF7C5E105C1 - 48 8D 54 24 48 - lea rdx,[rsp+48] 321 | 7FF7C5E105C6 - 48 8B C8 - mov rcx,rax 322 | 7FF7C5E105C9 - E8 62DDCCFF - call 7FF7C5ADE330 323 | 7FF7C5E105CE - 90 - nop 324 | 7FF7C5E105CF - 41 B0 01 - mov r8l,01 { 1 } 325 | 7FF7C5E105D2 - 48 8B D0 - mov rdx,rax 326 | 7FF7C5E105D5 - 48 8D 4C 24 68 - lea rcx,[rsp+68] 327 | 7FF7C5E105DA - E8 51FAFFFF - call 7FF7C5E10030 328 | 7FF7C5E105DF - 90 - nop 329 | 7FF7C5E105E0 - 4C 8B C3 - mov r8,rbx 330 | 7FF7C5E105E3 - 48 8D 55 30 - lea rdx,[rbp+30] 331 | 7FF7C5E105E7 - 48 8B C8 - mov rcx,rax 332 | 7FF7C5E105EA - E8 3148CBFF - call 7FF7C5AC4E20 333 | 7FF7C5E105EF - 90 - nop 334 | 7FF7C5E105F0 - 4C 8B C7 - mov r8,rdi 335 | 7FF7C5E105F3 - 48 8D 95 80000000 - lea rdx,[rbp+00000080] 336 | 7FF7C5E105FA - 48 8B C8 - mov rcx,rax 337 | 7FF7C5E105FD - E8 0E8FCBFF - call 7FF7C5AC9510 338 | 7FF7C5E10602 - 90 - nop 339 | 7FF7C5E10603 - 48 8D 54 24 50 - lea rdx,[rsp+50] 340 | 7FF7C5E10608 - 48 8B C8 - mov rcx,rax 341 | 7FF7C5E1060B - E8 20DDCCFF - call 7FF7C5ADE330 342 | 7FF7C5E10610 - 90 - nop 343 | 7FF7C5E10611 - 48 8B D0 - mov rdx,rax 344 | 7FF7C5E10614 - 48 8B CE - mov rcx,rsi 345 | 7FF7C5E10617 - E8 C41C0000 - call 7FF7C5E122E0 346 | 7FF7C5E1061C - 90 - nop 347 | 7FF7C5E1061D - 48 8B 9D 80000000 - mov rbx,[rbp+00000080] 348 | 7FF7C5E10624 - 48 85 DB - test rbx,rbx 349 | 7FF7C5E10627 - 74 36 - je 7FF7C5E1065F 350 | 7FF7C5E10629 - 48 8D 4B 08 - lea rcx,[rbx+08] 351 | 7FF7C5E1062D - E8 3E823601 - call 7FF7C7178870 352 | 7FF7C5E10632 - 83 F8 01 - cmp eax,01 { 1 } 353 | 7FF7C5E10635 - 75 0A - jne 7FF7C5E10641 354 | 7FF7C5E10637 - 48 8B 03 - mov rax,[rbx] 355 | 7FF7C5E1063A - 48 8B CB - mov rcx,rbx 356 | 7FF7C5E1063D - FF 10 - call qword ptr [rax] 357 | 7FF7C5E1063F - EB 17 - jmp 7FF7C5E10658 358 | 7FF7C5E10641 - 85 C0 - test eax,eax 359 | 7FF7C5E10643 - 7F 13 - jg 7FF7C5E10658 360 | 7FF7C5E10645 - 4C 8D 05 F4437202 - lea r8,[7FF7C8534A40] { ("DLReferenceCountObject: Invalid Unref() call. m_nRefCount is 0 ") } 361 | 7FF7C5E1064C - BA 3E000000 - mov edx,0000003E { 62 } 362 | 7FF7C5E10651 - 33 C9 - xor ecx,ecx 363 | 7FF7C5E10653 - E8 B8773601 - call 7FF7C7177E10 364 | 7FF7C5E10658 - 4C 89 B5 80000000 - mov [rbp+00000080],r14 365 | 7FF7C5E1065F - 48 8D 4D 30 - lea rcx,[rbp+30] 366 | 7FF7C5E10663 - E8 A835CBFF - call 7FF7C5AC3C10 367 | 7FF7C5E10668 - 90 - nop 368 | 7FF7C5E10669 - 48 8B 5C 24 68 - mov rbx,[rsp+68] 369 | 7FF7C5E1066E - 48 85 DB - test rbx,rbx 370 | 7FF7C5E10671 - 74 34 - je 7FF7C5E106A7 371 | 7FF7C5E10673 - 48 8D 4B 08 - lea rcx,[rbx+08] 372 | 7FF7C5E10677 - E8 F4813601 - call 7FF7C7178870 373 | 7FF7C5E1067C - 83 F8 01 - cmp eax,01 { 1 } 374 | 7FF7C5E1067F - 75 0A - jne 7FF7C5E1068B 375 | 7FF7C5E10681 - 48 8B 03 - mov rax,[rbx] 376 | 7FF7C5E10684 - 48 8B CB - mov rcx,rbx 377 | 7FF7C5E10687 - FF 10 - call qword ptr [rax] 378 | 7FF7C5E10689 - EB 17 - jmp 7FF7C5E106A2 379 | 7FF7C5E1068B - 85 C0 - test eax,eax 380 | 7FF7C5E1068D - 7F 13 - jg 7FF7C5E106A2 381 | 7FF7C5E1068F - 4C 8D 05 AA437202 - lea r8,[7FF7C8534A40] { ("DLReferenceCountObject: Invalid Unref() call. m_nRefCount is 0 ") } 382 | 7FF7C5E10696 - BA 3E000000 - mov edx,0000003E { 62 } 383 | 7FF7C5E1069B - 33 C9 - xor ecx,ecx 384 | 7FF7C5E1069D - E8 6E773601 - call 7FF7C7177E10 385 | 7FF7C5E106A2 - 4C 89 74 24 68 - mov [rsp+68],r14 386 | 7FF7C5E106A7 - 48 8B 9D 90000000 - mov rbx,[rbp+00000090] 387 | 7FF7C5E106AE - 48 85 DB - test rbx,rbx 388 | 7FF7C5E106B1 - 74 36 - je 7FF7C5E106E9 389 | 7FF7C5E106B3 - 48 8D 4B 08 - lea rcx,[rbx+08] 390 | 7FF7C5E106B7 - E8 B4813601 - call 7FF7C7178870 391 | 7FF7C5E106BC - 83 F8 01 - cmp eax,01 { 1 } 392 | 7FF7C5E106BF - 75 0A - jne 7FF7C5E106CB 393 | 7FF7C5E106C1 - 48 8B 03 - mov rax,[rbx] 394 | 7FF7C5E106C4 - 48 8B CB - mov rcx,rbx 395 | 7FF7C5E106C7 - FF 10 - call qword ptr [rax] 396 | 7FF7C5E106C9 - EB 17 - jmp 7FF7C5E106E2 397 | 7FF7C5E106CB - 85 C0 - test eax,eax 398 | 7FF7C5E106CD - 7F 13 - jg 7FF7C5E106E2 399 | 7FF7C5E106CF - 4C 8D 05 6A437202 - lea r8,[7FF7C8534A40] { ("DLReferenceCountObject: Invalid Unref() call. m_nRefCount is 0 ") } 400 | 7FF7C5E106D6 - BA 3E000000 - mov edx,0000003E { 62 } 401 | 7FF7C5E106DB - 33 C9 - xor ecx,ecx 402 | 7FF7C5E106DD - E8 2E773601 - call 7FF7C7177E10 403 | 7FF7C5E106E2 - 4C 89 B5 90000000 - mov [rbp+00000090],r14 404 | 7FF7C5E106E9 - 48 8B 9D 98000000 - mov rbx,[rbp+00000098] 405 | 7FF7C5E106F0 - 48 85 DB - test rbx,rbx 406 | 7FF7C5E106F3 - 74 36 - je 7FF7C5E1072B 407 | 7FF7C5E106F5 - 48 8D 4B 08 - lea rcx,[rbx+08] 408 | 7FF7C5E106F9 - E8 72813601 - call 7FF7C7178870 409 | 7FF7C5E106FE - 83 F8 01 - cmp eax,01 { 1 } 410 | 7FF7C5E10701 - 75 0A - jne 7FF7C5E1070D 411 | 7FF7C5E10703 - 48 8B 03 - mov rax,[rbx] 412 | 7FF7C5E10706 - 48 8B CB - mov rcx,rbx 413 | 7FF7C5E10709 - FF 10 - call qword ptr [rax] 414 | 7FF7C5E1070B - EB 17 - jmp 7FF7C5E10724 415 | 7FF7C5E1070D - 85 C0 - test eax,eax 416 | 7FF7C5E1070F - 7F 13 - jg 7FF7C5E10724 417 | 7FF7C5E10711 - 4C 8D 05 28437202 - lea r8,[7FF7C8534A40] { ("DLReferenceCountObject: Invalid Unref() call. m_nRefCount is 0 ") } 418 | 7FF7C5E10718 - BA 3E000000 - mov edx,0000003E { 62 } 419 | 7FF7C5E1071D - 33 C9 - xor ecx,ecx 420 | 7FF7C5E1071F - E8 EC763601 - call 7FF7C7177E10 421 | 7FF7C5E10724 - 4C 89 B5 98000000 - mov [rbp+00000098],r14 422 | 7FF7C5E1072B - 48 8B 5C 24 20 - mov rbx,[rsp+20] 423 | 7FF7C5E10730 - 48 85 DB - test rbx,rbx 424 | 7FF7C5E10733 - 74 34 - je 7FF7C5E10769 425 | 7FF7C5E10735 - 48 8D 4B 08 - lea rcx,[rbx+08] 426 | 7FF7C5E10739 - E8 32813601 - call 7FF7C7178870 427 | 7FF7C5E1073E - 83 F8 01 - cmp eax,01 { 1 } 428 | 7FF7C5E10741 - 75 0A - jne 7FF7C5E1074D 429 | 7FF7C5E10743 - 48 8B 03 - mov rax,[rbx] 430 | 7FF7C5E10746 - 48 8B CB - mov rcx,rbx 431 | 7FF7C5E10749 - FF 10 - call qword ptr [rax] 432 | 7FF7C5E1074B - EB 17 - jmp 7FF7C5E10764 433 | 7FF7C5E1074D - 85 C0 - test eax,eax 434 | 7FF7C5E1074F - 7F 13 - jg 7FF7C5E10764 435 | 7FF7C5E10751 - 4C 8D 05 E8427202 - lea r8,[7FF7C8534A40] { ("DLReferenceCountObject: Invalid Unref() call. m_nRefCount is 0 ") } 436 | 7FF7C5E10758 - BA 3E000000 - mov edx,0000003E { 62 } 437 | 7FF7C5E1075D - 33 C9 - xor ecx,ecx 438 | 7FF7C5E1075F - E8 AC763601 - call 7FF7C7177E10 439 | 7FF7C5E10764 - 4C 89 74 24 20 - mov [rsp+20],r14 440 | 7FF7C5E10769 - 48 81 C4 50010000 - add rsp,00000150 { 336 } 441 | 7FF7C5E10770 - 41 5E - pop r14 442 | 7FF7C5E10772 - 5F - pop rdi 443 | 7FF7C5E10773 - 5E - pop rsi 444 | 7FF7C5E10774 - 5B - pop rbx 445 | 7FF7C5E10775 - 5D - pop rbp 446 | 7FF7C5E10776 - C3 - ret --------------------------------------------------------------------------------