Skip to content

Commit fe66435

Browse files
committed
Update
1 parent f46bd48 commit fe66435

File tree

8 files changed

+445
-0
lines changed

8 files changed

+445
-0
lines changed

NexInput_1.0/NexInput.cpp

Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,246 @@
1+
//=================== Nex Input ===================
2+
//========== https://github.com/NexInput ==========
3+
4+
#include "stdafx.h"
5+
#include <atlstr.h>
6+
#include <Windows.h>
7+
8+
#define DLLEXPORT extern "C" __declspec(dllexport)
9+
10+
#define NEX_GAMEPAD_DPAD_UP 0x0001
11+
#define NEX_GAMEPAD_DPAD_DOWN 0x0002
12+
#define NEX_GAMEPAD_DPAD_LEFT 0x0004
13+
#define NEX_GAMEPAD_DPAD_RIGHT 0x0008
14+
#define NEX_GAMEPAD_START 0x0010
15+
#define NEX_GAMEPAD_BACK 0x0020
16+
#define NEX_GAMEPAD_LEFT_THUMB 0x0040
17+
#define NEX_GAMEPAD_RIGHT_THUMB 0x0080
18+
#define NEX_GAMEPAD_LEFT_SHOULDER 0x0100
19+
#define NEX_GAMEPAD_RIGHT_SHOULDER 0x0200
20+
#define NEX_GAMEPAD_A 0x1000
21+
#define NEX_GAMEPAD_B 0x2000
22+
#define NEX_GAMEPAD_X 0x4000
23+
#define NEX_GAMEPAD_Y 0x8000
24+
25+
#define NEX_CONTROLLER_WIRED 0
26+
#define NEX_CONTROLLER_WIRELESS 1
27+
#define NEX_BATTERY_NONE 0
28+
#define NEX_BATTERY_LOW 1
29+
#define NEX_BATTERY_FULL 5
30+
31+
#define NEX_INPUT_MAX_COUNT 4
32+
33+
#define ERROR_DEVICE_NOT_CONNECTED 1
34+
#define ERROR_SUCCESS 0
35+
36+
typedef struct _NEX_INPUT_STATE
37+
{
38+
WORD Buttons;
39+
BYTE LeftTrigger;
40+
BYTE RightTrigger;
41+
SHORT AxisLX;
42+
SHORT AxisLY;
43+
SHORT AxisRX;
44+
SHORT AxisRY;
45+
bool SupportRotation;
46+
float Yaw;
47+
float Pitch;
48+
float Roll;
49+
} NEX_INPUT_STATE, *PNEX_INPUT_STATE;
50+
51+
typedef struct _NEX_OUTPUT_STATE
52+
{
53+
WORD LeftMotorSpeed;
54+
WORD RightMotorSpeed;
55+
bool UseLed;
56+
BYTE LEDRed;
57+
BYTE LEDGreen;
58+
BYTE LEDBlue;
59+
} NEX_OUTPUT_STATE, *PNEX_OUTPUT_STATE;
60+
61+
#define NEX_UNKNOWN_CONTROLLER 0;
62+
63+
#define MICROSOFT_XBOX_360_CONTROLLER 1;
64+
#define MICROSOFT_XBOX_ONE_CONTROLLER 2;
65+
66+
#define SONY_DUALSHOCK_3_CONTROLLER 26;
67+
#define SONY_DUALSHOCK_4_CONTROLLER 27;
68+
69+
#define NINTENDO_SWITCH_PRO_CONTROLLER 51;
70+
71+
typedef struct _NEX_CONTROLLER_INFO
72+
{
73+
WORD ControllerType;
74+
BYTE ConnectType;
75+
BYTE BatteryLevel;
76+
} NEX_CONTROLLER_INFO, *PNEX_CONTROLLER_INFO;
77+
78+
typedef DWORD(__stdcall *_NEXInputGetState)(__in DWORD dwUserIndex, __out NEX_INPUT_STATE *pInputState);
79+
typedef DWORD(__stdcall *_NEXInputSetState)(__in DWORD dwUserIndex, __in NEX_OUTPUT_STATE *pOutputState);
80+
typedef DWORD(__stdcall *_NEXInputGetInfo)(__in DWORD dwUserIndex, __out NEX_CONTROLLER_INFO *pControllerInfo);
81+
typedef DWORD(__stdcall *_NEXInputPowerOff)(__in DWORD dwUserIndex);
82+
83+
_NEXInputGetState DriverNEXInputGetState[5];
84+
_NEXInputSetState DriverNEXInputSetState[5];
85+
_NEXInputGetInfo DriverNEXInputGetInfo[5];
86+
_NEXInputPowerOff DriverNEXInputPowerOff[5];
87+
88+
HMODULE DriverDll[5];
89+
BYTE DriverDllCount = 0;
90+
BYTE NexInputCount = 0;
91+
92+
typedef struct
93+
{
94+
BYTE DllIndex, ControllerIndex;
95+
} _DriverIndex;
96+
97+
_DriverIndex DriverControllerIndex[4];
98+
99+
void Init() {
100+
WIN32_FIND_DATA ffd;
101+
HANDLE hFind = INVALID_HANDLE_VALUE;
102+
103+
CRegKey key;
104+
TCHAR driversPath[MAX_PATH] = { 0 };
105+
TCHAR _driversPath[MAX_PATH] = { 0 };
106+
107+
LONG status = key.Open(HKEY_CURRENT_USER, _T("Software\\NexInput"));
108+
if (status == ERROR_SUCCESS)
109+
{
110+
ULONG regSize = sizeof(driversPath);
111+
112+
#ifdef _WIN64
113+
status = key.QueryStringValue(_T("Drivers64"), driversPath, &regSize);
114+
#else
115+
status = key.QueryStringValue(_T("Drivers32"), driversPath, &regSize);
116+
#endif
117+
_tcscpy_s(_driversPath, driversPath);
118+
}
119+
key.Close();
120+
121+
if (status == ERROR_SUCCESS) {
122+
123+
_tcscat_s(_driversPath, sizeof(_driversPath), _T("*.dll"));
124+
125+
//Search drivers
126+
hFind = FindFirstFile(_driversPath, &ffd);
127+
128+
bool FoundNewDriver;
129+
130+
if (INVALID_HANDLE_VALUE != hFind)
131+
do
132+
{
133+
TCHAR driverPath[MAX_PATH] = { 0 };
134+
_tcscpy_s(driverPath, driversPath);
135+
136+
if ((ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == false)
137+
{
138+
_tcscat_s(driverPath, sizeof(driverPath), ffd.cFileName);
139+
140+
DriverDll[0] = LoadLibrary(driverPath);
141+
if (DriverDll[0] != NULL) {
142+
DriverNEXInputGetState[0] = (_NEXInputGetState)GetProcAddress(DriverDll[0], "NEXInputGetState");
143+
144+
//Search connected gamepads
145+
NEX_INPUT_STATE DriverInputState;
146+
FoundNewDriver = true;
147+
if (DriverNEXInputGetState != NULL)
148+
for (int i = 0; i < NEX_INPUT_MAX_COUNT; i++)
149+
150+
//If found the connected gamepad then adding driver
151+
if (DriverNEXInputGetState[0](i, &DriverInputState) == ERROR_SUCCESS)
152+
{
153+
if (FoundNewDriver) { //Add new driver only 1 time.
154+
FoundNewDriver = false;
155+
DriverDllCount += 1;
156+
DriverDll[DriverDllCount] = LoadLibrary(driverPath);
157+
DriverNEXInputGetState[DriverDllCount] = (_NEXInputGetState)GetProcAddress(DriverDll[DriverDllCount], "NEXInputGetState");
158+
DriverNEXInputSetState[DriverDllCount] = (_NEXInputSetState)GetProcAddress(DriverDll[DriverDllCount], "NEXInputSetState");
159+
DriverNEXInputGetInfo[DriverDllCount] = (_NEXInputGetInfo)GetProcAddress(DriverDll[DriverDllCount], "NEXInputGetInfo");
160+
DriverNEXInputPowerOff[DriverDllCount] = (_NEXInputPowerOff)GetProcAddress(DriverDll[DriverDllCount], "NEXInputPowerOff");
161+
}
162+
163+
//Adding addressing
164+
DriverControllerIndex[NexInputCount].DllIndex = DriverDllCount;
165+
DriverControllerIndex[NexInputCount].ControllerIndex = i;
166+
NexInputCount += 1;
167+
}
168+
169+
FreeLibrary(DriverDll[0]);
170+
DriverDll[0] = nullptr;
171+
}
172+
173+
}
174+
} while (FindNextFile(hFind, &ffd) != 0);
175+
176+
FindClose(hFind);
177+
}
178+
}
179+
180+
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
181+
{
182+
switch (ul_reason_for_call)
183+
{
184+
case DLL_PROCESS_ATTACH: {
185+
Init();
186+
break;
187+
}
188+
189+
case DLL_PROCESS_DETACH: {
190+
for (int i = 1; i < DriverDllCount + 1; i++)
191+
if (DriverDll[i] != NULL) {
192+
FreeLibrary(DriverDll[i]);
193+
DriverDll[i] = nullptr;
194+
}
195+
break;
196+
}
197+
}
198+
return true;
199+
}
200+
201+
DLLEXPORT DWORD __stdcall NEXInputGetState(__in DWORD dwUserIndex, __out NEX_INPUT_STATE *pInputState)
202+
{
203+
pInputState->Buttons = 0;
204+
pInputState->RightTrigger = 0;
205+
pInputState->LeftTrigger = 0;
206+
pInputState->AxisLX = 0;
207+
pInputState->AxisLY = 0;
208+
pInputState->AxisRX = 0;
209+
pInputState->AxisRY = 0;
210+
pInputState->Yaw = 0;
211+
pInputState->Pitch = 0;
212+
pInputState->Roll = 0;
213+
pInputState->SupportRotation = false;
214+
if (dwUserIndex < NexInputCount)
215+
return DriverNEXInputGetState[DriverControllerIndex[dwUserIndex].DllIndex](DriverControllerIndex[dwUserIndex].ControllerIndex, pInputState);
216+
else
217+
return ERROR_DEVICE_NOT_CONNECTED;
218+
}
219+
220+
DLLEXPORT DWORD __stdcall NEXInputSetState(__in DWORD dwUserIndex, __in NEX_OUTPUT_STATE *pOutputState)
221+
{
222+
if (dwUserIndex < NexInputCount)
223+
return DriverNEXInputSetState[DriverControllerIndex[dwUserIndex].DllIndex](DriverControllerIndex[dwUserIndex].ControllerIndex, pOutputState);
224+
else
225+
return ERROR_DEVICE_NOT_CONNECTED;
226+
}
227+
228+
DLLEXPORT DWORD __stdcall NEXInputGetInfo(__in DWORD dwUserIndex, __out NEX_CONTROLLER_INFO *pControllerInfo)
229+
{
230+
pControllerInfo->ControllerType = NEX_UNKNOWN_CONTROLLER;
231+
pControllerInfo->ConnectType = NEX_CONTROLLER_WIRED;
232+
pControllerInfo->BatteryLevel = NEX_BATTERY_NONE;
233+
234+
if (dwUserIndex < NexInputCount)
235+
return DriverNEXInputGetInfo[DriverControllerIndex[dwUserIndex].DllIndex](DriverControllerIndex[dwUserIndex].ControllerIndex, pControllerInfo);
236+
else
237+
return ERROR_DEVICE_NOT_CONNECTED;
238+
}
239+
240+
DLLEXPORT DWORD __stdcall NEXInputPowerOff(__in DWORD dwUserIndex)
241+
{
242+
if (dwUserIndex < NexInputCount)
243+
return DriverNEXInputPowerOff[DriverControllerIndex[dwUserIndex].DllIndex](DriverControllerIndex[dwUserIndex].ControllerIndex);
244+
else
245+
return ERROR_DEVICE_NOT_CONNECTED;
246+
}

NexInput_1.0/NexInput.def

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
LIBRARY NexInput
2+
EXPORTS
3+
NEXInputGetState @1
4+
NEXInputSetState @2
5+
NEXInputGetInfo @3
6+
NEXInputPowerOff @4

0 commit comments

Comments
 (0)