HRESULT WINAPI HookDI::HookDirectInput8Create(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPVOID *ppvOut, LPUNKNOWN punkOuter) { HRESULT hr = TrueDirectInput8Create(hinst, dwVersion, riidltf, ppvOut, punkOuter); if (!InputHookManager::Get().GetInputHook().GetState(InputHook::HOOK_DI)) return hr; PrintLog("DirectInput8Create"); if (hr != DI_OK) return hr; InputHookManager::Get().GetInputHook().StartTimeoutThread(); if (IsEqualIID(riidltf, IID_IDirectInput8A)) { LPDIRECTINPUT8A pDIA = static_cast<LPDIRECTINPUT8A>(*ppvOut); if (pDIA) { PrintLog("DirectInput8Create - ANSI interface"); if (pDIA->lpVtbl->CreateDevice) { CreateDeviceA = pDIA->lpVtbl->CreateDevice; IH_CreateHook(CreateDeviceA, HookCreateDeviceA, &TrueCreateDeviceA); IH_EnableHook(CreateDeviceA); } if (pDIA->lpVtbl->EnumDevices) { EnumDevicesA = pDIA->lpVtbl->EnumDevices; IH_CreateHook(EnumDevicesA, HookEnumDevicesA, &TrueEnumDevicesA); IH_EnableHook(EnumDevicesA); } } } else if (IsEqualIID(riidltf, IID_IDirectInput8W)) { LPDIRECTINPUT8W pDIW = static_cast<LPDIRECTINPUT8W>(*ppvOut); if (pDIW) { PrintLog("DirectInput8Create - UNICODE interface"); if (pDIW->lpVtbl->CreateDevice) { CreateDeviceW = pDIW->lpVtbl->CreateDevice; IH_CreateHook(CreateDeviceW, HookCreateDeviceW, &TrueCreateDeviceW); IH_EnableHook(CreateDeviceW); } if (pDIW->lpVtbl->EnumDevices) { EnumDevicesW = pDIW->lpVtbl->EnumDevices; IH_CreateHook(EnumDevicesW, HookEnumDevicesW, &TrueEnumDevicesW); IH_EnableHook(EnumDevicesW); } } } return hr; }
GENERATE_INTERCEPT_HEADER(DirectInput8Create, HRESULT, WINAPI, HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPVOID * ppvOut, LPUNKNOWN punkOuter) { SDLOG(0, "DetouredDirectInput8Create!\n"); return TrueDirectInput8Create(hinst, dwVersion, riidltf, ppvOut, punkOuter); }