diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..10686c4 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "MinHook"] + path = MinHook + url = https://github.com/TsudaKageyu/minhook.git diff --git a/Common/Logger.h b/Common/Logger.h index b7c7193..71ce53e 100644 --- a/Common/Logger.h +++ b/Common/Logger.h @@ -13,7 +13,6 @@ class Logger { public: - std::mutex printLogMutex; Logger(const Logger&) = delete; const Logger& operator=(Logger& other) = delete; @@ -28,6 +27,8 @@ public: CloseHandle(m_file); } + std::mutex& writeMutex() const { return m_writeMutex; } + static Logger& Logger::Get() { static Logger instance; @@ -111,6 +112,7 @@ private: SYSTEMTIME m_systime; HANDLE m_console; HANDLE m_file; + mutable std::mutex m_writeMutex; }; inline void LogFile(const std::string& logname) @@ -125,7 +127,7 @@ inline void LogConsole(const char* title = nullptr) inline void PrintLog(const char* format, ...) { - const std::lock_guard lock(Logger::Get().printLogMutex); + const std::lock_guard lock(Logger::Get().writeMutex()); va_list args; va_start(args, format); Logger::Get().Print(format, args); diff --git a/Common/MemPatch.h b/Common/MemPatch.h new file mode 100644 index 0000000..017dd6c --- /dev/null +++ b/Common/MemPatch.h @@ -0,0 +1,42 @@ +#pragma once +#include + +namespace MemPatch +{ + class CUnprotect + { + public: + CUnprotect(void* address, unsigned long size) : m_adress(address), m_size(size) + { + VirtualProtect(m_adress, m_size, PAGE_EXECUTE_READWRITE, &m_oldprotect); + } + + ~CUnprotect() + { + DWORD oldProtect; + VirtualProtect(m_adress, m_size, m_oldprotect, &oldProtect); + } + private: + void* m_adress; + unsigned long m_size; + DWORD m_oldprotect; + }; + + __forceinline static void Patch(void* address, void* data, unsigned long size) + { + CUnprotect unp(address, size); + memcpy(address, data, size); + } + + __forceinline static void Fill(void* address, unsigned char byte, unsigned long size) + { + CUnprotect unp(address, size); + memset(address, byte, size); + } + + __forceinline static void Nop(void* address, unsigned long size) + { + Fill(address, 0x90, size); + } + +} \ No newline at end of file diff --git a/Common/SimpleIni.h b/Common/SimpleIni.h index 9297aa5..a1badb7 100644 --- a/Common/SimpleIni.h +++ b/Common/SimpleIni.h @@ -1422,7 +1422,7 @@ CSimpleIniTempl::LoadFile( } // allocate and ensure NULL terminated - char * pData = new char[lSize+1]; + char * pData = new(std::nothrow) char[lSize+1]; if (!pData) { return SI_NOMEM; } @@ -1471,7 +1471,7 @@ CSimpleIniTempl::LoadData( // allocate memory for the data, ensure that there is a NULL // terminator wherever the converted data ends - SI_CHAR * pData = new SI_CHAR[uLen+1]; + SI_CHAR * pData = new(std::nothrow) SI_CHAR[uLen+1]; if (!pData) { return SI_NOMEM; } @@ -1896,7 +1896,7 @@ CSimpleIniTempl::CopyString( for ( ; a_pString[uLen]; ++uLen) /*loop*/ ; } ++uLen; // NULL character - SI_CHAR * pCopy = new SI_CHAR[uLen]; + SI_CHAR * pCopy = new(std::nothrow) SI_CHAR[uLen]; if (!pCopy) { return SI_NOMEM; } diff --git a/Common/WinVer.h b/Common/WinVer.h index fb4b799..efed5da 100644 --- a/Common/WinVer.h +++ b/Common/WinVer.h @@ -62,14 +62,18 @@ typedef BOOL(WINAPI* GetProductInfo_t)(DWORD dwOSMajorVersion, DWORD dwOSMinorVe inline BOOL MyGetVersionExA(OSVERSIONINFOEXA* lpVersionInformation) { - GetVersionExA_t RealGetVersionExA = (GetVersionExA_t)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetVersionExA"); + HMODULE hkernel = GetModuleHandle(TEXT("kernel32.dll")); + if (!hkernel) return FALSE; + GetVersionExA_t RealGetVersionExA = (GetVersionExA_t)GetProcAddress(hkernel, "GetVersionExA"); if (!RealGetVersionExA) return FALSE; return RealGetVersionExA(lpVersionInformation); } inline BOOL MyGetProductInfo(DWORD dwOSMajorVersion, DWORD dwOSMinorVersion, DWORD dwSpMajorVersion, DWORD dwSpMinorVersion, PDWORD pdwReturnedProductType) { - GetProductInfo_t RealGetProductInfo = (GetProductInfo_t)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetProductInfo"); + HMODULE hkernel = GetModuleHandle(TEXT("kernel32.dll")); + if (!hkernel) return FALSE; + GetProductInfo_t RealGetProductInfo = (GetProductInfo_t)GetProcAddress(hkernel, "GetProductInfo"); if (!RealGetProductInfo) return FALSE; return RealGetProductInfo(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion, pdwReturnedProductType); } diff --git a/MinHook b/MinHook new file mode 160000 index 0000000..423d1e4 --- /dev/null +++ b/MinHook @@ -0,0 +1 @@ +Subproject commit 423d1e45af2ed2719a5c31e990e935ef301ed9c3 diff --git a/MinHook/.editorconfig b/MinHook/.editorconfig deleted file mode 100644 index 36c09e6..0000000 --- a/MinHook/.editorconfig +++ /dev/null @@ -1,22 +0,0 @@ -# EditorConfig is awesome: http://EditorConfig.org - -# top-most EditorConfig file -root = true - -# Windows-style newlines with a newline ending every file -[*] -end_of_line = crlf -insert_final_newline = true - -# 4 space indentation -[*.{c,h,def}] -indent_style = space -indent_size = 4 - -# Trim trailing whitespaces -[*.{c,h,def,txt}] -trim_trailing_whitespace = true - -# UTF-8 with BOM -[*.{c,h,def,txt}] -charset=utf-8-bom diff --git a/MinHook/.gitignore b/MinHook/.gitignore deleted file mode 100644 index 33a07e5..0000000 --- a/MinHook/.gitignore +++ /dev/null @@ -1,43 +0,0 @@ -#OS junk files -[Tt]humbs.db -*.DS_Store - -#Visual Studio files -*.[Oo]bj -*.user -*.aps -*.pch -*.vspscc -*.vssscc -*_i.c -*_p.c -*.ncb -*.suo -*.tlb -*.tlh -*.bak -*.[Cc]ache -*.ilk -*.log -*.sbr -*.sdf -*.opensdf -*.unsuccessfulbuild -ipch/ -obj/ -[Ll]ib -[Bb]in -[Dd]ebug*/ -[Rr]elease*/ -Ankh.NoLoad -*.VC.db - -#GCC files -*.o -*.d -*.res -*.dll -*.a - -#Visual Studio Code files -.vscode/ diff --git a/MinHook/AUTHORS.txt b/MinHook/AUTHORS.txt deleted file mode 100644 index ebef1a6..0000000 --- a/MinHook/AUTHORS.txt +++ /dev/null @@ -1,8 +0,0 @@ -Tsuda Kageyu - Creator, maintainer - -Michael Maltsev - Added "Queue" functions. A lot of bug fixes. - -Andrey Unis - Rewrote the hook engine in plain C. diff --git a/MinHook/LICENSE.txt b/MinHook/LICENSE.txt deleted file mode 100644 index 74dea27..0000000 --- a/MinHook/LICENSE.txt +++ /dev/null @@ -1,81 +0,0 @@ -MinHook - The Minimalistic API Hooking Library for x64/x86 -Copyright (C) 2009-2017 Tsuda Kageyu. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -================================================================================ -Portions of this software are Copyright (c) 2008-2009, Vyacheslav Patkov. -================================================================================ -Hacker Disassembler Engine 32 C -Copyright (c) 2008-2009, Vyacheslav Patkov. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -------------------------------------------------------------------------------- -Hacker Disassembler Engine 64 C -Copyright (c) 2008-2009, Vyacheslav Patkov. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/MinHook/README.md b/MinHook/README.md deleted file mode 100644 index 9b412b1..0000000 --- a/MinHook/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# MinHook - -[![License](https://img.shields.io/badge/License-BSD%202--Clause-orange.svg)](https://opensource.org/licenses/BSD-2-Clause) - -The Minimalistic x86/x64 API Hooking Library for Windows - -http://www.codeproject.com/KB/winsdk/LibMinHook.aspx - -### Donation please - -I need some funds to continue developing this library. All contributions gratefully accepted. - -Click here to lend your support to: MinHook - Help me continue to develop this library and make a donation at pledgie.com ! - -### Version history - -- ####v1.3.3 - 8 Jan 2017 - * Added a helper function ```MH_CreateHookApiEx```. (Thanks to asm256) - * Support Visual Studio 2017 RC. - -- ####v1.3.2.1 - 9 Nov 2015 (Nuget package only) - * Fixed an insufficient support for Visual Studio 2015. - -- ####v1.3.2 - 1 Nov 2015 - * Support Visual Studio 2015. - * Support MinGW. - -- ####v1.3.2-beta3 - 21 Jul 2015 (Nuget package only) - * Support MinGW. (Experimental) - -- ####v1.3.2-beta2 - 18 May 2015 - * Fixed some subtle bugs. (Thanks to RaMMicHaeL) - * Added a helper function ```MH_StatusToString```. (Thanks to Jan Klass) - -- ####v1.3.2-beta - 12 May 2015 - * Fixed a possible thread deadlock in x64 mode. (Thanks to Aleh Kazakevich) - * Reduced the footprint a little more. - * Support Visual Studio 2015 RC. (Experimental) - -- ####v1.3.1.1 - 7 Apr 2015 (Nuget package only) - * Support for WDK8.0 and 8.1. - -- ####v1.3.1 - 19 Mar 2015 - * No major changes from v1.3.1-beta. - -- ####v1.3.1-beta - 11 Mar 2015 - * Added a helper function ```MH_CreateHookApi```. (Thanks to uniskz). - * Fixed a false memory leak reported by some tools. - * Fixed a degradated compatibility issue. - -- ####v1.3 - 13 Sep 2014 - * No major changes from v1.3-beta3. - -- ####v1.3-beta3 - 31 Jul 2014 - - * Fixed some small bugs. - * Improved the memory management. - -- ####v1.3-beta2 - 21 Jul 2014 - - * Changed the parameters to Windows-friendly types. (void* to LPVOID) - * Fixed some small bugs. - * Reorganized the source files. - * Reduced the footprint a little more. - -- ####v1.3-beta - 17 Jul 2014 - - * Rewrote in plain C to reduce the footprint and memory usage. (suggested by Andrey Unis) - * Simplified the overall code base to make it more readable and maintainable. - * Changed the license from 3-clause to 2-clause BSD License. - -- ####v1.2 - 28 Sep 2013 - - * Removed boost dependency ([jarredholman](https://github.com/jarredholman/minhook)). - * Fixed a small bug in the GetRelativeBranchDestination function ([pillbug99](http://www.codeproject.com/Messages/4058892/Small-Bug-Found.aspx)). - * Added the ```MH_RemoveHook``` function, which removes a hook created with the ```MH_CreateHook``` function. - * Added the following functions to enable or disable multiple hooks in one go: ```MH_QueueEnableHook```, ```MH_QueueDisableHook```, ```MH_ApplyQueued```. This is the preferred way of handling multiple hooks as every call to `MH_EnableHook` or `MH_DisableHook` suspends and resumes all threads. - * Made the functions ```MH_EnableHook``` and ```MH_DisableHook``` enable/disable all created hooks when the ```MH_ALL_HOOKS``` parameter is passed. This, too, is an efficient way of handling multiple hooks. - * If the target function is too small to be patched with a jump, MinHook tries to place the jump above the function. If that fails as well, the ```MH_CreateHook``` function returns ```MH_ERROR_UNSUPPORTED_FUNCTION```. This fixes an issue of hooking the LoadLibraryExW function on Windows 7 x64 ([reported by Obble](http://www.codeproject.com/Messages/4578613/Re-Bug-LoadLibraryExW-hook-fails-on-windows-2008-r.aspx)). - -- ####v1.1 - 26 Nov 2009 - - * Changed the interface to create a hook and a trampoline function in one go to prevent the detour function from being called before the trampoline function is created. ([reported by xliqz](http://www.codeproject.com/Messages/3280374/Unsafe.aspx)) - * Shortened the function names from ```MinHook_*``` to ```MH_*``` to make them handier. - -- ####v1.0 - 22 Nov 2009 - - * Initial release. diff --git a/MinHook/build/MinGW/Makefile b/MinHook/build/MinGW/Makefile deleted file mode 100644 index cc16725..0000000 --- a/MinHook/build/MinGW/Makefile +++ /dev/null @@ -1,33 +0,0 @@ -WINDRES:=$(CROSS_PREFIX)windres -DLLTOOL:=$(CROSS_PREFIX)dlltool -AR:=$(CROSS_PREFIX)ar -CC:=$(CROSS_PREFIX)gcc -CCLD:=$(CC) -SRCS:=$(wildcard src/*.c src/hde/*.c) -OBJS:=$(SRCS:%.c=%.o) -DEPS:=$(SRCS:%.c=%.d) -INCS:=-Isrc -Iinclude -CFLAGS:=-masm=intel -Wall -Werror -std=c11 -LDFLAGS:=-Wl,-enable-stdcall-fixup -s -static-libgcc - -all: MinHook.dll libMinHook.dll.a libMinHook.a - --include $(DEPS) - -libMinHook.a: $(OBJS) - $(AR) r $@ $^ -libMinHook.dll.a: MinHook.dll dll_resources/MinHook.def - $(DLLTOOL) --dllname MinHook.dll --def dll_resources/MinHook.def --output-lib $@ -MinHook.dll: $(OBJS) dll_resources/MinHook.res dll_resources/MinHook.def - $(CCLD) -o $@ -shared $(LDFLAGS) $^ - -.rc.res: - $(WINDRES) -o $@ --input-format=rc --output-format=coff $< -.c.o: - $(CC) -o $@ -c -MMD -MP $(INCS) $(CFLAGS) $< - -clean: - rm -f $(OBJS) $(DEPS) MinHook.dll libMinHook.dll.a libMinHook.a dll_resources/MinHook.res - -.PHONY: clean -.SUFFIXES: .rc .res diff --git a/MinHook/build/MinGW/make.bat b/MinHook/build/MinGW/make.bat deleted file mode 100644 index 7671878..0000000 --- a/MinHook/build/MinGW/make.bat +++ /dev/null @@ -1 +0,0 @@ -windres -i ../../dll_resources/MinHook.rc -o MinHook_rc.o && dllwrap --driver-name g++ -o MinHook.dll -masm=intel --def ../../dll_resources/MinHook.def -Wl,-enable-stdcall-fixup -Wall MinHook_rc.o ../../src/*.c ../../src/HDE/*.c -I../../include -I../../src -Werror -std=c++11 -s -static-libgcc -static-libstdc++|| pause \ No newline at end of file diff --git a/MinHook/build/VC10/MinHook.vcxproj b/MinHook/build/VC10/MinHook.vcxproj deleted file mode 100644 index 3944d80..0000000 --- a/MinHook/build/VC10/MinHook.vcxproj +++ /dev/null @@ -1,189 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {027FAC75-3FDB-4044-8DD0-BC297BD4C461} - MinHook - Win32Proj - - - - DynamicLibrary - Unicode - true - - - DynamicLibrary - Unicode - - - DynamicLibrary - Unicode - true - - - DynamicLibrary - Unicode - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - true - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - true - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - false - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - false - $(ProjectName).x86 - $(ProjectName).x86 - $(ProjectName).x64 - $(ProjectName).x64 - - - - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - - - Level3 - - - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - MachineX86 - $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) - - - - - X64 - - - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - - - Level3 - - - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - MachineX64 - $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) - - - - - MinSpace - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - MultiThreaded - true - - - Level3 - - - false - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - true - true - MachineX86 - $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) - true - .CRT=.text - - - - - X64 - - - MinSpace - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - MultiThreaded - true - - - Level3 - - - false - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - true - true - MachineX64 - $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) - true - .CRT=.text - - - - - - - - - - - - \ No newline at end of file diff --git a/MinHook/build/VC10/MinHookVC10.sln b/MinHook/build/VC10/MinHookVC10.sln deleted file mode 100644 index dcc1d5c..0000000 --- a/MinHook/build/VC10/MinHookVC10.sln +++ /dev/null @@ -1,39 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "libMinHook.vcxproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MinHook", "MinHook.vcxproj", "{027FAC75-3FDB-4044-8DD0-BC297BD4C461}" - ProjectSection(ProjectDependencies) = postProject - {F142A341-5EE0-442D-A15F-98AE9B48DBAE} = {F142A341-5EE0-442D-A15F-98AE9B48DBAE} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.ActiveCfg = Debug|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.Build.0 = Debug|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.ActiveCfg = Debug|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.Build.0 = Debug|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.ActiveCfg = Release|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.Build.0 = Release|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.ActiveCfg = Release|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.Build.0 = Release|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.ActiveCfg = Debug|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.Build.0 = Debug|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.ActiveCfg = Debug|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.Build.0 = Debug|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.ActiveCfg = Release|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.Build.0 = Release|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.ActiveCfg = Release|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/MinHook/build/VC10/libMinHook.vcxproj b/MinHook/build/VC10/libMinHook.vcxproj deleted file mode 100644 index 589ff9a..0000000 --- a/MinHook/build/VC10/libMinHook.vcxproj +++ /dev/null @@ -1,172 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {F142A341-5EE0-442D-A15F-98AE9B48DBAE} - libMinHook - Win32Proj - - - - StaticLibrary - Unicode - true - - - StaticLibrary - Unicode - - - StaticLibrary - Unicode - true - - - StaticLibrary - Unicode - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(ProjectName).x86 - $(ProjectName).x86 - $(ProjectName).x64 - $(ProjectName).x64 - - - - Disabled - %(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - Level3 - - - false - - - - - - X64 - - - Disabled - %(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - Level3 - - - false - - - - - - MinSpace - true - %(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - MultiThreaded - true - Level3 - - - true - AnySuitable - - - - - - X64 - - - MinSpace - true - %(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - MultiThreaded - true - Level3 - - - true - AnySuitable - - - - - - - true - true - - - true - true - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/MinHook/build/VC10/libMinHook.vcxproj.filters b/MinHook/build/VC10/libMinHook.vcxproj.filters deleted file mode 100644 index f2d1d97..0000000 --- a/MinHook/build/VC10/libMinHook.vcxproj.filters +++ /dev/null @@ -1,55 +0,0 @@ - - - - - Source Files - - - Source Files - - - Source Files - - - HDE - - - HDE - - - - - Header Files - - - Header Files - - - - HDE - - - HDE - - - HDE - - - HDE - - - HDE - - - - - {9d24b740-be2e-4cfd-b9a4-340a50946ee9} - - - {76381bc7-2863-4cc5-aede-926ec2c506e4} - - - {56ddb326-6179-430d-ae19-e13bfd767bfa} - - - \ No newline at end of file diff --git a/MinHook/build/VC11/MinHook.vcxproj b/MinHook/build/VC11/MinHook.vcxproj deleted file mode 100644 index 4c0e212..0000000 --- a/MinHook/build/VC11/MinHook.vcxproj +++ /dev/null @@ -1,189 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {027FAC75-3FDB-4044-8DD0-BC297BD4C461} - MinHook - Win32Proj - - - - DynamicLibrary - Unicode - true - v110_xp - - - DynamicLibrary - Unicode - v110_xp - - - DynamicLibrary - Unicode - true - v110_xp - - - DynamicLibrary - Unicode - v110_xp - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - true - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - true - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - false - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - false - $(ProjectName).x86 - $(ProjectName).x86 - $(ProjectName).x64 - $(ProjectName).x64 - - - - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - - - Level3 - None - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - MachineX86 - $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) - - - - - X64 - - - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - - - Level3 - None - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - MachineX64 - $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) - - - - - MinSpace - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - MultiThreaded - true - - - Level3 - None - false - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - true - true - MachineX86 - $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) - true - .CRT=.text - - - - - X64 - - - MinSpace - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - MultiThreaded - true - - - Level3 - None - false - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - true - true - MachineX64 - $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) - true - .CRT=.text - - - - - - - - - - - - \ No newline at end of file diff --git a/MinHook/build/VC11/MinHookVC11.sln b/MinHook/build/VC11/MinHookVC11.sln deleted file mode 100644 index 5b56553..0000000 --- a/MinHook/build/VC11/MinHookVC11.sln +++ /dev/null @@ -1,39 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "libMinHook.vcxproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MinHook", "MinHook.vcxproj", "{027FAC75-3FDB-4044-8DD0-BC297BD4C461}" - ProjectSection(ProjectDependencies) = postProject - {F142A341-5EE0-442D-A15F-98AE9B48DBAE} = {F142A341-5EE0-442D-A15F-98AE9B48DBAE} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.ActiveCfg = Debug|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.Build.0 = Debug|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.ActiveCfg = Debug|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.Build.0 = Debug|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.ActiveCfg = Release|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.Build.0 = Release|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.ActiveCfg = Release|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.Build.0 = Release|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.ActiveCfg = Debug|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.Build.0 = Debug|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.ActiveCfg = Debug|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.Build.0 = Debug|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.ActiveCfg = Release|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.Build.0 = Release|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.ActiveCfg = Release|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/MinHook/build/VC11/libMinHook.vcxproj b/MinHook/build/VC11/libMinHook.vcxproj deleted file mode 100644 index 1a65499..0000000 --- a/MinHook/build/VC11/libMinHook.vcxproj +++ /dev/null @@ -1,172 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {F142A341-5EE0-442D-A15F-98AE9B48DBAE} - libMinHook - Win32Proj - - - - StaticLibrary - Unicode - true - v110_xp - - - StaticLibrary - Unicode - v110_xp - - - StaticLibrary - Unicode - true - v110_xp - - - StaticLibrary - Unicode - v110_xp - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(ProjectName).x86 - $(ProjectName).x86 - $(ProjectName).x64 - $(ProjectName).x64 - - - - Disabled - %(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - Level3 - None - NoExtensions - - - - - - X64 - - - Disabled - %(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - Level3 - None - - - - - - MinSpace - true - %(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - MultiThreaded - true - Level3 - None - true - AnySuitable - NoExtensions - - - - - - X64 - - - MinSpace - true - %(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - MultiThreaded - true - Level3 - None - true - AnySuitable - - - - - - - true - true - - - true - true - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/MinHook/build/VC11/libMinHook.vcxproj.filters b/MinHook/build/VC11/libMinHook.vcxproj.filters deleted file mode 100644 index f2d1d97..0000000 --- a/MinHook/build/VC11/libMinHook.vcxproj.filters +++ /dev/null @@ -1,55 +0,0 @@ - - - - - Source Files - - - Source Files - - - Source Files - - - HDE - - - HDE - - - - - Header Files - - - Header Files - - - - HDE - - - HDE - - - HDE - - - HDE - - - HDE - - - - - {9d24b740-be2e-4cfd-b9a4-340a50946ee9} - - - {76381bc7-2863-4cc5-aede-926ec2c506e4} - - - {56ddb326-6179-430d-ae19-e13bfd767bfa} - - - \ No newline at end of file diff --git a/MinHook/build/VC12/MinHook.vcxproj b/MinHook/build/VC12/MinHook.vcxproj deleted file mode 100644 index 40ec836..0000000 --- a/MinHook/build/VC12/MinHook.vcxproj +++ /dev/null @@ -1,189 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {027FAC75-3FDB-4044-8DD0-BC297BD4C461} - MinHook - Win32Proj - - - - DynamicLibrary - Unicode - true - v120_xp - - - DynamicLibrary - Unicode - v120_xp - - - DynamicLibrary - Unicode - true - v120_xp - - - DynamicLibrary - Unicode - v120_xp - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - true - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - true - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - false - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - false - $(ProjectName).x86 - $(ProjectName).x86 - $(ProjectName).x64 - $(ProjectName).x64 - - - - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - - - Level3 - None - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - MachineX86 - $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) - - - - - X64 - - - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - - - Level3 - None - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - MachineX64 - $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) - - - - - MinSpace - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - MultiThreaded - true - - - Level3 - None - false - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - true - true - MachineX86 - $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) - true - .CRT=.text - - - - - X64 - - - MinSpace - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - MultiThreaded - true - - - Level3 - None - false - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - true - true - MachineX64 - $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) - true - .CRT=.text - - - - - - - - - - - - \ No newline at end of file diff --git a/MinHook/build/VC12/MinHookVC12.sln b/MinHook/build/VC12/MinHookVC12.sln deleted file mode 100644 index cfd928b..0000000 --- a/MinHook/build/VC12/MinHookVC12.sln +++ /dev/null @@ -1,41 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.30501.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "libMinHook.vcxproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MinHook", "MinHook.vcxproj", "{027FAC75-3FDB-4044-8DD0-BC297BD4C461}" - ProjectSection(ProjectDependencies) = postProject - {F142A341-5EE0-442D-A15F-98AE9B48DBAE} = {F142A341-5EE0-442D-A15F-98AE9B48DBAE} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.ActiveCfg = Debug|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.Build.0 = Debug|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.ActiveCfg = Debug|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.Build.0 = Debug|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.ActiveCfg = Release|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.Build.0 = Release|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.ActiveCfg = Release|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.Build.0 = Release|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.ActiveCfg = Debug|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.Build.0 = Debug|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.ActiveCfg = Debug|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.Build.0 = Debug|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.ActiveCfg = Release|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.Build.0 = Release|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.ActiveCfg = Release|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/MinHook/build/VC12/libMinHook.vcxproj b/MinHook/build/VC12/libMinHook.vcxproj deleted file mode 100644 index 6b2a190..0000000 --- a/MinHook/build/VC12/libMinHook.vcxproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {F142A341-5EE0-442D-A15F-98AE9B48DBAE} - libMinHook - Win32Proj - - - - StaticLibrary - Unicode - true - v120_xp - - - StaticLibrary - Unicode - v120_xp - - - StaticLibrary - Unicode - true - v120_xp - - - StaticLibrary - Unicode - v120_xp - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(ProjectName).x86 - $(ProjectName).x86 - $(ProjectName).x64 - $(ProjectName).x64 - - - - Disabled - %(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - Level3 - None - NoExtensions - - - - - - X64 - - - Disabled - %(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - Level3 - None - NotSet - - - - - - MinSpace - true - %(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - MultiThreaded - true - Level3 - None - AnySuitable - CompileAsC - true - NoExtensions - - - - - - X64 - - - MinSpace - true - %(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - MultiThreaded - true - Level3 - None - true - AnySuitable - - - - - - - true - true - - - true - true - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/MinHook/build/VC12/libMinHook.vcxproj.filters b/MinHook/build/VC12/libMinHook.vcxproj.filters deleted file mode 100644 index f2d1d97..0000000 --- a/MinHook/build/VC12/libMinHook.vcxproj.filters +++ /dev/null @@ -1,55 +0,0 @@ - - - - - Source Files - - - Source Files - - - Source Files - - - HDE - - - HDE - - - - - Header Files - - - Header Files - - - - HDE - - - HDE - - - HDE - - - HDE - - - HDE - - - - - {9d24b740-be2e-4cfd-b9a4-340a50946ee9} - - - {76381bc7-2863-4cc5-aede-926ec2c506e4} - - - {56ddb326-6179-430d-ae19-e13bfd767bfa} - - - \ No newline at end of file diff --git a/MinHook/build/VC14/MinHook.vcxproj b/MinHook/build/VC14/MinHook.vcxproj deleted file mode 100644 index d5ecda2..0000000 --- a/MinHook/build/VC14/MinHook.vcxproj +++ /dev/null @@ -1,189 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {027FAC75-3FDB-4044-8DD0-BC297BD4C461} - MinHook - Win32Proj - - - - DynamicLibrary - Unicode - true - v140_xp - - - DynamicLibrary - Unicode - v140_xp - - - DynamicLibrary - Unicode - true - v140_xp - - - DynamicLibrary - Unicode - v140_xp - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - true - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - true - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - false - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - false - $(ProjectName).x86 - $(ProjectName).x86 - $(ProjectName).x64 - $(ProjectName).x64 - - - - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - - - Level3 - None - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - MachineX86 - $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) - - - - - X64 - - - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - - - Level3 - None - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - MachineX64 - $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) - - - - - MinSpace - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - MultiThreaded - true - - - Level3 - None - false - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - true - true - MachineX86 - $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) - true - .CRT=.text - - - - - X64 - - - MinSpace - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - MultiThreaded - true - - - Level3 - None - false - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - true - true - MachineX64 - $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) - true - .CRT=.text - - - - - - - - - - - - \ No newline at end of file diff --git a/MinHook/build/VC14/MinHookVC14.sln b/MinHook/build/VC14/MinHookVC14.sln deleted file mode 100644 index 258c192..0000000 --- a/MinHook/build/VC14/MinHookVC14.sln +++ /dev/null @@ -1,41 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.22823.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "libMinHook.vcxproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MinHook", "MinHook.vcxproj", "{027FAC75-3FDB-4044-8DD0-BC297BD4C461}" - ProjectSection(ProjectDependencies) = postProject - {F142A341-5EE0-442D-A15F-98AE9B48DBAE} = {F142A341-5EE0-442D-A15F-98AE9B48DBAE} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.ActiveCfg = Debug|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.Build.0 = Debug|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.ActiveCfg = Debug|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.Build.0 = Debug|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.ActiveCfg = Release|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.Build.0 = Release|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.ActiveCfg = Release|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.Build.0 = Release|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.ActiveCfg = Debug|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.Build.0 = Debug|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.ActiveCfg = Debug|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.Build.0 = Debug|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.ActiveCfg = Release|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.Build.0 = Release|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.ActiveCfg = Release|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/MinHook/build/VC14/libMinHook.vcxproj b/MinHook/build/VC14/libMinHook.vcxproj deleted file mode 100644 index 263b811..0000000 --- a/MinHook/build/VC14/libMinHook.vcxproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {F142A341-5EE0-442D-A15F-98AE9B48DBAE} - libMinHook - Win32Proj - - - - StaticLibrary - Unicode - true - v140_xp - - - StaticLibrary - Unicode - v140_xp - - - StaticLibrary - Unicode - true - v140_xp - - - StaticLibrary - Unicode - v140_xp - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(ProjectName).x86 - $(ProjectName).x86 - $(ProjectName).x64 - $(ProjectName).x64 - - - - Disabled - %(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - Level3 - None - NoExtensions - - - - - - X64 - - - Disabled - %(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - Level3 - None - NotSet - - - - - - MinSpace - true - %(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - MultiThreaded - true - Level3 - None - AnySuitable - CompileAsC - true - NoExtensions - - - - - - X64 - - - MinSpace - true - %(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - MultiThreaded - true - Level3 - None - true - AnySuitable - - - - - - - true - true - - - true - true - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/MinHook/build/VC14/libMinHook.vcxproj.filters b/MinHook/build/VC14/libMinHook.vcxproj.filters deleted file mode 100644 index f2d1d97..0000000 --- a/MinHook/build/VC14/libMinHook.vcxproj.filters +++ /dev/null @@ -1,55 +0,0 @@ - - - - - Source Files - - - Source Files - - - Source Files - - - HDE - - - HDE - - - - - Header Files - - - Header Files - - - - HDE - - - HDE - - - HDE - - - HDE - - - HDE - - - - - {9d24b740-be2e-4cfd-b9a4-340a50946ee9} - - - {76381bc7-2863-4cc5-aede-926ec2c506e4} - - - {56ddb326-6179-430d-ae19-e13bfd767bfa} - - - \ No newline at end of file diff --git a/MinHook/build/VC15/MinHook.vcxproj b/MinHook/build/VC15/MinHook.vcxproj deleted file mode 100644 index 1d51833..0000000 --- a/MinHook/build/VC15/MinHook.vcxproj +++ /dev/null @@ -1,189 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {027FAC75-3FDB-4044-8DD0-BC297BD4C461} - MinHook - Win32Proj - - - - DynamicLibrary - Unicode - true - v141_xp - - - DynamicLibrary - Unicode - v141_xp - - - DynamicLibrary - Unicode - true - v141_xp - - - DynamicLibrary - Unicode - v141_xp - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - true - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - true - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - false - $(SolutionDir)bin\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - false - $(ProjectName).x86 - $(ProjectName).x86 - $(ProjectName).x64 - $(ProjectName).x64 - - - - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - - - Level3 - None - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - MachineX86 - $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) - - - - - X64 - - - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - - - Level3 - None - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - MachineX64 - $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) - - - - - MinSpace - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - MultiThreaded - true - - - Level3 - None - false - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - true - true - MachineX86 - $(SolutionDir)lib\$(Configuration)\libMinHook.x86.lib;%(AdditionalDependencies) - true - .CRT=.text - - - - - X64 - - - MinSpace - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;MINHOOK_EXPORTS;%(PreprocessorDefinitions) - MultiThreaded - true - - - Level3 - None - false - - - $(SolutionDir)..\..\dll_resources\MinHook.def - false - Windows - true - true - MachineX64 - $(SolutionDir)lib\$(Configuration)\libMinHook.x64.lib;%(AdditionalDependencies) - true - .CRT=.text - - - - - - - - - - - - diff --git a/MinHook/build/VC15/MinHookVC15.sln b/MinHook/build/VC15/MinHookVC15.sln deleted file mode 100644 index 946dc70..0000000 --- a/MinHook/build/VC15/MinHookVC15.sln +++ /dev/null @@ -1,41 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.25123.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "libMinHook.vcxproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MinHook", "MinHook.vcxproj", "{027FAC75-3FDB-4044-8DD0-BC297BD4C461}" - ProjectSection(ProjectDependencies) = postProject - {F142A341-5EE0-442D-A15F-98AE9B48DBAE} = {F142A341-5EE0-442D-A15F-98AE9B48DBAE} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.ActiveCfg = Debug|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.Build.0 = Debug|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.ActiveCfg = Debug|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.Build.0 = Debug|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.ActiveCfg = Release|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.Build.0 = Release|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.ActiveCfg = Release|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.Build.0 = Release|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.ActiveCfg = Debug|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.Build.0 = Debug|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.ActiveCfg = Debug|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.Build.0 = Debug|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.ActiveCfg = Release|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.Build.0 = Release|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.ActiveCfg = Release|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/MinHook/build/VC15/libMinHook.vcxproj b/MinHook/build/VC15/libMinHook.vcxproj deleted file mode 100644 index b90c0c1..0000000 --- a/MinHook/build/VC15/libMinHook.vcxproj +++ /dev/null @@ -1,171 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {F142A341-5EE0-442D-A15F-98AE9B48DBAE} - libMinHook - Win32Proj - 10.0 - - - - StaticLibrary - Unicode - true - v142 - false - - - StaticLibrary - Unicode - v142 - - - StaticLibrary - Unicode - true - v142 - - - StaticLibrary - Unicode - v142 - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(SolutionDir)lib\$(Configuration)\ - $(Platform)\$(Configuration)\$(ProjectName)\ - $(ProjectName).x86 - $(ProjectName).x86 - $(ProjectName).x64 - $(ProjectName).x64 - - - - Disabled - %(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - Level3 - None - - - - - - X64 - - - Disabled - %(AdditionalIncludeDirectories) - WIN32;_DEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - Level3 - None - NotSet - - - - - - MinSpace - true - %(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - true - Level3 - None - AnySuitable - CompileAsC - true - MultiThreaded - - - - - - X64 - - - MinSpace - true - %(AdditionalIncludeDirectories) - WIN32;NDEBUG;_LIB;STRICT;%(PreprocessorDefinitions) - false - MultiThreaded - true - Level3 - None - true - AnySuitable - - - - - - - true - true - - - true - true - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/MinHook/build/VC15/libMinHook.vcxproj.filters b/MinHook/build/VC15/libMinHook.vcxproj.filters deleted file mode 100644 index f2d1d97..0000000 --- a/MinHook/build/VC15/libMinHook.vcxproj.filters +++ /dev/null @@ -1,55 +0,0 @@ - - - - - Source Files - - - Source Files - - - Source Files - - - HDE - - - HDE - - - - - Header Files - - - Header Files - - - - HDE - - - HDE - - - HDE - - - HDE - - - HDE - - - - - {9d24b740-be2e-4cfd-b9a4-340a50946ee9} - - - {76381bc7-2863-4cc5-aede-926ec2c506e4} - - - {56ddb326-6179-430d-ae19-e13bfd767bfa} - - - \ No newline at end of file diff --git a/MinHook/build/VC9/MinHook.vcproj b/MinHook/build/VC9/MinHook.vcproj deleted file mode 100644 index 4bad257..0000000 --- a/MinHook/build/VC9/MinHook.vcproj +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MinHook/build/VC9/MinHookVC9.sln b/MinHook/build/VC9/MinHookVC9.sln deleted file mode 100644 index 869f5b6..0000000 --- a/MinHook/build/VC9/MinHookVC9.sln +++ /dev/null @@ -1,39 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "libMinHook.vcproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MinHook", "MinHook.vcproj", "{027FAC75-3FDB-4044-8DD0-BC297BD4C461}" - ProjectSection(ProjectDependencies) = postProject - {F142A341-5EE0-442D-A15F-98AE9B48DBAE} = {F142A341-5EE0-442D-A15F-98AE9B48DBAE} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.ActiveCfg = Debug|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|Win32.Build.0 = Debug|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.ActiveCfg = Debug|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Debug|x64.Build.0 = Debug|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.ActiveCfg = Release|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|Win32.Build.0 = Release|Win32 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.ActiveCfg = Release|x64 - {F142A341-5EE0-442D-A15F-98AE9B48DBAE}.Release|x64.Build.0 = Release|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.ActiveCfg = Debug|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|Win32.Build.0 = Debug|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.ActiveCfg = Debug|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Debug|x64.Build.0 = Debug|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.ActiveCfg = Release|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|Win32.Build.0 = Release|Win32 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.ActiveCfg = Release|x64 - {027FAC75-3FDB-4044-8DD0-BC297BD4C461}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/MinHook/build/VC9/libMinHook.vcproj b/MinHook/build/VC9/libMinHook.vcproj deleted file mode 100644 index 68b0c05..0000000 --- a/MinHook/build/VC9/libMinHook.vcproj +++ /dev/null @@ -1,410 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MinHook/dll_resources/MinHook.def b/MinHook/dll_resources/MinHook.def deleted file mode 100644 index c6af698..0000000 --- a/MinHook/dll_resources/MinHook.def +++ /dev/null @@ -1,14 +0,0 @@ -EXPORTS - MH_Initialize - MH_Uninitialize - - MH_CreateHook - MH_CreateHookApi - MH_CreateHookApiEx - MH_RemoveHook - MH_EnableHook - MH_DisableHook - MH_QueueEnableHook - MH_QueueDisableHook - MH_ApplyQueued - MH_StatusToString diff --git a/MinHook/dll_resources/MinHook.rc b/MinHook/dll_resources/MinHook.rc deleted file mode 100644 index 7cbacb7..0000000 --- a/MinHook/dll_resources/MinHook.rc +++ /dev/null @@ -1,32 +0,0 @@ -1 VERSIONINFO - FILEVERSION 1,3,3,0 - PRODUCTVERSION 1,3,3,0 - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "CompanyName", "Tsuda Kageyu" - VALUE "FileDescription", "MinHook - The Minimalistic API Hook Library for x64/x86" - VALUE "FileVersion", "1.3.3.0" - VALUE "InternalName", "MinHookD" - VALUE "LegalCopyright", "Copyright (C) 2009-2017 Tsuda Kageyu. All rights reserved." - VALUE "LegalTrademarks", "Tsuda Kageyu" - VALUE "ProductName", "MinHook DLL" - VALUE "ProductVersion", "1.3.3.0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END diff --git a/MinHook/include/MinHook.h b/MinHook/include/MinHook.h deleted file mode 100644 index 15c0a87..0000000 --- a/MinHook/include/MinHook.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - * MinHook - The Minimalistic API Hooking Library for x64/x86 - * Copyright (C) 2009-2017 Tsuda Kageyu. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#pragma once - -#if !(defined _M_IX86) && !(defined _M_X64) && !(defined __i386__) && !(defined __x86_64__) - #error MinHook supports only x86 and x64 systems. -#endif - -#include - -// MinHook Error Codes. -typedef enum MH_STATUS -{ - // Unknown error. Should not be returned. - MH_UNKNOWN = -1, - - // Successful. - MH_OK = 0, - - // MinHook is already initialized. - MH_ERROR_ALREADY_INITIALIZED, - - // MinHook is not initialized yet, or already uninitialized. - MH_ERROR_NOT_INITIALIZED, - - // The hook for the specified target function is already created. - MH_ERROR_ALREADY_CREATED, - - // The hook for the specified target function is not created yet. - MH_ERROR_NOT_CREATED, - - // The hook for the specified target function is already enabled. - MH_ERROR_ENABLED, - - // The hook for the specified target function is not enabled yet, or already - // disabled. - MH_ERROR_DISABLED, - - // The specified pointer is invalid. It points the address of non-allocated - // and/or non-executable region. - MH_ERROR_NOT_EXECUTABLE, - - // The specified target function cannot be hooked. - MH_ERROR_UNSUPPORTED_FUNCTION, - - // Failed to allocate memory. - MH_ERROR_MEMORY_ALLOC, - - // Failed to change the memory protection. - MH_ERROR_MEMORY_PROTECT, - - // The specified module is not loaded. - MH_ERROR_MODULE_NOT_FOUND, - - // The specified function is not found. - MH_ERROR_FUNCTION_NOT_FOUND -} -MH_STATUS; - -// Can be passed as a parameter to MH_EnableHook, MH_DisableHook, -// MH_QueueEnableHook or MH_QueueDisableHook. -#define MH_ALL_HOOKS NULL - -#ifdef __cplusplus -extern "C" { -#endif - - // Initialize the MinHook library. You must call this function EXACTLY ONCE - // at the beginning of your program. - MH_STATUS WINAPI MH_Initialize(VOID); - - // Uninitialize the MinHook library. You must call this function EXACTLY - // ONCE at the end of your program. - MH_STATUS WINAPI MH_Uninitialize(VOID); - - // Creates a Hook for the specified target function, in disabled state. - // Parameters: - // pTarget [in] A pointer to the target function, which will be - // overridden by the detour function. - // pDetour [in] A pointer to the detour function, which will override - // the target function. - // ppOriginal [out] A pointer to the trampoline function, which will be - // used to call the original target function. - // This parameter can be NULL. - MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal); - - // Creates a Hook for the specified API function, in disabled state. - // Parameters: - // pszModule [in] A pointer to the loaded module name which contains the - // target function. - // pszTarget [in] A pointer to the target function name, which will be - // overridden by the detour function. - // pDetour [in] A pointer to the detour function, which will override - // the target function. - // ppOriginal [out] A pointer to the trampoline function, which will be - // used to call the original target function. - // This parameter can be NULL. - MH_STATUS WINAPI MH_CreateHookApi( - LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal); - - // Creates a Hook for the specified API function, in disabled state. - // Parameters: - // pszModule [in] A pointer to the loaded module name which contains the - // target function. - // pszTarget [in] A pointer to the target function name, which will be - // overridden by the detour function. - // pDetour [in] A pointer to the detour function, which will override - // the target function. - // ppOriginal [out] A pointer to the trampoline function, which will be - // used to call the original target function. - // This parameter can be NULL. - // ppTarget [out] A pointer to the target function, which will be used - // with other functions. - // This parameter can be NULL. - MH_STATUS WINAPI MH_CreateHookApiEx( - LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget); - - // Removes an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget); - - // Enables an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - // If this parameter is MH_ALL_HOOKS, all created hooks are - // enabled in one go. - MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget); - - // Disables an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - // If this parameter is MH_ALL_HOOKS, all created hooks are - // disabled in one go. - MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget); - - // Queues to enable an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - // If this parameter is MH_ALL_HOOKS, all created hooks are - // queued to be enabled. - MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget); - - // Queues to disable an already created hook. - // Parameters: - // pTarget [in] A pointer to the target function. - // If this parameter is MH_ALL_HOOKS, all created hooks are - // queued to be disabled. - MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget); - - // Applies all queued changes in one go. - MH_STATUS WINAPI MH_ApplyQueued(VOID); - - // Translates the MH_STATUS to its name as a string. - const char * WINAPI MH_StatusToString(MH_STATUS status); - -#ifdef __cplusplus -} -#endif - diff --git a/MinHook/src/HDE/hde32.c b/MinHook/src/HDE/hde32.c deleted file mode 100644 index 08fa25b..0000000 --- a/MinHook/src/HDE/hde32.c +++ /dev/null @@ -1,326 +0,0 @@ -/* - * Hacker Disassembler Engine 32 C - * Copyright (c) 2008-2009, Vyacheslav Patkov. - * All rights reserved. - * - */ - -#if defined(_M_IX86) || defined(__i386__) - -#include "hde32.h" -#include "table32.h" - -unsigned int hde32_disasm(const void *code, hde32s *hs) -{ - uint8_t x, c, *p = (uint8_t *)code, cflags, opcode, pref = 0; - uint8_t *ht = hde32_table, m_mod, m_reg, m_rm, disp_size = 0; - - // Avoid using memset to reduce the footprint. -#ifndef _MSC_VER - memset((LPBYTE)hs, 0, sizeof(hde32s)); -#else - __stosb((LPBYTE)hs, 0, sizeof(hde32s)); -#endif - - for (x = 16; x; x--) - switch (c = *p++) { - case 0xf3: - hs->p_rep = c; - pref |= PRE_F3; - break; - case 0xf2: - hs->p_rep = c; - pref |= PRE_F2; - break; - case 0xf0: - hs->p_lock = c; - pref |= PRE_LOCK; - break; - case 0x26: case 0x2e: case 0x36: - case 0x3e: case 0x64: case 0x65: - hs->p_seg = c; - pref |= PRE_SEG; - break; - case 0x66: - hs->p_66 = c; - pref |= PRE_66; - break; - case 0x67: - hs->p_67 = c; - pref |= PRE_67; - break; - default: - goto pref_done; - } - pref_done: - - hs->flags = (uint32_t)pref << 23; - - if (!pref) - pref |= PRE_NONE; - - if ((hs->opcode = c) == 0x0f) { - hs->opcode2 = c = *p++; - ht += DELTA_OPCODES; - } else if (c >= 0xa0 && c <= 0xa3) { - if (pref & PRE_67) - pref |= PRE_66; - else - pref &= ~PRE_66; - } - - opcode = c; - cflags = ht[ht[opcode / 4] + (opcode % 4)]; - - if (cflags == C_ERROR) { - hs->flags |= F_ERROR | F_ERROR_OPCODE; - cflags = 0; - if ((opcode & -3) == 0x24) - cflags++; - } - - x = 0; - if (cflags & C_GROUP) { - uint16_t t; - t = *(uint16_t *)(ht + (cflags & 0x7f)); - cflags = (uint8_t)t; - x = (uint8_t)(t >> 8); - } - - if (hs->opcode2) { - ht = hde32_table + DELTA_PREFIXES; - if (ht[ht[opcode / 4] + (opcode % 4)] & pref) - hs->flags |= F_ERROR | F_ERROR_OPCODE; - } - - if (cflags & C_MODRM) { - hs->flags |= F_MODRM; - hs->modrm = c = *p++; - hs->modrm_mod = m_mod = c >> 6; - hs->modrm_rm = m_rm = c & 7; - hs->modrm_reg = m_reg = (c & 0x3f) >> 3; - - if (x && ((x << m_reg) & 0x80)) - hs->flags |= F_ERROR | F_ERROR_OPCODE; - - if (!hs->opcode2 && opcode >= 0xd9 && opcode <= 0xdf) { - uint8_t t = opcode - 0xd9; - if (m_mod == 3) { - ht = hde32_table + DELTA_FPU_MODRM + t*8; - t = ht[m_reg] << m_rm; - } else { - ht = hde32_table + DELTA_FPU_REG; - t = ht[t] << m_reg; - } - if (t & 0x80) - hs->flags |= F_ERROR | F_ERROR_OPCODE; - } - - if (pref & PRE_LOCK) { - if (m_mod == 3) { - hs->flags |= F_ERROR | F_ERROR_LOCK; - } else { - uint8_t *table_end, op = opcode; - if (hs->opcode2) { - ht = hde32_table + DELTA_OP2_LOCK_OK; - table_end = ht + DELTA_OP_ONLY_MEM - DELTA_OP2_LOCK_OK; - } else { - ht = hde32_table + DELTA_OP_LOCK_OK; - table_end = ht + DELTA_OP2_LOCK_OK - DELTA_OP_LOCK_OK; - op &= -2; - } - for (; ht != table_end; ht++) - if (*ht++ == op) { - if (!((*ht << m_reg) & 0x80)) - goto no_lock_error; - else - break; - } - hs->flags |= F_ERROR | F_ERROR_LOCK; - no_lock_error: - ; - } - } - - if (hs->opcode2) { - switch (opcode) { - case 0x20: case 0x22: - m_mod = 3; - if (m_reg > 4 || m_reg == 1) - goto error_operand; - else - goto no_error_operand; - case 0x21: case 0x23: - m_mod = 3; - if (m_reg == 4 || m_reg == 5) - goto error_operand; - else - goto no_error_operand; - } - } else { - switch (opcode) { - case 0x8c: - if (m_reg > 5) - goto error_operand; - else - goto no_error_operand; - case 0x8e: - if (m_reg == 1 || m_reg > 5) - goto error_operand; - else - goto no_error_operand; - } - } - - if (m_mod == 3) { - uint8_t *table_end; - if (hs->opcode2) { - ht = hde32_table + DELTA_OP2_ONLY_MEM; - table_end = ht + sizeof(hde32_table) - DELTA_OP2_ONLY_MEM; - } else { - ht = hde32_table + DELTA_OP_ONLY_MEM; - table_end = ht + DELTA_OP2_ONLY_MEM - DELTA_OP_ONLY_MEM; - } - for (; ht != table_end; ht += 2) - if (*ht++ == opcode) { - if (*ht++ & pref && !((*ht << m_reg) & 0x80)) - goto error_operand; - else - break; - } - goto no_error_operand; - } else if (hs->opcode2) { - switch (opcode) { - case 0x50: case 0xd7: case 0xf7: - if (pref & (PRE_NONE | PRE_66)) - goto error_operand; - break; - case 0xd6: - if (pref & (PRE_F2 | PRE_F3)) - goto error_operand; - break; - case 0xc5: - goto error_operand; - } - goto no_error_operand; - } else - goto no_error_operand; - - error_operand: - hs->flags |= F_ERROR | F_ERROR_OPERAND; - no_error_operand: - - c = *p++; - if (m_reg <= 1) { - if (opcode == 0xf6) - cflags |= C_IMM8; - else if (opcode == 0xf7) - cflags |= C_IMM_P66; - } - - switch (m_mod) { - case 0: - if (pref & PRE_67) { - if (m_rm == 6) - disp_size = 2; - } else - if (m_rm == 5) - disp_size = 4; - break; - case 1: - disp_size = 1; - break; - case 2: - disp_size = 2; - if (!(pref & PRE_67)) - disp_size <<= 1; - } - - if (m_mod != 3 && m_rm == 4 && !(pref & PRE_67)) { - hs->flags |= F_SIB; - p++; - hs->sib = c; - hs->sib_scale = c >> 6; - hs->sib_index = (c & 0x3f) >> 3; - if ((hs->sib_base = c & 7) == 5 && !(m_mod & 1)) - disp_size = 4; - } - - p--; - switch (disp_size) { - case 1: - hs->flags |= F_DISP8; - hs->disp.disp8 = *p; - break; - case 2: - hs->flags |= F_DISP16; - hs->disp.disp16 = *(uint16_t *)p; - break; - case 4: - hs->flags |= F_DISP32; - hs->disp.disp32 = *(uint32_t *)p; - } - p += disp_size; - } else if (pref & PRE_LOCK) - hs->flags |= F_ERROR | F_ERROR_LOCK; - - if (cflags & C_IMM_P66) { - if (cflags & C_REL32) { - if (pref & PRE_66) { - hs->flags |= F_IMM16 | F_RELATIVE; - hs->imm.imm16 = *(uint16_t *)p; - p += 2; - goto disasm_done; - } - goto rel32_ok; - } - if (pref & PRE_66) { - hs->flags |= F_IMM16; - hs->imm.imm16 = *(uint16_t *)p; - p += 2; - } else { - hs->flags |= F_IMM32; - hs->imm.imm32 = *(uint32_t *)p; - p += 4; - } - } - - if (cflags & C_IMM16) { - if (hs->flags & F_IMM32) { - hs->flags |= F_IMM16; - hs->disp.disp16 = *(uint16_t *)p; - } else if (hs->flags & F_IMM16) { - hs->flags |= F_2IMM16; - hs->disp.disp16 = *(uint16_t *)p; - } else { - hs->flags |= F_IMM16; - hs->imm.imm16 = *(uint16_t *)p; - } - p += 2; - } - if (cflags & C_IMM8) { - hs->flags |= F_IMM8; - hs->imm.imm8 = *p++; - } - - if (cflags & C_REL32) { - rel32_ok: - hs->flags |= F_IMM32 | F_RELATIVE; - hs->imm.imm32 = *(uint32_t *)p; - p += 4; - } else if (cflags & C_REL8) { - hs->flags |= F_IMM8 | F_RELATIVE; - hs->imm.imm8 = *p++; - } - - disasm_done: - - if ((hs->len = (uint8_t)(p-(uint8_t *)code)) > 15) { - hs->flags |= F_ERROR | F_ERROR_LENGTH; - hs->len = 15; - } - - return (unsigned int)hs->len; -} - -#endif // defined(_M_IX86) || defined(__i386__) diff --git a/MinHook/src/HDE/hde32.h b/MinHook/src/HDE/hde32.h deleted file mode 100644 index 1112450..0000000 --- a/MinHook/src/HDE/hde32.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Hacker Disassembler Engine 32 - * Copyright (c) 2006-2009, Vyacheslav Patkov. - * All rights reserved. - * - * hde32.h: C/C++ header file - * - */ - -#ifndef _HDE32_H_ -#define _HDE32_H_ - -/* stdint.h - C99 standard header - * http://en.wikipedia.org/wiki/stdint.h - * - * if your compiler doesn't contain "stdint.h" header (for - * example, Microsoft Visual C++), you can download file: - * http://www.azillionmonkeys.com/qed/pstdint.h - * and change next line to: - * #include "pstdint.h" - */ -#include "pstdint.h" - -#define F_MODRM 0x00000001 -#define F_SIB 0x00000002 -#define F_IMM8 0x00000004 -#define F_IMM16 0x00000008 -#define F_IMM32 0x00000010 -#define F_DISP8 0x00000020 -#define F_DISP16 0x00000040 -#define F_DISP32 0x00000080 -#define F_RELATIVE 0x00000100 -#define F_2IMM16 0x00000800 -#define F_ERROR 0x00001000 -#define F_ERROR_OPCODE 0x00002000 -#define F_ERROR_LENGTH 0x00004000 -#define F_ERROR_LOCK 0x00008000 -#define F_ERROR_OPERAND 0x00010000 -#define F_PREFIX_REPNZ 0x01000000 -#define F_PREFIX_REPX 0x02000000 -#define F_PREFIX_REP 0x03000000 -#define F_PREFIX_66 0x04000000 -#define F_PREFIX_67 0x08000000 -#define F_PREFIX_LOCK 0x10000000 -#define F_PREFIX_SEG 0x20000000 -#define F_PREFIX_ANY 0x3f000000 - -#define PREFIX_SEGMENT_CS 0x2e -#define PREFIX_SEGMENT_SS 0x36 -#define PREFIX_SEGMENT_DS 0x3e -#define PREFIX_SEGMENT_ES 0x26 -#define PREFIX_SEGMENT_FS 0x64 -#define PREFIX_SEGMENT_GS 0x65 -#define PREFIX_LOCK 0xf0 -#define PREFIX_REPNZ 0xf2 -#define PREFIX_REPX 0xf3 -#define PREFIX_OPERAND_SIZE 0x66 -#define PREFIX_ADDRESS_SIZE 0x67 - -#pragma pack(push,1) - -typedef struct { - uint8_t len; - uint8_t p_rep; - uint8_t p_lock; - uint8_t p_seg; - uint8_t p_66; - uint8_t p_67; - uint8_t opcode; - uint8_t opcode2; - uint8_t modrm; - uint8_t modrm_mod; - uint8_t modrm_reg; - uint8_t modrm_rm; - uint8_t sib; - uint8_t sib_scale; - uint8_t sib_index; - uint8_t sib_base; - union { - uint8_t imm8; - uint16_t imm16; - uint32_t imm32; - } imm; - union { - uint8_t disp8; - uint16_t disp16; - uint32_t disp32; - } disp; - uint32_t flags; -} hde32s; - -#pragma pack(pop) - -#ifdef __cplusplus -extern "C" { -#endif - -/* __cdecl */ -unsigned int hde32_disasm(const void *code, hde32s *hs); - -#ifdef __cplusplus -} -#endif - -#endif /* _HDE32_H_ */ diff --git a/MinHook/src/HDE/hde64.c b/MinHook/src/HDE/hde64.c deleted file mode 100644 index c23e2fc..0000000 --- a/MinHook/src/HDE/hde64.c +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Hacker Disassembler Engine 64 C - * Copyright (c) 2008-2009, Vyacheslav Patkov. - * All rights reserved. - * - */ - -#if defined(_M_X64) || defined(__x86_64__) - -#include "hde64.h" -#include "table64.h" - -unsigned int hde64_disasm(const void *code, hde64s *hs) -{ - uint8_t x, c, *p = (uint8_t *)code, cflags, opcode, pref = 0; - uint8_t *ht = hde64_table, m_mod, m_reg, m_rm, disp_size = 0; - uint8_t op64 = 0; - - // Avoid using memset to reduce the footprint. -#ifndef _MSC_VER - memset((LPBYTE)hs, 0, sizeof(hde64s)); -#else - __stosb((LPBYTE)hs, 0, sizeof(hde64s)); -#endif - - for (x = 16; x; x--) - switch (c = *p++) { - case 0xf3: - hs->p_rep = c; - pref |= PRE_F3; - break; - case 0xf2: - hs->p_rep = c; - pref |= PRE_F2; - break; - case 0xf0: - hs->p_lock = c; - pref |= PRE_LOCK; - break; - case 0x26: case 0x2e: case 0x36: - case 0x3e: case 0x64: case 0x65: - hs->p_seg = c; - pref |= PRE_SEG; - break; - case 0x66: - hs->p_66 = c; - pref |= PRE_66; - break; - case 0x67: - hs->p_67 = c; - pref |= PRE_67; - break; - default: - goto pref_done; - } - pref_done: - - hs->flags = (uint32_t)pref << 23; - - if (!pref) - pref |= PRE_NONE; - - if ((c & 0xf0) == 0x40) { - hs->flags |= F_PREFIX_REX; - if ((hs->rex_w = (c & 0xf) >> 3) && (*p & 0xf8) == 0xb8) - op64++; - hs->rex_r = (c & 7) >> 2; - hs->rex_x = (c & 3) >> 1; - hs->rex_b = c & 1; - if (((c = *p++) & 0xf0) == 0x40) { - opcode = c; - goto error_opcode; - } - } - - if ((hs->opcode = c) == 0x0f) { - hs->opcode2 = c = *p++; - ht += DELTA_OPCODES; - } else if (c >= 0xa0 && c <= 0xa3) { - op64++; - if (pref & PRE_67) - pref |= PRE_66; - else - pref &= ~PRE_66; - } - - opcode = c; - cflags = ht[ht[opcode / 4] + (opcode % 4)]; - - if (cflags == C_ERROR) { - error_opcode: - hs->flags |= F_ERROR | F_ERROR_OPCODE; - cflags = 0; - if ((opcode & -3) == 0x24) - cflags++; - } - - x = 0; - if (cflags & C_GROUP) { - uint16_t t; - t = *(uint16_t *)(ht + (cflags & 0x7f)); - cflags = (uint8_t)t; - x = (uint8_t)(t >> 8); - } - - if (hs->opcode2) { - ht = hde64_table + DELTA_PREFIXES; - if (ht[ht[opcode / 4] + (opcode % 4)] & pref) - hs->flags |= F_ERROR | F_ERROR_OPCODE; - } - - if (cflags & C_MODRM) { - hs->flags |= F_MODRM; - hs->modrm = c = *p++; - hs->modrm_mod = m_mod = c >> 6; - hs->modrm_rm = m_rm = c & 7; - hs->modrm_reg = m_reg = (c & 0x3f) >> 3; - - if (x && ((x << m_reg) & 0x80)) - hs->flags |= F_ERROR | F_ERROR_OPCODE; - - if (!hs->opcode2 && opcode >= 0xd9 && opcode <= 0xdf) { - uint8_t t = opcode - 0xd9; - if (m_mod == 3) { - ht = hde64_table + DELTA_FPU_MODRM + t*8; - t = ht[m_reg] << m_rm; - } else { - ht = hde64_table + DELTA_FPU_REG; - t = ht[t] << m_reg; - } - if (t & 0x80) - hs->flags |= F_ERROR | F_ERROR_OPCODE; - } - - if (pref & PRE_LOCK) { - if (m_mod == 3) { - hs->flags |= F_ERROR | F_ERROR_LOCK; - } else { - uint8_t *table_end, op = opcode; - if (hs->opcode2) { - ht = hde64_table + DELTA_OP2_LOCK_OK; - table_end = ht + DELTA_OP_ONLY_MEM - DELTA_OP2_LOCK_OK; - } else { - ht = hde64_table + DELTA_OP_LOCK_OK; - table_end = ht + DELTA_OP2_LOCK_OK - DELTA_OP_LOCK_OK; - op &= -2; - } - for (; ht != table_end; ht++) - if (*ht++ == op) { - if (!((*ht << m_reg) & 0x80)) - goto no_lock_error; - else - break; - } - hs->flags |= F_ERROR | F_ERROR_LOCK; - no_lock_error: - ; - } - } - - if (hs->opcode2) { - switch (opcode) { - case 0x20: case 0x22: - m_mod = 3; - if (m_reg > 4 || m_reg == 1) - goto error_operand; - else - goto no_error_operand; - case 0x21: case 0x23: - m_mod = 3; - if (m_reg == 4 || m_reg == 5) - goto error_operand; - else - goto no_error_operand; - } - } else { - switch (opcode) { - case 0x8c: - if (m_reg > 5) - goto error_operand; - else - goto no_error_operand; - case 0x8e: - if (m_reg == 1 || m_reg > 5) - goto error_operand; - else - goto no_error_operand; - } - } - - if (m_mod == 3) { - uint8_t *table_end; - if (hs->opcode2) { - ht = hde64_table + DELTA_OP2_ONLY_MEM; - table_end = ht + sizeof(hde64_table) - DELTA_OP2_ONLY_MEM; - } else { - ht = hde64_table + DELTA_OP_ONLY_MEM; - table_end = ht + DELTA_OP2_ONLY_MEM - DELTA_OP_ONLY_MEM; - } - for (; ht != table_end; ht += 2) - if (*ht++ == opcode) { - if (*ht++ & pref && !((*ht << m_reg) & 0x80)) - goto error_operand; - else - break; - } - goto no_error_operand; - } else if (hs->opcode2) { - switch (opcode) { - case 0x50: case 0xd7: case 0xf7: - if (pref & (PRE_NONE | PRE_66)) - goto error_operand; - break; - case 0xd6: - if (pref & (PRE_F2 | PRE_F3)) - goto error_operand; - break; - case 0xc5: - goto error_operand; - } - goto no_error_operand; - } else - goto no_error_operand; - - error_operand: - hs->flags |= F_ERROR | F_ERROR_OPERAND; - no_error_operand: - - c = *p++; - if (m_reg <= 1) { - if (opcode == 0xf6) - cflags |= C_IMM8; - else if (opcode == 0xf7) - cflags |= C_IMM_P66; - } - - switch (m_mod) { - case 0: - if (pref & PRE_67) { - if (m_rm == 6) - disp_size = 2; - } else - if (m_rm == 5) - disp_size = 4; - break; - case 1: - disp_size = 1; - break; - case 2: - disp_size = 2; - if (!(pref & PRE_67)) - disp_size <<= 1; - } - - if (m_mod != 3 && m_rm == 4) { - hs->flags |= F_SIB; - p++; - hs->sib = c; - hs->sib_scale = c >> 6; - hs->sib_index = (c & 0x3f) >> 3; - if ((hs->sib_base = c & 7) == 5 && !(m_mod & 1)) - disp_size = 4; - } - - p--; - switch (disp_size) { - case 1: - hs->flags |= F_DISP8; - hs->disp.disp8 = *p; - break; - case 2: - hs->flags |= F_DISP16; - hs->disp.disp16 = *(uint16_t *)p; - break; - case 4: - hs->flags |= F_DISP32; - hs->disp.disp32 = *(uint32_t *)p; - } - p += disp_size; - } else if (pref & PRE_LOCK) - hs->flags |= F_ERROR | F_ERROR_LOCK; - - if (cflags & C_IMM_P66) { - if (cflags & C_REL32) { - if (pref & PRE_66) { - hs->flags |= F_IMM16 | F_RELATIVE; - hs->imm.imm16 = *(uint16_t *)p; - p += 2; - goto disasm_done; - } - goto rel32_ok; - } - if (op64) { - hs->flags |= F_IMM64; - hs->imm.imm64 = *(uint64_t *)p; - p += 8; - } else if (!(pref & PRE_66)) { - hs->flags |= F_IMM32; - hs->imm.imm32 = *(uint32_t *)p; - p += 4; - } else - goto imm16_ok; - } - - - if (cflags & C_IMM16) { - imm16_ok: - hs->flags |= F_IMM16; - hs->imm.imm16 = *(uint16_t *)p; - p += 2; - } - if (cflags & C_IMM8) { - hs->flags |= F_IMM8; - hs->imm.imm8 = *p++; - } - - if (cflags & C_REL32) { - rel32_ok: - hs->flags |= F_IMM32 | F_RELATIVE; - hs->imm.imm32 = *(uint32_t *)p; - p += 4; - } else if (cflags & C_REL8) { - hs->flags |= F_IMM8 | F_RELATIVE; - hs->imm.imm8 = *p++; - } - - disasm_done: - - if ((hs->len = (uint8_t)(p-(uint8_t *)code)) > 15) { - hs->flags |= F_ERROR | F_ERROR_LENGTH; - hs->len = 15; - } - - return (unsigned int)hs->len; -} - -#endif // defined(_M_X64) || defined(__x86_64__) diff --git a/MinHook/src/HDE/hde64.h b/MinHook/src/HDE/hde64.h deleted file mode 100644 index ecbf4df..0000000 --- a/MinHook/src/HDE/hde64.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Hacker Disassembler Engine 64 - * Copyright (c) 2008-2009, Vyacheslav Patkov. - * All rights reserved. - * - * hde64.h: C/C++ header file - * - */ - -#ifndef _HDE64_H_ -#define _HDE64_H_ - -/* stdint.h - C99 standard header - * http://en.wikipedia.org/wiki/stdint.h - * - * if your compiler doesn't contain "stdint.h" header (for - * example, Microsoft Visual C++), you can download file: - * http://www.azillionmonkeys.com/qed/pstdint.h - * and change next line to: - * #include "pstdint.h" - */ -#include "pstdint.h" - -#define F_MODRM 0x00000001 -#define F_SIB 0x00000002 -#define F_IMM8 0x00000004 -#define F_IMM16 0x00000008 -#define F_IMM32 0x00000010 -#define F_IMM64 0x00000020 -#define F_DISP8 0x00000040 -#define F_DISP16 0x00000080 -#define F_DISP32 0x00000100 -#define F_RELATIVE 0x00000200 -#define F_ERROR 0x00001000 -#define F_ERROR_OPCODE 0x00002000 -#define F_ERROR_LENGTH 0x00004000 -#define F_ERROR_LOCK 0x00008000 -#define F_ERROR_OPERAND 0x00010000 -#define F_PREFIX_REPNZ 0x01000000 -#define F_PREFIX_REPX 0x02000000 -#define F_PREFIX_REP 0x03000000 -#define F_PREFIX_66 0x04000000 -#define F_PREFIX_67 0x08000000 -#define F_PREFIX_LOCK 0x10000000 -#define F_PREFIX_SEG 0x20000000 -#define F_PREFIX_REX 0x40000000 -#define F_PREFIX_ANY 0x7f000000 - -#define PREFIX_SEGMENT_CS 0x2e -#define PREFIX_SEGMENT_SS 0x36 -#define PREFIX_SEGMENT_DS 0x3e -#define PREFIX_SEGMENT_ES 0x26 -#define PREFIX_SEGMENT_FS 0x64 -#define PREFIX_SEGMENT_GS 0x65 -#define PREFIX_LOCK 0xf0 -#define PREFIX_REPNZ 0xf2 -#define PREFIX_REPX 0xf3 -#define PREFIX_OPERAND_SIZE 0x66 -#define PREFIX_ADDRESS_SIZE 0x67 - -#pragma pack(push,1) - -typedef struct { - uint8_t len; - uint8_t p_rep; - uint8_t p_lock; - uint8_t p_seg; - uint8_t p_66; - uint8_t p_67; - uint8_t rex; - uint8_t rex_w; - uint8_t rex_r; - uint8_t rex_x; - uint8_t rex_b; - uint8_t opcode; - uint8_t opcode2; - uint8_t modrm; - uint8_t modrm_mod; - uint8_t modrm_reg; - uint8_t modrm_rm; - uint8_t sib; - uint8_t sib_scale; - uint8_t sib_index; - uint8_t sib_base; - union { - uint8_t imm8; - uint16_t imm16; - uint32_t imm32; - uint64_t imm64; - } imm; - union { - uint8_t disp8; - uint16_t disp16; - uint32_t disp32; - } disp; - uint32_t flags; -} hde64s; - -#pragma pack(pop) - -#ifdef __cplusplus -extern "C" { -#endif - -/* __cdecl */ -unsigned int hde64_disasm(const void *code, hde64s *hs); - -#ifdef __cplusplus -} -#endif - -#endif /* _HDE64_H_ */ diff --git a/MinHook/src/HDE/pstdint.h b/MinHook/src/HDE/pstdint.h deleted file mode 100644 index 84d82a0..0000000 --- a/MinHook/src/HDE/pstdint.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * MinHook - The Minimalistic API Hooking Library for x64/x86 - * Copyright (C) 2009-2017 Tsuda Kageyu. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#pragma once - -#include - -// Integer types for HDE. -typedef INT8 int8_t; -typedef INT16 int16_t; -typedef INT32 int32_t; -typedef INT64 int64_t; -typedef UINT8 uint8_t; -typedef UINT16 uint16_t; -typedef UINT32 uint32_t; -typedef UINT64 uint64_t; diff --git a/MinHook/src/HDE/table32.h b/MinHook/src/HDE/table32.h deleted file mode 100644 index 7b3e12e..0000000 --- a/MinHook/src/HDE/table32.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Hacker Disassembler Engine 32 C - * Copyright (c) 2008-2009, Vyacheslav Patkov. - * All rights reserved. - * - */ - -#define C_NONE 0x00 -#define C_MODRM 0x01 -#define C_IMM8 0x02 -#define C_IMM16 0x04 -#define C_IMM_P66 0x10 -#define C_REL8 0x20 -#define C_REL32 0x40 -#define C_GROUP 0x80 -#define C_ERROR 0xff - -#define PRE_ANY 0x00 -#define PRE_NONE 0x01 -#define PRE_F2 0x02 -#define PRE_F3 0x04 -#define PRE_66 0x08 -#define PRE_67 0x10 -#define PRE_LOCK 0x20 -#define PRE_SEG 0x40 -#define PRE_ALL 0xff - -#define DELTA_OPCODES 0x4a -#define DELTA_FPU_REG 0xf1 -#define DELTA_FPU_MODRM 0xf8 -#define DELTA_PREFIXES 0x130 -#define DELTA_OP_LOCK_OK 0x1a1 -#define DELTA_OP2_LOCK_OK 0x1b9 -#define DELTA_OP_ONLY_MEM 0x1cb -#define DELTA_OP2_ONLY_MEM 0x1da - -unsigned char hde32_table[] = { - 0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3,0xa8,0xa3, - 0xa8,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xac,0xaa,0xb2,0xaa,0x9f,0x9f, - 0x9f,0x9f,0xb5,0xa3,0xa3,0xa4,0xaa,0xaa,0xba,0xaa,0x96,0xaa,0xa8,0xaa,0xc3, - 0xc3,0x96,0x96,0xb7,0xae,0xd6,0xbd,0xa3,0xc5,0xa3,0xa3,0x9f,0xc3,0x9c,0xaa, - 0xaa,0xac,0xaa,0xbf,0x03,0x7f,0x11,0x7f,0x01,0x7f,0x01,0x3f,0x01,0x01,0x90, - 0x82,0x7d,0x97,0x59,0x59,0x59,0x59,0x59,0x7f,0x59,0x59,0x60,0x7d,0x7f,0x7f, - 0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x9a,0x88,0x7d, - 0x59,0x50,0x50,0x50,0x50,0x59,0x59,0x59,0x59,0x61,0x94,0x61,0x9e,0x59,0x59, - 0x85,0x59,0x92,0xa3,0x60,0x60,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59, - 0x59,0x59,0x9f,0x01,0x03,0x01,0x04,0x03,0xd5,0x03,0xcc,0x01,0xbc,0x03,0xf0, - 0x10,0x10,0x10,0x10,0x50,0x50,0x50,0x50,0x14,0x20,0x20,0x20,0x20,0x01,0x01, - 0x01,0x01,0xc4,0x02,0x10,0x00,0x00,0x00,0x00,0x01,0x01,0xc0,0xc2,0x10,0x11, - 0x02,0x03,0x11,0x03,0x03,0x04,0x00,0x00,0x14,0x00,0x02,0x00,0x00,0xc6,0xc8, - 0x02,0x02,0x02,0x02,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0xca, - 0x01,0x01,0x01,0x00,0x06,0x00,0x04,0x00,0xc0,0xc2,0x01,0x01,0x03,0x01,0xff, - 0xff,0x01,0x00,0x03,0xc4,0xc4,0xc6,0x03,0x01,0x01,0x01,0xff,0x03,0x03,0x03, - 0xc8,0x40,0x00,0x0a,0x00,0x04,0x00,0x00,0x00,0x00,0x7f,0x00,0x33,0x01,0x00, - 0x00,0x00,0x00,0x00,0x00,0xff,0xbf,0xff,0xff,0x00,0x00,0x00,0x00,0x07,0x00, - 0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0xff,0xff,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x7f,0x00,0x00,0xff,0x4a,0x4a,0x4a,0x4a,0x4b,0x52,0x4a,0x4a,0x4a,0x4a,0x4f, - 0x4c,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x55,0x45,0x40,0x4a,0x4a,0x4a, - 0x45,0x59,0x4d,0x46,0x4a,0x5d,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a,0x4a, - 0x4a,0x4a,0x4a,0x4a,0x4a,0x61,0x63,0x67,0x4e,0x4a,0x4a,0x6b,0x6d,0x4a,0x4a, - 0x45,0x6d,0x4a,0x4a,0x44,0x45,0x4a,0x4a,0x00,0x00,0x00,0x02,0x0d,0x06,0x06, - 0x06,0x06,0x0e,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x00,0x06,0x06,0x02,0x06, - 0x00,0x0a,0x0a,0x07,0x07,0x06,0x02,0x05,0x05,0x02,0x02,0x00,0x00,0x04,0x04, - 0x04,0x04,0x00,0x00,0x00,0x0e,0x05,0x06,0x06,0x06,0x01,0x06,0x00,0x00,0x08, - 0x00,0x10,0x00,0x18,0x00,0x20,0x00,0x28,0x00,0x30,0x00,0x80,0x01,0x82,0x01, - 0x86,0x00,0xf6,0xcf,0xfe,0x3f,0xab,0x00,0xb0,0x00,0xb1,0x00,0xb3,0x00,0xba, - 0xf8,0xbb,0x00,0xc0,0x00,0xc1,0x00,0xc7,0xbf,0x62,0xff,0x00,0x8d,0xff,0x00, - 0xc4,0xff,0x00,0xc5,0xff,0x00,0xff,0xff,0xeb,0x01,0xff,0x0e,0x12,0x08,0x00, - 0x13,0x09,0x00,0x16,0x08,0x00,0x17,0x09,0x00,0x2b,0x09,0x00,0xae,0xff,0x07, - 0xb2,0xff,0x00,0xb4,0xff,0x00,0xb5,0xff,0x00,0xc3,0x01,0x00,0xc7,0xff,0xbf, - 0xe7,0x08,0x00,0xf0,0x02,0x00 -}; diff --git a/MinHook/src/HDE/table64.h b/MinHook/src/HDE/table64.h deleted file mode 100644 index 01d4541..0000000 --- a/MinHook/src/HDE/table64.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Hacker Disassembler Engine 64 C - * Copyright (c) 2008-2009, Vyacheslav Patkov. - * All rights reserved. - * - */ - -#define C_NONE 0x00 -#define C_MODRM 0x01 -#define C_IMM8 0x02 -#define C_IMM16 0x04 -#define C_IMM_P66 0x10 -#define C_REL8 0x20 -#define C_REL32 0x40 -#define C_GROUP 0x80 -#define C_ERROR 0xff - -#define PRE_ANY 0x00 -#define PRE_NONE 0x01 -#define PRE_F2 0x02 -#define PRE_F3 0x04 -#define PRE_66 0x08 -#define PRE_67 0x10 -#define PRE_LOCK 0x20 -#define PRE_SEG 0x40 -#define PRE_ALL 0xff - -#define DELTA_OPCODES 0x4a -#define DELTA_FPU_REG 0xfd -#define DELTA_FPU_MODRM 0x104 -#define DELTA_PREFIXES 0x13c -#define DELTA_OP_LOCK_OK 0x1ae -#define DELTA_OP2_LOCK_OK 0x1c6 -#define DELTA_OP_ONLY_MEM 0x1d8 -#define DELTA_OP2_ONLY_MEM 0x1e7 - -unsigned char hde64_table[] = { - 0xa5,0xaa,0xa5,0xb8,0xa5,0xaa,0xa5,0xaa,0xa5,0xb8,0xa5,0xb8,0xa5,0xb8,0xa5, - 0xb8,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xac,0xc0,0xcc,0xc0,0xa1,0xa1, - 0xa1,0xa1,0xb1,0xa5,0xa5,0xa6,0xc0,0xc0,0xd7,0xda,0xe0,0xc0,0xe4,0xc0,0xea, - 0xea,0xe0,0xe0,0x98,0xc8,0xee,0xf1,0xa5,0xd3,0xa5,0xa5,0xa1,0xea,0x9e,0xc0, - 0xc0,0xc2,0xc0,0xe6,0x03,0x7f,0x11,0x7f,0x01,0x7f,0x01,0x3f,0x01,0x01,0xab, - 0x8b,0x90,0x64,0x5b,0x5b,0x5b,0x5b,0x5b,0x92,0x5b,0x5b,0x76,0x90,0x92,0x92, - 0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x6a,0x73,0x90, - 0x5b,0x52,0x52,0x52,0x52,0x5b,0x5b,0x5b,0x5b,0x77,0x7c,0x77,0x85,0x5b,0x5b, - 0x70,0x5b,0x7a,0xaf,0x76,0x76,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b, - 0x5b,0x5b,0x86,0x01,0x03,0x01,0x04,0x03,0xd5,0x03,0xd5,0x03,0xcc,0x01,0xbc, - 0x03,0xf0,0x03,0x03,0x04,0x00,0x50,0x50,0x50,0x50,0xff,0x20,0x20,0x20,0x20, - 0x01,0x01,0x01,0x01,0xc4,0x02,0x10,0xff,0xff,0xff,0x01,0x00,0x03,0x11,0xff, - 0x03,0xc4,0xc6,0xc8,0x02,0x10,0x00,0xff,0xcc,0x01,0x01,0x01,0x00,0x00,0x00, - 0x00,0x01,0x01,0x03,0x01,0xff,0xff,0xc0,0xc2,0x10,0x11,0x02,0x03,0x01,0x01, - 0x01,0xff,0xff,0xff,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0x10, - 0x10,0x10,0x10,0x02,0x10,0x00,0x00,0xc6,0xc8,0x02,0x02,0x02,0x02,0x06,0x00, - 0x04,0x00,0x02,0xff,0x00,0xc0,0xc2,0x01,0x01,0x03,0x03,0x03,0xca,0x40,0x00, - 0x0a,0x00,0x04,0x00,0x00,0x00,0x00,0x7f,0x00,0x33,0x01,0x00,0x00,0x00,0x00, - 0x00,0x00,0xff,0xbf,0xff,0xff,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0xff,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff, - 0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00, - 0xff,0x40,0x40,0x40,0x40,0x41,0x49,0x40,0x40,0x40,0x40,0x4c,0x42,0x40,0x40, - 0x40,0x40,0x40,0x40,0x40,0x40,0x4f,0x44,0x53,0x40,0x40,0x40,0x44,0x57,0x43, - 0x5c,0x40,0x60,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, - 0x40,0x40,0x64,0x66,0x6e,0x6b,0x40,0x40,0x6a,0x46,0x40,0x40,0x44,0x46,0x40, - 0x40,0x5b,0x44,0x40,0x40,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x01,0x06, - 0x06,0x02,0x06,0x06,0x00,0x06,0x00,0x0a,0x0a,0x00,0x00,0x00,0x02,0x07,0x07, - 0x06,0x02,0x0d,0x06,0x06,0x06,0x0e,0x05,0x05,0x02,0x02,0x00,0x00,0x04,0x04, - 0x04,0x04,0x05,0x06,0x06,0x06,0x00,0x00,0x00,0x0e,0x00,0x00,0x08,0x00,0x10, - 0x00,0x18,0x00,0x20,0x00,0x28,0x00,0x30,0x00,0x80,0x01,0x82,0x01,0x86,0x00, - 0xf6,0xcf,0xfe,0x3f,0xab,0x00,0xb0,0x00,0xb1,0x00,0xb3,0x00,0xba,0xf8,0xbb, - 0x00,0xc0,0x00,0xc1,0x00,0xc7,0xbf,0x62,0xff,0x00,0x8d,0xff,0x00,0xc4,0xff, - 0x00,0xc5,0xff,0x00,0xff,0xff,0xeb,0x01,0xff,0x0e,0x12,0x08,0x00,0x13,0x09, - 0x00,0x16,0x08,0x00,0x17,0x09,0x00,0x2b,0x09,0x00,0xae,0xff,0x07,0xb2,0xff, - 0x00,0xb4,0xff,0x00,0xb5,0xff,0x00,0xc3,0x01,0x00,0xc7,0xff,0xbf,0xe7,0x08, - 0x00,0xf0,0x02,0x00 -}; diff --git a/MinHook/src/buffer.c b/MinHook/src/buffer.c deleted file mode 100644 index 8f9fbce..0000000 --- a/MinHook/src/buffer.c +++ /dev/null @@ -1,312 +0,0 @@ -/* - * MinHook - The Minimalistic API Hooking Library for x64/x86 - * Copyright (C) 2009-2017 Tsuda Kageyu. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include "buffer.h" - -// Size of each memory block. (= page size of VirtualAlloc) -#define MEMORY_BLOCK_SIZE 0x1000 - -// Max range for seeking a memory block. (= 1024MB) -#define MAX_MEMORY_RANGE 0x40000000 - -// Memory protection flags to check the executable address. -#define PAGE_EXECUTE_FLAGS \ - (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY) - -// Memory slot. -typedef struct _MEMORY_SLOT -{ - union - { - struct _MEMORY_SLOT *pNext; - UINT8 buffer[MEMORY_SLOT_SIZE]; - }; -} MEMORY_SLOT, *PMEMORY_SLOT; - -// Memory block info. Placed at the head of each block. -typedef struct _MEMORY_BLOCK -{ - struct _MEMORY_BLOCK *pNext; - PMEMORY_SLOT pFree; // First element of the free slot list. - UINT usedCount; -} MEMORY_BLOCK, *PMEMORY_BLOCK; - -//------------------------------------------------------------------------- -// Global Variables: -//------------------------------------------------------------------------- - -// First element of the memory block list. -PMEMORY_BLOCK g_pMemoryBlocks; - -//------------------------------------------------------------------------- -VOID InitializeBuffer(VOID) -{ - // Nothing to do for now. -} - -//------------------------------------------------------------------------- -VOID UninitializeBuffer(VOID) -{ - PMEMORY_BLOCK pBlock = g_pMemoryBlocks; - g_pMemoryBlocks = NULL; - - while (pBlock) - { - PMEMORY_BLOCK pNext = pBlock->pNext; - VirtualFree(pBlock, 0, MEM_RELEASE); - pBlock = pNext; - } -} - -//------------------------------------------------------------------------- -#if defined(_M_X64) || defined(__x86_64__) -static LPVOID FindPrevFreeRegion(LPVOID pAddress, LPVOID pMinAddr, DWORD dwAllocationGranularity) -{ - ULONG_PTR tryAddr = (ULONG_PTR)pAddress; - - // Round down to the allocation granularity. - tryAddr -= tryAddr % dwAllocationGranularity; - - // Start from the previous allocation granularity multiply. - tryAddr -= dwAllocationGranularity; - - while (tryAddr >= (ULONG_PTR)pMinAddr) - { - MEMORY_BASIC_INFORMATION mbi; - if (VirtualQuery((LPVOID)tryAddr, &mbi, sizeof(mbi)) == 0) - break; - - if (mbi.State == MEM_FREE) - return (LPVOID)tryAddr; - - if ((ULONG_PTR)mbi.AllocationBase < dwAllocationGranularity) - break; - - tryAddr = (ULONG_PTR)mbi.AllocationBase - dwAllocationGranularity; - } - - return NULL; -} -#endif - -//------------------------------------------------------------------------- -#if defined(_M_X64) || defined(__x86_64__) -static LPVOID FindNextFreeRegion(LPVOID pAddress, LPVOID pMaxAddr, DWORD dwAllocationGranularity) -{ - ULONG_PTR tryAddr = (ULONG_PTR)pAddress; - - // Round down to the allocation granularity. - tryAddr -= tryAddr % dwAllocationGranularity; - - // Start from the next allocation granularity multiply. - tryAddr += dwAllocationGranularity; - - while (tryAddr <= (ULONG_PTR)pMaxAddr) - { - MEMORY_BASIC_INFORMATION mbi; - if (VirtualQuery((LPVOID)tryAddr, &mbi, sizeof(mbi)) == 0) - break; - - if (mbi.State == MEM_FREE) - return (LPVOID)tryAddr; - - tryAddr = (ULONG_PTR)mbi.BaseAddress + mbi.RegionSize; - - // Round up to the next allocation granularity. - tryAddr += dwAllocationGranularity - 1; - tryAddr -= tryAddr % dwAllocationGranularity; - } - - return NULL; -} -#endif - -//------------------------------------------------------------------------- -static PMEMORY_BLOCK GetMemoryBlock(LPVOID pOrigin) -{ - PMEMORY_BLOCK pBlock; -#if defined(_M_X64) || defined(__x86_64__) - ULONG_PTR minAddr; - ULONG_PTR maxAddr; - - SYSTEM_INFO si; - GetSystemInfo(&si); - minAddr = (ULONG_PTR)si.lpMinimumApplicationAddress; - maxAddr = (ULONG_PTR)si.lpMaximumApplicationAddress; - - // pOrigin ± 512MB - if ((ULONG_PTR)pOrigin > MAX_MEMORY_RANGE && minAddr < (ULONG_PTR)pOrigin - MAX_MEMORY_RANGE) - minAddr = (ULONG_PTR)pOrigin - MAX_MEMORY_RANGE; - - if (maxAddr > (ULONG_PTR)pOrigin + MAX_MEMORY_RANGE) - maxAddr = (ULONG_PTR)pOrigin + MAX_MEMORY_RANGE; - - // Make room for MEMORY_BLOCK_SIZE bytes. - maxAddr -= MEMORY_BLOCK_SIZE - 1; -#endif - - // Look the registered blocks for a reachable one. - for (pBlock = g_pMemoryBlocks; pBlock != NULL; pBlock = pBlock->pNext) - { -#if defined(_M_X64) || defined(__x86_64__) - // Ignore the blocks too far. - if ((ULONG_PTR)pBlock < minAddr || (ULONG_PTR)pBlock >= maxAddr) - continue; -#endif - // The block has at least one unused slot. - if (pBlock->pFree != NULL) - return pBlock; - } - -#if defined(_M_X64) || defined(__x86_64__) - // Alloc a new block above if not found. - { - LPVOID pAlloc = pOrigin; - while ((ULONG_PTR)pAlloc >= minAddr) - { - pAlloc = FindPrevFreeRegion(pAlloc, (LPVOID)minAddr, si.dwAllocationGranularity); - if (pAlloc == NULL) - break; - - pBlock = (PMEMORY_BLOCK)VirtualAlloc( - pAlloc, MEMORY_BLOCK_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); - if (pBlock != NULL) - break; - } - } - - // Alloc a new block below if not found. - if (pBlock == NULL) - { - LPVOID pAlloc = pOrigin; - while ((ULONG_PTR)pAlloc <= maxAddr) - { - pAlloc = FindNextFreeRegion(pAlloc, (LPVOID)maxAddr, si.dwAllocationGranularity); - if (pAlloc == NULL) - break; - - pBlock = (PMEMORY_BLOCK)VirtualAlloc( - pAlloc, MEMORY_BLOCK_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); - if (pBlock != NULL) - break; - } - } -#else - // In x86 mode, a memory block can be placed anywhere. - pBlock = (PMEMORY_BLOCK)VirtualAlloc( - NULL, MEMORY_BLOCK_SIZE, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); -#endif - - if (pBlock != NULL) - { - // Build a linked list of all the slots. - PMEMORY_SLOT pSlot = (PMEMORY_SLOT)pBlock + 1; - pBlock->pFree = NULL; - pBlock->usedCount = 0; - do - { - pSlot->pNext = pBlock->pFree; - pBlock->pFree = pSlot; - pSlot++; - } while ((ULONG_PTR)pSlot - (ULONG_PTR)pBlock <= MEMORY_BLOCK_SIZE - MEMORY_SLOT_SIZE); - - pBlock->pNext = g_pMemoryBlocks; - g_pMemoryBlocks = pBlock; - } - - return pBlock; -} - -//------------------------------------------------------------------------- -LPVOID AllocateBuffer(LPVOID pOrigin) -{ - PMEMORY_SLOT pSlot; - PMEMORY_BLOCK pBlock = GetMemoryBlock(pOrigin); - if (pBlock == NULL) - return NULL; - - // Remove an unused slot from the list. - pSlot = pBlock->pFree; - pBlock->pFree = pSlot->pNext; - pBlock->usedCount++; -#ifdef _DEBUG - // Fill the slot with INT3 for debugging. - memset(pSlot, 0xCC, sizeof(MEMORY_SLOT)); -#endif - return pSlot; -} - -//------------------------------------------------------------------------- -VOID FreeBuffer(LPVOID pBuffer) -{ - PMEMORY_BLOCK pBlock = g_pMemoryBlocks; - PMEMORY_BLOCK pPrev = NULL; - ULONG_PTR pTargetBlock = ((ULONG_PTR)pBuffer / MEMORY_BLOCK_SIZE) * MEMORY_BLOCK_SIZE; - - while (pBlock != NULL) - { - if ((ULONG_PTR)pBlock == pTargetBlock) - { - PMEMORY_SLOT pSlot = (PMEMORY_SLOT)pBuffer; -#ifdef _DEBUG - // Clear the released slot for debugging. - memset(pSlot, 0x00, sizeof(*pSlot)); -#endif - // Restore the released slot to the list. - pSlot->pNext = pBlock->pFree; - pBlock->pFree = pSlot; - pBlock->usedCount--; - - // Free if unused. - if (pBlock->usedCount == 0) - { - if (pPrev) - pPrev->pNext = pBlock->pNext; - else - g_pMemoryBlocks = pBlock->pNext; - - VirtualFree(pBlock, 0, MEM_RELEASE); - } - - break; - } - - pPrev = pBlock; - pBlock = pBlock->pNext; - } -} - -//------------------------------------------------------------------------- -BOOL IsExecutableAddress(LPVOID pAddress) -{ - MEMORY_BASIC_INFORMATION mi; - VirtualQuery(pAddress, &mi, sizeof(mi)); - - return (mi.State == MEM_COMMIT && (mi.Protect & PAGE_EXECUTE_FLAGS)); -} diff --git a/MinHook/src/buffer.h b/MinHook/src/buffer.h deleted file mode 100644 index 204d551..0000000 --- a/MinHook/src/buffer.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * MinHook - The Minimalistic API Hooking Library for x64/x86 - * Copyright (C) 2009-2017 Tsuda Kageyu. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#pragma once - -// Size of each memory slot. -#if defined(_M_X64) || defined(__x86_64__) - #define MEMORY_SLOT_SIZE 64 -#else - #define MEMORY_SLOT_SIZE 32 -#endif - -VOID InitializeBuffer(VOID); -VOID UninitializeBuffer(VOID); -LPVOID AllocateBuffer(LPVOID pOrigin); -VOID FreeBuffer(LPVOID pBuffer); -BOOL IsExecutableAddress(LPVOID pAddress); diff --git a/MinHook/src/hook.c b/MinHook/src/hook.c deleted file mode 100644 index ce65e57..0000000 --- a/MinHook/src/hook.c +++ /dev/null @@ -1,889 +0,0 @@ -/* - * MinHook - The Minimalistic API Hooking Library for x64/x86 - * Copyright (C) 2009-2017 Tsuda Kageyu. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include - -#include "../include/MinHook.h" -#include "buffer.h" -#include "trampoline.h" - -#ifndef ARRAYSIZE - #define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0])) -#endif - -// Initial capacity of the HOOK_ENTRY buffer. -#define INITIAL_HOOK_CAPACITY 32 - -// Initial capacity of the thread IDs buffer. -#define INITIAL_THREAD_CAPACITY 128 - -// Special hook position values. -#define INVALID_HOOK_POS UINT_MAX -#define ALL_HOOKS_POS UINT_MAX - -// Freeze() action argument defines. -#define ACTION_DISABLE 0 -#define ACTION_ENABLE 1 -#define ACTION_APPLY_QUEUED 2 - -// Thread access rights for suspending/resuming threads. -#define THREAD_ACCESS \ - (THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION | THREAD_SET_CONTEXT) - -// Hook information. -typedef struct _HOOK_ENTRY -{ - LPVOID pTarget; // Address of the target function. - LPVOID pDetour; // Address of the detour or relay function. - LPVOID pTrampoline; // Address of the trampoline function. - UINT8 backup[8]; // Original prologue of the target function. - - UINT8 patchAbove : 1; // Uses the hot patch area. - UINT8 isEnabled : 1; // Enabled. - UINT8 queueEnable : 1; // Queued for enabling/disabling when != isEnabled. - - UINT nIP : 4; // Count of the instruction boundaries. - UINT8 oldIPs[8]; // Instruction boundaries of the target function. - UINT8 newIPs[8]; // Instruction boundaries of the trampoline function. -} HOOK_ENTRY, *PHOOK_ENTRY; - -// Suspended threads for Freeze()/Unfreeze(). -typedef struct _FROZEN_THREADS -{ - LPDWORD pItems; // Data heap - UINT capacity; // Size of allocated data heap, items - UINT size; // Actual number of data items -} FROZEN_THREADS, *PFROZEN_THREADS; - -//------------------------------------------------------------------------- -// Global Variables: -//------------------------------------------------------------------------- - -// Spin lock flag for EnterSpinLock()/LeaveSpinLock(). -volatile LONG g_isLocked = FALSE; - -// Private heap handle. If not NULL, this library is initialized. -HANDLE g_hHeap = NULL; - -// Hook entries. -struct -{ - PHOOK_ENTRY pItems; // Data heap - UINT capacity; // Size of allocated data heap, items - UINT size; // Actual number of data items -} g_hooks; - -//------------------------------------------------------------------------- -// Returns INVALID_HOOK_POS if not found. -static UINT FindHookEntry(LPVOID pTarget) -{ - UINT i; - for (i = 0; i < g_hooks.size; ++i) - { - if ((ULONG_PTR)pTarget == (ULONG_PTR)g_hooks.pItems[i].pTarget) - return i; - } - - return INVALID_HOOK_POS; -} - -//------------------------------------------------------------------------- -static PHOOK_ENTRY AddHookEntry() -{ - if (g_hooks.pItems == NULL) - { - g_hooks.capacity = INITIAL_HOOK_CAPACITY; - g_hooks.pItems = (PHOOK_ENTRY)HeapAlloc( - g_hHeap, 0, g_hooks.capacity * sizeof(HOOK_ENTRY)); - if (g_hooks.pItems == NULL) - return NULL; - } - else if (g_hooks.size >= g_hooks.capacity) - { - PHOOK_ENTRY p = (PHOOK_ENTRY)HeapReAlloc( - g_hHeap, 0, g_hooks.pItems, (g_hooks.capacity * 2) * sizeof(HOOK_ENTRY)); - if (p == NULL) - return NULL; - - g_hooks.capacity *= 2; - g_hooks.pItems = p; - } - - return &g_hooks.pItems[g_hooks.size++]; -} - -//------------------------------------------------------------------------- -static void DeleteHookEntry(UINT pos) -{ - if (pos < g_hooks.size - 1) - g_hooks.pItems[pos] = g_hooks.pItems[g_hooks.size - 1]; - - g_hooks.size--; - - if (g_hooks.capacity / 2 >= INITIAL_HOOK_CAPACITY && g_hooks.capacity / 2 >= g_hooks.size) - { - PHOOK_ENTRY p = (PHOOK_ENTRY)HeapReAlloc( - g_hHeap, 0, g_hooks.pItems, (g_hooks.capacity / 2) * sizeof(HOOK_ENTRY)); - if (p == NULL) - return; - - g_hooks.capacity /= 2; - g_hooks.pItems = p; - } -} - -//------------------------------------------------------------------------- -static DWORD_PTR FindOldIP(PHOOK_ENTRY pHook, DWORD_PTR ip) -{ - UINT i; - - if (pHook->patchAbove && ip == ((DWORD_PTR)pHook->pTarget - sizeof(JMP_REL))) - return (DWORD_PTR)pHook->pTarget; - - for (i = 0; i < pHook->nIP; ++i) - { - if (ip == ((DWORD_PTR)pHook->pTrampoline + pHook->newIPs[i])) - return (DWORD_PTR)pHook->pTarget + pHook->oldIPs[i]; - } - -#if defined(_M_X64) || defined(__x86_64__) - // Check relay function. - if (ip == (DWORD_PTR)pHook->pDetour) - return (DWORD_PTR)pHook->pTarget; -#endif - - return 0; -} - -//------------------------------------------------------------------------- -static DWORD_PTR FindNewIP(PHOOK_ENTRY pHook, DWORD_PTR ip) -{ - UINT i; - for (i = 0; i < pHook->nIP; ++i) - { - if (ip == ((DWORD_PTR)pHook->pTarget + pHook->oldIPs[i])) - return (DWORD_PTR)pHook->pTrampoline + pHook->newIPs[i]; - } - - return 0; -} - -//------------------------------------------------------------------------- -static void ProcessThreadIPs(HANDLE hThread, UINT pos, UINT action) -{ - // If the thread suspended in the overwritten area, - // move IP to the proper address. - - CONTEXT c; -#if defined(_M_X64) || defined(__x86_64__) - DWORD64 *pIP = &c.Rip; -#else - DWORD *pIP = &c.Eip; -#endif - UINT count; - - c.ContextFlags = CONTEXT_CONTROL; - if (!GetThreadContext(hThread, &c)) - return; - - if (pos == ALL_HOOKS_POS) - { - pos = 0; - count = g_hooks.size; - } - else - { - count = pos + 1; - } - - for (; pos < count; ++pos) - { - PHOOK_ENTRY pHook = &g_hooks.pItems[pos]; - BOOL enable; - DWORD_PTR ip; - - switch (action) - { - case ACTION_DISABLE: - enable = FALSE; - break; - - case ACTION_ENABLE: - enable = TRUE; - break; - - default: // ACTION_APPLY_QUEUED - enable = pHook->queueEnable; - break; - } - if (pHook->isEnabled == enable) - continue; - - if (enable) - ip = FindNewIP(pHook, *pIP); - else - ip = FindOldIP(pHook, *pIP); - - if (ip != 0) - { - *pIP = ip; - SetThreadContext(hThread, &c); - } - } -} - -//------------------------------------------------------------------------- -static VOID EnumerateThreads(PFROZEN_THREADS pThreads) -{ - HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); - if (hSnapshot != INVALID_HANDLE_VALUE) - { - THREADENTRY32 te; - te.dwSize = sizeof(THREADENTRY32); - if (Thread32First(hSnapshot, &te)) - { - do - { - if (te.dwSize >= (FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) + sizeof(DWORD)) - && te.th32OwnerProcessID == GetCurrentProcessId() - && te.th32ThreadID != GetCurrentThreadId()) - { - if (pThreads->pItems == NULL) - { - pThreads->capacity = INITIAL_THREAD_CAPACITY; - pThreads->pItems - = (LPDWORD)HeapAlloc(g_hHeap, 0, pThreads->capacity * sizeof(DWORD)); - if (pThreads->pItems == NULL) - break; - } - else if (pThreads->size >= pThreads->capacity) - { - LPDWORD p = (LPDWORD)HeapReAlloc( - g_hHeap, 0, pThreads->pItems, (pThreads->capacity * 2) * sizeof(DWORD)); - if (p == NULL) - break; - - pThreads->capacity *= 2; - pThreads->pItems = p; - } - pThreads->pItems[pThreads->size++] = te.th32ThreadID; - } - - te.dwSize = sizeof(THREADENTRY32); - } while (Thread32Next(hSnapshot, &te)); - } - CloseHandle(hSnapshot); - } -} - -//------------------------------------------------------------------------- -static VOID Freeze(PFROZEN_THREADS pThreads, UINT pos, UINT action) -{ - pThreads->pItems = NULL; - pThreads->capacity = 0; - pThreads->size = 0; - EnumerateThreads(pThreads); - - if (pThreads->pItems != NULL) - { - UINT i; - for (i = 0; i < pThreads->size; ++i) - { - HANDLE hThread = OpenThread(THREAD_ACCESS, FALSE, pThreads->pItems[i]); - if (hThread != NULL) - { - SuspendThread(hThread); - ProcessThreadIPs(hThread, pos, action); - CloseHandle(hThread); - } - } - } -} - -//------------------------------------------------------------------------- -static VOID Unfreeze(PFROZEN_THREADS pThreads) -{ - if (pThreads->pItems != NULL) - { - UINT i; - for (i = 0; i < pThreads->size; ++i) - { - HANDLE hThread = OpenThread(THREAD_ACCESS, FALSE, pThreads->pItems[i]); - if (hThread != NULL) - { - ResumeThread(hThread); - CloseHandle(hThread); - } - } - - HeapFree(g_hHeap, 0, pThreads->pItems); - } -} - -//------------------------------------------------------------------------- -static MH_STATUS EnableHookLL(UINT pos, BOOL enable) -{ - PHOOK_ENTRY pHook = &g_hooks.pItems[pos]; - DWORD oldProtect; - SIZE_T patchSize = sizeof(JMP_REL); - LPBYTE pPatchTarget = (LPBYTE)pHook->pTarget; - - if (pHook->patchAbove) - { - pPatchTarget -= sizeof(JMP_REL); - patchSize += sizeof(JMP_REL_SHORT); - } - - if (!VirtualProtect(pPatchTarget, patchSize, PAGE_EXECUTE_READWRITE, &oldProtect)) - return MH_ERROR_MEMORY_PROTECT; - - if (enable) - { - PJMP_REL pJmp = (PJMP_REL)pPatchTarget; - pJmp->opcode = 0xE9; - pJmp->operand = (UINT32)((LPBYTE)pHook->pDetour - (pPatchTarget + sizeof(JMP_REL))); - - if (pHook->patchAbove) - { - PJMP_REL_SHORT pShortJmp = (PJMP_REL_SHORT)pHook->pTarget; - pShortJmp->opcode = 0xEB; - pShortJmp->operand = (UINT8)(0 - (sizeof(JMP_REL_SHORT) + sizeof(JMP_REL))); - } - } - else - { - if (pHook->patchAbove) - memcpy(pPatchTarget, pHook->backup, sizeof(JMP_REL) + sizeof(JMP_REL_SHORT)); - else - memcpy(pPatchTarget, pHook->backup, sizeof(JMP_REL)); - } - - VirtualProtect(pPatchTarget, patchSize, oldProtect, &oldProtect); - - // Just-in-case measure. - FlushInstructionCache(GetCurrentProcess(), pPatchTarget, patchSize); - - pHook->isEnabled = enable; - pHook->queueEnable = enable; - - return MH_OK; -} - -//------------------------------------------------------------------------- -static MH_STATUS EnableAllHooksLL(BOOL enable) -{ - MH_STATUS status = MH_OK; - UINT i, first = INVALID_HOOK_POS; - - for (i = 0; i < g_hooks.size; ++i) - { - if (g_hooks.pItems[i].isEnabled != enable) - { - first = i; - break; - } - } - - if (first != INVALID_HOOK_POS) - { - FROZEN_THREADS threads; - Freeze(&threads, ALL_HOOKS_POS, enable ? ACTION_ENABLE : ACTION_DISABLE); - - for (i = first; i < g_hooks.size; ++i) - { - if (g_hooks.pItems[i].isEnabled != enable) - { - status = EnableHookLL(i, enable); - if (status != MH_OK) - break; - } - } - - Unfreeze(&threads); - } - - return status; -} - -//------------------------------------------------------------------------- -static VOID EnterSpinLock(VOID) -{ - SIZE_T spinCount = 0; - - // Wait until the flag is FALSE. - while (InterlockedCompareExchange(&g_isLocked, TRUE, FALSE) != FALSE) - { - // No need to generate a memory barrier here, since InterlockedCompareExchange() - // generates a full memory barrier itself. - - // Prevent the loop from being too busy. - if (spinCount < 32) - Sleep(0); - else - Sleep(1); - - spinCount++; - } -} - -//------------------------------------------------------------------------- -static VOID LeaveSpinLock(VOID) -{ - // No need to generate a memory barrier here, since InterlockedExchange() - // generates a full memory barrier itself. - - InterlockedExchange(&g_isLocked, FALSE); -} - -//------------------------------------------------------------------------- -MH_STATUS WINAPI MH_Initialize(VOID) -{ - MH_STATUS status = MH_OK; - - EnterSpinLock(); - - if (g_hHeap == NULL) - { - g_hHeap = HeapCreate(0, 0, 0); - if (g_hHeap != NULL) - { - // Initialize the internal function buffer. - InitializeBuffer(); - } - else - { - status = MH_ERROR_MEMORY_ALLOC; - } - } - else - { - status = MH_ERROR_ALREADY_INITIALIZED; - } - - LeaveSpinLock(); - - return status; -} - -//------------------------------------------------------------------------- -MH_STATUS WINAPI MH_Uninitialize(VOID) -{ - MH_STATUS status = MH_OK; - - EnterSpinLock(); - - if (g_hHeap != NULL) - { - status = EnableAllHooksLL(FALSE); - if (status == MH_OK) - { - // Free the internal function buffer. - - // HeapFree is actually not required, but some tools detect a false - // memory leak without HeapFree. - - UninitializeBuffer(); - - HeapFree(g_hHeap, 0, g_hooks.pItems); - HeapDestroy(g_hHeap); - - g_hHeap = NULL; - - g_hooks.pItems = NULL; - g_hooks.capacity = 0; - g_hooks.size = 0; - } - } - else - { - status = MH_ERROR_NOT_INITIALIZED; - } - - LeaveSpinLock(); - - return status; -} - -//------------------------------------------------------------------------- -MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal) -{ - MH_STATUS status = MH_OK; - - EnterSpinLock(); - - if (g_hHeap != NULL) - { - if (IsExecutableAddress(pTarget) && IsExecutableAddress(pDetour)) - { - UINT pos = FindHookEntry(pTarget); - if (pos == INVALID_HOOK_POS) - { - LPVOID pBuffer = AllocateBuffer(pTarget); - if (pBuffer != NULL) - { - TRAMPOLINE ct; - - ct.pTarget = pTarget; - ct.pDetour = pDetour; - ct.pTrampoline = pBuffer; - if (CreateTrampolineFunction(&ct)) - { - PHOOK_ENTRY pHook = AddHookEntry(); - if (pHook != NULL) - { - pHook->pTarget = ct.pTarget; -#if defined(_M_X64) || defined(__x86_64__) - pHook->pDetour = ct.pRelay; -#else - pHook->pDetour = ct.pDetour; -#endif - pHook->pTrampoline = ct.pTrampoline; - pHook->patchAbove = ct.patchAbove; - pHook->isEnabled = FALSE; - pHook->queueEnable = FALSE; - pHook->nIP = ct.nIP; - memcpy(pHook->oldIPs, ct.oldIPs, ARRAYSIZE(ct.oldIPs)); - memcpy(pHook->newIPs, ct.newIPs, ARRAYSIZE(ct.newIPs)); - - // Back up the target function. - - if (ct.patchAbove) - { - memcpy( - pHook->backup, - (LPBYTE)pTarget - sizeof(JMP_REL), - sizeof(JMP_REL) + sizeof(JMP_REL_SHORT)); - } - else - { - memcpy(pHook->backup, pTarget, sizeof(JMP_REL)); - } - - if (ppOriginal != NULL) - *ppOriginal = pHook->pTrampoline; - } - else - { - status = MH_ERROR_MEMORY_ALLOC; - } - } - else - { - status = MH_ERROR_UNSUPPORTED_FUNCTION; - } - - if (status != MH_OK) - { - FreeBuffer(pBuffer); - } - } - else - { - status = MH_ERROR_MEMORY_ALLOC; - } - } - else - { - status = MH_ERROR_ALREADY_CREATED; - } - } - else - { - status = MH_ERROR_NOT_EXECUTABLE; - } - } - else - { - status = MH_ERROR_NOT_INITIALIZED; - } - - LeaveSpinLock(); - - return status; -} - -//------------------------------------------------------------------------- -MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget) -{ - MH_STATUS status = MH_OK; - - EnterSpinLock(); - - if (g_hHeap != NULL) - { - UINT pos = FindHookEntry(pTarget); - if (pos != INVALID_HOOK_POS) - { - if (g_hooks.pItems[pos].isEnabled) - { - FROZEN_THREADS threads; - Freeze(&threads, pos, ACTION_DISABLE); - - status = EnableHookLL(pos, FALSE); - - Unfreeze(&threads); - } - - if (status == MH_OK) - { - FreeBuffer(g_hooks.pItems[pos].pTrampoline); - DeleteHookEntry(pos); - } - } - else - { - status = MH_ERROR_NOT_CREATED; - } - } - else - { - status = MH_ERROR_NOT_INITIALIZED; - } - - LeaveSpinLock(); - - return status; -} - -//------------------------------------------------------------------------- -static MH_STATUS EnableHook(LPVOID pTarget, BOOL enable) -{ - MH_STATUS status = MH_OK; - - EnterSpinLock(); - - if (g_hHeap != NULL) - { - if (pTarget == MH_ALL_HOOKS) - { - status = EnableAllHooksLL(enable); - } - else - { - FROZEN_THREADS threads; - UINT pos = FindHookEntry(pTarget); - if (pos != INVALID_HOOK_POS) - { - if (g_hooks.pItems[pos].isEnabled != enable) - { - Freeze(&threads, pos, ACTION_ENABLE); - - status = EnableHookLL(pos, enable); - - Unfreeze(&threads); - } - else - { - status = enable ? MH_ERROR_ENABLED : MH_ERROR_DISABLED; - } - } - else - { - status = MH_ERROR_NOT_CREATED; - } - } - } - else - { - status = MH_ERROR_NOT_INITIALIZED; - } - - LeaveSpinLock(); - - return status; -} - -//------------------------------------------------------------------------- -MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget) -{ - return EnableHook(pTarget, TRUE); -} - -//------------------------------------------------------------------------- -MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget) -{ - return EnableHook(pTarget, FALSE); -} - -//------------------------------------------------------------------------- -static MH_STATUS QueueHook(LPVOID pTarget, BOOL queueEnable) -{ - MH_STATUS status = MH_OK; - - EnterSpinLock(); - - if (g_hHeap != NULL) - { - if (pTarget == MH_ALL_HOOKS) - { - UINT i; - for (i = 0; i < g_hooks.size; ++i) - g_hooks.pItems[i].queueEnable = queueEnable; - } - else - { - UINT pos = FindHookEntry(pTarget); - if (pos != INVALID_HOOK_POS) - { - g_hooks.pItems[pos].queueEnable = queueEnable; - } - else - { - status = MH_ERROR_NOT_CREATED; - } - } - } - else - { - status = MH_ERROR_NOT_INITIALIZED; - } - - LeaveSpinLock(); - - return status; -} - -//------------------------------------------------------------------------- -MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget) -{ - return QueueHook(pTarget, TRUE); -} - -//------------------------------------------------------------------------- -MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget) -{ - return QueueHook(pTarget, FALSE); -} - -//------------------------------------------------------------------------- -MH_STATUS WINAPI MH_ApplyQueued(VOID) -{ - MH_STATUS status = MH_OK; - UINT i, first = INVALID_HOOK_POS; - - EnterSpinLock(); - - if (g_hHeap != NULL) - { - for (i = 0; i < g_hooks.size; ++i) - { - if (g_hooks.pItems[i].isEnabled != g_hooks.pItems[i].queueEnable) - { - first = i; - break; - } - } - - if (first != INVALID_HOOK_POS) - { - FROZEN_THREADS threads; - Freeze(&threads, ALL_HOOKS_POS, ACTION_APPLY_QUEUED); - - for (i = first; i < g_hooks.size; ++i) - { - PHOOK_ENTRY pHook = &g_hooks.pItems[i]; - if (pHook->isEnabled != pHook->queueEnable) - { - status = EnableHookLL(i, pHook->queueEnable); - if (status != MH_OK) - break; - } - } - - Unfreeze(&threads); - } - } - else - { - status = MH_ERROR_NOT_INITIALIZED; - } - - LeaveSpinLock(); - - return status; -} - -//------------------------------------------------------------------------- -MH_STATUS WINAPI MH_CreateHookApiEx( - LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, - LPVOID *ppOriginal, LPVOID *ppTarget) -{ - HMODULE hModule; - LPVOID pTarget; - - hModule = GetModuleHandleW(pszModule); - if (hModule == NULL) - return MH_ERROR_MODULE_NOT_FOUND; - - pTarget = (LPVOID)GetProcAddress(hModule, pszProcName); - if (pTarget == NULL) - return MH_ERROR_FUNCTION_NOT_FOUND; - - if(ppTarget != NULL) - *ppTarget = pTarget; - - return MH_CreateHook(pTarget, pDetour, ppOriginal); -} - -//------------------------------------------------------------------------- -MH_STATUS WINAPI MH_CreateHookApi( - LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal) -{ - return MH_CreateHookApiEx(pszModule, pszProcName, pDetour, ppOriginal, NULL); -} - -//------------------------------------------------------------------------- -const char * WINAPI MH_StatusToString(MH_STATUS status) -{ -#define MH_ST2STR(x) \ - case x: \ - return #x; - - switch (status) { - MH_ST2STR(MH_UNKNOWN) - MH_ST2STR(MH_OK) - MH_ST2STR(MH_ERROR_ALREADY_INITIALIZED) - MH_ST2STR(MH_ERROR_NOT_INITIALIZED) - MH_ST2STR(MH_ERROR_ALREADY_CREATED) - MH_ST2STR(MH_ERROR_NOT_CREATED) - MH_ST2STR(MH_ERROR_ENABLED) - MH_ST2STR(MH_ERROR_DISABLED) - MH_ST2STR(MH_ERROR_NOT_EXECUTABLE) - MH_ST2STR(MH_ERROR_UNSUPPORTED_FUNCTION) - MH_ST2STR(MH_ERROR_MEMORY_ALLOC) - MH_ST2STR(MH_ERROR_MEMORY_PROTECT) - MH_ST2STR(MH_ERROR_MODULE_NOT_FOUND) - MH_ST2STR(MH_ERROR_FUNCTION_NOT_FOUND) - } - -#undef MH_ST2STR - - return "(unknown)"; -} diff --git a/MinHook/src/trampoline.c b/MinHook/src/trampoline.c deleted file mode 100644 index ac37f0f..0000000 --- a/MinHook/src/trampoline.c +++ /dev/null @@ -1,316 +0,0 @@ -/* - * MinHook - The Minimalistic API Hooking Library for x64/x86 - * Copyright (C) 2009-2017 Tsuda Kageyu. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include - -#ifndef ARRAYSIZE - #define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0])) -#endif - -#if defined(_M_X64) || defined(__x86_64__) - #include "./hde/hde64.h" - typedef hde64s HDE; - #define HDE_DISASM(code, hs) hde64_disasm(code, hs) -#else - #include "./hde/hde32.h" - typedef hde32s HDE; - #define HDE_DISASM(code, hs) hde32_disasm(code, hs) -#endif - -#include "trampoline.h" -#include "buffer.h" - -// Maximum size of a trampoline function. -#if defined(_M_X64) || defined(__x86_64__) - #define TRAMPOLINE_MAX_SIZE (MEMORY_SLOT_SIZE - sizeof(JMP_ABS)) -#else - #define TRAMPOLINE_MAX_SIZE MEMORY_SLOT_SIZE -#endif - -//------------------------------------------------------------------------- -static BOOL IsCodePadding(LPBYTE pInst, UINT size) -{ - UINT i; - - if (pInst[0] != 0x00 && pInst[0] != 0x90 && pInst[0] != 0xCC) - return FALSE; - - for (i = 1; i < size; ++i) - { - if (pInst[i] != pInst[0]) - return FALSE; - } - return TRUE; -} - -//------------------------------------------------------------------------- -BOOL CreateTrampolineFunction(PTRAMPOLINE ct) -{ -#if defined(_M_X64) || defined(__x86_64__) - CALL_ABS call = { - 0xFF, 0x15, 0x00000002, // FF15 00000002: CALL [RIP+8] - 0xEB, 0x08, // EB 08: JMP +10 - 0x0000000000000000ULL // Absolute destination address - }; - JMP_ABS jmp = { - 0xFF, 0x25, 0x00000000, // FF25 00000000: JMP [RIP+6] - 0x0000000000000000ULL // Absolute destination address - }; - JCC_ABS jcc = { - 0x70, 0x0E, // 7* 0E: J** +16 - 0xFF, 0x25, 0x00000000, // FF25 00000000: JMP [RIP+6] - 0x0000000000000000ULL // Absolute destination address - }; -#else - CALL_REL call = { - 0xE8, // E8 xxxxxxxx: CALL +5+xxxxxxxx - 0x00000000 // Relative destination address - }; - JMP_REL jmp = { - 0xE9, // E9 xxxxxxxx: JMP +5+xxxxxxxx - 0x00000000 // Relative destination address - }; - JCC_REL jcc = { - 0x0F, 0x80, // 0F8* xxxxxxxx: J** +6+xxxxxxxx - 0x00000000 // Relative destination address - }; -#endif - - UINT8 oldPos = 0; - UINT8 newPos = 0; - ULONG_PTR jmpDest = 0; // Destination address of an internal jump. - BOOL finished = FALSE; // Is the function completed? -#if defined(_M_X64) || defined(__x86_64__) - UINT8 instBuf[16]; -#endif - - ct->patchAbove = FALSE; - ct->nIP = 0; - - do - { - HDE hs; - UINT copySize; - LPVOID pCopySrc; - ULONG_PTR pOldInst = (ULONG_PTR)ct->pTarget + oldPos; - ULONG_PTR pNewInst = (ULONG_PTR)ct->pTrampoline + newPos; - - copySize = HDE_DISASM((LPVOID)pOldInst, &hs); - if (hs.flags & F_ERROR) - return FALSE; - - pCopySrc = (LPVOID)pOldInst; - if (oldPos >= sizeof(JMP_REL)) - { - // The trampoline function is long enough. - // Complete the function with the jump to the target function. -#if defined(_M_X64) || defined(__x86_64__) - jmp.address = pOldInst; -#else - jmp.operand = (UINT32)(pOldInst - (pNewInst + sizeof(jmp))); -#endif - pCopySrc = &jmp; - copySize = sizeof(jmp); - - finished = TRUE; - } -#if defined(_M_X64) || defined(__x86_64__) - else if ((hs.modrm & 0xC7) == 0x05) - { - // Instructions using RIP relative addressing. (ModR/M = 00???101B) - - // Modify the RIP relative address. - PUINT32 pRelAddr; - - // Avoid using memcpy to reduce the footprint. -#ifndef _MSC_VER - memcpy(instBuf, (LPBYTE)pOldInst, copySize); -#else - __movsb(instBuf, (LPBYTE)pOldInst, copySize); -#endif - pCopySrc = instBuf; - - // Relative address is stored at (instruction length - immediate value length - 4). - pRelAddr = (PUINT32)(instBuf + hs.len - ((hs.flags & 0x3C) >> 2) - 4); - *pRelAddr - = (UINT32)((pOldInst + hs.len + (INT32)hs.disp.disp32) - (pNewInst + hs.len)); - - // Complete the function if JMP (FF /4). - if (hs.opcode == 0xFF && hs.modrm_reg == 4) - finished = TRUE; - } -#endif - else if (hs.opcode == 0xE8) - { - // Direct relative CALL - ULONG_PTR dest = pOldInst + hs.len + (INT32)hs.imm.imm32; -#if defined(_M_X64) || defined(__x86_64__) - call.address = dest; -#else - call.operand = (UINT32)(dest - (pNewInst + sizeof(call))); -#endif - pCopySrc = &call; - copySize = sizeof(call); - } - else if ((hs.opcode & 0xFD) == 0xE9) - { - // Direct relative JMP (EB or E9) - ULONG_PTR dest = pOldInst + hs.len; - - if (hs.opcode == 0xEB) // isShort jmp - dest += (INT8)hs.imm.imm8; - else - dest += (INT32)hs.imm.imm32; - - // Simply copy an internal jump. - if ((ULONG_PTR)ct->pTarget <= dest - && dest < ((ULONG_PTR)ct->pTarget + sizeof(JMP_REL))) - { - if (jmpDest < dest) - jmpDest = dest; - } - else - { -#if defined(_M_X64) || defined(__x86_64__) - jmp.address = dest; -#else - jmp.operand = (UINT32)(dest - (pNewInst + sizeof(jmp))); -#endif - pCopySrc = &jmp; - copySize = sizeof(jmp); - - // Exit the function If it is not in the branch - finished = (pOldInst >= jmpDest); - } - } - else if ((hs.opcode & 0xF0) == 0x70 - || (hs.opcode & 0xFC) == 0xE0 - || (hs.opcode2 & 0xF0) == 0x80) - { - // Direct relative Jcc - ULONG_PTR dest = pOldInst + hs.len; - - if ((hs.opcode & 0xF0) == 0x70 // Jcc - || (hs.opcode & 0xFC) == 0xE0) // LOOPNZ/LOOPZ/LOOP/JECXZ - dest += (INT8)hs.imm.imm8; - else - dest += (INT32)hs.imm.imm32; - - // Simply copy an internal jump. - if ((ULONG_PTR)ct->pTarget <= dest - && dest < ((ULONG_PTR)ct->pTarget + sizeof(JMP_REL))) - { - if (jmpDest < dest) - jmpDest = dest; - } - else if ((hs.opcode & 0xFC) == 0xE0) - { - // LOOPNZ/LOOPZ/LOOP/JCXZ/JECXZ to the outside are not supported. - return FALSE; - } - else - { - UINT8 cond = ((hs.opcode != 0x0F ? hs.opcode : hs.opcode2) & 0x0F); -#if defined(_M_X64) || defined(__x86_64__) - // Invert the condition in x64 mode to simplify the conditional jump logic. - jcc.opcode = 0x71 ^ cond; - jcc.address = dest; -#else - jcc.opcode1 = 0x80 | cond; - jcc.operand = (UINT32)(dest - (pNewInst + sizeof(jcc))); -#endif - pCopySrc = &jcc; - copySize = sizeof(jcc); - } - } - else if ((hs.opcode & 0xFE) == 0xC2) - { - // RET (C2 or C3) - - // Complete the function if not in a branch. - finished = (pOldInst >= jmpDest); - } - - // Can't alter the instruction length in a branch. - if (pOldInst < jmpDest && copySize != hs.len) - return FALSE; - - // Trampoline function is too large. - if ((newPos + copySize) > TRAMPOLINE_MAX_SIZE) - return FALSE; - - // Trampoline function has too many instructions. - if (ct->nIP >= ARRAYSIZE(ct->oldIPs)) - return FALSE; - - ct->oldIPs[ct->nIP] = oldPos; - ct->newIPs[ct->nIP] = newPos; - ct->nIP++; - - // Avoid using memcpy to reduce the footprint. -#ifndef _MSC_VER - memcpy((LPBYTE)ct->pTrampoline + newPos, pCopySrc, copySize); -#else - __movsb((LPBYTE)ct->pTrampoline + newPos, pCopySrc, copySize); -#endif - newPos += copySize; - oldPos += hs.len; - } - while (!finished); - - // Is there enough place for a long jump? - if (oldPos < sizeof(JMP_REL) - && !IsCodePadding((LPBYTE)ct->pTarget + oldPos, sizeof(JMP_REL) - oldPos)) - { - // Is there enough place for a short jump? - if (oldPos < sizeof(JMP_REL_SHORT) - && !IsCodePadding((LPBYTE)ct->pTarget + oldPos, sizeof(JMP_REL_SHORT) - oldPos)) - { - return FALSE; - } - - // Can we place the long jump above the function? - if (!IsExecutableAddress((LPBYTE)ct->pTarget - sizeof(JMP_REL))) - return FALSE; - - if (!IsCodePadding((LPBYTE)ct->pTarget - sizeof(JMP_REL), sizeof(JMP_REL))) - return FALSE; - - ct->patchAbove = TRUE; - } - -#if defined(_M_X64) || defined(__x86_64__) - // Create a relay function. - jmp.address = (ULONG_PTR)ct->pDetour; - - ct->pRelay = (LPBYTE)ct->pTrampoline + newPos; - memcpy(ct->pRelay, &jmp, sizeof(jmp)); -#endif - - return TRUE; -} diff --git a/MinHook/src/trampoline.h b/MinHook/src/trampoline.h deleted file mode 100644 index bdffdac..0000000 --- a/MinHook/src/trampoline.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * MinHook - The Minimalistic API Hooking Library for x64/x86 - * Copyright (C) 2009-2017 Tsuda Kageyu. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A - * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER - * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#pragma once - -#pragma pack(push, 1) - -// Structs for writing x86/x64 instructions. - -// 8-bit relative jump. -typedef struct _JMP_REL_SHORT -{ - UINT8 opcode; // EB xx: JMP +2+xx - UINT8 operand; -} JMP_REL_SHORT, *PJMP_REL_SHORT; - -// 32-bit direct relative jump/call. -typedef struct _JMP_REL -{ - UINT8 opcode; // E9/E8 xxxxxxxx: JMP/CALL +5+xxxxxxxx - UINT32 operand; // Relative destination address -} JMP_REL, *PJMP_REL, CALL_REL; - -// 64-bit indirect absolute jump. -typedef struct _JMP_ABS -{ - UINT8 opcode0; // FF25 00000000: JMP [+6] - UINT8 opcode1; - UINT32 dummy; - UINT64 address; // Absolute destination address -} JMP_ABS, *PJMP_ABS; - -// 64-bit indirect absolute call. -typedef struct _CALL_ABS -{ - UINT8 opcode0; // FF15 00000002: CALL [+6] - UINT8 opcode1; - UINT32 dummy0; - UINT8 dummy1; // EB 08: JMP +10 - UINT8 dummy2; - UINT64 address; // Absolute destination address -} CALL_ABS; - -// 32-bit direct relative conditional jumps. -typedef struct _JCC_REL -{ - UINT8 opcode0; // 0F8* xxxxxxxx: J** +6+xxxxxxxx - UINT8 opcode1; - UINT32 operand; // Relative destination address -} JCC_REL; - -// 64bit indirect absolute conditional jumps that x64 lacks. -typedef struct _JCC_ABS -{ - UINT8 opcode; // 7* 0E: J** +16 - UINT8 dummy0; - UINT8 dummy1; // FF25 00000000: JMP [+6] - UINT8 dummy2; - UINT32 dummy3; - UINT64 address; // Absolute destination address -} JCC_ABS; - -#pragma pack(pop) - -typedef struct _TRAMPOLINE -{ - LPVOID pTarget; // [In] Address of the target function. - LPVOID pDetour; // [In] Address of the detour function. - LPVOID pTrampoline; // [In] Buffer address for the trampoline and relay function. - -#if defined(_M_X64) || defined(__x86_64__) - LPVOID pRelay; // [Out] Address of the relay function. -#endif - BOOL patchAbove; // [Out] Should use the hot patch area? - UINT nIP; // [Out] Number of the instruction boundaries. - UINT8 oldIPs[8]; // [Out] Instruction boundaries of the target function. - UINT8 newIPs[8]; // [Out] Instruction boundaries of the trampoline function. -} TRAMPOLINE, *PTRAMPOLINE; - -BOOL CreateTrampolineFunction(PTRAMPOLINE ct); diff --git a/d3d9ex.sln b/d3d9ex.sln index df545f5..f14c320 100644 --- a/d3d9ex.sln +++ b/d3d9ex.sln @@ -9,6 +9,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{5DB3A8 ProjectSection(SolutionItems) = preProject Common\Defines.h = Common\Defines.h Common\Logger.h = Common\Logger.h + Common\MemPatch.h = Common\MemPatch.h Common\SimpleIni.h = Common\SimpleIni.h Common\StringUtil.h = Common\StringUtil.h Common\Timer.h = Common\Timer.h @@ -17,7 +18,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{5DB3A8 Common\WinVer.h = Common\WinVer.h EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "MinHook\build\VC15\libMinHook.vcxproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "MinHook\build\VC16\libMinHook.vcxproj", "{F142A341-5EE0-442D-A15F-98AE9B48DBAE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/d3d9ex/AutoFix.cpp b/d3d9ex/AutoFix.cpp index 2de07a7..b6756b5 100644 --- a/d3d9ex/AutoFix.cpp +++ b/d3d9ex/AutoFix.cpp @@ -8,28 +8,16 @@ void MainContext::EnableAutoFix() std::string exe_name = ModuleNameA(NULL); std::transform(exe_name.begin(), exe_name.end(), exe_name.begin(), std::tolower); - if (exe_name == "game.exe" || exe_name == "game.dat") - { - autofix = RESIDENT_EVIL_4; - PrintLog("AutoFix for \"Resident Evil 4\" enabled"); - } - - if (exe_name == "kb.exe") - { - autofix = KINGS_BOUNTY_LEGEND; - PrintLog("AutoFix for \"Kings Bounty: Legend\" enabled"); - } - if (exe_name == "ffxiiiimg.exe") { - autofix = FINAL_FANTASY_XIII; + autofix = AutoFixes::FINAL_FANTASY_XIII; PrintLog("AutoFix for \"Final Fantasy XIII\" enabled"); FF13_InitializeGameAddresses(); } if (exe_name == "ffxiii2img.exe") { - autofix = FINAL_FANTASY_XIII2; + autofix = AutoFixes::FINAL_FANTASY_XIII2; PrintLog("AutoFix for \"Final Fantasy XIII-2\" enabled"); FF13_2_InitializeGameAddresses(); FF13_2_CreateSetFrameRateCodeBlock(); @@ -38,8 +26,7 @@ void MainContext::EnableAutoFix() const std::map MainContext::behaviorflags_fixes = { - { RESIDENT_EVIL_4, D3DCREATE_SOFTWARE_VERTEXPROCESSING }, - { KINGS_BOUNTY_LEGEND, D3DCREATE_MIXED_VERTEXPROCESSING } + }; void MainContext::FixBehaviorFlagConflict(const DWORD flags_in, DWORD* flags_out) @@ -75,44 +62,88 @@ bool MainContext::ApplyBehaviorFlagsFix(DWORD* flags) return false; } -void MainContext::ScaleScissorRect(RECT * rect) { - rect->left = (LONG) (rect->left * scissor_scaling_factor_w); - rect->top = (LONG) (rect->top * scissor_scaling_factor_h); - rect->right = (LONG)(rect->right * scissor_scaling_factor_w); - rect->bottom = (LONG) (rect-> bottom * scissor_scaling_factor_h); +HRESULT MainContext::SetScissorRect(IDirect3DDevice9* pIDirect3DDevice9, CONST RECT* rect) +{ + if (rect) + { + RECT* r = const_cast(rect); + r->left = (LONG)(r->left * scissor_scaling_factor_w); + r->top = (LONG)(r->top * scissor_scaling_factor_h); + r->right = (LONG)(r->right * scissor_scaling_factor_w); + r->bottom = (LONG)(r->bottom * scissor_scaling_factor_h); + return pIDirect3DDevice9->SetScissorRect(r); + } + return pIDirect3DDevice9->SetScissorRect(rect); } -HRESULT APIENTRY MainContext::ApplyVertexBufferFix(IDirect3DDevice9* pIDirect3DDevice9, UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle) +HRESULT MainContext::SetViewport(IDirect3DDevice9* pIDirect3DDevice9, CONST D3DVIEWPORT9* pViewport) { - switch (autofix) { - case AutoFixes::NONE: - return pIDirect3DDevice9->CreateVertexBuffer(Length, Usage, FVF, Pool, ppVertexBuffer, pSharedHandle); - case FINAL_FANTASY_XIII: - case FINAL_FANTASY_XIII2: + if (pViewport) + { + D3DVIEWPORT9* vp = const_cast(pViewport); + if (pViewport->Width > 1280 && pViewport->Height > 720) + { + vp->Width--; + vp->X++; + + vp->Height--; + vp->Y++; + } + return pIDirect3DDevice9->SetViewport(vp); + } + return pIDirect3DDevice9->SetViewport(pViewport); +} + +HRESULT MainContext::CreateVertexBuffer(IDirect3DDevice9* pIDirect3DDevice9, UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle) +{ + switch (autofix) + { + case AutoFixes::FINAL_FANTASY_XIII: + case AutoFixes::FINAL_FANTASY_XIII2: // Both games lock a vertex buffer 358400 before drawing any 2D element on screen (sometimes multiple times per frame) if (Length == 358400 && Pool == D3DPOOL_MANAGED) { Usage = D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY; Pool = D3DPOOL_SYSTEMMEM; - - //IDirect3DVertexBuffer9* buffer = nullptr; - //HRESULT hr = pIDirect3DDevice9->CreateVertexBuffer(Length, Usage, FVF, Pool, &buffer, NULL); - //if (FAILED(hr)) - //{ - // return pIDirect3DDevice9->CreateVertexBuffer(Length, Usage, FVF, Pool, ppVertexBuffer, pSharedHandle); - //} - - //if(ppVertexBuffer) *ppVertexBuffer = new hkIDirect3DVertexBuffer9(pIDirect3DDevice9, buffer); - //return hr; } + + // Crashing on Lock/Unlock, why??? + // //IDirect3DVertexBuffer9* buffer = nullptr; + // //HRESULT hr = pIDirect3DDevice9->CreateVertexBuffer(Length, Usage, FVF, Pool, &buffer, NULL); + // //if (FAILED(hr)) + // //{ + // // return pIDirect3DDevice9->CreateVertexBuffer(Length, Usage, FVF, Pool, ppVertexBuffer, pSharedHandle); + // //} + + // //if(ppVertexBuffer) *ppVertexBuffer = new hkIDirect3DVertexBuffer9(pIDirect3DDevice9, buffer); + // //return hr; break; } return pIDirect3DDevice9->CreateVertexBuffer(Length, Usage, FVF, Pool, ppVertexBuffer, pSharedHandle); } -void MainContext::FF13_AsyncPatching() { +void MainContext::OneTimeFix(std::unique_ptr& className) +{ + if (wcscmp(className.get(), L"SQEX.CDev.Engine.Framework.MainWindow") == 0) { + std::thread fix(&context.Fix_Thread); + fix.detach(); + } +} + +void MainContext::Fix_Thread() +{ std::this_thread::sleep_for(std::chrono::milliseconds(2000)); - context.FF13_OneTimeFixes(); + + std::lock_guard lock(context.fix_mutex); + if (context.autofix == AutoFixes::FINAL_FANTASY_XIII) { + PrintLog("Starting FFXIII one time RAM patches."); + context.FF13_OneTimeFixes(); + } + else if (context.autofix == AutoFixes::FINAL_FANTASY_XIII2) { + PrintLog("Starting FFXIII-2 one time RAM patches."); + context.FF13_2_OneTimeFixes(); + } + MessageBeep(MB_ICONASTERISK); } void MainContext::FF13_InitializeGameAddresses() @@ -142,33 +173,15 @@ void MainContext::FF13_InitializeGameAddresses() } void MainContext::FF13_OneTimeFixes() { - MainContext::FF13_Workaround_1440_Res_Bug(); - MainContext::FF13_NOPIngameFrameRateLimitSetter(); - MainContext::FF13_RemoveContinuousControllerScan(); - MainContext::FF13_FixScissorRect(); - MainContext::FF13_EnableControllerVibration(); - MainContext::FF13_SetFrameRateVariables(); + FF13_NOPIngameFrameRateLimitSetter(); + FF13_RemoveContinuousControllerScan(); + FF13_FixScissorRect(); + FF13_EnableControllerVibration(); + FF13_SetFrameRateVariables(); PrintLog("Finished FF13 One Time Fixes"); - context.didOneTimeFixes = true; } -void MainContext::FF13_Workaround_1440_Res_Bug() -{ - if (*ff13_internal_res_w == 2560 && *ff13_internal_res_h == 1440) { - // We need to reduce one or another. Increasing the internal res causes crashes. - // Decreasing the internal res width by one pixel causes the last pixel column displayed on the screen to stay black. - PrintLog("Applying workaround for resolution 2560x1440 bug."); - *ff13_internal_res_w = 2559; - } - else if (*ff13_internal_res_w == 3440 && *ff13_internal_res_h == 1440) { - // Fix ultrawide pixelation also. - PrintLog("Applying workaround for resolution 3440x1440 bug."); - *ff13_internal_res_w = 3439; - } -} - - void MainContext::FF13_EnableControllerVibration() { if (!config.GetFFXIIIEnableControllerVibration()) { @@ -180,24 +193,14 @@ void MainContext::FF13_EnableControllerVibration() return; } PrintLog("Enabling controller vibration..."); - ChangeMemoryProtectionToReadWriteExecute(ff13_vibration_low_set_zero_address, 5); + MemPatch::Nop(ff13_vibration_low_set_zero_address, 5); + MemPatch::Nop(ff13_vibration_high_set_zero_address, 5); - *ff13_vibration_low_set_zero_address = 0x90; - *(ff13_vibration_low_set_zero_address + 1) = 0x90; - *(ff13_vibration_low_set_zero_address + 2) = 0x90; - *(ff13_vibration_low_set_zero_address + 3) = 0x90; - *(ff13_vibration_low_set_zero_address + 4) = 0x90; - - ChangeMemoryProtectionToReadWriteExecute(ff13_vibration_high_set_zero_address, 5); - *ff13_vibration_high_set_zero_address = 0x90; - *(ff13_vibration_high_set_zero_address + 1) = 0x90; - *(ff13_vibration_high_set_zero_address + 2) = 0x90; - *(ff13_vibration_high_set_zero_address + 3) = 0x90; - *(ff13_vibration_high_set_zero_address + 4) = 0x90; xinputManager = new XInputManager(ff13_base_controller_input_address_ptr); } -void MainContext::FF13_RemoveContinuousControllerScan() { +void MainContext::FF13_RemoveContinuousControllerScan() +{ if (!config.GetFFXIIIDisableIngameControllerHotSwapping()) { PrintLog("Continuous controller scanning not disabled (config)"); return; @@ -205,12 +208,12 @@ void MainContext::FF13_RemoveContinuousControllerScan() { // Disable continuous controller scanning. PrintLog("Removing game slow and synchronous controller continuous controller scanning..."); - context.ChangeMemoryProtectionToReadWriteExecute(ff13_continuous_scan_instruction_address, 1); // change a jne to jmp - *(uint8_t*)ff13_continuous_scan_instruction_address = 0xEB; + MemPatch::Fill(ff13_continuous_scan_instruction_address, 0xEB, 1); } -void MainContext::FF13_FixScissorRect() { +void MainContext::FF13_FixScissorRect() +{ PrintLog("Fixing ScissorRect..."); const float originalWidth = 1280.0F; const float resolutionFactorW = (float)*ff13_internal_res_w / originalWidth; @@ -223,81 +226,25 @@ void MainContext::FF13_FixScissorRect() { // The game scales some scissor rects, but not all of them. // It seems easier to neuter its internal scaling process and scale everything on our own... - context.ChangeMemoryProtectionToReadWriteExecute(ff13_loading_screen_scissor_scaling_factor_1, 3); - *(ff13_loading_screen_scissor_scaling_factor_1) = 0x90; // NOP - *(ff13_loading_screen_scissor_scaling_factor_1 + 1) = 0x90; // NOP - *(ff13_loading_screen_scissor_scaling_factor_1 + 2) = 0x90; // NOP - - context.ChangeMemoryProtectionToReadWriteExecute(ff13_loading_screen_scissor_scaling_factor_2, 3); - *(ff13_loading_screen_scissor_scaling_factor_2 + 0) = 0x90; // NOP - *(ff13_loading_screen_scissor_scaling_factor_2 + 1) = 0x90; // NOP - *(ff13_loading_screen_scissor_scaling_factor_2 + 2) = 0x90; // NOP - - context.ChangeMemoryProtectionToReadWriteExecute(ff13_loading_screen_scissor_scaling_factor_3, 3); - *(ff13_loading_screen_scissor_scaling_factor_3 + 0) = 0x90; // NOP - *(ff13_loading_screen_scissor_scaling_factor_3 + 1) = 0x90; // NOP - *(ff13_loading_screen_scissor_scaling_factor_3 + 2) = 0x90; // NOP - - context.ChangeMemoryProtectionToReadWriteExecute(ff13_loading_screen_scissor_scaling_factor_4, 3); - *(ff13_loading_screen_scissor_scaling_factor_4 + 0) = 0x90; // NOP - *(ff13_loading_screen_scissor_scaling_factor_4 + 1) = 0x90; // NOP - *(ff13_loading_screen_scissor_scaling_factor_4 + 2) = 0x90; // NOP - - context.ChangeMemoryProtectionToReadWriteExecute(ff13_settings_screen_scissor_scaling_factor, 5); - *(ff13_settings_screen_scissor_scaling_factor) = 0x90; // NOP - *(ff13_settings_screen_scissor_scaling_factor + 1) = 0x90; // NOP - *(ff13_settings_screen_scissor_scaling_factor + 2) = 0x90; // NOP - *(ff13_settings_screen_scissor_scaling_factor + 3) = 0x90; // NOP - *(ff13_settings_screen_scissor_scaling_factor + 4) = 0x90; // NOP - - context.ChangeMemoryProtectionToReadWriteExecute(ff13_party_screen_scissor_scaling_factor_1, 4); - *(ff13_party_screen_scissor_scaling_factor_1) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_1 + 1) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_1 + 2) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_1 + 3) = 0x90; // NOP - - context.ChangeMemoryProtectionToReadWriteExecute(ff13_party_screen_scissor_scaling_factor_2, 7); - *(ff13_party_screen_scissor_scaling_factor_2) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_2 + 1) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_2 + 2) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_2 + 3) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_2 + 4) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_2 + 5) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_2 + 6) = 0x90; // NOP - - context.ChangeMemoryProtectionToReadWriteExecute(ff13_party_screen_scissor_scaling_factor_3, 7); - *(ff13_party_screen_scissor_scaling_factor_3) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_3 + 1) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_3 + 2) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_3 + 3) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_3 + 4) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_3 + 5) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_3 + 6) = 0x90; // NOP - - context.ChangeMemoryProtectionToReadWriteExecute(ff13_party_screen_scissor_scaling_factor_4, 5); - *(ff13_party_screen_scissor_scaling_factor_4) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_4 + 1) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_4 + 2) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_4 + 3) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_4 + 4) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_4 + 5) = 0x90; // NOP - *(ff13_party_screen_scissor_scaling_factor_4 + 6) = 0x90; // NOP + MemPatch::Nop(ff13_loading_screen_scissor_scaling_factor_1, 3); + MemPatch::Nop(ff13_loading_screen_scissor_scaling_factor_2, 3); + MemPatch::Nop(ff13_loading_screen_scissor_scaling_factor_3, 3); + MemPatch::Nop(ff13_loading_screen_scissor_scaling_factor_4, 3); + MemPatch::Nop(ff13_settings_screen_scissor_scaling_factor, 5); + MemPatch::Nop(ff13_party_screen_scissor_scaling_factor_1, 4); + MemPatch::Nop(ff13_party_screen_scissor_scaling_factor_2, 7); + MemPatch::Nop(ff13_party_screen_scissor_scaling_factor_3, 7); + MemPatch::Nop(ff13_party_screen_scissor_scaling_factor_3, 5); } -void MainContext::FF13_NOPIngameFrameRateLimitSetter() { +void MainContext::FF13_NOPIngameFrameRateLimitSetter() +{ PrintLog("NOPing the in-game instruction that sets the frame rate."); - - context.ChangeMemoryProtectionToReadWriteExecute(ff13_set_framerate_ingame_instruction_address, 5); - - // patching to: NOP NOP NOP NOP - *ff13_set_framerate_ingame_instruction_address = 0x90; - *(ff13_set_framerate_ingame_instruction_address + 1) = 0x90; - *(ff13_set_framerate_ingame_instruction_address + 2) = 0x90; - *(ff13_set_framerate_ingame_instruction_address + 3) = 0x90; - *(ff13_set_framerate_ingame_instruction_address + 4) = 0x90; + MemPatch::Nop(ff13_set_framerate_ingame_instruction_address, 5); } -void MainContext::FF13_SetFrameRateVariables() { +void MainContext::FF13_SetFrameRateVariables() +{ float* framePacerTargetPtr = *ff13_frame_pacer_ptr; if (framePacerTargetPtr) { PrintLog("Frame pacer target frame rate is at address %x", framePacerTargetPtr); @@ -306,20 +253,18 @@ void MainContext::FF13_SetFrameRateVariables() { *ingameFrameRateFramePacerTarget = MAX_FRAME_RATE_LIMIT; PrintLog("Frame pacer disabled."); - const float frameRateConfig = (float)context.config.GetFFXIIIIngameFrameRateLimit(); - const bool unlimitedFrameRate = AreAlmostTheSame(frameRateConfig, -1.0f); - const bool shouldSetFrameRateLimit = !AreAlmostTheSame(frameRateConfig, 0.0f); + if (config.GetFFXIIIIngameFrameRateLimit() != 0) + { + const s32 frameRateConfig = config.GetFFXIIIIngameFrameRateLimit(); + float frameRateLimit = 0; - float frameRateLimit = 0; + if (frameRateConfig == -1) { + frameRateLimit = MAX_FRAME_RATE_LIMIT; + } + else if (frameRateConfig > 0) { + frameRateLimit = (float)std::min(frameRateConfig, (s32)MAX_FRAME_RATE_LIMIT); + } - if (unlimitedFrameRate) { - frameRateLimit = MAX_FRAME_RATE_LIMIT; - } - else { - frameRateLimit = frameRateConfig; - } - - if (shouldSetFrameRateLimit) { float* ingameFrameRateLimitPtr = framePacerTargetPtr + 1; *ingameFrameRateLimitPtr = frameRateLimit; PrintLog("Target frame rate set to %f", frameRateLimit); @@ -330,40 +275,22 @@ void MainContext::FF13_SetFrameRateVariables() { } } -void MainContext::FF13_2_AsyncPatching() { - std::this_thread::sleep_for(std::chrono::milliseconds(2000)); - context.FF13_2_OneTimeFixes(); -} - -void MainContext::FF13_2_OneTimeFixes() { - +void MainContext::FF13_2_OneTimeFixes() +{ if (*ff13_2_frame_pacer_ptr_address) { **ff13_2_frame_pacer_ptr_address = MAX_FRAME_RATE_LIMIT; PrintLog("Frame pacer disabled"); - context.FF13_2_Workaround_2560_1440_Res_Bug(); - context.FF13_2_AddHookIngameFrameRateLimitSetter(); - context.FF13_2_RemoveContinuousControllerScan(); - context.FF13_2_EnableControllerVibration(); + FF13_2_AddHookIngameFrameRateLimitSetter(); + FF13_2_RemoveContinuousControllerScan(); + FF13_2_EnableControllerVibration(); PrintLog("Finished FF13-2 One Time Fixes"); - context.didOneTimeFixes = true; } else { PrintLog("Unable to apply FF13-2 One Time Fixes. Report this!"); } } -void MainContext::FF13_2_Workaround_2560_1440_Res_Bug() -{ - if (*ff13_2_internal_res_w == 2560 && *ff13_2_internal_res_h == 1440) { - // We need to reduce one or another. Increasing the internal res causes crashes. - // Decreasing the internal res width by one pixel causes the last pixel column displayed on the screen to stay black. - PrintLog("Applying workaround for resolution 2560x1440 bug."); - *ff13_2_internal_res_w = 2559; - } -} - - void MainContext::FF13_2_EnableControllerVibration() { if (!config.GetFFXIIIEnableControllerVibration()) { @@ -371,20 +298,9 @@ void MainContext::FF13_2_EnableControllerVibration() return; } PrintLog("Enabling controller vibration..."); - ChangeMemoryProtectionToReadWriteExecute(ff13_2_vibration_low_set_zero_address, 5); - *ff13_2_vibration_low_set_zero_address = 0x90; - *(ff13_2_vibration_low_set_zero_address + 1) = 0x90; - *(ff13_2_vibration_low_set_zero_address + 2) = 0x90; - *(ff13_2_vibration_low_set_zero_address + 3) = 0x90; - *(ff13_2_vibration_low_set_zero_address + 4) = 0x90; - - ChangeMemoryProtectionToReadWriteExecute(ff13_2_vibration_high_set_zero_address, 5); - *ff13_2_vibration_high_set_zero_address = 0x90; - *(ff13_2_vibration_high_set_zero_address + 1) = 0x90; - *(ff13_2_vibration_high_set_zero_address + 2) = 0x90; - *(ff13_2_vibration_high_set_zero_address + 3) = 0x90; - *(ff13_2_vibration_high_set_zero_address + 4) = 0x90; + MemPatch::Nop(ff13_2_vibration_low_set_zero_address, 5); + MemPatch::Nop(ff13_2_vibration_high_set_zero_address, 5); xinputManager = new XInputManager(ff13_2_base_controller_input_address_ptr); } @@ -405,7 +321,8 @@ void MainContext::FF13_2_InitializeGameAddresses() ff13_2_internal_res_h = ff13_2_internal_res_w + 1; } -void MainContext::FF13_2_RemoveContinuousControllerScan() { +void MainContext::FF13_2_RemoveContinuousControllerScan() +{ if (!config.GetFFXIIIDisableIngameControllerHotSwapping()) { PrintLog("Continuous controller scanning not disabled (config)"); return; @@ -413,20 +330,20 @@ void MainContext::FF13_2_RemoveContinuousControllerScan() { // Disable continuous controller scanning. PrintLog("Removing game slow and synchronous controller continuous controller scanning..."); - context.ChangeMemoryProtectionToReadWriteExecute(ff13_2_continuous_scan_instruction_address, 1); // change a jne to jmp - *(uint8_t*)ff13_2_continuous_scan_instruction_address = 0xEB; + MemPatch::Fill(ff13_2_continuous_scan_instruction_address, 0xEB, 1); } -void MainContext::FF13_2_AddHookIngameFrameRateLimitSetter() { - if (context.AreAlmostTheSame((float)context.config.GetFFXIIIIngameFrameRateLimit(), 0.0F)) { +void MainContext::FF13_2_AddHookIngameFrameRateLimitSetter() +{ + if (config.GetFFXIIIIngameFrameRateLimit() == 0) { PrintLog("Frame rate should not be changed (config = 0)"); return; } PrintLog("Hooking the instruction that sets the frame rate..."); - context.ChangeMemoryProtectionToReadWriteExecute(ff13_2_set_frame_rate_address, 5); + MemPatch::CUnprotect unp(ff13_2_set_frame_rate_address, 5); // patching to: jmp FF13_2_SET_FRAME_RATE_INJECTED_CODE *ff13_2_set_frame_rate_address = 0xE9; @@ -436,16 +353,26 @@ void MainContext::FF13_2_AddHookIngameFrameRateLimitSetter() { void MainContext::FF13_2_CreateSetFrameRateCodeBlock() { const int blockSize = 31; - FF13_2_SET_FRAME_RATE_INJECTED_CODE = new uint8_t[blockSize]; - - ChangeMemoryProtectionToReadWriteExecute(FF13_2_SET_FRAME_RATE_INJECTED_CODE, blockSize); - - float frameRateConfigValue = (float)context.config.GetFFXIIIIngameFrameRateLimit(); - if (AreAlmostTheSame(frameRateConfigValue, -1.0F) || frameRateConfigValue > FF13_2_MAX_FRAME_CAP) { - ff13_2_targetFrameRate = FF13_2_MAX_FRAME_CAP; + FF13_2_SET_FRAME_RATE_INJECTED_CODE = new(std::nothrow) uint8_t[blockSize]; + if (!FF13_2_SET_FRAME_RATE_INJECTED_CODE) { + PrintLog("Failed to initialize FFXIII-2 code block"); + return; } - else { - ff13_2_targetFrameRate = frameRateConfigValue; + DWORD oldProtect; + VirtualProtect(FF13_2_SET_FRAME_RATE_INJECTED_CODE, blockSize, PAGE_EXECUTE_READWRITE, &oldProtect); + + if (config.GetFFXIIIIngameFrameRateLimit() != 0) + { + const s32 frameRateConfig = config.GetFFXIIIIngameFrameRateLimit(); + + if (frameRateConfig == -1) { + ff13_2_targetFrameRate = FF13_2_MAX_FRAME_CAP; + } + else if (frameRateConfig > 0) { + ff13_2_targetFrameRate = (float)std::min(frameRateConfig, (s32)FF13_2_MAX_FRAME_CAP); + } + + PrintLog("Target frame rate set to %f", ff13_2_targetFrameRate); } // movss xmm1,[&FF13_2_30_FPS] @@ -484,12 +411,6 @@ void MainContext::FF13_2_CreateSetFrameRateCodeBlock() *(uint32_t*)(FF13_2_SET_FRAME_RATE_INJECTED_CODE + 27) = ff13_2_set_frame_rate_address - FF13_2_SET_FRAME_RATE_INJECTED_CODE - 26; } - -void MainContext::ChangeMemoryProtectionToReadWriteExecute(void* address, const int size) { - DWORD oldProtection; - VirtualProtect(address, size, PAGE_EXECUTE_READWRITE, &oldProtection); -} - void MainContext::PrintVersionInfo() { PrintLog("FF13Fix 1.4.6 https://github.com/rebtd7/FF13Fix"); } diff --git a/d3d9ex/Context.cpp b/d3d9ex/Context.cpp index f541fd8..4333c6a 100644 --- a/d3d9ex/Context.cpp +++ b/d3d9ex/Context.cpp @@ -44,7 +44,7 @@ MainContext::MainContext() : oldWndProc(nullptr) LogFile("FF13Fix.log"); context.PrintVersionInfo(); - if (config.GetAutoFix()) EnableAutoFix(); + if (config.GetOptionsAutoFix()) EnableAutoFix(); PrintLog("Enabling hooks:"); const MH_STATUS initializeHooks = MH_Initialize(); @@ -74,8 +74,6 @@ MainContext::MainContext() : oldWndProc(nullptr) PrintLog("createHookSetWindowLongW = %d", createHookSetWindowLongW); const MH_STATUS enableHookSetWindowLongW = MH_EnableHook(SetWindowLongW); PrintLog("enableHookSetWindowLongW = %d", enableHookSetWindowLongW); - - } MainContext::~MainContext() @@ -125,47 +123,48 @@ bool MainContext::ApplyPresentationParameters(D3DPRESENT_PARAMETERS* pPresentati { if (pPresentationParameters) { - if (config.GetTripleBuffering()) + // -1 = Auto, enabled when no DXVK is used + if (config.GetOptionsTripleBuffering() == 1 || (config.GetOptionsTripleBuffering() == -1 && !D3D9DLL::Get().IsDXVK())) { pPresentationParameters->BackBufferCount = 3; PrintLog("BackBufferCount: BackBufferCount set to %u", pPresentationParameters->BackBufferCount); } - if ((s32)config.GetFullScreenRefreshRate() >= 0 && pPresentationParameters->FullScreen_RefreshRateInHz != 0) + if ((s32)config.GetOptionsFullScreenRefreshRate() >= 0 && pPresentationParameters->FullScreen_RefreshRateInHz != 0) { - PrintLog("Changing refresh rate from %u to %u", pPresentationParameters->FullScreen_RefreshRateInHz, config.GetFullScreenRefreshRate()); - pPresentationParameters->FullScreen_RefreshRateInHz = config.GetFullScreenRefreshRate(); + PrintLog("Changing refresh rate from %u to %u", pPresentationParameters->FullScreen_RefreshRateInHz, config.GetOptionsFullScreenRefreshRate()); + pPresentationParameters->FullScreen_RefreshRateInHz = config.GetOptionsFullScreenRefreshRate(); } - if (config.GetMultisample() > 0) + if (config.GetOptionsMultisample() > 0) { pPresentationParameters->SwapEffect = D3DSWAPEFFECT_DISCARD; - pPresentationParameters->MultiSampleType = (D3DMULTISAMPLE_TYPE)config.GetMultisample(); + pPresentationParameters->MultiSampleType = (D3DMULTISAMPLE_TYPE)config.GetOptionsMultisample(); pPresentationParameters->MultiSampleQuality = 0; PrintLog("MultiSampleType %u, MultiSampleQuality %u", pPresentationParameters->MultiSampleType, pPresentationParameters->MultiSampleQuality); } - if (config.GetPresentationInterval() != -1) + if (config.GetOptionsPresentationInterval() != -1) { - pPresentationParameters->PresentationInterval = config.GetPresentationInterval(); + pPresentationParameters->PresentationInterval = config.GetOptionsPresentationInterval(); PrintLog("PresentationInterval: PresentationInterval set to %u", pPresentationParameters->PresentationInterval); } - if ((s32)config.GetSwapEffect() != -1) + if (config.GetOptionsSwapEffect() != -1) { - pPresentationParameters->SwapEffect = (D3DSWAPEFFECT)config.GetSwapEffect(); + pPresentationParameters->SwapEffect = (D3DSWAPEFFECT)config.GetOptionsSwapEffect(); PrintLog("SwapEffect: SwapEffect set to %u", pPresentationParameters->SwapEffect); } - if (config.GetBorderless()) + if (config.GetBorderlessBorderless()) { int cx = GetSystemMetrics(SM_CXSCREEN); int cy = GetSystemMetrics(SM_CYSCREEN); SetWindowPos(pPresentationParameters->hDeviceWindow, HWND_TOP, 0, 0, cx, cy, SWP_SHOWWINDOW | SWP_NOCOPYBITS | SWP_NOSENDCHANGING); - if (config.GetForceWindowedMode()) + if (config.GetBorderlessForceWindowedMode()) { pPresentationParameters->SwapEffect = pPresentationParameters->MultiSampleType == D3DMULTISAMPLE_NONE ? D3DSWAPEFFECT_DISCARD : D3DSWAPEFFECT_FLIP; pPresentationParameters->Windowed = TRUE; @@ -174,7 +173,7 @@ bool MainContext::ApplyPresentationParameters(D3DPRESENT_PARAMETERS* pPresentati } } - if (config.GetHideCursor()) while (::ShowCursor(FALSE) >= 0); // ShowCursor < 0 -> hidden + if (config.GetOptionsHideCursor()) while (::ShowCursor(FALSE) >= 0); // ShowCursor < 0 -> hidden return true; } @@ -191,32 +190,18 @@ bool MainContext::CheckWindow(HWND hWnd) PrintLog("HWND 0x%p: ClassName \"%ls\", WindowName: \"%ls\"", hWnd, className.get(), windowName.get()); - if (!context.didOneTimeFixes) { - if (context.autofix == FINAL_FANTASY_XIII && wcscmp(className.get(), L"SQEX.CDev.Engine.Framework.MainWindow") == 0) { - const std::lock_guard lock(context.oneTimeFixesMutex); - if(!context.didOneTimeFixes && patchingThread == NULL){ - PrintLog("Starting FFXIII one time RAM patches."); - patchingThread = new std::thread(&context.FF13_AsyncPatching); - } - } - else if (context.autofix == FINAL_FANTASY_XIII2 && wcscmp(className.get(), L"SQEX.CDev.Engine.Framework.MainWindow") == 0) { - const std::lock_guard lock(context.oneTimeFixesMutex); - if (!context.didOneTimeFixes && patchingThread == NULL) { - PrintLog("Starting FFXIII-2 one time RAM patches."); - patchingThread = new std::thread(&context.FF13_2_AsyncPatching); - } - } - } - bool class_found = config.GetWindowClass().compare(className.get()) == 0; - bool window_found = config.GetWindowName().compare(windowName.get()) == 0; - bool force = config.GetAllWindows(); + OneTimeFix(className); + + bool class_found = config.GetBorderlessWindowClass().compare(className.get()) == 0; + bool window_found = config.GetBorderlessWindowName().compare(windowName.get()) == 0; + bool force = config.GetBorderlessAllWindows(); return class_found || window_found || force; } void MainContext::ApplyWndProc(HWND hWnd) { - if (config.GetAlwaysActive() || config.GetHideCursor()) + if (config.GetOptionsAlwaysActive() || config.GetOptionsHideCursor()) { context.oldWndProc = (WNDPROC)context.TrueSetWindowLongA(hWnd, GWLP_WNDPROC, (LONG_PTR)context.WindowProc); } @@ -224,7 +209,7 @@ void MainContext::ApplyWndProc(HWND hWnd) void MainContext::ApplyBorderless(HWND hWnd) { - if (config.GetBorderless()) + if (config.GetBorderlessBorderless()) { LONG_PTR dwStyle = GetWindowLongPtr(hWnd, GWL_STYLE); LONG_PTR dwExStyle = GetWindowLongPtr(hWnd, GWL_EXSTYLE); @@ -243,7 +228,6 @@ void MainContext::ApplyBorderless(HWND hWnd) PrintLog("HWND 0x%p: Borderless dwStyle: %lX->%lX", hWnd, dwStyle, new_dwStyle); PrintLog("HWND 0x%p: Borderless dwExStyle: %lX->%lX", hWnd, dwExStyle, new_dwExStyle); - MessageBeep(MB_ICONASTERISK); } } @@ -261,21 +245,21 @@ LRESULT CALLBACK MainContext::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LP break; case WA_INACTIVE: - if (context.config.GetAlwaysActive()) + if (context.config.GetOptionsAlwaysActive()) return TRUE; - if (!context.config.GetForceHideCursor()) + if (!context.config.GetOptionsForceHideCursor()) while (::ShowCursor(TRUE) < 0); break; } case WM_ACTIVATEAPP: - if (context.config.GetAlwaysActive()) + if (context.config.GetOptionsAlwaysActive()) return TRUE; } - if (context.config.GetForceHideCursor()) + if (context.config.GetOptionsForceHideCursor()) while (::ShowCursor(FALSE) >= 0); return CallWindowProc(context.oldWndProc, hWnd, uMsg, wParam, lParam); @@ -283,7 +267,7 @@ LRESULT CALLBACK MainContext::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LP LONG WINAPI MainContext::HookSetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong) { - if (context.config.GetBorderless()) + if (context.config.GetBorderlessBorderless()) { DWORD olddwNewLong = dwNewLong; if (nIndex == GWL_STYLE) @@ -303,7 +287,7 @@ LONG WINAPI MainContext::HookSetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLon LONG WINAPI MainContext::HookSetWindowLongW(HWND hWnd, int nIndex, LONG dwNewLong) { - if (context.config.GetBorderless()) + if (context.config.GetBorderlessBorderless()) { DWORD olddwNewLong = dwNewLong; if (nIndex == GWL_STYLE) diff --git a/d3d9ex/Context.h b/d3d9ex/Context.h index bf8dff8..60a88ee 100644 --- a/d3d9ex/Context.h +++ b/d3d9ex/Context.h @@ -1,151 +1,148 @@ -#pragma once - -#include -#include "d3d9.h" -#include -#include "SimpleIni.h" -#include "XInputManager.h" - -struct hkIDirect3D9; - -static const char* inifilename = "FF13Fix.ini"; -#define CONFIG_VERSION 4 - -class Config -{ -public: - Config(const Config&) = delete; - const Config& operator=(Config& other) = delete; - - Config(); - -#define SETTING(_type, _func, _var, _section, _defaultval) \ - private: _type _var; \ - public: const _type& Get##_var() const { return _var; }; -#include "Settings.h" -#undef SETTING -}; - -#define DECLARE_HOOK(type, callconv, name, ...) \ - public: type(callconv* True##name)(__VA_ARGS__) = name; \ - private: static type callconv Hook##name(__VA_ARGS__); - -class MainContext -{ - MainContext(const MainContext&) = delete; - const MainContext& operator=(MainContext& other) = delete; - - DECLARE_HOOK(IDirect3D9*, WINAPI, Direct3DCreate9, UINT SDKVersion); - DECLARE_HOOK(LONG, WINAPI, SetWindowLongA, HWND hWnd, int nIndex, LONG dwNewLong); - DECLARE_HOOK(LONG, WINAPI, SetWindowLongW, HWND hWnd, int nIndex, LONG dwNewLong); - DECLARE_HOOK(HWND, WINAPI, CreateWindowExA, DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, - DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); - DECLARE_HOOK(HWND, WINAPI, CreateWindowExW, DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, - DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); - -public: +#pragma once + +#include +#include "d3d9.h" +#include +#include "SimpleIni.h" +#include "XInputManager.h" +#include "MemPatch.h" + +struct hkIDirect3D9; + +static const char* inifilename = "FF13Fix.ini"; +#define CONFIG_VERSION 5 + +class Config +{ +public: + Config(const Config&) = delete; + const Config& operator=(Config& other) = delete; + + Config(); + +#define SETTING(_type, _func, _var, _section, _defaultval) \ + private: _type _var; \ + public: const _type& Get##_section##_var() const { return _var; }; +#include "Settings.h" +#undef SETTING +}; + +#define DECLARE_HOOK(type, callconv, name, ...) \ + public: type(callconv* True##name)(__VA_ARGS__) = name; \ + private: static type callconv Hook##name(__VA_ARGS__); + +class MainContext +{ + MainContext(const MainContext&) = delete; + const MainContext& operator=(MainContext& other) = delete; + + DECLARE_HOOK(IDirect3D9*, WINAPI, Direct3DCreate9, UINT SDKVersion); + DECLARE_HOOK(LONG, WINAPI, SetWindowLongA, HWND hWnd, int nIndex, LONG dwNewLong); + DECLARE_HOOK(LONG, WINAPI, SetWindowLongW, HWND hWnd, int nIndex, LONG dwNewLong); + DECLARE_HOOK(HWND, WINAPI, CreateWindowExA, DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, + DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); + DECLARE_HOOK(HWND, WINAPI, CreateWindowExW, DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, + DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); + +public: MainContext(); - ~MainContext(); - - bool ApplyPresentationParameters(D3DPRESENT_PARAMETERS* pPresentationParameters); + ~MainContext(); + + bool ApplyPresentationParameters(D3DPRESENT_PARAMETERS* pPresentationParameters); bool ApplyBehaviorFlagsFix(DWORD* flags); - void ScaleScissorRect(RECT * rect); - HRESULT APIENTRY ApplyVertexBufferFix(IDirect3DDevice9* pIDirect3DDevice9, UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle); - bool BehaviorFlagsToString(DWORD BehaviorFlags, std::string* BehaviorFlagsString); - - bool CheckWindow(HWND hWnd); - - void ApplyWndProc(HWND hWnd); - void ApplyBorderless(HWND hWnd); - - Config config; - -private: - enum AutoFixes : u32 - { - NONE = 0, - RESIDENT_EVIL_4, - KINGS_BOUNTY_LEGEND, - FINAL_FANTASY_XIII, - FINAL_FANTASY_XIII2, - }; - - void EnableAutoFix(); - - AutoFixes autofix = AutoFixes::NONE; - - std::mutex oneTimeFixesMutex; - bool didOneTimeFixes = false; - - const float MAX_FRAME_RATE_LIMIT = 250000.0F; - float** ff13_frame_pacer_ptr = NULL; - uint8_t* ff13_set_framerate_ingame_instruction_address = NULL; - uint8_t* ff13_continuous_scan_instruction_address = NULL; - uint8_t* ff13_enemy_scan_box_code_address = NULL; - uint8_t** ff13_base_controller_input_address_ptr = NULL; - uint8_t* ff13_vibration_high_set_zero_address = NULL; - uint8_t* ff13_vibration_low_set_zero_address = NULL; - uint8_t* ff13_loading_screen_scissor_scaling_factor_1 = NULL; - uint8_t* ff13_loading_screen_scissor_scaling_factor_2 = NULL; - uint8_t* ff13_loading_screen_scissor_scaling_factor_3 = NULL; - uint8_t* ff13_loading_screen_scissor_scaling_factor_4 = NULL; - uint8_t* ff13_settings_screen_scissor_scaling_factor = NULL; - uint8_t* ff13_party_screen_scissor_scaling_factor_1 = NULL; - uint8_t* ff13_party_screen_scissor_scaling_factor_2 = NULL; - uint8_t* ff13_party_screen_scissor_scaling_factor_3 = NULL; - uint8_t* ff13_party_screen_scissor_scaling_factor_4 = NULL; - uint32_t* ff13_internal_res_w; - uint32_t* ff13_internal_res_h; - - uint8_t* FF13_2_SET_FRAME_RATE_INJECTED_CODE = NULL; - uint8_t* ff13_2_continuous_scan_instruction_address; + HRESULT SetScissorRect(IDirect3DDevice9* pIDirect3DDevice9, CONST RECT* rect); + HRESULT CreateVertexBuffer(IDirect3DDevice9* pIDirect3DDevice9, UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle); + HRESULT SetViewport(IDirect3DDevice9* pIDirect3DDevice9, CONST D3DVIEWPORT9* pViewport); + bool BehaviorFlagsToString(DWORD BehaviorFlags, std::string* BehaviorFlagsString); + + bool CheckWindow(HWND hWnd); + + void ApplyWndProc(HWND hWnd); + void ApplyBorderless(HWND hWnd); + + Config config; + +private: + enum class AutoFixes : u32 + { + NONE = 0, + RESIDENT_EVIL_4, + KINGS_BOUNTY_LEGEND, + FINAL_FANTASY_XIII, + FINAL_FANTASY_XIII2, + }; + + void EnableAutoFix(); + + AutoFixes autofix = AutoFixes::NONE; + + std::mutex fix_mutex; + + const float MAX_FRAME_RATE_LIMIT = 250000.0F; + float** ff13_frame_pacer_ptr = NULL; + uint8_t* ff13_set_framerate_ingame_instruction_address = NULL; + uint8_t* ff13_continuous_scan_instruction_address = NULL; + uint8_t* ff13_enemy_scan_box_code_address = NULL; + uint8_t** ff13_base_controller_input_address_ptr = NULL; + uint8_t* ff13_vibration_high_set_zero_address = NULL; + uint8_t* ff13_vibration_low_set_zero_address = NULL; + uint8_t* ff13_loading_screen_scissor_scaling_factor_1 = NULL; + uint8_t* ff13_loading_screen_scissor_scaling_factor_2 = NULL; + uint8_t* ff13_loading_screen_scissor_scaling_factor_3 = NULL; + uint8_t* ff13_loading_screen_scissor_scaling_factor_4 = NULL; + uint8_t* ff13_settings_screen_scissor_scaling_factor = NULL; + uint8_t* ff13_party_screen_scissor_scaling_factor_1 = NULL; + uint8_t* ff13_party_screen_scissor_scaling_factor_2 = NULL; + uint8_t* ff13_party_screen_scissor_scaling_factor_3 = NULL; + uint8_t* ff13_party_screen_scissor_scaling_factor_4 = NULL; + uint32_t* ff13_internal_res_w; + uint32_t* ff13_internal_res_h; + + uint8_t* FF13_2_SET_FRAME_RATE_INJECTED_CODE = NULL; + uint8_t* ff13_2_continuous_scan_instruction_address; uint8_t* ff13_2_set_frame_rate_address; float** ff13_2_frame_pacer_ptr_address; float ff13_2_targetFrameRate; uint8_t** ff13_2_base_controller_input_address_ptr = NULL; - uint8_t* ff13_2_vibration_high_set_zero_address = NULL; + uint8_t* ff13_2_vibration_high_set_zero_address = NULL; uint8_t* ff13_2_vibration_low_set_zero_address = NULL; - uint32_t* ff13_2_internal_res_w; + uint32_t* ff13_2_internal_res_w; uint32_t* ff13_2_internal_res_h; - - const float FF13_2_30_FPS = 30.0F; - const float FF13_2_MAX_FRAME_CAP = 1000.0F; - - float scissor_scaling_factor_w = 1.0f; - float scissor_scaling_factor_h = 1.0f; - - XInputManager* xinputManager; - std::thread * patchingThread = NULL; - - void FixBehaviorFlagConflict(const DWORD flags_in, DWORD* flags_out); - static const std::map behaviorflags_fixes; - - static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - WNDPROC oldWndProc; - - void ChangeMemoryProtectionToReadWriteExecute(void* address, const int size); + + const float FF13_2_30_FPS = 30.0F; + const float FF13_2_MAX_FRAME_CAP = 1000.0F; + + float scissor_scaling_factor_w = 1.0f; + float scissor_scaling_factor_h = 1.0f; + + XInputManager* xinputManager; + + void FixBehaviorFlagConflict(const DWORD flags_in, DWORD* flags_out); + static const std::map behaviorflags_fixes; + + static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + WNDPROC oldWndProc; + bool AreAlmostTheSame(float a, float b); - void PrintVersionInfo(); - - - static void FF13_AsyncPatching(); - void FF13_InitializeGameAddresses(); - void FF13_OneTimeFixes(); - void FF13_Workaround_1440_Res_Bug(); - void FF13_EnableControllerVibration(); + void PrintVersionInfo(); + + void FF13_InitializeGameAddresses(); + void FF13_OneTimeFixes(); + void FF13_EnableControllerVibration(); void FF13_NOPIngameFrameRateLimitSetter(); - void FF13_SetFrameRateVariables(); - void FF13_FixScissorRect(); + void FF13_SetFrameRateVariables(); + void FF13_FixScissorRect(); void FF13_RemoveContinuousControllerScan(); - static void FF13_2_AsyncPatching(); void FF13_2_CreateSetFrameRateCodeBlock(); void FF13_2_InitializeGameAddresses(); void FF13_2_RemoveContinuousControllerScan(); - void FF13_2_AddHookIngameFrameRateLimitSetter(); + void FF13_2_AddHookIngameFrameRateLimitSetter(); void FF13_2_OneTimeFixes(); - void FF13_2_Workaround_2560_1440_Res_Bug(); - void FF13_2_EnableControllerVibration(); -}; - -extern MainContext context; \ No newline at end of file + void FF13_2_EnableControllerVibration(); + + void OneTimeFix(std::unique_ptr& className); + static void Fix_Thread(); +}; + +extern MainContext context; diff --git a/d3d9ex/IDirect3D9.cpp b/d3d9ex/IDirect3D9.cpp index 75e90ab..04a7f49 100644 --- a/d3d9ex/IDirect3D9.cpp +++ b/d3d9ex/IDirect3D9.cpp @@ -53,10 +53,10 @@ UINT APIENTRY hkIDirect3D9::GetAdapterCount() { HRESULT APIENTRY hkIDirect3D9::GetAdapterIdentifier(UINT Adapter, DWORD Flags, D3DADAPTER_IDENTIFIER9* pIdentifier) { PrintLog(__FUNCTION__); HRESULT rt = m_pWrapped->GetAdapterIdentifier(Adapter, Flags, pIdentifier); - if (context.config.GetAdapter() && SUCCEEDED(rt) && pIdentifier) + if (context.config.GetAdapterAdapter() && SUCCEEDED(rt) && pIdentifier) { - pIdentifier->VendorId = context.config.GetVendorId(); - pIdentifier->DeviceId = context.config.GetDeviceId(); + pIdentifier->VendorId = context.config.GetAdapterVendorId(); + pIdentifier->DeviceId = context.config.GetAdapterDeviceId(); } return rt; @@ -79,7 +79,7 @@ HRESULT APIENTRY hkIDirect3D9::GetAdapterDisplayMode(UINT Adapter, D3DDISPLAYMOD HRESULT APIENTRY hkIDirect3D9::CheckDeviceType(UINT Adapter, D3DDEVTYPE DevType, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, BOOL bWindowed) { IDirect3D9_PrintLog(__FUNCTION__); - if (context.config.GetForceWindowedMode()) bWindowed = TRUE; + if (context.config.GetBorderlessForceWindowedMode()) bWindowed = TRUE; return m_pWrapped->CheckDeviceType(Adapter, DevType, AdapterFormat, BackBufferFormat, bWindowed); } @@ -122,9 +122,9 @@ HRESULT APIENTRY hkIDirect3D9::CreateDevice(UINT Adapter, D3DDEVTYPE DeviceType, PrintLog("BehaviorFlags: %08X %s", BehaviorFlags, BehaviorFlagsString.c_str()); - if (context.config.GetBehaviorFlags() > 0) + if (context.config.GetOptionsBehaviorFlags() > 0) { - BehaviorFlags = context.config.GetBehaviorFlags(); + BehaviorFlags = context.config.GetOptionsBehaviorFlags(); PrintLog("Advanced Mode: BehaviorFlags set"); } else diff --git a/d3d9ex/IDirect3DDevice9.cpp b/d3d9ex/IDirect3DDevice9.cpp index 1afe03e..b863809 100644 --- a/d3d9ex/IDirect3DDevice9.cpp +++ b/d3d9ex/IDirect3DDevice9.cpp @@ -9,7 +9,7 @@ #include -#define IDirect3DDevice9_PrintLog(...) //PrintLog(format, __VA_ARGS__); +#define IDirect3DDevice9_PrintLog(...) //PrintLog("%s", __VA_ARGS__); HRESULT APIENTRY hkIDirect3DDevice9::QueryInterface(REFIID riid, void** ppvObj) { IDirect3DDevice9_PrintLog(__FUNCTION__); @@ -102,22 +102,10 @@ HRESULT APIENTRY hkIDirect3DDevice9::GetSwapChain(UINT iSwapChain, IDirect3DSwap // Steam Overlay Fix // Add some space, 16bytes should be enough - __nop(); - __nop(); - __nop(); - __nop(); - __nop(); - __nop(); - __nop(); - __nop(); - __nop(); - __nop(); - __nop(); - __nop(); - __nop(); - __nop(); - __nop(); - __nop(); + __nop(); __nop(); __nop(); __nop(); + __nop(); __nop(); __nop(); __nop(); + __nop(); __nop(); __nop(); __nop(); + __nop(); __nop(); __nop(); __nop(); return m_pWrapped->GetSwapChain(iSwapChain, pSwapChain); } @@ -181,7 +169,7 @@ HRESULT APIENTRY hkIDirect3DDevice9::CreateCubeTexture(UINT EdgeLength, UINT Lev HRESULT APIENTRY hkIDirect3DDevice9::CreateVertexBuffer(UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle) { //PrintLog("hkIDirect3DDevice9::CreateVertexBuffer %08u %x %x %x %p %p", Length, Usage, FVF, Pool, ppVertexBuffer, pSharedHandle); - return context.ApplyVertexBufferFix(m_pWrapped, Length, Usage, FVF, Pool, ppVertexBuffer, pSharedHandle); + return context.CreateVertexBuffer(m_pWrapped, Length, Usage, FVF, Pool, ppVertexBuffer, pSharedHandle); } HRESULT APIENTRY hkIDirect3DDevice9::CreateIndexBuffer(UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer9** ppIndexBuffer, HANDLE* pSharedHandle) { @@ -286,7 +274,7 @@ HRESULT APIENTRY hkIDirect3DDevice9::MultiplyTransform(D3DTRANSFORMSTATETYPE Sta HRESULT APIENTRY hkIDirect3DDevice9::SetViewport(CONST D3DVIEWPORT9* pViewport) { IDirect3DDevice9_PrintLog(__FUNCTION__); - return m_pWrapped->SetViewport(pViewport); + return context.SetViewport(m_pWrapped, pViewport); } HRESULT APIENTRY hkIDirect3DDevice9::GetViewport(D3DVIEWPORT9* pViewport) { @@ -426,8 +414,7 @@ HRESULT APIENTRY hkIDirect3DDevice9::GetCurrentTexturePalette(UINT *PaletteNumbe HRESULT APIENTRY hkIDirect3DDevice9::SetScissorRect(CONST RECT* pRect) { IDirect3DDevice9_PrintLog(__FUNCTION__); - context.ScaleScissorRect((RECT*)pRect); - return m_pWrapped->SetScissorRect(pRect); + return context.SetScissorRect(m_pWrapped, pRect); } HRESULT APIENTRY hkIDirect3DDevice9::GetScissorRect(RECT* pRect) { diff --git a/d3d9ex/Settings.h b/d3d9ex/Settings.h index 3fa03b7..0bc1451 100644 --- a/d3d9ex/Settings.h +++ b/d3d9ex/Settings.h @@ -1,19 +1,18 @@ -SETTING(u32, LongValue, PresentationInterval, Options, 1); -SETTING(bool, BoolValue, TripleBuffering, Options, true); -SETTING(u32, LongValue, FullScreenRefreshRate, Options, 0); -SETTING(u32, LongValue, SwapEffect, Options, -1); +SETTING(s32, LongValue, PresentationInterval, Options, 1); +SETTING(s32, LongValue, TripleBuffering, Options, -1); +SETTING(s32, LongValue, FullScreenRefreshRate, Options, 0); +SETTING(s32, LongValue, SwapEffect, Options, -1); SETTING(bool, BoolValue, AlwaysActive, Options, false); SETTING(bool, BoolValue, AutoFix, Options, true); -SETTING(u32, LongValue, Multisample, Options, 0); +SETTING(s32, LongValue, Multisample, Options, 0); SETTING(bool, BoolValue, HideCursor, Options, false); SETTING(bool, BoolValue, ForceHideCursor, Options, false); SETTING(u32, LongValue, BehaviorFlags, Options, 0); -SETTING(double, DoubleValue, FFXIIIIngameFrameRateLimit, Options, 0.0); -SETTING(bool, BoolValue, FFXIIIDisableIngameControllerHotSwapping, Options, true); -SETTING(bool, BoolValue, FFXIIIEnableControllerVibration, Options, true); - +SETTING(s32, LongValue, IngameFrameRateLimit, FFXIII, 0); +SETTING(bool, BoolValue, DisableIngameControllerHotSwapping, FFXIII, true); +SETTING(bool, BoolValue, EnableControllerVibration, FFXIII, true); SETTING(bool, BoolValue, Adapter, Adapter, false); SETTING(u32, LongValue, VendorId, Adapter, 0); diff --git a/d3d9ex/Wrapper.h b/d3d9ex/Wrapper.h index 56c1f6d..55cddf3 100644 --- a/d3d9ex/Wrapper.h +++ b/d3d9ex/Wrapper.h @@ -3,7 +3,6 @@ #include "comdef.h" #include "d3d9.h" -#include "dinput.h" #include "xinput.h" template @@ -31,13 +30,16 @@ public: } protected: - void WrapperLoad(const char* module_name) + bool WrapperLoad(const char* module_name, bool use_system_dir = true, bool fail_is_critical = true) { - module_path = CreateSystemModulePath(module_name); + use_system_dir ? module_path = CreateSystemModulePath(module_name) : module_path = module_name; m_module = LoadLibraryA(module_path.c_str()); - if (!m_module) - { + if (m_module) { + PrintLog("Loaded %s", module_path.c_str()); + return true; + } + else if(fail_is_critical) { HRESULT hr = HRESULT_FROM_WIN32(GetLastError()); _com_error err(hr); @@ -47,8 +49,7 @@ protected: MessageBoxA(NULL, msg.c_str(), "Error", MB_ICONERROR); ExitProcess(hr); } - - PrintLog("Loaded %s", module_path.c_str()); + return false; } template @@ -77,9 +78,11 @@ public: void (WINAPI* D3DPERF_SetOptions)(DWORD dwOptions); void (WINAPI* D3DPERF_SetRegion)(D3DCOLOR col, LPCWSTR wszName); + bool IsDXVK() { return m_isdxvk; } + D3D9DLL() { - WrapperLoad("d3d9.dll"); + WrapperLoad("dxvk.dll", false, false) ? m_isdxvk = true : WrapperLoad("d3d9.dll"); StoreAddress(&Direct3DCreate9, "Direct3DCreate9"); StoreAddress(&Direct3DCreate9Ex, "Direct3DCreate9Ex"); @@ -93,6 +96,9 @@ public: StoreAddress(&D3DPERF_SetOptions, "D3DPERF_SetOptions"); StoreAddress(&D3DPERF_SetRegion, "D3DPERF_SetRegion"); } + +private: + bool m_isdxvk = false; }; extern "C" @@ -143,118 +149,3 @@ extern "C" return D3D9DLL::Get().D3DPERF_SetRegion(col, wszName); } } - -class DINPUT8DLL : public WrapperBase -{ -public: - - HRESULT (WINAPI* DirectInput8Create)(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPVOID *ppvOut, LPUNKNOWN punkOuter); - - DINPUT8DLL() - { - WrapperLoad("dinput8.dll"); - - StoreAddress(&DirectInput8Create, "DirectInput8Create"); - } -}; - -extern "C" -{ - HRESULT WINAPI _DirectInput8Create(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPVOID *ppvOut, LPUNKNOWN punkOuter) - { - return DINPUT8DLL::Get().DirectInput8Create(hinst, dwVersion, riidltf, ppvOut, punkOuter); - } -} - -class XINPUTDLL : public WrapperBase -{ -public: - - // XInput 1.3 and older functions - DWORD(WINAPI* XInputGetState)(DWORD dwUserIndex, XINPUT_STATE* pState); - DWORD(WINAPI* XInputSetState)(DWORD dwUserIndex, XINPUT_VIBRATION* pVibration); - DWORD(WINAPI* XInputGetCapabilities)(DWORD dwUserIndex, DWORD dwFlags, XINPUT_CAPABILITIES* pCapabilities); - VOID(WINAPI* XInputEnable)(BOOL enable); - DWORD(WINAPI* XInputGetDSoundAudioDeviceGuids)(DWORD dwUserIndex, GUID* pDSoundRenderGuid, GUID* pDSoundCaptureGuid); - DWORD(WINAPI* XInputGetBatteryInformation)(DWORD dwUserIndex, uint8_t devType, XINPUT_BATTERY_INFORMATION* pBatteryInformation); - DWORD(WINAPI* XInputGetKeystroke)(DWORD dwUserIndex, DWORD dwReserved, PXINPUT_KEYSTROKE pKeystroke); - - // XInput 1.3 undocumented functions - DWORD(WINAPI* XInputGetStateEx)(DWORD dwUserIndex, XINPUT_STATE *pState); // 100 - DWORD(WINAPI* XInputWaitForGuideButton)(DWORD dwUserIndex, DWORD dwFlag, LPVOID pVoid); // 101 - DWORD(WINAPI* XInputCancelGuideButtonWait)(DWORD dwUserIndex); // 102 - DWORD(WINAPI* XInputPowerOffController)(DWORD dwUserIndex); // 103 - - // XInput 1.4 functions - DWORD(WINAPI* XInputGetAudioDeviceIds)(DWORD dwUserIndex, LPWSTR pRenderDeviceId, UINT* pRenderCount, LPWSTR pCaptureDeviceId, UINT* pCaptureCount); - - // XInput 1.4 undocumented functionss - DWORD(WINAPI* XInputGetBaseBusInformation)(DWORD dwUserIndex, struct XINPUT_BUSINFO* pBusinfo); // 104 - DWORD(WINAPI* XInputGetCapabilitiesEx)(DWORD unk1, DWORD dwUserIndex, DWORD dwFlags, struct XINPUT_CAPABILITIESEX* pCapabilitiesEx); // 108 - - XINPUTDLL() - { - WrapperLoad("xinput1_3.dll"); - - // XInput 1.3 and older functions - StoreAddress(&XInputGetState, "XInputGetState"); - StoreAddress(&XInputSetState, "XInputSetState"); - StoreAddress(&XInputGetCapabilities, "XInputGetCapabilities"); - StoreAddress(&XInputEnable, "XInputEnable"); - StoreAddress(&XInputGetDSoundAudioDeviceGuids, "XInputGetDSoundAudioDeviceGuids"); - StoreAddress(&XInputGetBatteryInformation, "XInputGetBatteryInformation"); - StoreAddress(&XInputGetKeystroke, "XInputGetKeystroke"); - - // XInput 1.3 undocumented functions - StoreAddress(&XInputGetStateEx, (const char*)100); - StoreAddress(&XInputWaitForGuideButton, (const char*)101); - StoreAddress(&XInputCancelGuideButtonWait, (const char*)102); - StoreAddress(&XInputPowerOffController, (const char*)103); - - // XInput 1.4 functions - StoreAddress(&XInputGetAudioDeviceIds, "XInputGetAudioDeviceIds"); - - // XInput 1.4 undocumented functionss - StoreAddress(&XInputGetBaseBusInformation, (const char*)104); - StoreAddress(&XInputGetCapabilitiesEx, (const char*)108); - } -}; - -extern "C" -{ - // XInput 1.3 and older functions - DWORD WINAPI _XInputGetState(DWORD dwUserIndex, XINPUT_STATE* pState) - { - return XINPUTDLL::Get().XInputGetState(dwUserIndex, pState); - } - - DWORD WINAPI _XInputSetState(DWORD dwUserIndex, XINPUT_VIBRATION* pVibration) - { - return XINPUTDLL::Get().XInputSetState(dwUserIndex, pVibration); - } - - DWORD WINAPI _XInputGetCapabilities(DWORD dwUserIndex, DWORD dwFlags, XINPUT_CAPABILITIES* pCapabilities) - { - return XINPUTDLL::Get().XInputGetCapabilities(dwUserIndex, dwFlags, pCapabilities); - } - - VOID WINAPI _XInputEnable(BOOL enable) - { - return XINPUTDLL::Get().XInputEnable(enable); - } - - DWORD WINAPI _XInputGetDSoundAudioDeviceGuids(DWORD dwUserIndex, GUID* pDSoundRenderGuid, GUID* pDSoundCaptureGuid) - { - return XINPUTDLL::Get().XInputGetDSoundAudioDeviceGuids(dwUserIndex, pDSoundRenderGuid, pDSoundCaptureGuid); - } - - DWORD WINAPI _XInputGetBatteryInformation(DWORD dwUserIndex, uint8_t devType, XINPUT_BATTERY_INFORMATION* pBatteryInformation) - { - return XINPUTDLL::Get().XInputGetBatteryInformation(dwUserIndex, devType, pBatteryInformation); - } - - DWORD WINAPI _XInputGetKeystroke(DWORD dwUserIndex, DWORD dwReserved, PXINPUT_KEYSTROKE pKeystroke) - { - return XINPUTDLL::Get().XInputGetKeystroke(dwUserIndex, dwReserved, pKeystroke); - } -} diff --git a/d3d9ex/d3d9ex.vcxproj b/d3d9ex/d3d9ex.vcxproj index 652ff87..301bfc4 100644 --- a/d3d9ex/d3d9ex.vcxproj +++ b/d3d9ex/d3d9ex.vcxproj @@ -83,7 +83,7 @@ false - dinput8 + d3d9 $(SolutionDir)\Common;$(SolutionDir)\MinHook\include;$(DXSDK_DIR)\Include;$(IncludePath) @@ -137,8 +137,8 @@ true true true - XINPUT9_1_0.LIB;d3d9.lib;%(AdditionalDependencies) exports.def + d3d9.lib;XINPUT9_1_0.LIB;%(AdditionalDependencies) @@ -193,7 +193,9 @@ - + + true + Create Create @@ -206,7 +208,7 @@ - + {f142a341-5ee0-442d-a15f-98ae9b48dbae} diff --git a/d3d9ex/exports.def b/d3d9ex/exports.def index 0b170ae..3266e59 100644 --- a/d3d9ex/exports.def +++ b/d3d9ex/exports.def @@ -11,12 +11,4 @@ D3DPERF_SetMarker=_D3DPERF_SetMarker @24 D3DPERF_SetOptions=_D3DPERF_SetOptions @25 D3DPERF_SetRegion=_D3DPERF_SetRegion @26 -DirectInput8Create=_DirectInput8Create -XInputGetState=_XInputGetState @2 -XInputSetState=_XInputSetState @3 -XInputGetCapabilities=_XInputGetCapabilities @4 -XInputEnable=_XInputEnable @5 -XInputGetDSoundAudioDeviceGuids=_XInputGetDSoundAudioDeviceGuids @6 -XInputGetBatteryInformation=_XInputGetBatteryInformation @7 -XInputGetKeystroke=_XInputGetKeystroke @8