XInput_Scp/XInput_Wrap.cpp (154 lines of code) (raw):

#include "StdAfx.h" #define XINPUT_FUNCTIONS 11 static BOOL l_bInited = false; static HMODULE l_hXInputDll = NULL; static FARPROC l_hXInputFunc[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; typedef DWORD (WINAPI *XInputGetStateFunction)(__in DWORD dwUserIndex, __out XINPUT_STATE* pState); typedef DWORD (WINAPI *XInputSetStateFunction)(__in DWORD dwUserIndex, __in XINPUT_VIBRATION* pVibration); typedef DWORD (WINAPI *XInputGetCapabilitiesFunction)(__in DWORD dwUserIndex, __in DWORD dwFlags, __out XINPUT_CAPABILITIES* pCapabilities); typedef void (WINAPI *XInputEnableFunction)(__in BOOL enable); typedef DWORD (WINAPI *XInputGetDSoundAudioDeviceGuidsFunction)(__in DWORD dwUserIndex, __out GUID* pDSoundRenderGuid, __out GUID* pDSoundCaptureGuid); typedef DWORD (WINAPI *XInputGetBatteryInformationFunction)(__in DWORD dwUserIndex, __in BYTE devType, __out XINPUT_BATTERY_INFORMATION* pBatteryInformation); typedef DWORD (WINAPI *XInputGetKeystrokeFunction)(__in DWORD dwUserIndex, __reserved DWORD dwReserved, __out PXINPUT_KEYSTROKE pKeystroke); // UNDOCUMENTED typedef DWORD (WINAPI *XInputGetStateExFunction)(__in DWORD dwUserIndex, __out XINPUT_STATE* pState); typedef DWORD (WINAPI *InputWaitForGuideButtonFunction)(__in DWORD dwUserIndex, __in DWORD dwFlag, __out LPVOID pVoid); typedef DWORD (WINAPI *XInputCancelGuideButtonWaitFunction)(__in DWORD dwUserIndex); typedef DWORD (WINAPI *XInputPowerOffControllerFunction)(__in DWORD dwUserIndex); BOOL WINAPI WRAP_LoadXInput ( __in BOOL enable ) { if (enable && !l_bInited) { TCHAR libdir[MAX_PATH]; GetSystemDirectory(libdir, MAX_PATH); _stprintf_s(libdir, _T("%s\\XInput1_3.dll"), libdir); if ((l_hXInputDll = LoadLibrary(libdir)) != NULL) { l_hXInputFunc[ 0] = GetProcAddress(l_hXInputDll, "XInputGetState"); l_hXInputFunc[ 1] = GetProcAddress(l_hXInputDll, "XInputSetState"); l_hXInputFunc[ 2] = GetProcAddress(l_hXInputDll, "XInputGetCapabilities"); l_hXInputFunc[ 3] = GetProcAddress(l_hXInputDll, "XInputEnable"); l_hXInputFunc[ 4] = GetProcAddress(l_hXInputDll, "XInputGetDSoundAudioDeviceGuids"); l_hXInputFunc[ 5] = GetProcAddress(l_hXInputDll, "XInputGetBatteryInformation"); l_hXInputFunc[ 6] = GetProcAddress(l_hXInputDll, "XInputGetKeystroke"); l_hXInputFunc[ 7] = GetProcAddress(l_hXInputDll, (LPCSTR) 100); // XInputGetStateEx l_hXInputFunc[ 8] = GetProcAddress(l_hXInputDll, (LPCSTR) 101); // XInputWaitForGuideButton l_hXInputFunc[ 9] = GetProcAddress(l_hXInputDll, (LPCSTR) 102); // XInputCancelGuideButtonWait l_hXInputFunc[10] = GetProcAddress(l_hXInputDll, (LPCSTR) 103); // XInputPowerOffController l_bInited = true; } } else if (!enable && l_bInited) { for (int i = 0; i < XINPUT_FUNCTIONS; i++) l_hXInputFunc[i] = NULL; if (l_hXInputDll) { FreeLibrary(l_hXInputDll); l_hXInputDll = NULL; } l_bInited = false; } return true; } DWORD WINAPI WRAP_XInputGetState ( __in DWORD dwUserIndex, // Index of the gamer associated with the device __out XINPUT_STATE* pState // Receives the current state ) { if (!l_bInited || !l_hXInputFunc[0]) return ERROR_DEVICE_NOT_CONNECTED; return ((XInputGetStateFunction)(l_hXInputFunc[0]))(dwUserIndex, pState); } DWORD WINAPI WRAP_XInputSetState ( __in DWORD dwUserIndex, // Index of the gamer associated with the device __in XINPUT_VIBRATION* pVibration // The vibration information to send to the controller ) { if (!l_bInited || !l_hXInputFunc[1]) return ERROR_DEVICE_NOT_CONNECTED; return ((XInputSetStateFunction)(l_hXInputFunc[1]))(dwUserIndex, pVibration); } DWORD WINAPI WRAP_XInputGetCapabilities ( __in DWORD dwUserIndex, // Index of the gamer associated with the device __in DWORD dwFlags, // Input flags that identify the device type __out XINPUT_CAPABILITIES* pCapabilities // Receives the capabilities ) { if (!l_bInited || !l_hXInputFunc[2]) return ERROR_DEVICE_NOT_CONNECTED; return ((XInputGetCapabilitiesFunction)(l_hXInputFunc[2]))(dwUserIndex, dwFlags, pCapabilities); } void WINAPI WRAP_XInputEnable ( __in BOOL enable // [in] Indicates whether xinput is enabled or disabled. ) { if (!l_bInited || !l_hXInputFunc[3]) return; return ((XInputEnableFunction)(l_hXInputFunc[3]))(enable); } DWORD WINAPI WRAP_XInputGetDSoundAudioDeviceGuids ( __in DWORD dwUserIndex, // Index of the gamer associated with the device __out GUID* pDSoundRenderGuid, // DSound device ID for render __out GUID* pDSoundCaptureGuid // DSound device ID for capture ) { if (!l_bInited || !l_hXInputFunc[4]) return ERROR_DEVICE_NOT_CONNECTED; return ((XInputGetDSoundAudioDeviceGuidsFunction)(l_hXInputFunc[4]))(dwUserIndex, pDSoundRenderGuid, pDSoundCaptureGuid); } DWORD WINAPI WRAP_XInputGetBatteryInformation ( __in DWORD dwUserIndex, // Index of the gamer associated with the device __in BYTE devType, // Which device on this user index __out XINPUT_BATTERY_INFORMATION* pBatteryInformation // Contains the level and types of batteries ) { if (!l_bInited || !l_hXInputFunc[5]) return ERROR_DEVICE_NOT_CONNECTED; return ((XInputGetBatteryInformationFunction)(l_hXInputFunc[5]))(dwUserIndex, devType, pBatteryInformation); } DWORD WINAPI WRAP_XInputGetKeystroke ( __in DWORD dwUserIndex, // Index of the gamer associated with the device __reserved DWORD dwReserved, // Reserved for future use __out PXINPUT_KEYSTROKE pKeystroke // Pointer to an XINPUT_KEYSTROKE structure that receives an input event. ) { if (!l_bInited || !l_hXInputFunc[6]) return ERROR_DEVICE_NOT_CONNECTED; return ((XInputGetKeystrokeFunction)(l_hXInputFunc[6]))(dwUserIndex, dwReserved, pKeystroke); } // UNDOCUMENTED DWORD WINAPI WRAP_XInputGetStateEx ( __in DWORD dwUserIndex, // Index of the gamer associated with the device __out XINPUT_STATE* pState // Receives the current state + the Guide/Home button ) { if (!l_bInited || !l_hXInputFunc[7]) return ERROR_DEVICE_NOT_CONNECTED; return ((XInputGetStateExFunction)(l_hXInputFunc[7]))(dwUserIndex, pState); } DWORD WINAPI WRAP_XInputWaitForGuideButton ( __in DWORD dwUserIndex, // Index of the gamer associated with the device __in DWORD dwFlag, // ??? __out LPVOID pVoid // ??? ) { if (!l_bInited || !l_hXInputFunc[8]) return ERROR_DEVICE_NOT_CONNECTED; return ((InputWaitForGuideButtonFunction)(l_hXInputFunc[8]))(dwUserIndex, dwFlag, pVoid); } DWORD WINAPI WRAP_XInputCancelGuideButtonWait ( __in DWORD dwUserIndex // Index of the gamer associated with the device ) { if (!l_bInited || !l_hXInputFunc[9]) return ERROR_DEVICE_NOT_CONNECTED; return ((XInputCancelGuideButtonWaitFunction)(l_hXInputFunc[9]))(dwUserIndex); } DWORD WINAPI WRAP_XInputPowerOffController ( __in DWORD dwUserIndex // Index of the gamer associated with the device ) { if (!l_bInited || !l_hXInputFunc[10]) return ERROR_DEVICE_NOT_CONNECTED; return ((XInputPowerOffControllerFunction)(l_hXInputFunc[10]))(dwUserIndex); }