├── README.md ├── dinput8.cpp ├── dinput8.def └── dinput8.h /README.md: -------------------------------------------------------------------------------- 1 | A few games such as 'Condemend Criminal Origins', 'FEAR' and possibly others have issues with DirectInput and have been known to tank the users FPS. 2 | -------------------------------------------------------------------------------- /dinput8.cpp: -------------------------------------------------------------------------------- 1 | #define CINTERFACE 2 | #include "Minhook.h" 3 | #include "dinput8.h" 4 | 5 | #pragma comment (lib, "dxguid.lib") 6 | 7 | HRESULT WINAPI dEnumDevicesA( 8 | LPDIRECTINPUT8A This, 9 | DWORD dwDevType, 10 | LPDIENUMDEVICESCALLBACKA lpCallback, 11 | LPVOID pvRef, 12 | DWORD dwFlags 13 | ) 14 | { 15 | 16 | if (dwDevType == 1) 17 | { 18 | return NULL; 19 | } 20 | else 21 | { 22 | return pEnumDevicesA(This, dwDevType, lpCallback, pvRef, dwFlags); 23 | } 24 | 25 | } 26 | 27 | HRESULT WINAPI dEnumDevicesW( 28 | LPDIRECTINPUT8W This, 29 | DWORD dwDevType, 30 | LPDIENUMDEVICESCALLBACKW lpCallback, 31 | LPVOID pvRef, 32 | DWORD dwFlags 33 | ) 34 | { 35 | 36 | if (dwDevType == 1) 37 | { 38 | return NULL; 39 | } 40 | else 41 | { 42 | return pEnumDevicesW(This, dwDevType, lpCallback, pvRef, dwFlags); 43 | } 44 | 45 | } 46 | 47 | HRESULT WINAPI DirectInput8Create( 48 | HINSTANCE hinst, 49 | DWORD dwVersion, 50 | REFIID riidltf, 51 | LPVOID * ppvOut, 52 | LPUNKNOWN punkOuter 53 | ){ 54 | 55 | HRESULT ret = oDirectInput8Create(hinst, dwVersion, riidltf, ppvOut, punkOuter); 56 | 57 | LPDIRECTINPUT8A pDICa = static_cast(*ppvOut); 58 | LPDIRECTINPUT8W pDICu = static_cast(*ppvOut); 59 | 60 | if (IsEqualIID(riidltf, IID_IDirectInput8A)) 61 | { 62 | if (pDICa->lpVtbl->EnumDevices) 63 | { 64 | oEnumDevicesA = pDICa->lpVtbl->EnumDevices; 65 | 66 | MH_CreateHook((DWORD_PTR*)oEnumDevicesA, dEnumDevicesA, reinterpret_cast(&pEnumDevicesA)); 67 | MH_EnableHook((DWORD_PTR*)oEnumDevicesA); 68 | } 69 | } 70 | 71 | if (IsEqualIID(riidltf, IID_IDirectInput8W)) 72 | { 73 | if (pDICu->lpVtbl->EnumDevices) 74 | { 75 | oEnumDevicesW = pDICu->lpVtbl->EnumDevices; 76 | 77 | MH_CreateHook((DWORD_PTR*)oEnumDevicesW, dEnumDevicesW, reinterpret_cast(&pEnumDevicesW)); 78 | MH_EnableHook((DWORD_PTR*)oEnumDevicesW); 79 | } 80 | } 81 | 82 | return ret; 83 | 84 | } 85 | 86 | 87 | bool WINAPI DllMain(HMODULE hModule, DWORD fdwReason, LPVOID lpReserved) { 88 | static HMODULE din8DLL = nullptr; 89 | switch (fdwReason) 90 | { 91 | case DLL_PROCESS_ATTACH: 92 | { 93 | 94 | if (MH_Initialize() != MH_OK) 95 | { 96 | MessageBox(NULL, ("Error"), ("Failed to Initialize MinHook"), MB_OK); 97 | return 1; 98 | } 99 | 100 | char path[MAX_PATH]; 101 | GetSystemDirectory(path, MAX_PATH); 102 | strcat_s(path, "\\dinput8.dll"); 103 | din8DLL = LoadLibrary(path); 104 | 105 | oDirectInput8Create = (tDirectInput8Create)GetProcAddress(din8DLL, "DirectInput8Create"); 106 | 107 | } 108 | case DLL_PROCESS_DETACH: 109 | FreeLibrary(hModule); 110 | break; 111 | } 112 | return true; 113 | } 114 | -------------------------------------------------------------------------------- /dinput8.def: -------------------------------------------------------------------------------- 1 | EXPORTS 2 | DirectInput8Create @1 3 | -------------------------------------------------------------------------------- /dinput8.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | typedef HRESULT(WINAPI *tDirectInput8Create)( 5 | HINSTANCE hinst, 6 | DWORD dwVersion, 7 | REFIID riidltf, 8 | LPVOID * ppvOut, 9 | LPUNKNOWN punkOuter); 10 | 11 | tDirectInput8Create oDirectInput8Create; 12 | 13 | typedef HRESULT(WINAPI *tEnumDevicesA)( 14 | LPDIRECTINPUT8A This, 15 | DWORD dwDevType, 16 | LPDIENUMDEVICESCALLBACKA lpCallback, 17 | LPVOID pvRef, 18 | DWORD dwFlags); 19 | 20 | tEnumDevicesA oEnumDevicesA; 21 | tEnumDevicesA pEnumDevicesA; 22 | 23 | typedef HRESULT(WINAPI *tEnumDevicesW)( 24 | LPDIRECTINPUT8W This, 25 | DWORD dwDevType, 26 | LPDIENUMDEVICESCALLBACKW lpCallback, 27 | LPVOID pvRef, 28 | DWORD dwFlags); 29 | 30 | 31 | tEnumDevicesW oEnumDevicesW; 32 | tEnumDevicesW pEnumDevicesW; 33 | --------------------------------------------------------------------------------