ReactOS 0.4.17-dev-684-ga6524ef
dhcpcsvc.c File Reference
#include <rosdhcp.h>
#include <winsvc.h>
#include <dhcpcapi.h>
#include <debug.h>
Include dependency graph for dhcpcsvc.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

void __RPC_FAR *__RPC_USER MIDL_user_allocate (SIZE_T len)
 
void __RPC_USER MIDL_user_free (void __RPC_FAR *ptr)
 
handle_t __RPC_USER PDHCP_SERVER_NAME_bind (_In_ PDHCP_SERVER_NAME pszServerName)
 
void __RPC_USER PDHCP_SERVER_NAME_unbind (_In_ PDHCP_SERVER_NAME pszServerName, _In_ handle_t hBinding)
 
static DWORD SetBinaryClassId (_In_ PWSTR pszAdapterName)
 
static PDHCPAPI_PARAMS FindParam (_In_ LPDHCPCAPI_PARAMS_ARRAY ParamsArray, _In_ ULONG OptionId, _In_ BOOL IsVendor)
 
static DWORD MapRequestResultData (_In_ LPDHCPCAPI_RESULT_ARRAY Results, _Inout_ LPDHCPCAPI_PARAMS_ARRAY RecdParams, _In_ LPBYTE Buffer, _Inout_ LPDWORD pSize)
 
DWORD APIENTRY DhcpCApiInitialize (_Out_ LPDWORD Version)
 
VOID APIENTRY DhcpCApiCleanup (VOID)
 
DWORD APIENTRY DhcpAcquireParameters (_In_ PWSTR AdapterName)
 
DWORD APIENTRY DhcpAcquireParametersByBroadcast (_In_ PWSTR AdapterName)
 
DWORD APIENTRY DhcpDeRegisterParamChange (_In_ DWORD Flags, _In_ LPVOID Reserved, _In_ LPVOID Event)
 
DWORD APIENTRY DhcpEnumClasses (_In_ DWORD Unknown1, _In_ PWSTR AdapterName, _In_ DWORD Unknown3, _In_ DWORD Unknown4)
 
DWORD APIENTRY DhcpFallbackRefreshParams (_In_ PWSTR AdapterName)
 
DWORD APIENTRY DhcpHandlePnPEvent (_In_ DWORD Unknown1, _In_ DWORD Unknown2, _In_ PWSTR AdapterName, _In_ PDHCP_PNP_EVENT PnpEvent, _In_ DWORD Unknown5)
 
DWORD APIENTRY DhcpNotifyConfigChange (_In_ LPWSTR ServerName, _In_ LPWSTR AdapterName, _In_ BOOL NewIpAddress, _In_ DWORD IpIndex, _In_ DWORD IpAddress, _In_ DWORD SubnetMask, _In_ INT DhcpAction)
 
DWORD APIENTRY DhcpNotifyConfigChangeEx (_In_ LPWSTR ServerName, _In_ LPWSTR AdapterName, _In_ BOOL NewIpAddress, _In_ DWORD IpIndex, _In_ DWORD IpAddress, _In_ DWORD SubnetMask, _In_ INT DhcpAction, _In_ DWORD Unknown8)
 
DWORD APIENTRY DhcpRegisterParamChange (_In_ DWORD Flags, _In_ LPVOID Reserved, _In_ LPWSTR AdapterName, _In_ LPDHCPCAPI_CLASSID ClassId, _In_ DHCPCAPI_PARAMS_ARRAY Params, _Inout_ LPVOID Handle)
 
DWORD APIENTRY DhcpReleaseParameters (_In_ PWSTR AdapterName)
 
DWORD APIENTRY DhcpRemoveDNSRegistrations (VOID)
 
DWORD APIENTRY DhcpRequestParams (_In_ DWORD Flags, _In_ PVOID Reserved, _In_ LPWSTR AdapterName, _In_ LPDHCPCAPI_CLASSID ClassId, _In_ DHCPCAPI_PARAMS_ARRAY SendParams, _Inout_ DHCPCAPI_PARAMS_ARRAY RecdParams, _In_ LPBYTE Buffer, _Inout_ LPDWORD pSize, _In_ LPWSTR RequestIdStr)
 
DWORD APIENTRY DhcpStaticRefreshParams (DWORD AdapterIndex, DWORD Address, DWORD Netmask)
 
DWORD APIENTRY DhcpUndoRequestParams (_In_ DWORD Flags, _In_ LPVOID Reserved, _In_ LPWSTR AdapterName, _In_ 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
 
SOCKET DhcpSocket
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 13 of file dhcpcsvc.c.

Function Documentation

◆ DhcpAcquireParameters()

DWORD APIENTRY DhcpAcquireParameters ( _In_ PWSTR  AdapterName)

Renews a DHCP Lease

Parameters
[in]AdapterNameName (GUID) of the Adapter
Returns
ERROR_SUCCESS on success
Remarks
Undocumented by Microsoft

Definition at line 304 of file dhcpcsvc.c.

306{
307 DWORD ret;
308
309 DPRINT("DhcpAcquireParameters(%S)\n", AdapterName);
310
312 {
313 ret = Client_AcquireParameters(NULL, AdapterName);
314 }
316 {
318 }
320
321 return ret;
322}
#define NULL
Definition: types.h:112
return ret
Definition: mutex.c:147
unsigned long DWORD
Definition: ntddk_ex.h:95
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
_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
LONG WINAPI I_RpcMapWin32Status(RPC_STATUS status)
Definition: rpcrt4_main.c:771
#define RpcEndExcept
Definition: rpc.h:123
#define RpcTryExcept
Definition: rpc.h:121
#define RpcExcept(expr)
Definition: rpc.h:122
#define RpcExceptionCode()
Definition: rpc.h:127
#define DPRINT
Definition: sndvol32.h:73

Referenced by IpRenewAddress(), and Renew().

◆ DhcpAcquireParametersByBroadcast()

DWORD APIENTRY DhcpAcquireParametersByBroadcast ( _In_ PWSTR  AdapterName)

Renews a DHCP Lease

Parameters
[in]AdapterNameName (GUID) of the Adapter
Returns
ERROR_SUCCESS on success
Remarks
Undocumented by Microsoft

Definition at line 336 of file dhcpcsvc.c.

338{
339 DWORD ret;
340
341 DPRINT("DhcpAcquireParametersByBroadcast(%S)\n", AdapterName);
342
344 {
345 ret = Client_AcquireParametersByBroadcast(NULL, AdapterName);
346 }
348 {
350 }
352
353 return ret;
354}

◆ DhcpCApiCleanup()

VOID APIENTRY DhcpCApiCleanup ( VOID  )

Cleans up the DHCP interface

Remarks
Other DHCP Functions must not be called after DhcpCApiCleanup.

Definition at line 288 of file dhcpcsvc.c.

289{
290}

Referenced by INetCfgComponentControl_fnApplyPnpChanges(), IpReleaseAddress(), IpRenewAddress(), Release(), and Renew().

◆ DhcpCApiInitialize()

DWORD APIENTRY DhcpCApiInitialize ( _Out_ LPDWORD  Version)

Initializes the DHCP interface

Parameters
[out]VersionReturns the DHCP Interface Version
Returns
ERROR_SUCCESS on success
Remarks
DhcpCApiInitialized must be called before any other DHCP Function.

Definition at line 274 of file dhcpcsvc.c.

276{
277 *Version = 2;
278 return ERROR_SUCCESS;
279}
#define ERROR_SUCCESS
Definition: deptool.c:10
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
Definition: wdffdo.h:469

Referenced by INetCfgComponentControl_fnApplyPnpChanges(), IpReleaseAddress(), IpRenewAddress(), Release(), and Renew().

◆ DhcpDeRegisterParamChange()

DWORD APIENTRY DhcpDeRegisterParamChange ( _In_ DWORD  Flags,
_In_ LPVOID  Reserved,
_In_ LPVOID  Event 
)

Definition at line 358 of file dhcpcsvc.c.

362{
364 return 0;
365}
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15

◆ DhcpEnumClasses()

DWORD APIENTRY DhcpEnumClasses ( _In_ DWORD  Unknown1,
_In_ PWSTR  AdapterName,
_In_ DWORD  Unknown3,
_In_ DWORD  Unknown4 
)

Enumerates the DHCP user classes for the given adapter

Parameters
[in]Unknown1Unknown
[in]AdapterNameName (GUID) of the Adapter
[in]Unknown3Unknown
[in]Unknown4Unknown
Returns
ERROR_SUCCESS on success
Remarks
Undocumented by Microsoft

Definition at line 388 of file dhcpcsvc.c.

393{
394 DPRINT1("DhcpEnumClasses(%lx %S %lx %lx)\n",
395 Unknown1, AdapterName, Unknown3, Unknown4);
396 return 0;
397}
PRTL_UNICODE_STRING_BUFFER PULONG PULONG Unknown4
#define DPRINT1
Definition: precomp.h:8
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES IN DWORD Unknown3
Definition: conport.c:37

◆ DhcpFallbackRefreshParams()

DWORD APIENTRY DhcpFallbackRefreshParams ( _In_ PWSTR  AdapterName)

Notify the DHCP client to refresh its fallback configuration

Parameters
[in]AdapterNameName (GUID) of the Adapter
Returns
ERROR_SUCCESS on success
Remarks
Undocumented by Microsoft

Definition at line 411 of file dhcpcsvc.c.

413{
414 DWORD ret;
415
416 DPRINT("DhcpFallbackRefreshParams(%S)\n", AdapterName);
417
419 {
420 ret = Client_FallbackRefreshParams(NULL, AdapterName);
421 }
423 {
425 }
427
428 return ret;
429}

◆ DhcpHandlePnPEvent()

DWORD APIENTRY DhcpHandlePnPEvent ( _In_ DWORD  Unknown1,
_In_ DWORD  Unknown2,
_In_ PWSTR  AdapterName,
_In_ PDHCP_PNP_EVENT  PnpEvent,
_In_ DWORD  Unknown5 
)

Notify the DHCP client of PNP events

Parameters
[in]Unknown1Unknown
[in]Unknown2Unknown
[in]AdapterNameName (GUID) of the Adapter
[in]PnpEventUnknown
[in]Unknown5Unknown
Returns
ERROR_SUCCESS on success
Remarks
Undocumented by Microsoft

Definition at line 455 of file dhcpcsvc.c.

461{
462 DWORD dwError = ERROR_SUCCESS;
463
464 DPRINT1("DhcpHandlePnPEvent(%lx %lx %S %p %lx)\n",
465 Unknown1, Unknown2, AdapterName, PnpEvent, Unknown5);
466
467 if ((Unknown1 != 0) || (Unknown2 != 1) || (PnpEvent == NULL) || (Unknown5 != 0))
469
470 if (PnpEvent->Unknown5)
471 {
472 dwError = SetBinaryClassId(AdapterName);
473 }
474
475 return dwError;
476}
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES IN DWORD IN DWORD IN DWORD Unknown5
Definition: conport.c:39
static DWORD SetBinaryClassId(_In_ PWSTR pszAdapterName)
Definition: dhcpcsvc.c:93
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101

Referenced by SetClassId().

◆ DhcpNotifyConfigChange()

DWORD APIENTRY DhcpNotifyConfigChange ( _In_ LPWSTR  ServerName,
_In_ LPWSTR  AdapterName,
_In_ BOOL  NewIpAddress,
_In_ DWORD  IpIndex,
_In_ DWORD  IpAddress,
_In_ DWORD  SubnetMask,
_In_ 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]IpIndex...
[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
ERROR_SUCCESS on success
Remarks
Undocumented by Microsoft

Definition at line 510 of file dhcpcsvc.c.

518{
519 DPRINT("DhcpNotifyConfigChange(%S %S %lu %lu %lu %lu %d)\n",
520 ServerName, AdapterName, NewIpAddress, IpIndex, IpAddress, SubnetMask, DhcpAction);
521 return DhcpNotifyConfigChangeEx(ServerName, AdapterName, NewIpAddress,
522 IpIndex, IpAddress, SubnetMask, DhcpAction, 0);
523}
DWORD APIENTRY DhcpNotifyConfigChangeEx(_In_ LPWSTR ServerName, _In_ LPWSTR AdapterName, _In_ BOOL NewIpAddress, _In_ DWORD IpIndex, _In_ DWORD IpAddress, _In_ DWORD SubnetMask, _In_ INT DhcpAction, _In_ DWORD Unknown8)
Definition: dhcpcsvc.c:560

◆ DhcpNotifyConfigChangeEx()

DWORD APIENTRY DhcpNotifyConfigChangeEx ( _In_ LPWSTR  ServerName,
_In_ LPWSTR  AdapterName,
_In_ BOOL  NewIpAddress,
_In_ DWORD  IpIndex,
_In_ DWORD  IpAddress,
_In_ DWORD  SubnetMask,
_In_ INT  DhcpAction,
_In_ DWORD  Unknown8 
)

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]IpIndex...
[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
[in]Unknown8Unknown
Returns
ERROR_SUCCESS on success
Remarks
Undocumented by Microsoft

Definition at line 560 of file dhcpcsvc.c.

569{
571
572 DPRINT1("DHCPCSVC: DhcpNotifyConfigChangeEx not implemented yet\n");
573 DPRINT1("DhcpNotifyConfigChangeEx(%S %S %lu %lu %lu %lu %d %lu)\n",
574 ServerName, AdapterName, NewIpAddress, IpIndex, IpAddress, SubnetMask, DhcpAction, Unknown8);
575
576 if (AdapterName == NULL)
578
579 if (DhcpAction == 1) // Enable DHCP
580 {
581 if ((NewIpAddress != FALSE) ||
582 (IpIndex != 0) ||
583 (IpAddress != 0) ||
584 (SubnetMask != 0))
586 }
587 else if (DhcpAction == 2) // Disable DHCP
588 {
589 if ((NewIpAddress == FALSE) ||
590 (IpIndex != 0) ||
591 (IpAddress == 0) ||
592 (SubnetMask == 0))
594 }
595 else if (DhcpAction == 0) // Do not modify
596 {
597
598 }
599 else
600 {
602 }
603
604 if (DhcpAction == 1) // Enable DHCP
605 {
606 /* TODO: Remove static IP address(es) */
607
609 {
610 ret = Server_EnableDhcp(ServerName, AdapterName, TRUE);
611 }
613 {
615 }
617 }
618 else if (DhcpAction == 2) // Disable DHCP
619 {
621 {
622 ret = Server_EnableDhcp(ServerName, AdapterName, FALSE);
623 }
625 {
627 }
629 }
630 else if (DhcpAction == 0) // Do not modify
631 {
632
633 }
634
635 return ret;
636}
DWORD __stdcall Server_EnableDhcp(_In_ PDHCP_SERVER_NAME ServerName, _In_ LPWSTR AdapterName, _In_ BOOL Enable)
Definition: api.c:106
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117

Referenced by DhcpNotifyConfigChange().

◆ DhcpRegisterParamChange()

DWORD APIENTRY DhcpRegisterParamChange ( _In_ DWORD  Flags,
_In_ LPVOID  Reserved,
_In_ LPWSTR  AdapterName,
_In_ LPDHCPCAPI_CLASSID  ClassId,
_In_ DHCPCAPI_PARAMS_ARRAY  Params,
_Inout_ LPVOID  Handle 
)

Definition at line 640 of file dhcpcsvc.c.

647{
648 DPRINT1("DhcpRegisterParamChange(%lx %p %S)\n", Flags, Reserved, AdapterName);
649
652
653 if ((Reserved != NULL) || (AdapterName == NULL) || (Handle == NULL))
655
657 return 0;
658}
#define DHCPCAPI_REGISTER_HANDLE_EVENT
Definition: dhcpcsdk.h:126
ULONG Handle
Definition: gdb_input.c:15
_Reserved_ PVOID Reserved
Definition: winddi.h:3974
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170

◆ DhcpReleaseParameters()

DWORD APIENTRY DhcpReleaseParameters ( _In_ PWSTR  AdapterName)

Releases a DHCP Lease

Parameters
[in]AdapterNameName (GUID) of the Adapter
Returns
ERROR_SUCCESS on success
Remarks
Undocumented by Microsoft

Definition at line 672 of file dhcpcsvc.c.

674{
675 DWORD ret;
676
677 DPRINT("DhcpReleaseParameters(%S)\n", AdapterName);
678
680 {
681 ret = Client_ReleaseParameters(NULL, AdapterName);
682 }
684 {
686 }
688
689 return ret;
690}

Referenced by IpReleaseAddress(), and Release().

◆ DhcpRemoveDNSRegistrations()

DWORD APIENTRY DhcpRemoveDNSRegistrations ( VOID  )

Removes all DNS Registrations which were added by the DHCP Client

Returns
ERROR_SUCCESS on success

Definition at line 699 of file dhcpcsvc.c.

700{
701 DWORD ret;
702
703 DPRINT("DhcpRemoveDNSRegistrations()\n");
704
706 {
707 ret = Client_RemoveDNSRegistrations(NULL);
708 }
710 {
712 }
714
715 return ret;
716}

◆ DhcpRequestParams()

DWORD APIENTRY DhcpRequestParams ( _In_ DWORD  Flags,
_In_ PVOID  Reserved,
_In_ LPWSTR  AdapterName,
_In_ LPDHCPCAPI_CLASSID  ClassId,
_In_ DHCPCAPI_PARAMS_ARRAY  SendParams,
_Inout_ DHCPCAPI_PARAMS_ARRAY  RecdParams,
_In_ LPBYTE  Buffer,
_Inout_ LPDWORD  pSize,
_In_ LPWSTR  RequestIdStr 
)

Definition at line 720 of file dhcpcsvc.c.

730{
733
734 DPRINT("DhcpRequestParams(%lx %p %S %p %lu %p %lu %p %p %p %S)\n",
735 Flags, Reserved, AdapterName, ClassId, SendParams.nParams, SendParams.Params,
736 RecdParams.nParams, RecdParams.Params, Buffer, pSize, RequestIdStr);
737
742
743 if ((Reserved != NULL) || (AdapterName == NULL))
745
746 if (ClassId != NULL)
747 {
748 if (ClassId->Flags != 0)
750
751 if ((ClassId->Data == NULL) || (ClassId->nBytesData == 0))
753 }
754
755 if ((SendParams.nParams != 0) && (SendParams.Params == NULL))
757
758 if (RecdParams.Params == NULL)
760
762 {
764 {
765 ret = Client_RequestParams(NULL,
767 ClassId,
768 &SendParams,
769 &RecdParams,
770 &Results);
771 }
773 {
775 }
777 }
778
779 if (Results)
780 {
781 DPRINT("Results: Count %lu DataSize %lu\n", Results->ResultsCount, Results->DataSize);
782
783 ret = MapRequestResultData(Results,
784 &RecdParams,
785 Buffer,
786 pSize);
787
788 if (Results->Results)
789 MIDL_user_free(Results->Results);
790 if (Results->Data)
791 MIDL_user_free(Results->Data);
792 MIDL_user_free(Results);
793 }
794
795 if (ret != ERROR_SUCCESS)
796 return ret;
797
799 {
800 /* FIXME: Store the request */
801 DPRINT1("DHCPCAPI_REQUEST_PERSISTENT is not supported yet!\n");
802 }
803
804 return ret;
805}
Definition: bufpool.h:45
#define DHCPCAPI_REQUEST_SYNCHRONOUS
Definition: dhcpcsdk.h:129
#define DHCPCAPI_REQUEST_PERSISTENT
Definition: dhcpcsdk.h:128
void __RPC_USER MIDL_user_free(void __RPC_FAR *ptr)
Definition: dhcpcsvc.c:31
static DWORD MapRequestResultData(_In_ LPDHCPCAPI_RESULT_ARRAY Results, _Inout_ LPDHCPCAPI_PARAMS_ARRAY RecdParams, _In_ LPBYTE Buffer, _Inout_ LPDWORD pSize)
Definition: dhcpcsvc.c:222
LPDHCPCAPI_RESULTS Results
Definition: dhcpcsvc.idl:63

Referenced by detect_autoproxyconfig_url_dhcp(), and detect_proxy_autoconfig_url_dhcp().

◆ DhcpStaticRefreshParams()

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

Definition at line 809 of file dhcpcsvc.c.

812{
813 DWORD ret;
814
815 DPRINT("DhcpStaticRefreshParams()\n");
816
818 {
819 ret = Client_StaticRefreshParams(NULL, AdapterIndex, Address, Netmask);
820 }
822 {
824 }
826
827 return (ret == ERROR_SUCCESS) ? 1 : 0;
828}
static WCHAR Address[46]
Definition: ping.c:68

Referenced by INetCfgComponentControl_fnApplyPnpChanges().

◆ DhcpUndoRequestParams()

DWORD APIENTRY DhcpUndoRequestParams ( _In_ DWORD  Flags,
_In_ LPVOID  Reserved,
_In_ LPWSTR  AdapterName,
_In_ LPWSTR  RequestIdStr 
)

Definition at line 832 of file dhcpcsvc.c.

837{
838 DPRINT1("DhcpUndoRequestParams(%lx %p %S %S)\n",
839 Flags, Reserved, AdapterName, RequestIdStr);
840
841 if ((Flags != 0) || (Reserved != NULL) || (RequestIdStr == NULL))
843
845 return STATUS_SUCCESS;
846}
#define STATUS_SUCCESS
Definition: shellext.h:65

◆ DllMain()

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

Definition at line 1014 of file dhcpcsvc.c.

1017{
1018 switch (fdwReason)
1019 {
1020 case DLL_PROCESS_ATTACH:
1021 DisableThreadLibraryCalls(hinstDLL);
1022 break;
1023
1024 case DLL_PROCESS_DETACH:
1025 break;
1026 }
1027
1028 return TRUE;
1029}
static DWORD const fdwReason
#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

◆ FindParam()

static PDHCPAPI_PARAMS FindParam ( _In_ LPDHCPCAPI_PARAMS_ARRAY  ParamsArray,
_In_ ULONG  OptionId,
_In_ BOOL  IsVendor 
)
static

Definition at line 203 of file dhcpcsvc.c.

207{
208 ULONG i;
209
210 for (i = 0; i < ParamsArray->nParams; i++)
211 {
212 if ((ParamsArray->Params[i].OptionId == OptionId) &&
213 (ParamsArray->Params[i].IsVendor == IsVendor))
214 return &ParamsArray->Params[i];
215 }
216
217 return NULL;
218}
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
uint32_t ULONG
Definition: typedefs.h:59

Referenced by MapRequestResultData().

◆ MapRequestResultData()

static DWORD MapRequestResultData ( _In_ LPDHCPCAPI_RESULT_ARRAY  Results,
_Inout_ LPDHCPCAPI_PARAMS_ARRAY  RecdParams,
_In_ LPBYTE  Buffer,
_Inout_ LPDWORD  pSize 
)
static

Definition at line 222 of file dhcpcsvc.c.

227{
228 PDHCPAPI_PARAMS Param;
229 LPBYTE Ptr;
230 ULONG i;
231
232 if (Results->DataSize > *pSize)
233 {
234 *pSize = Results->DataSize;
235 return ERROR_MORE_DATA;
236 }
237
238 Ptr = Buffer;
239 for (i = 0; i < Results->ResultsCount; i++)
240 {
241 Param = FindParam(RecdParams,
242 Results->Results[i].OptionId,
243 Results->Results[i].IsVendor);
244 if (Param)
245 {
247 &Results->Data[Results->Results[i].DataOffset],
248 Results->Results[i].DataSize);
249
250 Param->nBytesData = Results->Results[i].DataSize;
251 Param->Data = Ptr;
252
253 Ptr += Results->Results[i].DataSize;
254 }
255 }
256
257 *pSize = Results->DataSize;
258
259 return ERROR_SUCCESS;
260}
#define ERROR_MORE_DATA
Definition: dderror.h:13
static PDHCPAPI_PARAMS FindParam(_In_ LPDHCPCAPI_PARAMS_ARRAY ParamsArray, _In_ ULONG OptionId, _In_ BOOL IsVendor)
Definition: dhcpcsvc.c:203
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
#define CopyMemory
Definition: minwinbase.h:29
LPBYTE Data
Definition: dhcpcsdk.h:98
DWORD nBytesData
Definition: dhcpcsdk.h:100
unsigned char * LPBYTE
Definition: typedefs.h:53

Referenced by DhcpRequestParams().

◆ MIDL_user_allocate()

void __RPC_FAR *__RPC_USER MIDL_user_allocate ( SIZE_T  len)

◆ MIDL_user_free()

void __RPC_USER MIDL_user_free ( void __RPC_FAR ptr)

Definition at line 31 of file dhcpcsvc.c.

32{
34}
#define HeapFree(x, y, z)
Definition: compat.h:735
static PVOID ptr
Definition: dispmode.c:27

Referenced by DhcpRequestParams(), DsAddressToSiteNamesExW(), DsAddressToSiteNamesW(), DsGetDcSiteCoverageW(), free_pyramid_doub_carr(), LsaEnumerateAccountRights(), LsaEnumerateAccounts(), LsaEnumerateAccountsWithUserRight(), LsaEnumeratePrivileges(), LsaEnumerateTrustedDomains(), LsaEnumerateTrustedDomainsEx(), LsaGetRemoteUserName(), LsaGetUserName(), LsaLookupNames(), LsaLookupNames2(), LsaLookupPrivilegeDisplayName(), LsaLookupPrivilegeName(), LsaLookupSids(), LsapAddAuthorityToDomainsList(), LsapAddDomainToDomainsList(), LsapLookupAccountRightName(), LsapLookupFullyQualifiedWellKnownNames(), LsapLookupIsolatedNames(), LsapLookupNames(), LsapLookupSids(), LsapSplitNames(), LsaQueryDomainInformationPolicy(), LsaQueryInformationPolicy(), LsaQueryInfoTrustedDomain(), LsarAddPrivilegesToAccount(), LsarEnumerateAccountRights(), LsarEnumeratePrivilegesAccount(), LsarLookupNames(), LsarLookupNames2(), LsarLookupSids(), LsarpEnumeratePrivileges(), LsarpLookupPrivilegeDisplayName(), LsarpLookupPrivilegeName(), LsarQueryAccountDomain(), LsarQueryAuditEvents(), LsarQueryAuditFull(), LsarQueryAuditLog(), LsarQueryDefaultQuota(), LsarQueryDnsDomain(), LsarQueryModification(), LsarQueryPrimaryDomain(), LsarQuerySecurityObject(), LsarQueryServerRole(), LsarRemovePrivilegesFromAccount(), LsarSetAuditFull(), LsaSetSecurityObject(), pointer_tests(), SamGetGroupsForUser(), SamGetMembersInGroup(), SamIFree_SAMPR_ALIAS_INFO_BUFFER(), SamIFree_SAMPR_DISPLAY_INFO_BUFFER(), SamIFree_SAMPR_DOMAIN_INFO_BUFFER(), SamIFree_SAMPR_ENUMERATION_BUFFER(), SamIFree_SAMPR_GET_GROUPS_BUFFER(), SamIFree_SAMPR_GET_MEMBERS_BUFFER(), SamIFree_SAMPR_GROUP_INFO_BUFFER(), SamIFree_SAMPR_PSID_ARRAY(), SamIFree_SAMPR_RETURNED_USTRING_ARRAY(), SamIFree_SAMPR_SR_SECURITY_DESCRIPTOR(), SamIFree_SAMPR_ULONG_ARRAY(), SamIFree_SAMPR_USER_INFO_BUFFER(), SamIFreeVoid(), SamrQuerySecurityObject(), SamSetSecurityObject(), and ScmGetServiceNameFromTag().

◆ PDHCP_SERVER_NAME_bind()

handle_t __RPC_USER PDHCP_SERVER_NAME_bind ( _In_ PDHCP_SERVER_NAME  pszServerName)

Definition at line 37 of file dhcpcsvc.c.

39{
41 LPWSTR pszStringBinding;
43
44 DPRINT("PDHCP_SERVER_NAME_bind() called\n");
45
47 L"ncacn_np",
48 pszServerName,
49 L"\\pipe\\dhcpcsvc",
50 NULL,
51 &pszStringBinding);
52 if (status)
53 {
54 DPRINT1("RpcStringBindingCompose returned 0x%x\n", status);
55 return NULL;
56 }
57
58 /* Set the binding handle that will be used to bind to the server. */
59 status = RpcBindingFromStringBindingW(pszStringBinding,
60 &hBinding);
61 if (status)
62 {
63 DPRINT1("RpcBindingFromStringBinding returned 0x%x\n", status);
64 }
65
66 status = RpcStringFreeW(&pszStringBinding);
67 if (status)
68 {
69 DPRINT1("RpcStringFree returned 0x%x\n", status);
70 }
71
72 return hBinding;
73}
handle_t hBinding
Definition: ctx_c.c:54
#define L(x)
Definition: resources.c:13
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 RpcStringFreeW(RPC_WSTR *String)
Definition: rpcrt4_main.c:181
long RPC_STATUS
Definition: rpc.h:48
Definition: ps.c:97
uint16_t * LPWSTR
Definition: typedefs.h:56

◆ PDHCP_SERVER_NAME_unbind()

void __RPC_USER PDHCP_SERVER_NAME_unbind ( _In_ PDHCP_SERVER_NAME  pszServerName,
_In_ handle_t  hBinding 
)

Definition at line 76 of file dhcpcsvc.c.

79{
81
82 DPRINT("PDHCP_SERVER_NAME_unbind() called\n");
83
85 if (status)
86 {
87 DPRINT1("RpcBindingFree returned 0x%x\n", status);
88 }
89}
RPC_STATUS WINAPI RpcBindingFree(RPC_BINDING_HANDLE *Binding)
Definition: rpc_binding.c:769

◆ ServiceControlHandler()

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

Definition at line 874 of file dhcpcsvc.c.

878{
879 switch (dwControl)
880 {
884 if (hStopEvent != NULL)
886 return ERROR_SUCCESS;
887
891 return ERROR_SUCCESS;
892
893 default:
895 }
896}
static VOID UpdateServiceStatus(DWORD dwState)
Definition: dhcpcsvc.c:849
SERVICE_STATUS_HANDLE ServiceStatusHandle
Definition: dhcpcsvc.c:18
HANDLE hStopEvent
Definition: dhcpcsvc.c:20
SERVICE_STATUS ServiceStatus
Definition: dhcpcsvc.c:19
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102
#define SERVICE_STOP_PENDING
Definition: winsvc.h:23
#define SERVICE_CONTROL_SHUTDOWN
Definition: winsvc.h:46
#define SERVICE_CONTROL_STOP
Definition: winsvc.h:42
#define SERVICE_CONTROL_INTERROGATE
Definition: winsvc.h:45
BOOL WINAPI SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus, LPSERVICE_STATUS lpServiceStatus)
Definition: sctrl.c:1016
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:669

Referenced by ServiceMain().

◆ ServiceMain()

static VOID CALLBACK ServiceMain ( DWORD  argc,
LPWSTR argv 
)

Definition at line 899 of file dhcpcsvc.c.

900{
901 HANDLE hPipeThread = INVALID_HANDLE_VALUE;
902 HANDLE hDiscoveryThread = INVALID_HANDLE_VALUE;
903 DWORD ret;
904
907 NULL);
909 {
910 DPRINT1("DHCPCSVC: Unable to register service control handler (%lx)\n", GetLastError());
911 return;
912 }
913
915
916 /* Create the stop event */
918 if (hStopEvent == NULL)
919 {
921 return;
922 }
923
926 {
929 return;
930 }
931
933
934 if (!init_client())
935 {
936 DbgPrint("DHCPCSVC: init_client() failed!\n");
940 return;
941 }
942
944
945 hPipeThread = InitRpc();
946 if (hPipeThread == INVALID_HANDLE_VALUE)
947 {
948 DbgPrint("DHCPCSVC: PipeInit() failed!\n");
949 stop_client();
953 return;
954 }
955
956 hDiscoveryThread = StartAdapterDiscovery(hStopEvent);
957 if (hDiscoveryThread == INVALID_HANDLE_VALUE)
958 {
959 DbgPrint("DHCPCSVC: StartAdapterDiscovery() failed!\n");
960 ShutdownRpc();
961 stop_client();
965 return;
966 }
967
968 DH_DbgPrint(MID_TRACE,("DHCP Service Started\n"));
969
971
972 DH_DbgPrint(MID_TRACE,("Going into dispatch()\n"));
973 DH_DbgPrint(MID_TRACE,("DHCPCSVC: DHCP service is starting up\n"));
974
976
977 DH_DbgPrint(MID_TRACE,("DHCPCSVC: DHCP service is shutting down\n"));
978
979 ShutdownRpc();
980 stop_client();
981
982 DPRINT("Wait for pipe thread to close! %p\n", hPipeThread);
983 if (hPipeThread != INVALID_HANDLE_VALUE)
984 {
985 DPRINT("Waiting for pipe thread\n");
986 ret = WaitForSingleObject(hPipeThread, 5000);
987 DPRINT("Done %lx\n", ret);
988 }
989
990 DPRINT("Wait for discovery thread to close! %p\n", hDiscoveryThread);
991 if (hDiscoveryThread != INVALID_HANDLE_VALUE)
992 {
993 DPRINT("Waiting for discovery thread\n");
994 ret = WaitForSingleObject(hDiscoveryThread, 5000);
995 DPRINT("Done %lx\n", ret);
996 }
997
998 DPRINT("Closing events!\n");
1001
1004
1005 CloseHandle(hDiscoveryThread);
1006 CloseHandle(hPipeThread);
1007
1008 DPRINT("Done!\n");
1009
1011}
HANDLE StartAdapterDiscovery(HANDLE hStopEvent)
Definition: adapter.c:591
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
int init_client(void)
Definition: dhclient.c:111
void stop_client(void)
Definition: dhclient.c:129
static WCHAR ServiceName[]
Definition: dhcpcsvc.c:16
HANDLE hAdapterStateChangedEvent
Definition: dhcpcsvc.c:21
SOCKET DhcpSocket
Definition: adapter.c:8
static DWORD WINAPI ServiceControlHandler(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext)
Definition: dhcpcsvc.c:874
#define CloseHandle
Definition: compat.h:739
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define DbgPrint
Definition: hal.h:12
#define closesocket
Definition: ncftp.h:477
#define SERVICE_STOPPED
Definition: winsvc.h:21
#define SERVICE_START_PENDING
Definition: winsvc.h:22
#define SERVICE_RUNNING
Definition: winsvc.h:24
SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerExW(LPCWSTR lpServiceName, LPHANDLER_FUNCTION_EX lpHandlerProc, LPVOID lpContext)
Definition: sctrl.c:831
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:587
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define CreateEvent
Definition: winbase.h:3469
#define INVALID_SOCKET
Definition: winsock.h:326

◆ SetBinaryClassId()

static DWORD SetBinaryClassId ( _In_ PWSTR  pszAdapterName)
static

Definition at line 93 of file dhcpcsvc.c.

95{
96 WCHAR szKeyName[256];
97 PWSTR pszUnicodeBuffer = NULL;
98 PSZ pszAnsiBuffer = NULL;
99 DWORD dwUnicodeSize = 0, dwAnsiSize = 0;
100 HKEY hKey = NULL;
101 DWORD dwError = ERROR_SUCCESS;
102
103 DPRINT("SetBinaryClassId(%S)\n", pszAdapterName);
104
105 _swprintf(szKeyName,
106 L"System\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\%s",
107 pszAdapterName);
108 DPRINT("KeyName %S\n", szKeyName);
109
111 szKeyName,
112 0,
114 &hKey);
115 if (dwError != ERROR_SUCCESS)
116 {
117 DPRINT1("Error %lu\n", dwError);
118 return dwError;
119 }
120
122 L"DhcpClassId",
123 NULL,
124 NULL,
125 NULL,
126 &dwUnicodeSize);
127 DPRINT("UnicodeSize %lu\n", dwUnicodeSize);
128
129 pszUnicodeBuffer = HeapAlloc(GetProcessHeap(), 0, dwUnicodeSize);
130 if (pszUnicodeBuffer == NULL)
131 {
132 dwError = ERROR_NOT_ENOUGH_MEMORY;
133 DPRINT1("Error %lu\n", dwError);
134 goto done;
135 }
136
137 dwError = RegQueryValueExW(hKey,
138 L"DhcpClassId",
139 NULL,
140 NULL,
141 (PBYTE)pszUnicodeBuffer,
142 &dwUnicodeSize);
143 if (dwError != ERROR_SUCCESS)
144 {
145 DPRINT1("Error %lu\n", dwError);
146 goto done;
147 }
148
149 dwAnsiSize = WideCharToMultiByte(CP_ACP,
150 0,
151 pszUnicodeBuffer,
152 -1,
153 NULL,
154 0,
155 NULL,
156 NULL);
157 DPRINT("AnsiSize %lu\n", dwAnsiSize);
158
159 pszAnsiBuffer = HeapAlloc(GetProcessHeap(), 0, dwAnsiSize);
160 if (pszAnsiBuffer == NULL)
161 {
162 dwError = ERROR_NOT_ENOUGH_MEMORY;
163 DPRINT1("Error %lu\n", dwError);
164 goto done;
165 }
166
168 0,
169 pszUnicodeBuffer,
170 -1,
171 pszAnsiBuffer,
172 dwAnsiSize,
173 NULL,
174 NULL);
175 DPRINT("AnsiBuffer %s\n", pszAnsiBuffer);
176
177 dwError = RegSetValueExW(hKey,
178 L"DhcpClassIdBin",
179 0,
181 (PBYTE)pszAnsiBuffer,
182 strlen(pszAnsiBuffer));
183 if (dwError != ERROR_SUCCESS)
184 {
185 DPRINT1("Error %lu\n", dwError);
186 }
187
188done:
189 if (hKey)
191
192 if (pszAnsiBuffer)
193 HeapFree(GetProcessHeap(), 0, pszAnsiBuffer);
194
195 if (pszUnicodeBuffer)
196 HeapFree(GetProcessHeap(), 0, pszUnicodeBuffer);
197
198 return dwError;
199}
#define RegCloseKey(hKey)
Definition: registry.h:49
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
#define CP_ACP
Definition: compat.h:109
#define WideCharToMultiByte
Definition: compat.h:111
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
FxAutoRegKey hKey
_Null_terminated_ char * PSZ
Definition: minwindef.h:56
#define _swprintf(buf, format,...)
Definition: sprintf.c:56
#define REG_BINARY
Definition: nt_native.h:1499
#define KEY_QUERY_VALUE
Definition: nt_native.h:1019
#define KEY_SET_VALUE
Definition: nt_native.h:1020
BYTE * PBYTE
Definition: pedump.c:66
short WCHAR
Definition: pedump.c:58
uint16_t * PWSTR
Definition: typedefs.h:56
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12

Referenced by DhcpHandlePnPEvent().

◆ UpdateServiceStatus()

static VOID UpdateServiceStatus ( DWORD  dwState)
static

Definition at line 849 of file dhcpcsvc.c.

850{
853
854 if (dwState == SERVICE_RUNNING)
856 else
858
862
863 if (dwState == SERVICE_START_PENDING ||
864 dwState == SERVICE_STOP_PENDING)
866 else
868
871}
#define SERVICE_ACCEPT_STOP
Definition: winsvc.h:28
#define SERVICE_ACCEPT_SHUTDOWN
Definition: winsvc.h:30
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
#define SERVICE_WIN32_SHARE_PROCESS
Definition: cmtypes.h:964

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

◆ ServiceName

WCHAR ServiceName[] = L"DHCP"
static

Definition at line 16 of file dhcpcsvc.c.

Referenced by ServiceMain().

◆ ServiceStatus

SERVICE_STATUS ServiceStatus

Definition at line 19 of file dhcpcsvc.c.

Referenced by ServiceControlHandler(), and UpdateServiceStatus().

◆ ServiceStatusHandle

SERVICE_STATUS_HANDLE ServiceStatusHandle = 0

Definition at line 18 of file dhcpcsvc.c.

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