ReactOS 0.4.16-dev-1946-g52006dd
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
22extern SOCKET DhcpSocket;
23
24
26{
28}
29
31{
33}
34
37 _In_ PDHCP_SERVER_NAME pszServerName)
38{
40 LPWSTR pszStringBinding;
42
43 DPRINT("PDHCP_SERVER_NAME_bind() called\n");
44
46 L"ncacn_np",
47 pszServerName,
48 L"\\pipe\\dhcpcsvc",
49 NULL,
50 &pszStringBinding);
51 if (status)
52 {
53 DPRINT1("RpcStringBindingCompose returned 0x%x\n", status);
54 return NULL;
55 }
56
57 /* Set the binding handle that will be used to bind to the server. */
58 status = RpcBindingFromStringBindingW(pszStringBinding,
59 &hBinding);
60 if (status)
61 {
62 DPRINT1("RpcBindingFromStringBinding returned 0x%x\n", status);
63 }
64
65 status = RpcStringFreeW(&pszStringBinding);
66 if (status)
67 {
68 DPRINT1("RpcStringFree returned 0x%x\n", status);
69 }
70
71 return hBinding;
72}
73
74void __RPC_USER
76 _In_ PDHCP_SERVER_NAME pszServerName,
78{
80
81 DPRINT("PDHCP_SERVER_NAME_unbind() called\n");
82
84 if (status)
85 {
86 DPRINT1("RpcBindingFree returned 0x%x\n", status);
87 }
88}
89
100DWORD
104{
105 *Version = 2;
106 return ERROR_SUCCESS;
107}
108
114VOID
117{
118}
119
130DWORD
134{
135 DWORD ret;
136
137 DPRINT("DhcpAcquireParameters(%S)\n", AdapterName);
138
140 {
141 ret = Client_AcquireParameters(NULL, AdapterName);
142 }
144 {
146 }
148
149 return ret;
150}
151
152DWORD
155 _In_ DWORD Unknown1,
159{
160 DPRINT1("DhcpEnumClasses(%lx %S %lx %lx)\n",
161 Unknown1, AdapterName, Unknown3, Unknown4);
162 return 0;
163}
164
165DWORD
168 _In_ DWORD Unknown1,
169 _In_ DWORD Unknown2,
173{
174 DPRINT1("DhcpHandlePnPEvent(%lx %lx %S %lx %lx)\n",
175 Unknown1, Unknown2, AdapterName, Unknown4, Unknown5);
176 return 0;
177}
178
209DWORD
212 _In_ LPWSTR ServerName,
214 _In_ BOOL NewIpAddress,
215 _In_ DWORD IpIndex,
216 _In_ DWORD IpAddress,
217 _In_ DWORD SubnetMask,
218 _In_ INT DhcpAction)
219{
220 DPRINT1("DHCPCSVC: DhcpNotifyConfigChange not implemented yet\n");
221 DPRINT1("DhcpNotifyConfigChange(%S %S %lu %lu %lu %lu %d)\n",
222 ServerName, AdapterName, NewIpAddress, IpIndex, IpAddress, SubnetMask, DhcpAction);
223
224 if (AdapterName == NULL)
226
228 return ERROR_SUCCESS;
229}
230
233 PDWORD MediaType,
234 PDWORD Mtu,
235 PDWORD Speed)
236{
237 DWORD ret;
238
239 DPRINT("DhcpQueryHWInfo()\n");
240
242 {
243 ret = Client_QueryHWInfo(NULL, AdapterIndex, MediaType, Mtu, Speed);
244 }
246 {
248 }
250
251 return (ret == ERROR_SUCCESS) ? 1 : 0;
252}
253
264DWORD
268{
269 DWORD ret;
270
271 DPRINT("DhcpReleaseParameters(%S)\n", AdapterName);
272
274 {
275 ret = Client_ReleaseParameters(NULL, AdapterName);
276 }
278 {
280 }
282
283 return ret;
284}
285
291DWORD
292WINAPI
294{
295 DWORD ret;
296
297 DPRINT("DhcpRemoveDNSRegistrations()\n");
298
300 {
301 ret = Client_RemoveDNSRegistrations(NULL);
302 }
304 {
306 }
308
309 return ret;
310}
311
312DWORD
316 DWORD Netmask)
317{
318 DWORD ret;
319
320 DPRINT("DhcpStaticRefreshParams()\n");
321
323 {
324 ret = Client_StaticRefreshParams(NULL, AdapterIndex, Address, Netmask);
325 }
327 {
329 }
331
332 return (ret == ERROR_SUCCESS) ? 1 : 0;
333}
334
335
340 LPDHCPCAPI_CLASSID ClassId,
341 DHCPCAPI_PARAMS_ARRAY SendParams,
342 DHCPCAPI_PARAMS_ARRAY RecdParams,
344 LPDWORD pSize,
345 LPWSTR RequestIdStr)
346{
348 return 0;
349}
350
351static VOID
353{
356
357 if (dwState == SERVICE_RUNNING)
359 else
361
365
366 if (dwState == SERVICE_START_PENDING ||
367 dwState == SERVICE_STOP_PENDING)
369 else
371
374}
375
376static DWORD WINAPI
378 DWORD dwEventType,
379 LPVOID lpEventData,
380 LPVOID lpContext)
381{
382 switch (dwControl)
383 {
387 if (hStopEvent != NULL)
389 return ERROR_SUCCESS;
390
394 return ERROR_SUCCESS;
395
396 default:
398 }
399}
400
403{
404 HANDLE hPipeThread = INVALID_HANDLE_VALUE;
405 HANDLE hDiscoveryThread = INVALID_HANDLE_VALUE;
406 DWORD ret;
407
410 NULL);
412 {
413 DPRINT1("DHCPCSVC: Unable to register service control handler (%lx)\n", GetLastError());
414 return;
415 }
416
418
419 /* Create the stop event */
421 if (hStopEvent == NULL)
422 {
424 return;
425 }
426
429 {
432 return;
433 }
434
436
437 if (!init_client())
438 {
439 DbgPrint("DHCPCSVC: init_client() failed!\n");
443 return;
444 }
445
447
448 hPipeThread = InitRpc();
449 if (hPipeThread == INVALID_HANDLE_VALUE)
450 {
451 DbgPrint("DHCPCSVC: PipeInit() failed!\n");
452 stop_client();
456 return;
457 }
458
459 hDiscoveryThread = StartAdapterDiscovery(hStopEvent);
460 if (hDiscoveryThread == INVALID_HANDLE_VALUE)
461 {
462 DbgPrint("DHCPCSVC: StartAdapterDiscovery() failed!\n");
463 ShutdownRpc();
464 stop_client();
468 return;
469 }
470
471 DH_DbgPrint(MID_TRACE,("DHCP Service Started\n"));
472
474
475 DH_DbgPrint(MID_TRACE,("Going into dispatch()\n"));
476 DH_DbgPrint(MID_TRACE,("DHCPCSVC: DHCP service is starting up\n"));
477
479
480 DH_DbgPrint(MID_TRACE,("DHCPCSVC: DHCP service is shutting down\n"));
481
482 ShutdownRpc();
483 stop_client();
484
485 DPRINT("Wait for pipe thread to close! %p\n", hPipeThread);
486 if (hPipeThread != INVALID_HANDLE_VALUE)
487 {
488 DPRINT("Waiting for pipe thread\n");
489 ret = WaitForSingleObject(hPipeThread, 5000);
490 DPRINT("Done %lx\n", ret);
491 }
492
493 DPRINT("Wait for discovery thread to close! %p\n", hDiscoveryThread);
494 if (hDiscoveryThread != INVALID_HANDLE_VALUE)
495 {
496 DPRINT("Waiting for discovery thread\n");
497 ret = WaitForSingleObject(hDiscoveryThread, 5000);
498 DPRINT("Done %lx\n", ret);
499 }
500
501 DPRINT("Closing events!\n");
504
507
508 CloseHandle(hDiscoveryThread);
509 CloseHandle(hPipeThread);
510
511 DPRINT("Done!\n");
512
514}
515
520{
521 switch (fdwReason)
522 {
525 break;
526
528 break;
529 }
530
531 return TRUE;
532}
533
534/* EOF */
static SERVICE_STATUS_HANDLE(WINAPI *pRegisterServiceCtrlHandlerExA)(LPCSTR
PRTL_UNICODE_STRING_BUFFER PULONG PULONG Unknown4
static int argc
Definition: ServiceArgs.c:12
static DWORD const fdwReason
#define DPRINT1
Definition: precomp.h:8
HANDLE StartAdapterDiscovery(HANDLE hStopEvent)
Definition: adapter.c:483
VOID ShutdownRpc(VOID)
Definition: api.c:71
HANDLE InitRpc(VOID)
Definition: api.c:65
void dispatch(HANDLE hStopEvent)
Definition: dispatch.c:70
#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
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES IN DWORD IN DWORD IN DWORD Unknown5
Definition: conport.c:39
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES IN DWORD Unknown3
Definition: conport.c:37
handle_t hBinding
Definition: ctx_c.c:54
#define ERROR_SUCCESS
Definition: deptool.c:10
int init_client(void)
Definition: dhclient.c:111
void stop_client(void)
Definition: dhclient.c:129
static WCHAR ServiceName[]
Definition: dhcpcsvc.c:15
DWORD APIENTRY DhcpCApiInitialize(_Out_ LPDWORD Version)
Definition: dhcpcsvc.c:102
HANDLE hAdapterStateChangedEvent
Definition: dhcpcsvc.c:20
SOCKET DhcpSocket
Definition: adapter.c:8
DWORD APIENTRY DhcpReleaseParameters(_In_ PWSTR AdapterName)
Definition: dhcpcsvc.c:266
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
Definition: dhcpcsvc.c:517
void __RPC_USER MIDL_user_free(void __RPC_FAR *ptr)
Definition: dhcpcsvc.c:30
VOID WINAPI ServiceMain(DWORD argc, LPWSTR *argv)
Definition: dhcpcsvc.c:402
static DWORD WINAPI ServiceControlHandler(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext)
Definition: dhcpcsvc.c:377
static VOID UpdateServiceStatus(DWORD dwState)
Definition: dhcpcsvc.c:352
SERVICE_STATUS_HANDLE ServiceStatusHandle
Definition: dhcpcsvc.c:17
DWORD APIENTRY DhcpStaticRefreshParams(DWORD AdapterIndex, DWORD Address, DWORD Netmask)
Definition: dhcpcsvc.c:314
DWORD APIENTRY DhcpQueryHWInfo(DWORD AdapterIndex, PDWORD MediaType, PDWORD Mtu, PDWORD Speed)
Definition: dhcpcsvc.c:232
handle_t __RPC_USER PDHCP_SERVER_NAME_bind(_In_ PDHCP_SERVER_NAME pszServerName)
Definition: dhcpcsvc.c:36
HANDLE hStopEvent
Definition: dhcpcsvc.c:19
DWORD APIENTRY DhcpHandlePnPEvent(_In_ DWORD Unknown1, _In_ DWORD Unknown2, _In_ PWSTR AdapterName, _In_ DWORD Unknown4, _In_ DWORD Unknown5)
Definition: dhcpcsvc.c:167
DWORD WINAPI DhcpRemoveDNSRegistrations(VOID)
Definition: dhcpcsvc.c:293
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:337
DWORD APIENTRY DhcpAcquireParameters(_In_ PWSTR AdapterName)
Definition: dhcpcsvc.c:132
DWORD APIENTRY DhcpNotifyConfigChange(_In_ LPWSTR ServerName, _In_ LPWSTR AdapterName, _In_ BOOL NewIpAddress, _In_ DWORD IpIndex, _In_ DWORD IpAddress, _In_ DWORD SubnetMask, _In_ INT DhcpAction)
Definition: dhcpcsvc.c:211
DWORD APIENTRY DhcpEnumClasses(_In_ DWORD Unknown1, _In_ PWSTR AdapterName, _In_ DWORD Unknown3, _In_ DWORD Unknown4)
Definition: dhcpcsvc.c:154
void __RPC_FAR *__RPC_USER MIDL_user_allocate(SIZE_T len)
Definition: dhcpcsvc.c:25
VOID APIENTRY DhcpCApiCleanup(VOID)
Definition: dhcpcsvc.c:116
void __RPC_USER PDHCP_SERVER_NAME_unbind(_In_ PDHCP_SERVER_NAME pszServerName, _In_ handle_t hBinding)
Definition: dhcpcsvc.c:75
wchar_t * PDHCP_SERVER_NAME
Definition: dhcpcsvc.idl:7
#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 GetProcessHeap()
Definition: compat.h:736
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define DLL_PROCESS_DETACH
Definition: compat.h:130
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLsizei len
Definition: glext.h:6722
#define DbgPrint
Definition: hal.h:12
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
static IN DWORD IN LPVOID lpvReserved
static PVOID ptr
Definition: dispmode.c:27
#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 _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
DWORD * PDWORD
Definition: pedump.c:68
static WCHAR Address[46]
Definition: ping.c:68
RPC_STATUS WINAPI RpcBindingFromStringBindingW(RPC_WSTR StringBinding, RPC_BINDING_HANDLE *Binding)
Definition: rpc_binding.c:862
RPC_STATUS WINAPI RpcStringBindingComposeW(RPC_WSTR ObjUuid, RPC_WSTR Protseq, RPC_WSTR NetworkAddr, RPC_WSTR Endpoint, RPC_WSTR Options, RPC_WSTR *StringBinding)
Definition: rpc_binding.c:493
RPC_STATUS WINAPI RpcBindingFree(RPC_BINDING_HANDLE *Binding)
Definition: rpc_binding.c:769
LONG WINAPI I_RpcMapWin32Status(RPC_STATUS status)
Definition: rpcrt4_main.c:771
RPC_STATUS WINAPI RpcStringFreeW(RPC_WSTR *String)
Definition: rpcrt4_main.c:181
SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExW(LPCWSTR lpServiceName, LPHANDLER_FUNCTION_EX lpHandlerProc, LPVOID lpContext)
Definition: sctrl.c:831
BOOL WINAPI SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus, LPSERVICE_STATUS lpServiceStatus)
Definition: sctrl.c:1016
#define RpcEndExcept
Definition: rpc.h:123
#define __RPC_FAR
Definition: rpc.h:52
#define RpcTryExcept
Definition: rpc.h:121
#define RpcExcept(expr)
Definition: rpc.h:122
long RPC_STATUS
Definition: rpc.h:48
#define __RPC_USER
Definition: rpc.h:61
#define RpcExceptionCode()
Definition: rpc.h:127
#define DPRINT
Definition: sndvol32.h:73
DWORD dwServiceType
Definition: winsvc.h:105
DWORD dwWin32ExitCode
Definition: winsvc.h:108
DWORD dwControlsAccepted
Definition: winsvc.h:107
DWORD dwWaitHint
Definition: winsvc.h:111
DWORD dwCurrentState
Definition: winsvc.h:106
DWORD dwCheckPoint
Definition: winsvc.h:110
DWORD dwServiceSpecificExitCode
Definition: winsvc.h:109
Definition: ps.c:97
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
uint16_t * PWSTR
Definition: typedefs.h:56
unsigned char * LPBYTE
Definition: typedefs.h:53
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t * LPDWORD
Definition: typedefs.h:59
int32_t INT
Definition: typedefs.h:58
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
Definition: wdffdo.h:469
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define CreateEvent
Definition: winbase.h:3497
_Reserved_ PVOID Reserved
Definition: winddi.h:3974
#define WINAPI
Definition: msvc.h:6
#define INVALID_SOCKET
Definition: winsock.h:326
UINT_PTR SOCKET
Definition: winsock.h:41
#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:46
#define SERVICE_START_PENDING
Definition: winsvc.h:22
#define SERVICE_RUNNING
Definition: winsvc.h:24
#define SERVICE_CONTROL_STOP
Definition: winsvc.h:42
#define SERVICE_ACCEPT_SHUTDOWN
Definition: winsvc.h:30
#define SERVICE_CONTROL_INTERROGATE
Definition: winsvc.h:45
_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