#include #include #include #include "gfxhook/gfx.h" #include "hook/table.h" #include "util/dprintf.h" typedef BOOL (WINAPI *ShowWindow_t)(HWND hWnd, int nCmdShow); typedef HWND (WINAPI *CreateWindowExA_t)( DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam ); typedef HWND (WINAPI *CreateWindowExW_t)( DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam ); static BOOL WINAPI hook_ShowWindow(HWND hWnd, int nCmdShow); static HWND WINAPI hook_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 ); static HWND WINAPI hook_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 ); static struct gfx_config gfx_config; static ShowWindow_t next_ShowWindow; static CreateWindowExA_t next_CreateWindowExA; static CreateWindowExW_t next_CreateWindowExW; static const struct hook_symbol gfx_hooks[] = { { .name = "ShowWindow", .patch = hook_ShowWindow, .link = (void **) &next_ShowWindow, }, { .name = "CreateWindowExA", .patch = hook_CreateWindowExA, .link = (void **) &next_CreateWindowExA, }, { .name = "CreateWindowExW", .patch = hook_CreateWindowExW, .link = (void **) &next_CreateWindowExW, }, }; void gfx_hook_init(const struct gfx_config *cfg) { assert(cfg != NULL); if (!cfg->enable) { return; } memcpy(&gfx_config, cfg, sizeof(*cfg)); hook_table_apply(NULL, "user32.dll", gfx_hooks, _countof(gfx_hooks)); } static BOOL WINAPI hook_ShowWindow(HWND hWnd, int nCmdShow) { dprintf("Gfx: ShowWindow hook hit\n"); if (!gfx_config.framed && nCmdShow == SW_RESTORE) { nCmdShow = SW_SHOW; } return next_ShowWindow(hWnd, nCmdShow); } static HWND WINAPI hook_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 ) { dprintf("Gfx: CreateWindowExA hook hit\n"); DWORD windowStyle = 0; windowStyle = WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX; return next_CreateWindowExA(dwExStyle, lpClassName, lpWindowName, windowStyle, X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); } static HWND WINAPI hook_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 ) { dprintf("Gfx: CreateWindowExW hook hit\n"); DWORD windowStyle = 0; windowStyle = WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX; return next_CreateWindowExW(dwExStyle, lpClassName, lpWindowName, windowStyle, X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); }