227 lines
4.8 KiB
C
227 lines
4.8 KiB
C
#include <windows.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include "ddrhook-util/gfx.h"
|
|
|
|
#include "hook/pe.h"
|
|
#include "hook/table.h"
|
|
|
|
#include "util/defs.h"
|
|
#include "util/log.h"
|
|
#include "util/str.h"
|
|
|
|
static LRESULT(STDCALL *real_SendMessageW)(
|
|
HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
|
|
|
static HWND(STDCALL *real_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 SHORT STDCALL my_GetKeyState(int vk);
|
|
static LRESULT STDCALL
|
|
my_SendMessageW(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
|
|
|
static HWND STDCALL my_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 STDCALL my_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 const struct hook_symbol misc_user32_syms[] = {
|
|
{
|
|
.name = "SendMessageW",
|
|
.patch = my_SendMessageW,
|
|
.link = (void **) &real_SendMessageW,
|
|
},
|
|
{
|
|
.name = "GetKeyState",
|
|
.patch = my_GetKeyState,
|
|
},
|
|
{
|
|
.name = "CreateWindowExA",
|
|
.patch = my_CreateWindowExA,
|
|
},
|
|
{
|
|
.name = "CreateWindowExW",
|
|
.patch = my_CreateWindowExW,
|
|
.link = (void **) &real_CreateWindowExW,
|
|
},
|
|
};
|
|
|
|
static HWND STDCALL my_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)
|
|
{
|
|
// This breaks DDR X, X2 and X3
|
|
if (gfx_get_is_modern()) {
|
|
return real_CreateWindowExW(
|
|
dwExStyle,
|
|
lpClassName,
|
|
lpWindowName,
|
|
dwStyle,
|
|
X,
|
|
Y,
|
|
nWidth,
|
|
nHeight,
|
|
hWndParent,
|
|
hMenu,
|
|
hInstance,
|
|
lpParam);
|
|
}
|
|
|
|
if (gfx_get_windowed()) {
|
|
/* use a different style */
|
|
dwStyle |= WS_OVERLAPPEDWINDOW;
|
|
/* also show mouse cursor */
|
|
ShowCursor(TRUE);
|
|
}
|
|
|
|
if (!lpWindowName)
|
|
lpWindowName = L"Dance Dance Revolution";
|
|
|
|
HWND hwnd = real_CreateWindowExW(
|
|
dwExStyle,
|
|
lpClassName,
|
|
lpWindowName,
|
|
dwStyle,
|
|
X,
|
|
Y,
|
|
nWidth,
|
|
nHeight,
|
|
hWndParent,
|
|
hMenu,
|
|
hInstance,
|
|
lpParam);
|
|
|
|
if (hwnd == INVALID_HANDLE_VALUE) {
|
|
return hwnd;
|
|
}
|
|
|
|
if (gfx_get_windowed()) {
|
|
/* we have to adjust the window size, because the window needs to be a
|
|
slightly bigger than the rendering resolution (window caption and
|
|
stuff is included in the window size) */
|
|
WINDOWPOS wp;
|
|
gfx_d3d9_calc_win_size_with_framed(hwnd, X, Y, nWidth, nHeight, &wp);
|
|
SetWindowPos(hwnd, 0, wp.x, wp.y, wp.cx, wp.cy, 0);
|
|
X = wp.x;
|
|
Y = wp.y;
|
|
nWidth = wp.cx;
|
|
nHeight = wp.cy;
|
|
}
|
|
|
|
return hwnd;
|
|
}
|
|
|
|
static HWND STDCALL my_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)
|
|
{
|
|
LPWSTR longWindowName = NULL;
|
|
LPWSTR longClassName = NULL;
|
|
if (lpWindowName)
|
|
longWindowName = str_widen(lpWindowName);
|
|
if (lpClassName)
|
|
longClassName = str_widen(lpClassName);
|
|
|
|
HWND ret = my_CreateWindowExW(
|
|
dwExStyle,
|
|
longClassName,
|
|
longWindowName,
|
|
dwStyle,
|
|
X,
|
|
Y,
|
|
nWidth,
|
|
nHeight,
|
|
hWndParent,
|
|
hMenu,
|
|
hInstance,
|
|
lpParam);
|
|
|
|
if (longWindowName)
|
|
free(longWindowName);
|
|
if (longClassName)
|
|
free(longClassName);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static SHORT STDCALL my_GetKeyState(int vk)
|
|
{
|
|
/* yeah we kinda have our own keyboard input thing */
|
|
return 0;
|
|
}
|
|
|
|
static LRESULT STDCALL
|
|
my_SendMessageW(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
|
{
|
|
if (hwnd == HWND_BROADCAST) {
|
|
/* OK COOL STORY BRO */
|
|
log_misc("Dropping message sent to HWND_BROADCAST");
|
|
|
|
return TRUE;
|
|
} else {
|
|
return real_SendMessageW(hwnd, msg, wparam, lparam);
|
|
}
|
|
}
|
|
|
|
void misc_insert_hooks(HMODULE target)
|
|
{
|
|
hook_table_apply(
|
|
target, "user32.dll", misc_user32_syms, lengthof(misc_user32_syms));
|
|
|
|
log_info("Inserted miscellaneous hooks into %p", target);
|
|
}
|