Skip to content

Commit ab1b4f5

Browse files
committed
GamePads depended By Client Mac Address and Xbox controller Index Id
1 parent d1c2bdf commit ab1b4f5

3 files changed

Lines changed: 169 additions & 63 deletions

File tree

NetInput.Capture/NetInput.Capture.cpp

Lines changed: 86 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,44 +12,100 @@
1212
#include <string>
1313
#include <stdint.h>
1414
#include <fstream>
15+
#include <nb30.h>
16+
#pragma comment(lib, "Netapi32.lib")
1517

16-
#define PAD_OUT_SIZE 5
17-
#define PAD_ONLINE 0x00
18-
#define PAD_VIBRA 0x01
18+
typedef struct _ASTAT_
19+
{
20+
ADAPTER_STATUS adapt;
21+
NAME_BUFFER NameBuff[30];
22+
} ASTAT, * PASTAT;
23+
24+
25+
#define PAD_SERVER_SIZE 5
26+
#define PAD_CLIENT_SIZE 24
27+
28+
#define PAD_ONLINE 0x00u
29+
#define PAD_VIBRA 0x01u
30+
#define PAD_REG 0x03u
31+
#define PAD_STATE 0x04u
32+
#define PAD_RESET 0xFFu
1933

2034
SOCKET sock;
2135
struct sockaddr_in addr;
2236
XINPUT_STATE lastSentInputStates[XUSER_MAX_COUNT];
2337
time_t updatetime[XUSER_MAX_COUNT];
38+
uint8_t hmac[6];
39+
40+
void getMac()
41+
{
42+
ASTAT Adapter;
43+
NCB Ncb;
44+
UCHAR uRetCode;
45+
LANA_ENUM lenum;
46+
int i = 0;
47+
48+
memset(&Ncb, 0, sizeof(Ncb));
49+
Ncb.ncb_command = NCBENUM;
50+
Ncb.ncb_buffer = (UCHAR*)&lenum;
51+
Ncb.ncb_length = sizeof(lenum);
52+
53+
uRetCode = Netbios(&Ncb);
54+
55+
for (i = 0; i < lenum.length; i++)
56+
{
57+
memset(&Ncb, 0, sizeof(Ncb));
58+
Ncb.ncb_command = NCBRESET;
59+
Ncb.ncb_lana_num = lenum.lana[i];
60+
uRetCode = Netbios(&Ncb);
61+
62+
memset(&Ncb, 0, sizeof(Ncb));
63+
Ncb.ncb_command = NCBASTAT;
64+
Ncb.ncb_lana_num = lenum.lana[i];
65+
strcpy_s((char*)Ncb.ncb_callname, sizeof(Ncb.ncb_callname), "*");
66+
Ncb.ncb_buffer = (unsigned char*)&Adapter;
67+
Ncb.ncb_length = sizeof(Adapter);
68+
uRetCode = Netbios(&Ncb);
69+
70+
if (uRetCode == 0)
71+
{
72+
for (int j = 0; j < sizeof(hmac); j++) {
73+
hmac[j] = int(Adapter.adapt.adapter_address[j]);
74+
}
75+
break;
76+
}
77+
}
78+
}
79+
2480

2581
void CheckControllerMessage()
2682
{
2783
while (true)
2884
{
29-
char packet[PAD_OUT_SIZE];
85+
char packet[PAD_SERVER_SIZE];
3086
int addr_size = sizeof(addr);
3187
int bytesReceived = recvfrom(sock, (char*)&packet, sizeof(packet), 0, (struct sockaddr*)&addr, &addr_size);
3288

33-
if (bytesReceived == PAD_OUT_SIZE){
89+
if (bytesReceived == PAD_SERVER_SIZE){
3490
uint8_t i = (uint8_t)packet[1];
3591
if ((i >= 0) && (i < XUSER_MAX_COUNT)) {
36-
if (packet[0] == PAD_ONLINE) {
92+
if (packet[0] == (uint8_t)PAD_ONLINE) {
3793
XINPUT_VIBRATION Vibration;
3894

3995
uint8_t pindex = (uint8_t)packet[4];
4096
Vibration.wLeftMotorSpeed = 0;
4197
Vibration.wRightMotorSpeed = -1;
4298
XInputSetState(i, &Vibration);
4399

44-
printf("Get Local controller %u as Online controller %u.\n", i,pindex);
100+
printf("Connected client controller %u to server controller %u.\n", i,pindex);
45101
std::this_thread::sleep_for(std::chrono::milliseconds(250));
46102

47103
Vibration.wLeftMotorSpeed = 0;
48104
Vibration.wRightMotorSpeed = 0;
49105
XInputSetState(i, &Vibration);
50106

51107
}
52-
else if (packet[0] == PAD_VIBRA) {
108+
else if (packet[0] == (uint8_t)PAD_VIBRA) {
53109
XINPUT_VIBRATION Vibration;
54110
Vibration.wLeftMotorSpeed = packet[2] << 8;
55111
Vibration.wRightMotorSpeed = packet[3] << 8;
@@ -63,7 +119,9 @@ void CheckControllerMessage()
63119

64120
void SendResetControllers()
65121
{
66-
uint8_t packet[] = { 0xFFu };
122+
uint8_t packet[1+sizeof(hmac)];
123+
packet[0] = (uint8_t)PAD_RESET;
124+
memcpy(packet + 1, &hmac, sizeof(hmac));
67125
if (sendto(sock, (const char*)&packet, sizeof(packet), 0, (struct sockaddr*)&addr, sizeof(addr)) != sizeof(packet))
68126
printf("Failed to send reset message.\n");
69127
}
@@ -79,22 +137,29 @@ void PollControllers()
79137

80138
if (time(NULL) - updatetime[i] >= 5)
81139
{
82-
uint8_t packet[] = { 0xFEu ,i };
140+
uint8_t packet[sizeof(hmac)+2];
141+
packet[0] = (uint8_t)PAD_REG;
142+
packet[1] = (uint8_t)i;
143+
memcpy(packet + 2, &hmac, sizeof(hmac));
83144
if (sendto(sock, (const char*)&packet, sizeof(packet), 0, (struct sockaddr*)&addr, sizeof(addr)) != sizeof(packet))
84-
printf("Failed to CheckUpdateTimeOut!\n");
145+
printf("Failed to checktimeOut of client controller %u .\n",i);
85146
updatetime[i] = time(NULL);
86147
}
87148

88149
if (memcmp(lastSentInputStates + i, &state, sizeof(XINPUT_STATE)) == 0)
89150
continue;
90151

91-
uint8_t packet[sizeof(XINPUT_STATE) + 1];
92-
packet[0] = (uint8_t)i;
93-
memcpy(packet + 1, &state, sizeof(XINPUT_STATE));
152+
uint8_t packet[PAD_CLIENT_SIZE];
153+
154+
packet[0] = (uint8_t)PAD_STATE;
155+
packet[1] = (uint8_t)i;
156+
157+
memcpy(packet + 2, &hmac, sizeof(hmac));
158+
memcpy(packet + sizeof(hmac) + 2, &state, sizeof(XINPUT_STATE));
94159
memcpy(lastSentInputStates + i, &state, sizeof(XINPUT_STATE));
95160

96161
if (sendto(sock, (const char*)&packet, sizeof(packet), 0, (struct sockaddr*)&addr, sizeof(addr)) != sizeof(packet))
97-
printf("Failed to send update message of controller %u.\n", i);
162+
printf("Failed to send update message of client controller %u.\n", i);
98163
}
99164
}
100165

@@ -131,12 +196,14 @@ int main(int argc, char* argv[])
131196
return -1;
132197
}
133198

134-
printf("Target is %s:%d.\n", ip.c_str(),port);
199+
printf("Connected to server %s:%d.\n", ip.c_str(),port);
135200

136201
CoInitialize(NULL);
137-
138-
printf("Starting networking...\n");
139-
202+
203+
getMac();
204+
printf("Starting networking at %02X:%02X:%02X:%02X:%02X:%02X ...\n",
205+
hmac[0], hmac[1], hmac[2], hmac[3], hmac[4], hmac[5]);
206+
140207
WSADATA wsaData;
141208
int wsaStartupResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
142209
if (wsaStartupResult != 0)
@@ -155,9 +222,6 @@ int main(int argc, char* argv[])
155222
addr.sin_family = AF_INET;
156223
addr.sin_port = htons(port);
157224

158-
printf("Sending reset...\n");
159-
SendResetControllers();
160-
printf("Done.\n");
161225
printf("Waiting for gamepad input, press Ctrl+C to exit...\n");
162226

163227
std::thread message(CheckControllerMessage); // new thread for message

0 commit comments

Comments
 (0)