BOOL FAR PASCAL HookDI::HookEnumCallbackW(LPCDIDEVICEINSTANCEW lpddi, LPVOID pvRef) { if (!InputHookManager::Get().GetInputHook().GetState(InputHook::HOOK_DI)) return TrueCallbackW(lpddi, pvRef); PrintLog("EnumCallbackW"); if (!DeviceCheck(lpddi)) return TrueCallbackW(lpddi, pvRef); if (InputHookManager::Get().GetInputHook().GetState(InputHook::HOOK_STOP)) return DIENUM_STOP; for (auto padcfg = InputHookManager::Get().GetInputHook().begin(); padcfg != InputHookManager::Get().GetInputHook().end(); ++padcfg) { if (IsEqualGUID(padcfg->GetProductGUID(), lpddi->guidProduct)) { DIDEVICEINSTANCEW fakedev = *lpddi; if (InputHookManager::Get().GetInputHook().GetState(InputHook::HOOK_PIDVID)) { std::wstring strTrueguidProduct; std::wstring strHookguidProduct; GUIDtoString(&strTrueguidProduct, fakedev.guidProduct); fakedev.guidProduct.Data1 = InputHookManager::Get().GetInputHook().GetFakePIDVID(); GUIDtoString(&strHookguidProduct, fakedev.guidProduct); PrintLog("GUID change:"); PrintLog("%ls", strTrueguidProduct.c_str()); PrintLog("%ls", strHookguidProduct.c_str()); } // This should not be required // fakedev.dwDevType = (MAKEWORD(DI8DEVTYPE_GAMEPAD, DI8DEVTYPEGAMEPAD_STANDARD) | DIDEVTYPE_HID); //66069 == 0x00010215 // fakedev.wUsage = 0x05; // fakedev.wUsagePage = 0x01; if (InputHookManager::Get().GetInputHook().GetState(InputHook::HOOK_NAME)) { std::wstring OldProductName(fakedev.tszProductName); std::wstring OldInstanceName(fakedev.tszInstanceName); wcscpy_s(fakedev.tszProductName, L"XBOX 360 For Windows (Controller)"); wcscpy_s(fakedev.tszInstanceName, L"XBOX 360 For Windows (Controller)"); PrintLog("Product Name change:"); PrintLog("\"%ls\"", OldProductName.c_str()); PrintLog("\"%ls\"", fakedev.tszProductName); PrintLog("Instance Name change:"); PrintLog("\"%ls\"", OldInstanceName.c_str()); PrintLog("\"%ls\"", fakedev.tszInstanceName); } return TrueCallbackW(&fakedev, pvRef); } } return TrueCallbackW(lpddi, pvRef); }
HRESULT STDMETHODCALLTYPE HookDI::HookGetDeviceInfoW(LPDIRECTINPUTDEVICE8W This, LPDIDEVICEINSTANCEW pdidi) { HRESULT hr = TrueGetDeviceInfoW(This, pdidi); if (!InputHookManager::Get().GetInputHook().GetState(InputHook::HOOK_DI)) return hr; PrintLog("IDirectInputDevice8W::GetDeviceInfoW"); if (!DeviceCheck(pdidi)) return TrueGetDeviceInfoW(This, pdidi); for (auto padcfg = InputHookManager::Get().GetInputHook().begin(); padcfg != InputHookManager::Get().GetInputHook().end(); ++padcfg) { if (IsEqualGUID(padcfg->GetProductGUID(), pdidi->guidProduct)) { if (InputHookManager::Get().GetInputHook().GetState(InputHook::HOOK_PIDVID)) { std::wstring strTrueguidProduct; std::wstring strHookguidProduct; GUIDtoString(&strTrueguidProduct, pdidi->guidProduct); pdidi->guidProduct.Data1 = InputHookManager::Get().GetInputHook().GetFakePIDVID(); GUIDtoString(&strHookguidProduct, pdidi->guidProduct); PrintLog("GUID change:"); PrintLog("%ls", strTrueguidProduct.c_str()); PrintLog("%ls", strHookguidProduct.c_str()); } // This should not be required //pdidi->dwDevType = (MAKEWORD(DI8DEVTYPE_GAMEPAD, DI8DEVTYPEGAMEPAD_STANDARD) | DIDEVTYPE_HID); //66069 == 0x00010215 //pdidi->wUsage = 0x05; //pdidi->wUsagePage = 0x01; if (InputHookManager::Get().GetInputHook().GetState(InputHook::HOOK_NAME)) { std::wstring OldProductName(pdidi->tszProductName); std::wstring OldInstanceName(pdidi->tszInstanceName); wcscpy_s(pdidi->tszProductName, L"XBOX 360 For Windows (Controller)"); wcscpy_s(pdidi->tszInstanceName, L"XBOX 360 For Windows (Controller)"); PrintLog("Product Name change:"); PrintLog("\"%ls\"", OldProductName.c_str()); PrintLog("\"%ls\"", pdidi->tszProductName); PrintLog("Instance Name change:"); PrintLog("\"%ls\"", OldInstanceName.c_str()); PrintLog("\"%ls\"", pdidi->tszInstanceName); } } } return hr; }
HRESULT STDMETHODCALLTYPE HookGetDeviceInfoW (LPDIRECTINPUTDEVICE8W This, LPDIDEVICEINSTANCEW pdidi) { HRESULT hr = oGetDeviceInfoW( This, pdidi ); if(!iHookThis->GetState(iHook::HOOK_DI)) return hr; PrintLog(LOG_HOOKDI,"*GetDeviceInfoW*"); if(hr != NO_ERROR) return hr; if(pdidi) { // Fast return if keyboard or mouse if (((pdidi->dwDevType & 0xFF) == DI8DEVTYPE_KEYBOARD)) { PrintLog(LOG_HOOKDI,"Keyboard detected - skipping"); return hr; } if (((pdidi->dwDevType & 0xFF) == DI8DEVTYPE_MOUSE)) { PrintLog(LOG_HOOKDI,"Mouse detected - skipping"); return hr; } for(auto padcfg = iHookThis->begin(); padcfg != iHookThis->end(); ++padcfg) { if(padcfg->GetHookState() && IsEqualGUID(padcfg->GetProductGUID(), pdidi->guidProduct)) { if(iHookThis->GetState(iHook::HOOK_PIDVID)) { std::wstring strTrueguidProduct; std::wstring strHookguidProduct; strTrueguidProduct = GUIDtoStringW(pdidi->guidProduct); pdidi->guidProduct.Data1 = iHookThis->GetFakePIDVID(); strHookguidProduct = GUIDtoStringW(pdidi->guidProduct); PrintLog(LOG_HOOKDI,"%s","GUID change:"); PrintLog(LOG_HOOKDI,"%ls",strTrueguidProduct.c_str()); PrintLog(LOG_HOOKDI,"%ls",strHookguidProduct.c_str()); } // This should not be required //pdidi->dwDevType = (MAKEWORD(DI8DEVTYPE_GAMEPAD, DI8DEVTYPEGAMEPAD_STANDARD) | DIDEVTYPE_HID); //66069 == 0x00010215 //pdidi->wUsage = 0x05; //pdidi->wUsagePage = 0x01; if(iHookThis->GetState(iHook::HOOK_NAME)) { std::wstring OldProductName(pdidi->tszProductName); std::wstring OldInstanceName(pdidi->tszInstanceName); wcscpy_s(pdidi->tszProductName, L"XBOX 360 For Windows (Controller)"); wcscpy_s(pdidi->tszInstanceName, L"XBOX 360 For Windows (Controller)"); PrintLog(LOG_HOOKDI,"%s","Product Name change:"); PrintLog(LOG_HOOKDI,"\"%ls\"",OldProductName.c_str()); PrintLog(LOG_HOOKDI,"\"%ls\"",pdidi->tszProductName); PrintLog(LOG_HOOKDI,"%s","Instance Name change:"); PrintLog(LOG_HOOKDI,"\"%ls\"",OldInstanceName.c_str()); PrintLog(LOG_HOOKDI,"\"%ls\"",pdidi->tszInstanceName); } hr=DI_OK; } } } return hr; }
BOOL FAR PASCAL HookEnumCallbackW( const DIDEVICEINSTANCEW* pInst,VOID* pContext ) { if(!iHookThis->GetState(iHook::HOOK_DI)) return lpTrueCallbackW(pInst,pContext); PrintLog(LOG_HOOKDI,"*EnumCallbackW*"); // Fast return if keyboard or mouse if (((pInst->dwDevType & 0xFF) == DI8DEVTYPE_KEYBOARD)) { PrintLog(LOG_HOOKDI,"Keyboard detected - skipping"); return lpTrueCallbackW(pInst,pContext); } if (((pInst->dwDevType & 0xFF) == DI8DEVTYPE_MOUSE)) { PrintLog(LOG_HOOKDI,"Mouse detected - skipping"); return lpTrueCallbackW(pInst,pContext); } if(iHookThis->GetState(iHook::HOOK_STOP)) return DIENUM_STOP; if(pInst && pInst->dwSize == sizeof(DIDEVICEINSTANCEW)) { for(auto padcfg = iHookThis->begin(); padcfg != iHookThis->end(); ++padcfg) { if(padcfg->GetHookState() && IsEqualGUID(padcfg->GetProductGUID(),pInst->guidProduct)) { DIDEVICEINSTANCEW& HookInst = *(const_cast<DIDEVICEINSTANCEW*>(pInst)); //DIDEVICEINSTANCEW HookInst; //memcpy(&HookInst,pInst,pInst->dwSize); if(iHookThis->GetState(iHook::HOOK_PIDVID)) { std::wstring strTrueguidProduct; std::wstring strHookguidProduct; strTrueguidProduct = GUIDtoStringW(HookInst.guidProduct); HookInst.guidProduct.Data1 = iHookThis->GetFakePIDVID(); strHookguidProduct = GUIDtoStringW(HookInst.guidProduct); PrintLog(LOG_HOOKDI,"%s","GUID change:"); PrintLog(LOG_HOOKDI,"%ls",strTrueguidProduct.c_str()); PrintLog(LOG_HOOKDI,"%ls",strHookguidProduct.c_str()); } // This should not be required //HookInst.dwDevType = (MAKEWORD(DI8DEVTYPE_GAMEPAD, DI8DEVTYPEGAMEPAD_STANDARD) | DIDEVTYPE_HID); //66069 == 0x00010215 //HookInst.wUsage = 0x05; //HookInst.wUsagePage = 0x01; if(iHookThis->GetState(iHook::HOOK_NAME)) { std::wstring OldProductName(HookInst.tszProductName); std::wstring OldInstanceName(HookInst.tszInstanceName); wcscpy_s(HookInst.tszProductName, L"XBOX 360 For Windows (Controller)"); wcscpy_s(HookInst.tszInstanceName, L"XBOX 360 For Windows (Controller)"); PrintLog(LOG_HOOKDI,"%s","Product Name change:"); PrintLog(LOG_HOOKDI,"\"%ls\"",OldProductName.c_str()); PrintLog(LOG_HOOKDI,"\"%ls\"",HookInst.tszProductName); PrintLog(LOG_HOOKDI,"%s","Instance Name change:"); PrintLog(LOG_HOOKDI,"\"%ls\"",OldInstanceName.c_str()); PrintLog(LOG_HOOKDI,"\"%ls\"",HookInst.tszInstanceName); } return lpTrueCallbackW(&HookInst,pContext); } } } return lpTrueCallbackW(pInst,pContext); }