ReactOS 0.4.16-dev-1140-g53685ad
dhcpcsvc.c File Reference
#include <rosdhcp.h>
#include <winsvc.h>
#include <debug.h>
Include dependency graph for dhcpcsvc.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

DWORD APIENTRY DhcpCApiInitialize (LPDWORD Version)
 
VOID APIENTRY DhcpCApiCleanup (VOID)
 
DWORD APIENTRY DhcpAcquireParameters (_In_ PSTR AdapterName)
 
DWORD APIENTRY DhcpReleaseParameters (_In_ PSTR AdapterName)
 
DWORD APIENTRY DhcpQueryHWInfo (DWORD AdapterIndex, PDWORD MediaType, PDWORD Mtu, PDWORD Speed)
 
DWORD APIENTRY DhcpLeaseIpAddress (DWORD AdapterIndex)
 
DWORD APIENTRY DhcpReleaseIpAddressLease (DWORD AdapterIndex)
 
DWORD APIENTRY DhcpRenewIpAddressLease (DWORD AdapterIndex)
 
DWORD APIENTRY DhcpStaticRefreshParams (DWORD AdapterIndex, DWORD Address, DWORD Netmask)
 
DWORD APIENTRY DhcpNotifyConfigChange (LPWSTR ServerName, LPWSTR AdapterName, BOOL NewIpAddress, DWORD IpIndex, DWORD IpAddress, DWORD SubnetMask, INT DhcpAction)
 
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)
 
static VOID UpdateServiceStatus (DWORD dwState)
 
static DWORD WINAPI ServiceControlHandler (DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext)
 
VOID WINAPI ServiceMain (DWORD argc, LPWSTR *argv)
 
BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
 

Variables

static WCHAR ServiceName [] = L"DHCP"
 
SERVICE_STATUS_HANDLE ServiceStatusHandle = 0
 
SERVICE_STATUS ServiceStatus
 
HANDLE hStopEvent = NULL
 
HANDLE hAdapterStateChangedEvent = NULL
 
static HANDLE PipeHandle = INVALID_HANDLE_VALUE
 
SOCKET DhcpSocket
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 12 of file dhcpcsvc.c.

Function Documentation

◆ DhcpAcquireParameters()

DWORD APIENTRY DhcpAcquireParameters ( _In_ PSTR  AdapterName)

Definition at line 81 of file dhcpcsvc.c.

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}
#define DPRINT1
Definition: precomp.h:8
static HANDLE PipeHandle
Definition: dhcpcsvc.c:22
#define NULL
Definition: types.h:112
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
#define ASSERT(a)
Definition: mode.c:44
_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
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
@ DhcpReqAcquireParams
Definition: rosdhcp_pipe.h:5
strcpy
Definition: string.h:131
struct _COMM_DHCP_REQ::@32::@33 AcquireParams
union _COMM_DHCP_REQ::@32 Body
_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
_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

◆ DhcpCApiCleanup()

VOID APIENTRY DhcpCApiCleanup ( VOID  )

◆ DhcpCApiInitialize()

DWORD APIENTRY DhcpCApiInitialize ( LPDWORD  Version)

Definition at line 26 of file dhcpcsvc.c.

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}
#define NO_ERROR
Definition: dderror.h:5
#define OPEN_EXISTING
Definition: compat.h:775
#define GENERIC_READ
Definition: compat.h:135
#define CreateFileW
Definition: compat.h:741
#define FILE_SHARE_READ
Definition: compat.h:136
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 DHCP_PIPE_NAME
Definition: rosdhcp_pipe.h:51
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
Definition: wdffdo.h:469
#define NMPWAIT_USE_DEFAULT_WAIT
Definition: winbase.h:135
#define PIPE_READMODE_MESSAGE
Definition: winbase.h:171

Referenced by INetCfgComponentControl_fnApplyRegistryChanges(), IpReleaseAddress(), and IpRenewAddress().

◆ DhcpLeaseIpAddress()

DWORD APIENTRY DhcpLeaseIpAddress ( DWORD  AdapterIndex)

Definition at line 176 of file dhcpcsvc.c.

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}
@ DhcpReqLeaseIpAddress
Definition: rosdhcp_pipe.h:7
DWORD AdapterIndex
Definition: rosdhcp_pipe.h:16

◆ DhcpNotifyConfigChange()

DWORD APIENTRY DhcpNotifyConfigChange ( LPWSTR  ServerName,
LPWSTR  AdapterName,
BOOL  NewIpAddress,
DWORD  IpIndex,
DWORD  IpAddress,
DWORD  SubnetMask,
INT  DhcpAction 
)

Set new TCP/IP parameters and notify DHCP client service of this

Parameters
[in]ServerNameNULL for local machine
[in]AdapterNameIPHLPAPI name of adapter to change
[in]NewIpAddressTRUE if IP address changes
[in]IpAddressNew IP address (network byte order)
[in]SubnetMaskNew subnet mask (network byte order)
[in]DhcpAction0 - don't modify 1 - enable DHCP 2 - disable DHCP
Returns
non-zero on success
Remarks
Undocumented by Microsoft

Definition at line 311 of file dhcpcsvc.c.

318{
319 DPRINT1("DHCPCSVC: DhcpNotifyConfigChange not implemented yet\n");
320 return 0;
321}

◆ DhcpQueryHWInfo()

DWORD APIENTRY DhcpQueryHWInfo ( DWORD  AdapterIndex,
PDWORD  MediaType,
PDWORD  Mtu,
PDWORD  Speed 
)

Definition at line 141 of file dhcpcsvc.c.

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}
@ DhcpReqQueryHWInfo
Definition: rosdhcp_pipe.h:8
struct _COMM_DHCP_REPLY::@38 QueryHWInfo

◆ DhcpReleaseIpAddressLease()

DWORD APIENTRY DhcpReleaseIpAddressLease ( DWORD  AdapterIndex)

Definition at line 202 of file dhcpcsvc.c.

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}
@ DhcpReqReleaseIpAddress
Definition: rosdhcp_pipe.h:9

Referenced by IpReleaseAddress().

◆ DhcpReleaseParameters()

DWORD APIENTRY DhcpReleaseParameters ( _In_ PSTR  AdapterName)

Definition at line 112 of file dhcpcsvc.c.

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}
@ DhcpReqReleaseParams
Definition: rosdhcp_pipe.h:6

◆ DhcpRenewIpAddressLease()

DWORD APIENTRY DhcpRenewIpAddressLease ( DWORD  AdapterIndex)

Definition at line 228 of file dhcpcsvc.c.

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}
@ DhcpReqRenewIpAddress
Definition: rosdhcp_pipe.h:10

Referenced by IpRenewAddress().

◆ DhcpRequestParams()

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 at line 324 of file dhcpcsvc.c.

333{
335 return 0;
336}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15

Referenced by detect_proxy_autoconfig_url_dhcp().

◆ DhcpStaticRefreshParams()

DWORD APIENTRY DhcpStaticRefreshParams ( DWORD  AdapterIndex,
DWORD  Address,
DWORD  Netmask 
)

Definition at line 254 of file dhcpcsvc.c.

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}
static WCHAR Address[46]
Definition: ping.c:68
@ DhcpReqStaticRefreshParams
Definition: rosdhcp_pipe.h:11
struct _COMM_DHCP_REQ::@32::@37 StaticRefreshParams

Referenced by INetCfgComponentControl_fnApplyRegistryChanges().

◆ DllMain()

BOOL WINAPI DllMain ( HINSTANCE  hinstDLL,
DWORD  fdwReason,
LPVOID  lpvReserved 
)

Definition at line 502 of file dhcpcsvc.c.

505{
506 switch (fdwReason)
507 {
510 break;
511
513 break;
514 }
515
516 return TRUE;
517}
static DWORD const fdwReason
#define TRUE
Definition: types.h:120
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define DLL_PROCESS_DETACH
Definition: compat.h:130
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85

◆ ServiceControlHandler()

static DWORD WINAPI ServiceControlHandler ( DWORD  dwControl,
DWORD  dwEventType,
LPVOID  lpEventData,
LPVOID  lpContext 
)
static

Definition at line 364 of file dhcpcsvc.c.

368{
369 switch (dwControl)
370 {
374 if (hStopEvent != NULL)
376 return ERROR_SUCCESS;
377
381 return ERROR_SUCCESS;
382
383 default:
385 }
386}
#define ERROR_SUCCESS
Definition: deptool.c:10
static VOID UpdateServiceStatus(DWORD dwState)
Definition: dhcpcsvc.c:339
SERVICE_STATUS_HANDLE ServiceStatusHandle
Definition: dhcpcsvc.c:17
HANDLE hStopEvent
Definition: dhcpcsvc.c:19
SERVICE_STATUS ServiceStatus
Definition: dhcpcsvc.c:18
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102
BOOL WINAPI SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus, LPSERVICE_STATUS lpServiceStatus)
Definition: sctrl.c:997
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
#define SERVICE_STOP_PENDING
Definition: winsvc.h:23
#define SERVICE_CONTROL_SHUTDOWN
Definition: winsvc.h:40
#define SERVICE_CONTROL_STOP
Definition: winsvc.h:36
#define SERVICE_CONTROL_INTERROGATE
Definition: winsvc.h:39

Referenced by ServiceMain().

◆ ServiceMain()

static VOID CALLBACK ServiceMain ( DWORD  argc,
LPWSTR argv 
)

Definition at line 389 of file dhcpcsvc.c.

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}
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
int init_client(void)
Definition: dhclient.c:111
void stop_client(void)
Definition: dhclient.c:129
static WCHAR ServiceName[]
Definition: dhcpcsvc.c:15
HANDLE hAdapterStateChangedEvent
Definition: dhcpcsvc.c:20
SOCKET DhcpSocket
Definition: adapter.c:8
static DWORD WINAPI ServiceControlHandler(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext)
Definition: dhcpcsvc.c:364
#define FALSE
Definition: types.h:117
#define DbgPrint
Definition: hal.h:12
#define closesocket
Definition: ncftp.h:477
SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExW(LPCWSTR lpServiceName, LPHANDLER_FUNCTION_EX lpHandlerProc, LPVOID lpContext)
Definition: sctrl.c:812
#define DPRINT
Definition: sndvol32.h:73
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
int ret
#define CreateEvent
Definition: winbase.h:3779
#define INVALID_SOCKET
Definition: winsock.h:332
#define SERVICE_STOPPED
Definition: winsvc.h:21
#define SERVICE_START_PENDING
Definition: winsvc.h:22
#define SERVICE_RUNNING
Definition: winsvc.h:24

◆ UpdateServiceStatus()

static VOID UpdateServiceStatus ( DWORD  dwState)
static

Definition at line 339 of file dhcpcsvc.c.

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}
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
#define SERVICE_ACCEPT_STOP
Definition: winsvc.h:28
#define SERVICE_ACCEPT_SHUTDOWN
Definition: winsvc.h:30
#define SERVICE_WIN32_SHARE_PROCESS
Definition: cmtypes.h:963

Referenced by ServiceControlHandler(), and ServiceMain().

Variable Documentation

◆ DhcpSocket

SOCKET DhcpSocket
extern

Definition at line 8 of file adapter.c.

Referenced by AdapterDiscoveryThread(), and ServiceMain().

◆ hAdapterStateChangedEvent

◆ hStopEvent

◆ PipeHandle

◆ ServiceName

WCHAR ServiceName[] = L"DHCP"
static

Definition at line 15 of file dhcpcsvc.c.

Referenced by ServiceMain().

◆ ServiceStatus

SERVICE_STATUS ServiceStatus

Definition at line 18 of file dhcpcsvc.c.

Referenced by ServiceControlHandler(), and UpdateServiceStatus().

◆ ServiceStatusHandle

SERVICE_STATUS_HANDLE ServiceStatusHandle = 0

Definition at line 17 of file dhcpcsvc.c.

Referenced by ServiceControlHandler(), ServiceMain(), and UpdateServiceStatus().