From b7a57b361b8a3a8daa73b8724611505b7d088544 Mon Sep 17 00:00:00 2001 From: chyves <82107846+notchyves@users.noreply.github.com> Date: Sun, 17 Dec 2023 19:30:18 -0500 Subject: [PATCH] src halal optifine --- Include/MinHook.h | 184 ++++++++++ Include/kiero/kiero.cpp | 719 ++++++++++++++++++++++++++++++++++++++++ Include/kiero/kiero.h | 78 +++++ bin/optimizer.dll | Bin 0 -> 154624 bytes build.bat | 1 + dllmain.cpp | 163 +++++++++ lib/MinHook.x64.lib | Bin 0 -> 26876 bytes 7 files changed, 1145 insertions(+) create mode 100644 Include/MinHook.h create mode 100644 Include/kiero/kiero.cpp create mode 100644 Include/kiero/kiero.h create mode 100644 bin/optimizer.dll create mode 100644 build.bat create mode 100644 dllmain.cpp create mode 100644 lib/MinHook.x64.lib diff --git a/Include/MinHook.h b/Include/MinHook.h new file mode 100644 index 0000000..49ce7d1 --- /dev/null +++ b/Include/MinHook.h @@ -0,0 +1,184 @@ +/* + * 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. + // pszProcName [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. + // pszProcName [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 \ No newline at end of file diff --git a/Include/kiero/kiero.cpp b/Include/kiero/kiero.cpp new file mode 100644 index 0000000..9c6e6ca --- /dev/null +++ b/Include/kiero/kiero.cpp @@ -0,0 +1,719 @@ +#include "kiero.h" +#include +#include + +#if KIERO_INCLUDE_D3D9 +# include +#endif + +#if KIERO_INCLUDE_D3D10 +# include +# include +# include +#endif + +#if KIERO_INCLUDE_D3D11 +# include +# include +#endif + +#if KIERO_INCLUDE_D3D12 +# include +# include +#endif + +#if KIERO_INCLUDE_OPENGL +# include +#endif + +#if KIERO_INCLUDE_VULKAN +# include +#endif + +#if KIERO_USE_MINHOOK +# include +#endif + +#ifdef _UNICODE +# define KIERO_TEXT(text) L##text +#else +# define KIERO_TEXT(text) text +#endif + +#define KIERO_ARRAY_SIZE(arr) ((size_t)(sizeof(arr)/sizeof(arr[0]))) + +static kiero::RenderType::Enum g_renderType = kiero::RenderType::None; +static uint150_t* g_methodsTable = NULL; + +kiero::Status::Enum kiero::init(RenderType::Enum _renderType) +{ + if (g_renderType != RenderType::None) + { + return Status::AlreadyInitializedError; + } + + if (_renderType != RenderType::None) + { + if (_renderType >= RenderType::D3D9 && _renderType <= RenderType::D3D12) + { + WNDCLASSEX windowClass; + windowClass.cbSize = sizeof(WNDCLASSEX); + windowClass.style = CS_HREDRAW | CS_VREDRAW; + windowClass.lpfnWndProc = DefWindowProc; + windowClass.cbClsExtra = 0; + windowClass.cbWndExtra = 0; + windowClass.hInstance = GetModuleHandle(NULL); + windowClass.hIcon = NULL; + windowClass.hCursor = NULL; + windowClass.hbrBackground = NULL; + windowClass.lpszMenuName = NULL; + windowClass.lpszClassName = KIERO_TEXT("Kiero"); + windowClass.hIconSm = NULL; + + ::RegisterClassEx(&windowClass); + + HWND window = ::CreateWindow(windowClass.lpszClassName, KIERO_TEXT("Kiero DirectX Window"), WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, NULL, NULL, windowClass.hInstance, NULL); + + if (_renderType == RenderType::D3D9) + { +#if KIERO_INCLUDE_D3D9 + HMODULE libD3D9; + if ((libD3D9 = ::GetModuleHandle(KIERO_TEXT("d3d9.dll"))) == NULL) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::ModuleNotFoundError; + } + + void* Direct3DCreate9; + if ((Direct3DCreate9 = ::GetProcAddress(libD3D9, "Direct3DCreate9")) == NULL) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + LPDIRECT3D9 direct3D9; + if ((direct3D9 = ((LPDIRECT3D9(__stdcall*)(uint32_t))(Direct3DCreate9))(D3D_SDK_VERSION)) == NULL) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + D3DPRESENT_PARAMETERS params; + params.BackBufferWidth = 0; + params.BackBufferHeight = 0; + params.BackBufferFormat = D3DFMT_UNKNOWN; + params.BackBufferCount = 0; + params.MultiSampleType = D3DMULTISAMPLE_NONE; + params.MultiSampleQuality = NULL; + params.SwapEffect = D3DSWAPEFFECT_DISCARD; + params.hDeviceWindow = window; + params.Windowed = 1; + params.EnableAutoDepthStencil = 0; + params.AutoDepthStencilFormat = D3DFMT_UNKNOWN; + params.Flags = NULL; + params.FullScreen_RefreshRateInHz = 0; + params.PresentationInterval = 0; + + LPDIRECT3DDEVICE9 device; + if (direct3D9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_NULLREF, window, D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_DISABLE_DRIVER_MANAGEMENT, ¶ms, &device) < 0) + { + direct3D9->Release(); + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + g_methodsTable = (uint150_t*)::calloc(119, sizeof(uint150_t)); + ::memcpy(g_methodsTable, *(uint150_t**)device, 119 * sizeof(uint150_t)); + +#if KIERO_USE_MINHOOK + MH_Initialize(); +#endif + + device->Release(); + device = NULL; + + direct3D9->Release(); + direct3D9 = NULL; + + g_renderType = RenderType::D3D9; + + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + + return Status::Success; +#endif + } + else if (_renderType == RenderType::D3D10) + { +#if KIERO_INCLUDE_D3D10 + HMODULE libDXGI; + HMODULE libD3D10; + if ((libDXGI = ::GetModuleHandle(KIERO_TEXT("dxgi.dll"))) == NULL || (libD3D10 = ::GetModuleHandle(KIERO_TEXT("d3d10.dll"))) == NULL) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::ModuleNotFoundError; + } + + void* CreateDXGIFactory; + if ((CreateDXGIFactory = ::GetProcAddress(libDXGI, "CreateDXGIFactory")) == NULL) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + IDXGIFactory* factory; + if (((long(__stdcall*)(const IID&, void**))(CreateDXGIFactory))(__uuidof(IDXGIFactory), (void**)&factory) < 0) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + IDXGIAdapter* adapter; + if (factory->EnumAdapters(0, &adapter) == DXGI_ERROR_NOT_FOUND) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + void* D3D10CreateDeviceAndSwapChain; + if ((D3D10CreateDeviceAndSwapChain = ::GetProcAddress(libD3D10, "D3D10CreateDeviceAndSwapChain")) == NULL) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + DXGI_RATIONAL refreshRate; + refreshRate.Numerator = 60; + refreshRate.Denominator = 1; + + DXGI_MODE_DESC bufferDesc; + bufferDesc.Width = 100; + bufferDesc.Height = 100; + bufferDesc.RefreshRate = refreshRate; + bufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + bufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; + bufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; + + DXGI_SAMPLE_DESC sampleDesc; + sampleDesc.Count = 1; + sampleDesc.Quality = 0; + + DXGI_SWAP_CHAIN_DESC swapChainDesc; + swapChainDesc.BufferDesc = bufferDesc; + swapChainDesc.SampleDesc = sampleDesc; + swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + swapChainDesc.BufferCount = 1; + swapChainDesc.OutputWindow = window; + swapChainDesc.Windowed = 1; + swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; + + IDXGISwapChain* swapChain; + ID3D10Device* device; + + if (((long(__stdcall*)( + IDXGIAdapter*, + D3D10_DRIVER_TYPE, + HMODULE, + UINT, + UINT, + DXGI_SWAP_CHAIN_DESC*, + IDXGISwapChain**, + ID3D10Device**))(D3D10CreateDeviceAndSwapChain))(adapter, D3D10_DRIVER_TYPE_HARDWARE, NULL, 0, D3D10_SDK_VERSION, &swapChainDesc, &swapChain, &device) < 0) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + g_methodsTable = (uint150_t*)::calloc(116, sizeof(uint150_t)); + ::memcpy(g_methodsTable, *(uint150_t**)swapChain, 18 * sizeof(uint150_t)); + ::memcpy(g_methodsTable + 18, *(uint150_t**)device, 98 * sizeof(uint150_t)); + +#if KIERO_USE_MINHOOK + MH_Initialize(); +#endif + + swapChain->Release(); + swapChain = NULL; + + device->Release(); + device = NULL; + + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + + g_renderType = RenderType::D3D10; + + return Status::Success; +#endif + } + else if (_renderType == RenderType::D3D11) + { +#if KIERO_INCLUDE_D3D11 + HMODULE libD3D11; + if ((libD3D11 = ::GetModuleHandle(KIERO_TEXT("d3d11.dll"))) == NULL) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::ModuleNotFoundError; + } + + void* D3D11CreateDeviceAndSwapChain; + if ((D3D11CreateDeviceAndSwapChain = ::GetProcAddress(libD3D11, "D3D11CreateDeviceAndSwapChain")) == NULL) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + D3D_FEATURE_LEVEL featureLevel; + const D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_11_0 }; + + DXGI_RATIONAL refreshRate; + refreshRate.Numerator = 60; + refreshRate.Denominator = 1; + + DXGI_MODE_DESC bufferDesc; + bufferDesc.Width = 100; + bufferDesc.Height = 100; + bufferDesc.RefreshRate = refreshRate; + bufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + bufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; + bufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; + + DXGI_SAMPLE_DESC sampleDesc; + sampleDesc.Count = 1; + sampleDesc.Quality = 0; + + DXGI_SWAP_CHAIN_DESC swapChainDesc; + swapChainDesc.BufferDesc = bufferDesc; + swapChainDesc.SampleDesc = sampleDesc; + swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + swapChainDesc.BufferCount = 1; + swapChainDesc.OutputWindow = window; + swapChainDesc.Windowed = 1; + swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; + + IDXGISwapChain* swapChain; + ID3D11Device* device; + ID3D11DeviceContext* context; + + if (((long(__stdcall*)( + IDXGIAdapter*, + D3D_DRIVER_TYPE, + HMODULE, + UINT, + const D3D_FEATURE_LEVEL*, + UINT, + UINT, + const DXGI_SWAP_CHAIN_DESC*, + IDXGISwapChain**, + ID3D11Device**, + D3D_FEATURE_LEVEL*, + ID3D11DeviceContext**))(D3D11CreateDeviceAndSwapChain))(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, featureLevels, 2, D3D11_SDK_VERSION, &swapChainDesc, &swapChain, &device, &featureLevel, &context) < 0) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + g_methodsTable = (uint150_t*)::calloc(205, sizeof(uint150_t)); + ::memcpy(g_methodsTable, *(uint150_t**)swapChain, 18 * sizeof(uint150_t)); + ::memcpy(g_methodsTable + 18, *(uint150_t**)device, 43 * sizeof(uint150_t)); + ::memcpy(g_methodsTable + 18 + 43, *(uint150_t**)context, 144 * sizeof(uint150_t)); + +#if KIERO_USE_MINHOOK + MH_Initialize(); +#endif + + swapChain->Release(); + swapChain = NULL; + + device->Release(); + device = NULL; + + context->Release(); + context = NULL; + + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + + g_renderType = RenderType::D3D11; + + return Status::Success; +#endif + } + else if (_renderType == RenderType::D3D12) + { +#if KIERO_INCLUDE_D3D12 + HMODULE libDXGI; + HMODULE libD3D12; + if ((libDXGI = ::GetModuleHandle(KIERO_TEXT("dxgi.dll"))) == NULL || (libD3D12 = ::GetModuleHandle(KIERO_TEXT("d3d12.dll"))) == NULL) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::ModuleNotFoundError; + } + + void* CreateDXGIFactory; + if ((CreateDXGIFactory = ::GetProcAddress(libDXGI, "CreateDXGIFactory")) == NULL) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + IDXGIFactory* factory; + if (((long(__stdcall*)(const IID&, void**))(CreateDXGIFactory))(__uuidof(IDXGIFactory), (void**)&factory) < 0) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + IDXGIAdapter* adapter; + if (factory->EnumAdapters(0, &adapter) == DXGI_ERROR_NOT_FOUND) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + void* D3D12CreateDevice; + if ((D3D12CreateDevice = ::GetProcAddress(libD3D12, "D3D12CreateDevice")) == NULL) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + ID3D12Device* device; + if (((long(__stdcall*)(IUnknown*, D3D_FEATURE_LEVEL, const IID&, void**))(D3D12CreateDevice))(adapter, D3D_FEATURE_LEVEL_11_0, __uuidof(ID3D12Device), (void**)&device) < 0) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + D3D12_COMMAND_QUEUE_DESC queueDesc; + queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT; + queueDesc.Priority = 0; + queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE; + queueDesc.NodeMask = 0; + + ID3D12CommandQueue* commandQueue; + if (device->CreateCommandQueue(&queueDesc, __uuidof(ID3D12CommandQueue), (void**)&commandQueue) < 0) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + ID3D12CommandAllocator* commandAllocator; + if (device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, __uuidof(ID3D12CommandAllocator), (void**)&commandAllocator) < 0) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + ID3D12GraphicsCommandList* commandList; + if (device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, commandAllocator, NULL, __uuidof(ID3D12GraphicsCommandList), (void**)&commandList) < 0) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + DXGI_RATIONAL refreshRate; + refreshRate.Numerator = 60; + refreshRate.Denominator = 1; + + DXGI_MODE_DESC bufferDesc; + bufferDesc.Width = 100; + bufferDesc.Height = 100; + bufferDesc.RefreshRate = refreshRate; + bufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + bufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; + bufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; + + DXGI_SAMPLE_DESC sampleDesc; + sampleDesc.Count = 1; + sampleDesc.Quality = 0; + + DXGI_SWAP_CHAIN_DESC swapChainDesc = {}; + swapChainDesc.BufferDesc = bufferDesc; + swapChainDesc.SampleDesc = sampleDesc; + swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + swapChainDesc.BufferCount = 2; + swapChainDesc.OutputWindow = window; + swapChainDesc.Windowed = 1; + swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; + swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; + + IDXGISwapChain* swapChain; + if (factory->CreateSwapChain(commandQueue, &swapChainDesc, &swapChain) < 0) + { + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + return Status::UnknownError; + } + + g_methodsTable = (uint150_t*)::calloc(150, sizeof(uint150_t)); + ::memcpy(g_methodsTable, *(uint150_t**)device, 44 * sizeof(uint150_t)); + ::memcpy(g_methodsTable + 44, *(uint150_t**)commandQueue, 19 * sizeof(uint150_t)); + ::memcpy(g_methodsTable + 44 + 19, *(uint150_t**)commandAllocator, 9 * sizeof(uint150_t)); + ::memcpy(g_methodsTable + 44 + 19 + 9, *(uint150_t**)commandList, 60 * sizeof(uint150_t)); + ::memcpy(g_methodsTable + 44 + 19 + 9 + 60, *(uint150_t**)swapChain, 18 * sizeof(uint150_t)); + +#if KIERO_USE_MINHOOK + MH_Initialize(); +#endif + + device->Release(); + device = NULL; + + commandQueue->Release(); + commandQueue = NULL; + + commandAllocator->Release(); + commandAllocator = NULL; + + commandList->Release(); + commandList = NULL; + + swapChain->Release(); + swapChain = NULL; + + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + + g_renderType = RenderType::D3D12; + + return Status::Success; +#endif + } + + ::DestroyWindow(window); + ::UnregisterClass(windowClass.lpszClassName, windowClass.hInstance); + + return Status::NotSupportedError; + } + else if (_renderType != RenderType::Auto) + { + if (_renderType == RenderType::OpenGL) + { +#if KIERO_INCLUDE_OPENGL + HMODULE libOpenGL32; + if ((libOpenGL32 = ::GetModuleHandle(KIERO_TEXT("opengl32.dll"))) == NULL) + { + return Status::ModuleNotFoundError; + } + + const char* const methodsNames[] = { + "glAccum", "glAlphaFunc", "glAreTexturesResident", "glArrayElement", "glBegin", "glBindTexture", "glBitmap", "glBlendFunc", "glCallList", "glCallLists", "glClear", "glClearAccum", + "glClearColor", "glClearDepth", "glClearIndex", "glClearStencil", "glClipPlane", "glColor3b", "glColor3bv", "glColor3d", "glColor3dv", "glColor3f", "glColor3fv", "glColor3i", "glColor3iv", + "glColor3s", "glColor3sv", "glColor3ub", "glColor3ubv", "glColor3ui", "glColor3uiv", "glColor3us", "glColor3usv", "glColor4b", "glColor4bv", "glColor4d", "glColor4dv", "glColor4f", + "glColor4fv", "glColor4i", "glColor4iv", "glColor4s", "glColor4sv", "glColor4ub", "glColor4ubv", "glColor4ui", "glColor4uiv", "glColor4us", "glColor4usv", "glColorMask", "glColorMaterial", + "glColorPointer", "glCopyPixels", "glCopyTexImage1D", "glCopyTexImage2D", "glCopyTexSubImage1D", "glCopyTexSubImage2D", "glCullFaceglCullFace", "glDeleteLists", "glDeleteTextures", + "glDepthFunc", "glDepthMask", "glDepthRange", "glDisable", "glDisableClientState", "glDrawArrays", "glDrawBuffer", "glDrawElements", "glDrawPixels", "glEdgeFlag", "glEdgeFlagPointer", + "glEdgeFlagv", "glEnable", "glEnableClientState", "glEnd", "glEndList", "glEvalCoord1d", "glEvalCoord1dv", "glEvalCoord1f", "glEvalCoord1fv", "glEvalCoord2d", "glEvalCoord2dv", + "glEvalCoord2f", "glEvalCoord2fv", "glEvalMesh1", "glEvalMesh2", "glEvalPoint1", "glEvalPoint2", "glFeedbackBuffer", "glFinish", "glFlush", "glFogf", "glFogfv", "glFogi", "glFogiv", + "glFrontFace", "glFrustum", "glGenLists", "glGenTextures", "glGetBooleanv", "glGetClipPlane", "glGetDoublev", "glGetError", "glGetFloatv", "glGetIntegerv", "glGetLightfv", "glGetLightiv", + "glGetMapdv", "glGetMapfv", "glGetMapiv", "glGetMaterialfv", "glGetMaterialiv", "glGetPixelMapfv", "glGetPixelMapuiv", "glGetPixelMapusv", "glGetPointerv", "glGetPolygonStipple", + "glGetString", "glGetTexEnvfv", "glGetTexEnviv", "glGetTexGendv", "glGetTexGenfv", "glGetTexGeniv", "glGetTexImage", "glGetTexLevelParameterfv", "glGetTexLevelParameteriv", + "glGetTexParameterfv", "glGetTexParameteriv", "glHint", "glIndexMask", "glIndexPointer", "glIndexd", "glIndexdv", "glIndexf", "glIndexfv", "glIndexi", "glIndexiv", "glIndexs", "glIndexsv", + "glIndexub", "glIndexubv", "glInitNames", "glInterleavedArrays", "glIsEnabled", "glIsList", "glIsTexture", "glLightModelf", "glLightModelfv", "glLightModeli", "glLightModeliv", "glLightf", + "glLightfv", "glLighti", "glLightiv", "glLineStipple", "glLineWidth", "glListBase", "glLoadIdentity", "glLoadMatrixd", "glLoadMatrixf", "glLoadName", "glLogicOp", "glMap1d", "glMap1f", + "glMap2d", "glMap2f", "glMapGrid1d", "glMapGrid1f", "glMapGrid2d", "glMapGrid2f", "glMaterialf", "glMaterialfv", "glMateriali", "glMaterialiv", "glMatrixMode", "glMultMatrixd", + "glMultMatrixf", "glNewList", "glNormal3b", "glNormal3bv", "glNormal3d", "glNormal3dv", "glNormal3f", "glNormal3fv", "glNormal3i", "glNormal3iv", "glNormal3s", "glNormal3sv", + "glNormalPointer", "glOrtho", "glPassThrough", "glPixelMapfv", "glPixelMapuiv", "glPixelMapusv", "glPixelStoref", "glPixelStorei", "glPixelTransferf", "glPixelTransferi", "glPixelZoom", + "glPointSize", "glPolygonMode", "glPolygonOffset", "glPolygonStipple", "glPopAttrib", "glPopClientAttrib", "glPopMatrix", "glPopName", "glPrioritizeTextures", "glPushAttrib", + "glPushClientAttrib", "glPushMatrix", "glPushName", "glRasterPos2d", "glRasterPos2dv", "glRasterPos2f", "glRasterPos2fv", "glRasterPos2i", "glRasterPos2iv", "glRasterPos2s", + "glRasterPos2sv", "glRasterPos3d", "glRasterPos3dv", "glRasterPos3f", "glRasterPos3fv", "glRasterPos3i", "glRasterPos3iv", "glRasterPos3s", "glRasterPos3sv", "glRasterPos4d", + "glRasterPos4dv", "glRasterPos4f", "glRasterPos4fv", "glRasterPos4i", "glRasterPos4iv", "glRasterPos4s", "glRasterPos4sv", "glReadBuffer", "glReadPixels", "glRectd", "glRectdv", "glRectf", + "glRectfv", "glRecti", "glRectiv", "glRects", "glRectsv", "glRenderMode", "glRotated", "glRotatef", "glScaled", "glScalef", "glScissor", "glSelectBuffer", "glShadeModel", "glStencilFunc", + "glStencilMask", "glStencilOp", "glTexCoord1d", "glTexCoord1dv", "glTexCoord1f", "glTexCoord1fv", "glTexCoord1i", "glTexCoord1iv", "glTexCoord1s", "glTexCoord1sv", "glTexCoord2d", + "glTexCoord2dv", "glTexCoord2f", "glTexCoord2fv", "glTexCoord2i", "glTexCoord2iv", "glTexCoord2s", "glTexCoord2sv", "glTexCoord3d", "glTexCoord3dv", "glTexCoord3f", "glTexCoord3fv", + "glTexCoord3i", "glTexCoord3iv", "glTexCoord3s", "glTexCoord3sv", "glTexCoord4d", "glTexCoord4dv", "glTexCoord4f", "glTexCoord4fv", "glTexCoord4i", "glTexCoord4iv", "glTexCoord4s", + "glTexCoord4sv", "glTexCoordPointer", "glTexEnvf", "glTexEnvfv", "glTexEnvi", "glTexEnviv", "glTexGend", "glTexGendv", "glTexGenf", "glTexGenfv", "glTexGeni", "glTexGeniv", "glTexImage1D", + "glTexImage2D", "glTexParameterf", "glTexParameterfv", "glTexParameteri", "glTexParameteriv", "glTexSubImage1D", "glTexSubImage2D", "glTranslated", "glTranslatef", "glVertex2d", + "glVertex2dv", "glVertex2f", "glVertex2fv", "glVertex2i", "glVertex2iv", "glVertex2s", "glVertex2sv", "glVertex3d", "glVertex3dv", "glVertex3f", "glVertex3fv", "glVertex3i", "glVertex3iv", + "glVertex3s", "glVertex3sv", "glVertex4d", "glVertex4dv", "glVertex4f", "glVertex4fv", "glVertex4i", "glVertex4iv", "glVertex4s", "glVertex4sv", "glVertexPointer", "glViewport" + }; + + size_t size = KIERO_ARRAY_SIZE(methodsNames); + + g_methodsTable = (uint150_t*)::calloc(size, sizeof(uint150_t)); + + for (int i = 0; i < size; i++) + { + g_methodsTable[i] = (uint150_t)::GetProcAddress(libOpenGL32, methodsNames[i]); + } + +#if KIERO_USE_MINHOOK + MH_Initialize(); +#endif + + g_renderType = RenderType::OpenGL; + + return Status::Success; +#endif + } + else if (_renderType == RenderType::Vulkan) + { +#if KIERO_INCLUDE_VULKAN + HMODULE libVulkan; + if ((libVulkan = GetModuleHandle(KIERO_TEXT("vulkan-1.dll"))) == NULL) + { + return Status::ModuleNotFoundError; + } + + const char* const methodsNames[] = { + "vkCreateInstance", "vkDestroyInstance", "vkEnumeratePhysicalDevices", "vkGetPhysicalDeviceFeatures", "vkGetPhysicalDeviceFormatProperties", "vkGetPhysicalDeviceImageFormatProperties", + "vkGetPhysicalDeviceProperties", "vkGetPhysicalDeviceQueueFamilyProperties", "vkGetPhysicalDeviceMemoryProperties", "vkGetInstanceProcAddr", "vkGetDeviceProcAddr", "vkCreateDevice", + "vkDestroyDevice", "vkEnumerateInstanceExtensionProperties", "vkEnumerateDeviceExtensionProperties", "vkEnumerateDeviceLayerProperties", "vkGetDeviceQueue", "vkQueueSubmit", "vkQueueWaitIdle", + "vkDeviceWaitIdle", "vkAllocateMemory", "vkFreeMemory", "vkMapMemory", "vkUnmapMemory", "vkFlushMappedMemoryRanges", "vkInvalidateMappedMemoryRanges", "vkGetDeviceMemoryCommitment", + "vkBindBufferMemory", "vkBindImageMemory", "vkGetBufferMemoryRequirements", "vkGetImageMemoryRequirements", "vkGetImageSparseMemoryRequirements", "vkGetPhysicalDeviceSparseImageFormatProperties", + "vkQueueBindSparse", "vkCreateFence", "vkDestroyFence", "vkResetFences", "vkGetFenceStatus", "vkWaitForFences", "vkCreateSemaphore", "vkDestroySemaphore", "vkCreateEvent", "vkDestroyEvent", + "vkGetEventStatus", "vkSetEvent", "vkResetEvent", "vkCreateQueryPool", "vkDestroyQueryPool", "vkGetQueryPoolResults", "vkCreateBuffer", "vkDestroyBuffer", "vkCreateBufferView", "vkDestroyBufferView", + "vkCreateImage", "vkDestroyImage", "vkGetImageSubresourceLayout", "vkCreateImageView", "vkDestroyImageView", "vkCreateShaderModule", "vkDestroyShaderModule", "vkCreatePipelineCache", + "vkDestroyPipelineCache", "vkGetPipelineCacheData", "vkMergePipelineCaches", "vkCreateGraphicsPipelines", "vkCreateComputePipelines", "vkDestroyPipeline", "vkCreatePipelineLayout", + "vkDestroyPipelineLayout", "vkCreateSampler", "vkDestroySampler", "vkCreateDescriptorSetLayout", "vkDestroyDescriptorSetLayout", "vkCreateDescriptorPool", "vkDestroyDescriptorPool", + "vkResetDescriptorPool", "vkAllocateDescriptorSets", "vkFreeDescriptorSets", "vkUpdateDescriptorSets", "vkCreateFramebuffer", "vkDestroyFramebuffer", "vkCreateRenderPass", "vkDestroyRenderPass", + "vkGetRenderAreaGranularity", "vkCreateCommandPool", "vkDestroyCommandPool", "vkResetCommandPool", "vkAllocateCommandBuffers", "vkFreeCommandBuffers", "vkBeginCommandBuffer", "vkEndCommandBuffer", + "vkResetCommandBuffer", "vkCmdBindPipeline", "vkCmdSetViewport", "vkCmdSetScissor", "vkCmdSetLineWidth", "vkCmdSetDepthBias", "vkCmdSetBlendConstants", "vkCmdSetDepthBounds", + "vkCmdSetStencilCompareMask", "vkCmdSetStencilWriteMask", "vkCmdSetStencilReference", "vkCmdBindDescriptorSets", "vkCmdBindIndexBuffer", "vkCmdBindVertexBuffers", "vkCmdDraw", "vkCmdDrawIndexed", + "vkCmdDrawIndirect", "vkCmdDrawIndexedIndirect", "vkCmdDispatch", "vkCmdDispatchIndirect", "vkCmdCopyBuffer", "vkCmdCopyImage", "vkCmdBlitImage", "vkCmdCopyBufferToImage", "vkCmdCopyImageToBuffer", + "vkCmdUpdateBuffer", "vkCmdFillBuffer", "vkCmdClearColorImage", "vkCmdClearDepthStencilImage", "vkCmdClearAttachments", "vkCmdResolveImage", "vkCmdSetEvent", "vkCmdResetEvent", "vkCmdWaitEvents", + "vkCmdPipelineBarrier", "vkCmdBeginQuery", "vkCmdEndQuery", "vkCmdResetQueryPool", "vkCmdWriteTimestamp", "vkCmdCopyQueryPoolResults", "vkCmdPushConstants", "vkCmdBeginRenderPass", "vkCmdNextSubpass", + "vkCmdEndRenderPass", "vkCmdExecuteCommands" + }; + + size_t size = KIERO_ARRAY_SIZE(methodsNames); + + g_methodsTable = (uint150_t*)::calloc(size, sizeof(uint150_t)); + + for (int i = 0; i < size; i++) + { + g_methodsTable[i] = (uint150_t)::GetProcAddress(libVulkan, methodsNames[i]); + } + +#if KIERO_USE_MINHOOK + MH_Initialize(); +#endif + + g_renderType = RenderType::Vulkan; + + return Status::Success; +#endif + } + + return Status::NotSupportedError; + } + else + { + RenderType::Enum type = RenderType::None; + + if (::GetModuleHandle(KIERO_TEXT("d3d9.dll")) != NULL) + { + type = RenderType::D3D9; + } + else if (::GetModuleHandle(KIERO_TEXT("d3d10.dll")) != NULL) + { + type = RenderType::D3D10; + } + else if (::GetModuleHandle(KIERO_TEXT("d3d11.dll")) != NULL) + { + type = RenderType::D3D11; + } + else if (::GetModuleHandle(KIERO_TEXT("d3d12.dll")) != NULL) + { + type = RenderType::D3D12; + } + else if (::GetModuleHandle(KIERO_TEXT("opengl32.dll")) != NULL) + { + type = RenderType::OpenGL; + } + else if (::GetModuleHandle(KIERO_TEXT("vulkan-1.dll")) != NULL) + { + type = RenderType::Vulkan; + } + else + { + return Status::NotSupportedError; + } + + return init(type); + } + } + + return Status::Success; +} + +void kiero::shutdown() +{ + if (g_renderType != RenderType::None) + { +#if KIERO_USE_MINHOOK + MH_DisableHook(MH_ALL_HOOKS); +#endif + + ::free(g_methodsTable); + g_methodsTable = NULL; + g_renderType = RenderType::None; + } +} + +kiero::Status::Enum kiero::bind(uint16_t _index, void** _original, void* _function) +{ + // TODO: Need own detour function + + assert(_original != NULL && _function != NULL); + + if (g_renderType != RenderType::None) + { +#if KIERO_USE_MINHOOK + void* target = (void*)g_methodsTable[_index]; + if (MH_CreateHook(target, _function, _original) != MH_OK || MH_EnableHook(target) != MH_OK) + { + return Status::UnknownError; + } +#endif + + return Status::Success; + } + + return Status::NotInitializedError; +} + +void kiero::unbind(uint16_t _index) +{ + if (g_renderType != RenderType::None) + { +#if KIERO_USE_MINHOOK + MH_DisableHook((void*)g_methodsTable[_index]); +#endif + } +} + +kiero::RenderType::Enum kiero::getRenderType() +{ + return g_renderType; +} + +uint150_t* kiero::getMethodsTable() +{ + return g_methodsTable; +} \ No newline at end of file diff --git a/Include/kiero/kiero.h b/Include/kiero/kiero.h new file mode 100644 index 0000000..be05172 --- /dev/null +++ b/Include/kiero/kiero.h @@ -0,0 +1,78 @@ +#ifndef __KIERO_H__ +#define __KIERO_H__ + +#include + +#define KIERO_VERSION "1.2.12" + +#define KIERO_INCLUDE_D3D9 0 // 1 if you need D3D9 hook +#define KIERO_INCLUDE_D3D10 0 // 1 if you need D3D10 hook +#define KIERO_INCLUDE_D3D11 1 // 1 if you need D3D11 hook +#define KIERO_INCLUDE_D3D12 1 // 1 if you need D3D12 hook +#define KIERO_INCLUDE_OPENGL 0 // 1 if you need OpenGL hook +#define KIERO_INCLUDE_VULKAN 0 // 1 if you need Vulkan hook +#define KIERO_USE_MINHOOK 1 // 1 if you will use kiero::bind function + +#define KIERO_ARCH_X64 0 +#define KIERO_ARCH_X86 0 + +#if defined(_M_X64) +# undef KIERO_ARCH_X64 +# define KIERO_ARCH_X64 1 +#else +# undef KIERO_ARCH_X86 +# define KIERO_ARCH_X86 1 +#endif + +#if KIERO_ARCH_X64 +typedef uint64_t uint150_t; +#else +typedef uint32_t uint150_t; +#endif + +namespace kiero +{ + struct Status + { + enum Enum + { + UnknownError = -1, + NotSupportedError = -2, + ModuleNotFoundError = -3, + + AlreadyInitializedError = -4, + NotInitializedError = -5, + + Success = 0, + }; + }; + + struct RenderType + { + enum Enum + { + None, + + D3D9, + D3D10, + D3D11, + D3D12, + + OpenGL, + Vulkan, + + Auto + }; + }; + + Status::Enum init(RenderType::Enum renderType); + void shutdown(); + + Status::Enum bind(uint16_t index, void** original, void* function); + void unbind(uint16_t index); + + RenderType::Enum getRenderType(); + uint150_t* getMethodsTable(); +} + +#endif // __KIERO_H__ \ No newline at end of file diff --git a/bin/optimizer.dll b/bin/optimizer.dll new file mode 100644 index 0000000000000000000000000000000000000000..f9c0ec9dad422a65cdc274cf6bd63fd0858f17e7 GIT binary patch literal 154624 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 +#include +#include "d2d1.h" +#include +#include +#include +#include +#include +#include +#include +#include "Include/MinHook.h" +#include "Include/kiero/kiero.h" + +bool init = false; +bool init2 = false; +ID3D11Device* d3d11Device; +ID3D12Device5* d3d12Device; +IDXGISurface* back_buffer = nullptr; +ID2D1DeviceContext* context = nullptr; +ID2D1SolidColorBrush* brush = nullptr; + +wchar_t font[32] = L"Segoe UI"; +IDWriteFactory* write_factory = nullptr; +IDWriteTextFormat* text_format = nullptr; + +typedef HRESULT(__thiscall* present_t)(IDXGISwapChain3*, UINT, UINT); +present_t original_present; + +typedef HRESULT(__thiscall* resize_buffers_t)(IDXGISwapChain3*, UINT, UINT, UINT, DXGI_FORMAT, UINT); +resize_buffers_t original_resize_buffers; + +int frames = 0; +float fps = 0.f; + +static std::chrono::high_resolution_clock fpsclock; +static std::chrono::steady_clock::time_point start = fpsclock.now(); +static std::chrono::steady_clock::time_point previousFrameTime = fpsclock.now(); + +template +static void Release(T*& pPtr) +{ + if (pPtr != nullptr) + { + pPtr->Release(); + pPtr = nullptr; + } +}; + +HRESULT present_callback(IDXGISwapChain3* swap_chain, UINT sync_interval, UINT flags) +{ + + std::chrono::duration elapsed = fpsclock.now() - start; + frames += 1; + + if (elapsed.count() >= 0.5f) { + fps = static_cast(frames / elapsed.count()); + frames = 0; + start = fpsclock.now(); + } + + if (!init) + { + if (SUCCEEDED(swap_chain->GetDevice(IID_PPV_ARGS(&d3d12Device)))) + { + d3d12Device->RemoveDevice(); + init = true; + return original_present(swap_chain, sync_interval, DXGI_PRESENT_DO_NOT_WAIT); + } + } + + if (FAILED(swap_chain->GetDevice(IID_PPV_ARGS(&d3d11Device)))) + return original_present(swap_chain, sync_interval, DXGI_PRESENT_DO_NOT_WAIT); + + if (!init2) + { + if (SUCCEEDED(swap_chain->GetDevice(IID_PPV_ARGS(&d3d11Device)))) + { + + swap_chain->GetDevice(IID_PPV_ARGS(&d3d11Device)); + swap_chain->GetBuffer(0, IID_PPV_ARGS(&back_buffer)); + + const D2D1_CREATION_PROPERTIES properties = D2D1::CreationProperties( + D2D1_THREADING_MODE_SINGLE_THREADED, + D2D1_DEBUG_LEVEL_NONE, + D2D1_DEVICE_CONTEXT_OPTIONS_NONE + ); + + D2D1CreateDeviceContext(back_buffer, properties, &context); + + Release(back_buffer); + + DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory), (IUnknown**)&write_factory); + + init2 = true; + } + } + + + context->BeginDraw(); + + write_factory->CreateTextFormat(font, nullptr, DWRITE_FONT_WEIGHT_NORMAL, + DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, 24.0f, L"en-us", &text_format); + text_format->SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP); + + D2D1_COLOR_F color = D2D1::ColorF(D2D1::ColorF::LightSlateGray, 0.35f); + wchar_t fpsText[16]; + swprintf_s(fpsText, L"%.2f", fps); + + context->CreateSolidColorBrush(color, &brush); + context->DrawTextA(fpsText, wcslen(fpsText), text_format, + D2D1::RectF(10, 10, 10000, 10000), brush); + + Release(brush); + Release(text_format); + + context->EndDraw(); + + return original_present(swap_chain, sync_interval, DXGI_PRESENT_DO_NOT_WAIT); // disable vsync lmao +} + +HRESULT resize_buffers_callback(IDXGISwapChain3* swap_chain, UINT buffer_count, UINT width, UINT height, DXGI_FORMAT new_format, UINT swap_chain_flags) +{ + Release(write_factory); + Release(context); + Release(d3d11Device); + + init2 = false; + + return original_resize_buffers(swap_chain, buffer_count, width, height, new_format, swap_chain_flags); +} + +void Inject() +{ + // halal optifine start + if (kiero::init(kiero::RenderType::D3D12) == kiero::Status::Success) + { + kiero::bind(140, (void**)&original_present, present_callback); + kiero::bind(145, (void**)&original_resize_buffers, resize_buffers_callback); + return; + } + if (kiero::init(kiero::RenderType::D3D11) == kiero::Status::Success) + { + kiero::bind(8, (void**)&original_present, present_callback); + kiero::bind(13, (void**)&original_resize_buffers, resize_buffers_callback); + return; + } +} + +BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Inject, hModule, 0, 0); + break; + case DLL_PROCESS_DETACH: + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + break; + } + + return TRUE; +} \ No newline at end of file diff --git a/lib/MinHook.x64.lib b/lib/MinHook.x64.lib new file mode 100644 index 0000000000000000000000000000000000000000..7b583c825ec814716e351cd58d2a15424a5dd6c5 GIT binary patch literal 26876 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