static DWORD WINAPI Main(LPVOID) {
while (!GetModuleHandleA("client.dll")) Sleep(100);
Sleep(1500);
offs::Init();
MH_Initialize();
// dummy swapchain для Present
WNDCLASSEXA wc{ sizeof wc };
wc.lpfnWndProc = DefWindowProcA;
wc.hInstance = GetModuleHandleA(nullptr);
wc.lpszClassName = "wsc";
RegisterClassExA(&wc);
HWND dummy = CreateWindowA("wsc", "", WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, nullptr, nullptr, wc.hInstance, nullptr);
DXGI_SWAP_CHAIN_DESC sd{};
sd.BufferCount = 1;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = dummy;
sd.SampleDesc.Count = 1;
sd.Windowed = TRUE;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
IDXGISwapChain* sc = nullptr;
ID3D11Device* dv = nullptr;
ID3D11DeviceContext* cx = nullptr;
D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0, nullptr, 0, D3D11_SDK_VERSION, &sd, &sc, &dv, nullptr, &cx);
if (!sc) return 0;
void** vt = *(void***)sc;
MH_CreateHook(vt[8], &Present, (void**)&oPresent);
MH_EnableHook(vt[8]);
sc->Release(); dv->Release(); cx->Release();
DestroyWindow(dummy); UnregisterClassA("wsc", wc.hInstance);
if (offs::fnCreateMove) {
MH_CreateHook((void*)offs::fnCreateMove, &CreateMove, (void**)&oCreateMove);
MH_EnableHook((void*)offs::fnCreateMove);
}
return 0;
}
BOOL APIENTRY DllMain(HMODULE, DWORD r, LPVOID) {
if (r == DLL_PROCESS_ATTACH) {
DisableThreadLibraryCalls(GetModuleHandleA(nullptr));
CreateThread(nullptr, 0, Main, nullptr, 0, nullptr);
}
return TRUE;
}