From 7f03c3cebdf207dfaac3890ad85c7bd54350dbc0 Mon Sep 17 00:00:00 2001 From: Brian Kendall Date: Tue, 4 Apr 2017 23:56:41 -0400 Subject: [PATCH] Improved logging --- dinput8/DirectInputModuleManager.h | 5 +- dinput8/dinput8.cpp | 85 +++++++++++++++--------------- dinput8/dinput8.h | 4 +- 3 files changed, 48 insertions(+), 46 deletions(-) diff --git a/dinput8/DirectInputModuleManager.h b/dinput8/DirectInputModuleManager.h index b172d14..2b35784 100644 --- a/dinput8/DirectInputModuleManager.h +++ b/dinput8/DirectInputModuleManager.h @@ -24,6 +24,7 @@ class DirectInputModuleManager : NonCopyable ini.SetAllowEmptyValues(false); std::wstring inipath(L"devreorder.ini"); SI_Error err = ini.LoadFile(inipath.c_str()); + LogSystem(); if (err < 0) { CheckCommonDirectory(&inipath, L"devreorder"); @@ -69,7 +70,7 @@ class DirectInputModuleManager : NonCopyable } else { - PrintLog("Loaded \"%s\"", UTF16ToUTF8(loadedModulePath).c_str()); + PrintLog("devreorder: Loaded \"%s\"", UTF16ToUTF8(loadedModulePath).c_str()); } GetProcAddress("DirectInput8Create", &DirectInput8Create); @@ -85,7 +86,7 @@ class DirectInputModuleManager : NonCopyable { std::string xinput_path; ModulePath(&xinput_path, m_module); - PrintLog("Unloading %s", xinput_path.c_str()); + PrintLog("devreorder: Unloading %s", xinput_path.c_str()); FreeLibrary(m_module); } } diff --git a/dinput8/dinput8.cpp b/dinput8/dinput8.cpp index 1021643..ea8d550 100755 --- a/dinput8/dinput8.cpp +++ b/dinput8/dinput8.cpp @@ -29,11 +29,15 @@ vector loadAllKeysFromSectionOfIni(const wstring §ion) if (err < 0) { CheckCommonDirectory(&inipath, L"devreorder"); err = ini.LoadFile(inipath.c_str()); - } - if (err < 0) { - PrintLog("Error: devreorder.ini file found"); - return result; + if (err < 0) { + PrintLog("devreorder error: devreorder.ini file found"); + return result; + } else { + PrintLog("devreorder: using system-wide devreorder.ini"); + } + } else { + PrintLog("devreorder: using program-specific devreorder.ini"); } CSimpleIniW::TNamesDepend keys; @@ -78,18 +82,6 @@ vector & sortedControllersA() return result; } -vector & sortedControllers(const string &ignored) -{ - (void)ignored; - return sortedControllersA(); -} - -vector & sortedControllers(const wstring &ignored) -{ - (void)ignored; - return sortedControllersW(); -} - vector & hiddenControllersW() { static vector result; @@ -121,18 +113,6 @@ vector & hiddenControllersA() return result; } -vector & hiddenControllers(const string &ignored) -{ - (void)ignored; - return hiddenControllersA(); -} - -vector & hiddenControllers(const wstring &ignored) -{ - (void)ignored; - return hiddenControllersW(); -} - template struct DeviceEnumData { list nonsorted; @@ -175,38 +155,56 @@ bool stringsAreEqual(const wstring &a, const WCHAR *b) return lstrcmpW((WCHAR *)trim(a).c_str(), (WCHAR *)trim(wstring(b)).c_str()) == 0; } -template -bool enumCallback(const DeviceType *deviceInstance, LPVOID userData) +BOOL CALLBACK enumCallbackA(LPCDIDEVICEINSTANCEA deviceInstance, LPVOID userData) { - DeviceEnumData *enumData = (DeviceEnumData *)userData; - vector &order = sortedControllers(StringType()); - vector &hidden = hiddenControllers(StringType()); + DeviceEnumData *enumData = (DeviceEnumData *)userData; + vector &order = sortedControllersA(); + vector &hidden = hiddenControllersA(); for (unsigned int i = 0; i < hidden.size(); ++i) { if (stringsAreEqual(hidden[i], deviceInstance->tszProductName)) { + PrintLog("devreorder: product \"%s\" is hidden", deviceInstance->tszProductName); return DIENUM_CONTINUE; } } for (unsigned int i = 0; i < order.size(); ++i) { if (stringsAreEqual(order[i], deviceInstance->tszProductName)) { + PrintLog("devreorder: product \"%s\" is sorted up", deviceInstance->tszProductName); enumData->sorted[i].push_back(*deviceInstance); return DIENUM_CONTINUE; } } + PrintLog("devreorder: product \"%s\" is not sorted differently", deviceInstance->tszProductName); enumData->nonsorted.push_back(*deviceInstance); return DIENUM_CONTINUE; } -BOOL CALLBACK enumCallbackA(LPCDIDEVICEINSTANCEA deviceInstance, LPVOID userData) -{ - return enumCallback(deviceInstance, userData); -} - BOOL CALLBACK enumCallbackW(LPCDIDEVICEINSTANCEW deviceInstance, LPVOID userData) { - return enumCallback(deviceInstance, userData); + DeviceEnumData *enumData = (DeviceEnumData *)userData; + vector &order = sortedControllersW(); + vector &hidden = hiddenControllersW(); + + for (unsigned int i = 0; i < hidden.size(); ++i) { + if (stringsAreEqual(hidden[i], deviceInstance->tszProductName)) { + PrintLog(L"devreorder: product \"%s\" is hidden", deviceInstance->tszProductName); + return DIENUM_CONTINUE; + } + } + + for (unsigned int i = 0; i < order.size(); ++i) { + if (stringsAreEqual(order[i], deviceInstance->tszProductName)) { + PrintLog(L"devreorder: product \"%s\" is sorted up", deviceInstance->tszProductName); + enumData->sorted[i].push_back(*deviceInstance); + return DIENUM_CONTINUE; + } + } + + PrintLog(L"devreorder: product \"%s\" is not sorted differently", deviceInstance->tszProductName); + enumData->nonsorted.push_back(*deviceInstance); + return DIENUM_CONTINUE; } HRESULT STDMETHODCALLTYPE HookEnumDevicesA(LPDIRECTINPUT8A This, DWORD dwDevType, LPDIENUMDEVICESCALLBACKA lpCallback, LPVOID pvRef, DWORD dwFlags) @@ -216,6 +214,7 @@ HRESULT STDMETHODCALLTYPE HookEnumDevicesA(LPDIRECTINPUT8A This, DWORD dwDevType enumData.sorted.resize(order.size()); + PrintLog("devreorder: determining new sorting order for devices"); HRESULT result = TrueEnumDevicesA(This, dwDevType, enumCallbackA, (LPVOID)&enumData, dwFlags); if (result != DI_OK) { @@ -246,6 +245,7 @@ HRESULT STDMETHODCALLTYPE HookEnumDevicesW(LPDIRECTINPUT8W This, DWORD dwDevType enumData.sorted.resize(order.size()); + PrintLog("devreorder: determining new sorting order for devices"); HRESULT result = TrueEnumDevicesW(This, dwDevType, enumCallbackW, (LPVOID)&enumData, dwFlags); if (result != DI_OK) { @@ -277,7 +277,7 @@ void CreateHooks(REFIID riidltf, LPVOID *realDI) if (pDIA) { - PrintLog("DirectInput8Create - ANSI interface"); + PrintLog("devreorder: using ANSI interface"); if (pDIA->lpVtbl->EnumDevices) { EnumDevicesA = pDIA->lpVtbl->EnumDevices; @@ -292,7 +292,7 @@ void CreateHooks(REFIID riidltf, LPVOID *realDI) if (pDIW) { - PrintLog("DirectInput8Create - UNICODE interface"); + PrintLog("devreorder: using UNICODE interface"); if (pDIW->lpVtbl->EnumDevices) { EnumDevicesW = pDIW->lpVtbl->EnumDevices; @@ -305,7 +305,7 @@ void CreateHooks(REFIID riidltf, LPVOID *realDI) extern "C" HRESULT WINAPI DirectInput8Create(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPVOID *ppvOut, LPUNKNOWN punkOuter) { - OutputDebugString(L"devreorder: Calling hooked DirectInput8Create"); + PrintLog("devreorder: Calling hooked DirectInput8Create"); HRESULT hr = DirectInputModuleManager::Get().DirectInput8Create(hinst, dwVersion, riidltf, ppvOut, punkOuter); if (hr != DI_OK) return hr; @@ -322,6 +322,7 @@ extern "C" HRESULT WINAPI DllCanUnloadNow(void) extern "C" HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID FAR* ppv) { + PrintLog("devreorder: Calling hooked DllGetClassObject"); IClassFactory *cf; HRESULT hr = DirectInputModuleManager::Get().DllGetClassObject(rclsid, riid, (void**)&cf); diff --git a/dinput8/dinput8.h b/dinput8/dinput8.h index eed6813..2c2aa9b 100644 --- a/dinput8/dinput8.h +++ b/dinput8/dinput8.h @@ -27,13 +27,13 @@ void IH_CreateHookF(LPVOID pTarget, LPVOID pDetour, N* ppOriginal, const char* p { if (*ppOriginal) return; MH_STATUS status = MH_CreateHook(pTarget, pDetour, reinterpret_cast(ppOriginal)); - PrintLog("CreateHook %s status %s", pTargetName, MH_StatusToString(status)); + PrintLog("devreorder: CreateHook %s status %s", pTargetName, MH_StatusToString(status)); } inline void IH_EnableHookF(LPVOID pTarget, const char* pTargetName) { MH_STATUS status = MH_EnableHook(pTarget); - PrintLog("EnableHook %s status %s", pTargetName, MH_StatusToString(status)); + PrintLog("devreorder: EnableHook %s status %s", pTargetName, MH_StatusToString(status)); } #define IH_CreateHook(pTarget, pDetour, ppOrgiginal) IH_CreateHookF(pTarget, pDetour, ppOrgiginal, #pTarget)