ReactOS 0.4.16-dev-1163-gec5b142
dhcpcsvc.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/dhcpcapi/dhcpcapi.c
5 * PURPOSE: Client API for DHCP
6 * COPYRIGHT: Copyright 2005 Art Yerkes <ayerkes@speakeasy.net>
7 */
8
9#include <rosdhcp.h>
10#include <winsvc.h>
11
12#define NDEBUG
13#include <debug.h>
14
15static WCHAR ServiceName[] = L"DHCP";
16
21
23extern SOCKET DhcpSocket;
24
27{
28 DWORD PipeMode;
29
30 /* Wait for the pipe to be available */
32 {
33 /* No good, we failed */
34 return GetLastError();
35 }
36
37 /* It's available, let's try to open it */
41 NULL,
43 0,
44 NULL);
45
46 /* Check if we succeeded in opening the pipe */
48 {
49 /* We didn't */
50 return GetLastError();
51 }
52
53 /* Change the pipe into message mode */
54 PipeMode = PIPE_READMODE_MESSAGE;
56 {
57 /* Mode change failed */
60 return GetLastError();
61 }
62 else
63 {
64 /* We're good to go */
65 *Version = 2;
66 return NO_ERROR;
67 }
68}
69
72{
75}
76
77
78/* FIXME: The adapter name should be a unicode string */
83{
84 COMM_DHCP_REQ Req;
85 COMM_DHCP_REPLY Reply;
88
89 DPRINT1("DhcpAcquireParameters(%s)\n", AdapterName);
90
92
94 strcpy(Req.Body.AcquireParams.AdapterName, AdapterName);
95
97 &Req, sizeof(Req),
98 &Reply, sizeof(Reply),
99 &BytesRead, NULL);
100 if (!Result)
101 {
102 /* Pipe transaction failed */
103 return GetLastError();
104 }
105
106 return Reply.Reply;
107}
108
109/* FIXME: The adapter name should be a unicode string */
110DWORD
114{
115 COMM_DHCP_REQ Req;
116 COMM_DHCP_REPLY Reply;
118 BOOL Result;
119
120 DPRINT1("DhcpReleaseParameters(%s)\n", AdapterName);
121
123
125 strcpy(Req.Body.AcquireParams.AdapterName, AdapterName);
126
128 &Req, sizeof(Req),
129 &Reply, sizeof(Reply),
130 &BytesRead, NULL);
131 if (!Result)
132 {
133 /* Pipe transaction failed */
134 return GetLastError();
135 }
136
137 return Reply.Reply;
138}
139
142 PDWORD MediaType,
143 PDWORD Mtu,
144 PDWORD Speed)
145{
146 COMM_DHCP_REQ Req;
147 COMM_DHCP_REPLY Reply;
149 BOOL Result;
150
152
154 Req.AdapterIndex = AdapterIndex;
155
157 &Req, sizeof(Req),
158 &Reply, sizeof(Reply),
159 &BytesRead, NULL);
160 if (!Result)
161 {
162 /* Pipe transaction failed */
163 return 0;
164 }
165
166 if (Reply.Reply == 0)
167 return 0;
168
169 *MediaType = Reply.QueryHWInfo.MediaType;
170 *Mtu = Reply.QueryHWInfo.Mtu;
171 *Speed = Reply.QueryHWInfo.Speed;
172 return 1;
173}
174
177{
178 COMM_DHCP_REQ Req;
179 COMM_DHCP_REPLY Reply;
181 BOOL Result;
182
184
186 Req.AdapterIndex = AdapterIndex;
187
189 &Req, sizeof(Req),
190 &Reply, sizeof(Reply),
191 &BytesRead, NULL);
192 if (!Result)
193 {
194 /* Pipe transaction failed */
195 return 0;
196 }
197
198 return Reply.Reply;
199}
200
203{
204 COMM_DHCP_REQ Req;
205 COMM_DHCP_REPLY Reply;
207 BOOL Result;
208
210
212 Req.AdapterIndex = AdapterIndex;
213
215 &Req, sizeof(Req),
216 &Reply, sizeof(Reply),
217 &BytesRead, NULL);
218 if (!Result)
219 {
220 /* Pipe transaction failed */
221 return 0;
222 }
223
224 return Reply.Reply;
225}
226
229{
230 COMM_DHCP_REQ Req;
231 COMM_DHCP_REPLY Reply;
233 BOOL Result;
234
236
238 Req.AdapterIndex = AdapterIndex;
239
241 &Req, sizeof(Req),
242 &Reply, sizeof(Reply),
243 &BytesRead, NULL);
244 if (!Result)
245 {
246 /* Pipe transaction failed */
247 return 0;
248 }
249
250 return Reply.Reply;
251}
252
256 DWORD Netmask)
257{
258 COMM_DHCP_REQ Req;
259 COMM_DHCP_REPLY Reply;
261 BOOL Result;
262
264
266 Req.AdapterIndex = AdapterIndex;
267 Req.Body.StaticRefreshParams.IPAddress = Address;
268 Req.Body.StaticRefreshParams.Netmask = Netmask;
269
271 &Req, sizeof(Req),
272 &Reply, sizeof(Reply),
273 &BytesRead, NULL);
274 if (!Result)
275 {
276 /* Pipe transaction failed */
277 return 0;
278 }
279
280 return Reply.Reply;
281}
282
313 BOOL NewIpAddress,
314 DWORD IpIndex,
315 DWORD IpAddress,
316 DWORD SubnetMask,
317 INT DhcpAction)
318{
319 DPRINT1("DHCPCSVC: DhcpNotifyConfigChange not implemented yet\n");
320 return 0;
321}
322
327 LPDHCPCAPI_CLASSID ClassId,
328 DHCPCAPI_PARAMS_ARRAY SendParams,
329 DHCPCAPI_PARAMS_ARRAY RecdParams,
331 LPDWORD pSize,
332 LPWSTR RequestIdStr)
333{
335 return 0;
336}
337
338static VOID
340{
343
344 if (dwState == SERVICE_RUNNING)
346 else
348
352
353 if (dwState == SERVICE_START_PENDING ||
354 dwState == SERVICE_STOP_PENDING)
356 else
358
361}
362
363static DWORD WINAPI
365 DWORD dwEventType,
366 LPVOID lpEventData,
367 LPVOID lpContext)
368{
369 switch (dwControl)
370 {
374 if (hStopEvent != NULL)
376 return ERROR_SUCCESS;
377
381 return ERROR_SUCCESS;
382
383 default:
385 }
386}
387
390{
391 HANDLE hPipeThread = INVALID_HANDLE_VALUE;
392 HANDLE hDiscoveryThread = INVALID_HANDLE_VALUE;
393 DWORD ret;
394
397 NULL);
399 {
400 DPRINT1("DHCPCSVC: Unable to register service control handler (%lx)\n", GetLastError());
401 return;
402 }
403
405
406 /* Create the stop event */
408 if (hStopEvent == NULL)
409 {
411 return;
412 }
413
416 {
419 return;
420 }
421
423
424 if (!init_client())
425 {
426 DbgPrint("DHCPCSVC: init_client() failed!\n");
430 return;
431 }
432
434
435 hPipeThread = PipeInit(hStopEvent);
436 if (hPipeThread == INVALID_HANDLE_VALUE)
437 {
438 DbgPrint("DHCPCSVC: PipeInit() failed!\n");
439 stop_client();
443 return;
444 }
445
446 hDiscoveryThread = StartAdapterDiscovery(hStopEvent);
447 if (hDiscoveryThread == INVALID_HANDLE_VALUE)
448 {
449 DbgPrint("DHCPCSVC: StartAdapterDiscovery() failed!\n");
450 stop_client();
454 return;
455 }
456
457 DH_DbgPrint(MID_TRACE,("DHCP Service Started\n"));
458
460
461 DH_DbgPrint(MID_TRACE,("Going into dispatch()\n"));
462 DH_DbgPrint(MID_TRACE,("DHCPCSVC: DHCP service is starting up\n"));
463
465
466 DH_DbgPrint(MID_TRACE,("DHCPCSVC: DHCP service is shutting down\n"));
467
468 stop_client();
469
470 DPRINT("Wait for pipe thread to close! %p\n", hPipeThread);
471 if (hPipeThread != INVALID_HANDLE_VALUE)
472 {
473 DPRINT("Waiting for pipe thread\n");
474 ret = WaitForSingleObject(hPipeThread, 5000);
475 DPRINT("Done %lx\n", ret);
476 }
477
478 DPRINT("Wait for discovery thread to close! %p\n", hDiscoveryThread);
479 if (hDiscoveryThread != INVALID_HANDLE_VALUE)
480 {
481 DPRINT("Waiting for discovery thread\n");
482 ret = WaitForSingleObject(hDiscoveryThread, 5000);
483 DPRINT("Done %lx\n", ret);
484 }
485
486 DPRINT("Closing events!\n");
489
492
493 CloseHandle(hDiscoveryThread);
494 CloseHandle(hPipeThread);
495
496 DPRINT("Done!\n");
497
499}
500
505{
506 switch (fdwReason)
507 {
510 break;
511
513 break;
514 }
515
516 return TRUE;
517}
518
519/* EOF */
static SERVICE_STATUS_HANDLE(WINAPI *pRegisterServiceCtrlHandlerExA)(LPCSTR
static int argc
Definition: ServiceArgs.c:12
static DWORD const fdwReason
#define DPRINT1
Definition: precomp.h:8
HANDLE StartAdapterDiscovery(HANDLE hStopEvent)
Definition: adapter.c:481
void dispatch(HANDLE hStopEvent)
Definition: dispatch.c:70
HANDLE PipeInit(HANDLE hStopEvent)
Definition: pipe.c:428
#define MID_TRACE
Definition: debug.h:15
#define DH_DbgPrint(_t_, _x_)
Definition: debug.h:49
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
Definition: bufpool.h:45
#define NO_ERROR
Definition: dderror.h:5
#define ERROR_SUCCESS
Definition: deptool.c:10
int init_client(void)
Definition: dhclient.c:111
void stop_client(void)
Definition: dhclient.c:129
void WINAPI DhcpCApiCleanup(void)
Definition: dhcpcsvc.c:71
DWORD APIENTRY DhcpLeaseIpAddress(DWORD AdapterIndex)
Definition: dhcpcsvc.c:176
static WCHAR ServiceName[]
Definition: dhcpcsvc.c:15
static HANDLE PipeHandle
Definition: dhcpcsvc.c:22
HANDLE hAdapterStateChangedEvent
Definition: dhcpcsvc.c:20
SOCKET DhcpSocket
Definition: adapter.c:8
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
Definition: dhcpcsvc.c:502
DWORD APIENTRY DhcpCApiInitialize(LPDWORD Version)
Definition: dhcpcsvc.c:26
VOID WINAPI ServiceMain(DWORD argc, LPWSTR *argv)
Definition: dhcpcsvc.c:389
DWORD APIENTRY DhcpNotifyConfigChange(LPWSTR ServerName, LPWSTR AdapterName, BOOL NewIpAddress, DWORD IpIndex, DWORD IpAddress, DWORD SubnetMask, INT DhcpAction)
Definition: dhcpcsvc.c:311
static DWORD WINAPI ServiceControlHandler(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext)
Definition: dhcpcsvc.c:364
DWORD APIENTRY DhcpReleaseIpAddressLease(DWORD AdapterIndex)
Definition: dhcpcsvc.c:202
static VOID UpdateServiceStatus(DWORD dwState)
Definition: dhcpcsvc.c:339
SERVICE_STATUS_HANDLE ServiceStatusHandle
Definition: dhcpcsvc.c:17
DWORD APIENTRY DhcpStaticRefreshParams(DWORD AdapterIndex, DWORD Address, DWORD Netmask)
Definition: dhcpcsvc.c:254
DWORD APIENTRY DhcpQueryHWInfo(DWORD AdapterIndex, PDWORD MediaType, PDWORD Mtu, PDWORD Speed)
Definition: dhcpcsvc.c:141
HANDLE hStopEvent
Definition: dhcpcsvc.c:19
DWORD APIENTRY DhcpReleaseParameters(_In_ PSTR AdapterName)
Definition: dhcpcsvc.c:112
SERVICE_STATUS ServiceStatus
Definition: dhcpcsvc.c:18
DWORD APIENTRY DhcpRequestParams(DWORD Flags, PVOID Reserved, LPWSTR AdapterName, LPDHCPCAPI_CLASSID ClassId, DHCPCAPI_PARAMS_ARRAY SendParams, DHCPCAPI_PARAMS_ARRAY RecdParams, LPBYTE Buffer, LPDWORD pSize, LPWSTR RequestIdStr)
Definition: dhcpcsvc.c:324
DWORD APIENTRY DhcpAcquireParameters(_In_ PSTR AdapterName)
Definition: dhcpcsvc.c:81
DWORD APIENTRY DhcpRenewIpAddressLease(DWORD AdapterIndex)
Definition: dhcpcsvc.c:228
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define APIENTRY
Definition: api.h:79
#define CloseHandle
Definition: compat.h:739
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define DLL_PROCESS_DETACH
Definition: compat.h:130
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define GENERIC_READ
Definition: compat.h:135
#define CreateFileW
Definition: compat.h:741
#define FILE_SHARE_READ
Definition: compat.h:136
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
#define DbgPrint
Definition: hal.h:12
static IN DWORD IN LPVOID lpvReserved
#define ASSERT(a)
Definition: mode.c:44
#define argv
Definition: mplay32.c:18
#define closesocket
Definition: ncftp.h:477
_Must_inspect_result_ _Out_ PNDIS_STATUS _Out_ PNDIS_STATUS _Out_ PNDIS_HANDLE _Out_ PUINT _In_ UINT _In_ NDIS_HANDLE _In_ NDIS_HANDLE _In_ PNDIS_STRING AdapterName
Definition: ndis.h:6016
#define _In_
Definition: no_sal2.h:158
BOOL WINAPI TransactNamedPipe(IN HANDLE hNamedPipe, IN LPVOID lpInBuffer, IN DWORD nInBufferSize, OUT LPVOID lpOutBuffer, IN DWORD nOutBufferSize, OUT LPDWORD lpBytesRead OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: npipe.c:1315
BOOL WINAPI SetNamedPipeHandleState(HANDLE hNamedPipe, LPDWORD lpMode, LPDWORD lpMaxCollectionCount, LPDWORD lpCollectDataTimeout)
Definition: npipe.c:774
BOOL WINAPI WaitNamedPipeW(LPCWSTR lpNamedPipeName, DWORD nTimeOut)
Definition: npipe.c:458
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define GENERIC_WRITE
Definition: nt_native.h:90
#define L(x)
Definition: ntvdm.h:50
DWORD * PDWORD
Definition: pedump.c:68
static WCHAR Address[46]
Definition: ping.c:68
@ DhcpReqLeaseIpAddress
Definition: rosdhcp_pipe.h:7
@ DhcpReqRenewIpAddress
Definition: rosdhcp_pipe.h:10
@ DhcpReqStaticRefreshParams
Definition: rosdhcp_pipe.h:11
@ DhcpReqAcquireParams
Definition: rosdhcp_pipe.h:5
@ DhcpReqReleaseParams
Definition: rosdhcp_pipe.h:6
@ DhcpReqReleaseIpAddress
Definition: rosdhcp_pipe.h:9
@ DhcpReqQueryHWInfo
Definition: rosdhcp_pipe.h:8
#define DHCP_PIPE_NAME
Definition: rosdhcp_pipe.h:51
SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExW(LPCWSTR lpServiceName, LPHANDLER_FUNCTION_EX lpHandlerProc, LPVOID lpContext)
Definition: sctrl.c:812
BOOL WINAPI SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus, LPSERVICE_STATUS lpServiceStatus)
Definition: sctrl.c:997
strcpy
Definition: string.h:131
#define DPRINT
Definition: sndvol32.h:73
struct _COMM_DHCP_REQ::@32::@33 AcquireParams
DWORD AdapterIndex
Definition: rosdhcp_pipe.h:16
union _COMM_DHCP_REQ::@32 Body
struct _COMM_DHCP_REQ::@32::@37 StaticRefreshParams
DWORD dwServiceType
Definition: winsvc.h:99
DWORD dwWin32ExitCode
Definition: winsvc.h:102
DWORD dwControlsAccepted
Definition: winsvc.h:101
DWORD dwWaitHint
Definition: winsvc.h:105
DWORD dwCurrentState
Definition: winsvc.h:100
DWORD dwCheckPoint
Definition: winsvc.h:104
DWORD dwServiceSpecificExitCode
Definition: winsvc.h:103
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:651
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
char * PSTR
Definition: typedefs.h:51
unsigned char * LPBYTE
Definition: typedefs.h:53
uint32_t * LPDWORD
Definition: typedefs.h:59
int32_t INT
Definition: typedefs.h:58
struct _COMM_DHCP_REPLY::@38 QueryHWInfo
int ret
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
Definition: wdffdo.h:469
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesRead
Definition: wdfiotarget.h:870
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define NMPWAIT_USE_DEFAULT_WAIT
Definition: winbase.h:136
#define CreateEvent
Definition: winbase.h:3780
#define PIPE_READMODE_MESSAGE
Definition: winbase.h:172
_Reserved_ PVOID Reserved
Definition: winddi.h:3974
#define WINAPI
Definition: msvc.h:6
#define INVALID_SOCKET
Definition: winsock.h:332
UINT_PTR SOCKET
Definition: winsock.h:47
#define SERVICE_STOPPED
Definition: winsvc.h:21
#define SERVICE_ACCEPT_STOP
Definition: winsvc.h:28
#define SERVICE_STOP_PENDING
Definition: winsvc.h:23
#define SERVICE_CONTROL_SHUTDOWN
Definition: winsvc.h:40
#define SERVICE_START_PENDING
Definition: winsvc.h:22
#define SERVICE_RUNNING
Definition: winsvc.h:24
#define SERVICE_CONTROL_STOP
Definition: winsvc.h:36
#define SERVICE_ACCEPT_SHUTDOWN
Definition: winsvc.h:30
#define SERVICE_CONTROL_INTERROGATE
Definition: winsvc.h:39
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define SERVICE_WIN32_SHARE_PROCESS
Definition: cmtypes.h:963
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184