#include #include typedef BOOL (WINAPI *FN_ImeDestroy)(UINT uReserved); typedef BOOL (WINAPI *FN_NotifyIME)(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue); typedef struct IMEDPI /* unconfirmed */ { struct IMEDPI *pNext; // 0x0 HINSTANCE hInst; // 0x4 HKL hKL; // 0x8 DWORD dwUnknown0; // 0xc DWORD dwUnknown1; // 0x10 DWORD dwUnknown2[14]; DWORD cLockObj; // 0x4c DWORD dwFlags; DWORD dwUnknown3[7]; FN_ImeDestroy ImeDestroy; DWORD dwUnknown4[5]; FN_NotifyIME NotifyIME; /* ... */ } IMEDPI, *PIMEDPI; #define IMEDPI_FLAG_UNKNOWN 1 #define IMEDPI_FLAG_UNKNOWN2 2 typedef VOID (WINAPI *FN_ImmUnlockImeDpi)(PIMEDPI pImeDpi); int main(int argc, char **argv) { INT ret = EXIT_SUCCESS; LPVOID pv; HINSTANCE hImm32 = LoadLibraryA("imm32.dll"); FN_ImmUnlockImeDpi pImmUnlockImeDpi = (FN_ImmUnlockImeDpi)GetProcAddress(hImm32, "ImmUnlockImeDpi"); if (!pImmUnlockImeDpi) { puts("Not found"); ret = EXIT_FAILURE; } else { PIMEDPI pImeDpi = (PIMEDPI)calloc(sizeof(IMEDPI), 1); pImeDpi->cLockObj = 1; pv = &pImeDpi->dwUnknown1; pImeDpi->dwUnknown1 = (argc >= 2 ? atoi(argv[1]) : 0); printf("pv: %p\n", pv); fflush(stdout); DebugBreak(); (*pImmUnlockImeDpi)(pImeDpi); } FreeLibrary(hImm32); return ret; }