已解决,来人散分了,Hook DirectInput->CreateDevice->GetDeviceData
在一款使用DirectInput的3D游戏里面,通过Hook DirectInput8Create函数,CreateDevice方法,取得了GetDeviceData函数指针,在GetDeviceData里面已经可以取得键盘输入的数据(程序未使用GetDeviceState获得数据)
HRESULT CHook::MyGetDeviceData(LPVOID *ppvOut, DWORD cbObjectData, LPDIDEVICEOBJECTDATA didod, LPDWORD pdwInOut, DWORD dwFlags){ HRESULT hr = CGetDeviceData::Real(ppvOut, cbObjectData, didod, pdwInOut, dwFlags); if(SUCCEEDED(hr)) { for(DWORD i = 0; i < *pdwInOut; i++) { if(didod[i].dwOfs == DIK_CAPSLOCK) { if(didod[i].dwData & 0x80) { m_TurnLeft = !m_TurnLeft; didod[i].dwOfs = m_TurnLeft ? DIK_A : DIK_D; } else didod[i].dwOfs = m_TurnLeft ? DIK_A : DIK_D; } } } return hr;}
HRESULT CHook::MyGetDeviceData(LPVOID *ppvOut, DWORD cbObjectData, LPDIDEVICEOBJECTDATA didod, LPDWORD pdwInOut, DWORD dwFlags){ HRESULT hr = CGetDeviceData::Real(ppvOut, cbObjectData, didod, pdwInOut, dwFlags); if(SUCCEEDED(hr)) { for(DWORD i = 0; i < *pdwInOut; i++) { if(didod[i].dwOfs == DIK_I) { didod[i].dwOfs = DIK_L; } } } return hr;}
// CGetDeviceDatatypedef HRESULT (WINAPI *lpGetDeviceData)(LPVOID *ppvOut, DWORD cbObjectData, LPDIDEVICEOBJECTDATA didod, LPDWORD pdwInOut, DWORD dwFlags);class CGetDeviceData{private: static CGetDeviceData* m_this; static HRESULT WINAPI _MyGetDeviceData(LPVOID *ppvOut, DWORD cbObjectData, LPDIDEVICEOBJECTDATA didod, LPDWORD pdwInOut, DWORD dwFlags){ return m_this->MyGetDeviceData(ppvOut, cbObjectData, didod, pdwInOut, dwFlags); };public: lpGetDeviceData Real; virtual HRESULT MyGetDeviceData(LPVOID *ppvOut, DWORD cbObjectData, LPDIDEVICEOBJECTDATA didod, LPDWORD pdwInOut, DWORD dwFlags) = 0; void Init(LPVOID *lplpDirectInputDevice){ ULONG* vptr = *(*(ULONG***)lplpDirectInputDevice); Real = (lpGetDeviceData)vptr[10]; vptr[10] = (ULONG)_MyGetDeviceData; }; CGetDeviceData(){ m_this = this; Real = NULL; };};