xref: /reactos/base/services/seclogon/seclogon.c (revision 0e462a39)
1 /*
2  * PROJECT:     ReactOS Secondary Logon Service
3  * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE:     Secondary Logon service RPC server
5  * COPYRIGHT:   Eric Kohl 2022 <eric.kohl@reactos.org>
6  */
7 
8 /* INCLUDES *****************************************************************/
9 
10 #include "precomp.h"
11 
12 WINE_DEFAULT_DEBUG_CHANNEL(seclogon);
13 
14 
15 /* GLOBALS ******************************************************************/
16 
17 HINSTANCE hDllInstance;
18 PSVCHOST_GLOBAL_DATA lpServiceGlobals;
19 
20 static WCHAR ServiceName[] = L"seclogon";
21 
22 static SERVICE_STATUS_HANDLE ServiceStatusHandle;
23 static SERVICE_STATUS ServiceStatus;
24 
25 
26 /* FUNCTIONS *****************************************************************/
27 
28 static
29 VOID
UpdateServiceStatus(_In_ DWORD dwState)30 UpdateServiceStatus(
31     _In_ DWORD dwState)
32 {
33     ServiceStatus.dwServiceType = SERVICE_WIN32_SHARE_PROCESS;
34     ServiceStatus.dwCurrentState = dwState;
35 
36     if (dwState == SERVICE_PAUSED || dwState == SERVICE_RUNNING)
37         ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP |
38                                            SERVICE_ACCEPT_SHUTDOWN |
39                                            SERVICE_ACCEPT_PAUSE_CONTINUE;
40     else
41         ServiceStatus.dwControlsAccepted = 0;
42 
43     ServiceStatus.dwWin32ExitCode = 0;
44     ServiceStatus.dwServiceSpecificExitCode = 0;
45     ServiceStatus.dwCheckPoint = 0;
46 
47     if (dwState == SERVICE_START_PENDING ||
48         dwState == SERVICE_STOP_PENDING ||
49         dwState == SERVICE_PAUSE_PENDING ||
50         dwState == SERVICE_CONTINUE_PENDING)
51         ServiceStatus.dwWaitHint = 10000;
52     else
53         ServiceStatus.dwWaitHint = 0;
54 
55     SetServiceStatus(ServiceStatusHandle,
56                      &ServiceStatus);
57 }
58 
59 
60 static
61 DWORD
62 WINAPI
ServiceControlHandlerEx(_In_ DWORD dwControl,_In_ DWORD dwEventType,_In_ LPVOID lpEventData,_In_ LPVOID lpContext)63 ServiceControlHandlerEx(
64     _In_ DWORD dwControl,
65     _In_ DWORD dwEventType,
66     _In_ LPVOID lpEventData,
67     _In_ LPVOID lpContext)
68 {
69     TRACE("ServiceControlHandlerEx()\n");
70 
71     switch (dwControl)
72     {
73         case SERVICE_CONTROL_STOP:
74             TRACE("  SERVICE_CONTROL_STOP received\n");
75             UpdateServiceStatus(SERVICE_STOP_PENDING);
76             StopRpcServer();
77             UpdateServiceStatus(SERVICE_STOPPED);
78             return ERROR_SUCCESS;
79 
80         case SERVICE_CONTROL_PAUSE:
81             TRACE("  SERVICE_CONTROL_PAUSE received\n");
82             UpdateServiceStatus(SERVICE_PAUSE_PENDING);
83             StopRpcServer();
84             UpdateServiceStatus(SERVICE_PAUSED);
85             return ERROR_SUCCESS;
86 
87         case SERVICE_CONTROL_CONTINUE:
88             TRACE("  SERVICE_CONTROL_CONTINUE received\n");
89             UpdateServiceStatus(SERVICE_CONTINUE_PENDING);
90             StartRpcServer();
91             UpdateServiceStatus(SERVICE_RUNNING);
92             return ERROR_SUCCESS;
93 
94         case SERVICE_CONTROL_INTERROGATE:
95             TRACE("  SERVICE_CONTROL_INTERROGATE received\n");
96             SetServiceStatus(ServiceStatusHandle,
97                              &ServiceStatus);
98             return ERROR_SUCCESS;
99 
100         case SERVICE_CONTROL_SHUTDOWN:
101             TRACE("  SERVICE_CONTROL_SHUTDOWN received\n");
102             UpdateServiceStatus(SERVICE_STOP_PENDING);
103             StopRpcServer();
104             UpdateServiceStatus(SERVICE_STOPPED);
105             return ERROR_SUCCESS;
106 
107         default :
108             TRACE("  Control %lu received\n", dwControl);
109             return ERROR_CALL_NOT_IMPLEMENTED;
110     }
111 }
112 
113 
114 VOID
115 WINAPI
SvchostPushServiceGlobals(_In_ PSVCHOST_GLOBAL_DATA lpGlobals)116 SvchostPushServiceGlobals(
117     _In_ PSVCHOST_GLOBAL_DATA lpGlobals)
118 {
119     TRACE("SvchostPushServiceGlobals(%p)\n", lpGlobals);
120     lpServiceGlobals = lpGlobals;
121 }
122 
123 
124 VOID
125 WINAPI
SvcEntry_Seclogon(_In_ INT ArgCount,_In_ PWSTR * ArgVector)126 SvcEntry_Seclogon(
127     _In_ INT ArgCount,
128     _In_ PWSTR *ArgVector)
129 {
130     DWORD dwError;
131 
132     UNREFERENCED_PARAMETER(ArgCount);
133     UNREFERENCED_PARAMETER(ArgVector);
134 
135     TRACE("ServiceMain(%d %p)\n", ArgCount, ArgVector);
136 
137     ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName,
138                                                         ServiceControlHandlerEx,
139                                                         NULL);
140     if (!ServiceStatusHandle)
141     {
142         ERR("RegisterServiceCtrlHandlerExW() failed! (Error %lu)\n", GetLastError());
143         return;
144     }
145 
146     UpdateServiceStatus(SERVICE_START_PENDING);
147 
148     dwError = StartRpcServer();
149     if (dwError != ERROR_SUCCESS)
150     {
151         ERR("Service stopped (dwError: %lu\n", dwError);
152         UpdateServiceStatus(SERVICE_STOPPED);
153         return;
154     }
155 
156     UpdateServiceStatus(SERVICE_RUNNING);
157 }
158 
159 
160 BOOL
161 WINAPI
DllMain(_In_ HINSTANCE hinstDLL,_In_ DWORD fdwReason,_In_ PVOID pvReserved)162 DllMain(
163     _In_ HINSTANCE hinstDLL,
164     _In_ DWORD fdwReason,
165     _In_ PVOID pvReserved)
166 {
167     UNREFERENCED_PARAMETER(pvReserved);
168 
169     switch (fdwReason)
170     {
171         case DLL_PROCESS_ATTACH:
172             DisableThreadLibraryCalls(hinstDLL);
173             hDllInstance = hinstDLL;
174             break;
175 
176         case DLL_PROCESS_DETACH:
177             break;
178     }
179 
180     return TRUE;
181 }
182 
183 /* EOF */
184