xref: /reactos/base/services/dnsrslvr/dnsrslvr.c (revision 76dd2fcf)
1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS DNS Resolver
4  * FILE:        base/services/dnsrslvr/dnsrslvr.c
5  * PURPOSE:     DNS Resolver Service
6  * PROGRAMMER:  Christoph von Wittich
7  */
8 
9 /* INCLUDES *****************************************************************/
10 
11 #include "precomp.h"
12 
13 #define NDEBUG
14 #include <debug.h>
15 
16 /* GLOBALS ******************************************************************/
17 
18 HINSTANCE hDllInstance;
19 SERVICE_STATUS_HANDLE ServiceStatusHandle;
20 SERVICE_STATUS SvcStatus;
21 static WCHAR ServiceName[] = L"Dnscache";
22 
23 DWORD WINAPI RpcThreadRoutine(LPVOID lpParameter);
24 
25 /* FUNCTIONS *****************************************************************/
26 
27 static
28 VOID
29 UpdateServiceStatus(
30     HANDLE hServiceStatus,
31     DWORD NewStatus,
32     DWORD Increment)
33 {
34     if (Increment > 0)
35         SvcStatus.dwCheckPoint += Increment;
36     else
37         SvcStatus.dwCheckPoint = 0;
38 
39     SvcStatus.dwCurrentState = NewStatus;
40     SetServiceStatus(hServiceStatus, &SvcStatus);
41 }
42 
43 static
44 DWORD
45 WINAPI
46 ServiceControlHandler(
47     DWORD dwControl,
48     DWORD dwEventType,
49     LPVOID lpEventData,
50     LPVOID lpContext)
51 {
52     switch (dwControl)
53     {
54         case SERVICE_CONTROL_SHUTDOWN:
55         case SERVICE_CONTROL_STOP:
56             UpdateServiceStatus(ServiceStatusHandle, SERVICE_STOP_PENDING, 1);
57             RpcMgmtStopServerListening(NULL);
58             DnsIntCacheFree();
59             UpdateServiceStatus(ServiceStatusHandle, SERVICE_STOPPED, 0);
60             break;
61 
62         case SERVICE_CONTROL_INTERROGATE:
63             return NO_ERROR;
64 
65         default:
66             return ERROR_CALL_NOT_IMPLEMENTED;
67     }
68     return NO_ERROR;
69 }
70 
71 VOID
72 WINAPI
73 ServiceMain(
74     DWORD argc,
75     LPWSTR *argv)
76 {
77     HANDLE hThread;
78 
79     UNREFERENCED_PARAMETER(argc);
80     UNREFERENCED_PARAMETER(argv);
81 
82     DPRINT("ServiceMain() called\n");
83 
84     SvcStatus.dwServiceType             = SERVICE_WIN32_OWN_PROCESS;
85     SvcStatus.dwCurrentState            = SERVICE_START_PENDING;
86     SvcStatus.dwControlsAccepted        = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
87     SvcStatus.dwCheckPoint              = 0;
88     SvcStatus.dwWin32ExitCode           = NO_ERROR;
89     SvcStatus.dwServiceSpecificExitCode = 0;
90     SvcStatus.dwWaitHint                = 4000;
91 
92     ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName,
93                                                         ServiceControlHandler,
94                                                         NULL);
95 
96     if (!ServiceStatusHandle)
97     {
98         DPRINT1("DNSRSLVR: Unable to register service control handler (%lx)\n", GetLastError());
99         return; // FALSE
100     }
101 
102     DnsIntCacheInitialize();
103 
104     ReadHostsFile();
105 
106     hThread = CreateThread(NULL,
107                            0,
108                            (LPTHREAD_START_ROUTINE)
109                            RpcThreadRoutine,
110                            NULL,
111                            0,
112                            NULL);
113 
114     if (!hThread)
115     {
116         DnsIntCacheFree();
117         DPRINT("Can't create RpcThread\n");
118         UpdateServiceStatus(ServiceStatusHandle, SERVICE_STOPPED, 0);
119     }
120     else
121     {
122         CloseHandle(hThread);
123     }
124 
125     DPRINT("ServiceMain() done\n");
126     UpdateServiceStatus(ServiceStatusHandle, SERVICE_RUNNING, 0);
127 }
128 
129 BOOL
130 WINAPI
131 DllMain(
132     _In_ HINSTANCE hinstDLL,
133     _In_ DWORD fdwReason,
134     _In_ PVOID pvReserved)
135 {
136     UNREFERENCED_PARAMETER(pvReserved);
137 
138     switch (fdwReason)
139     {
140         case DLL_PROCESS_ATTACH:
141             DisableThreadLibraryCalls(hinstDLL);
142             hDllInstance = hinstDLL;
143             break;
144 
145         case DLL_PROCESS_DETACH:
146             break;
147     }
148 
149     return TRUE;
150 }
151 
152 /* EOF */
153