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
2034SOCKET sock;
2135struct sockaddr_in addr;
2236XINPUT_STATE lastSentInputStates[XUSER_MAX_COUNT];
2337time_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
2581void 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
64120void 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