2 * PROJECT: Local Security Authority Server DLL
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/lsasrv/service.c
5 * PURPOSE: Security service
6 * COPYRIGHT: Copyright 2016, 2019 Eric Kohl <eric.kohl@reactos.org>
9 /* INCLUDES ****************************************************************/
14 typedef VOID (WINAPI
*PNETLOGONMAIN
)(INT ArgCount
, PWSTR
*ArgVector
);
16 VOID WINAPI
I_ScIsSecurityProcess(VOID
);
18 static VOID WINAPI
NetlogonServiceMain(DWORD dwArgc
, PWSTR
*pszArgv
);
19 static VOID WINAPI
SamSsServiceMain(DWORD dwArgc
, PWSTR
*pszArgv
);
21 SERVICE_TABLE_ENTRYW ServiceTable
[] =
23 {L
"NETLOGON", NetlogonServiceMain
},
24 {L
"SAMSS", SamSsServiceMain
},
29 /* FUNCTIONS ***************************************************************/
38 HINSTANCE hNetlogon
= NULL
;
39 PNETLOGONMAIN pNetlogonMain
= NULL
;
41 TRACE("NetlogonServiceMain(%lu %p)\n", dwArgc
, pszArgv
);
43 hNetlogon
= LoadLibraryW(L
"Netlogon.dll");
44 if (hNetlogon
== NULL
)
46 ERR("LoadLibrary() failed!\n");
50 pNetlogonMain
= (PNETLOGONMAIN
)GetProcAddress(hNetlogon
, "NlNetlogonMain");
51 if (pNetlogonMain
== NULL
)
53 ERR("GetProcAddress(NlNetlogonMain) failed!\n");
54 FreeLibrary(hNetlogon
);
58 TRACE("NlNetlogonMain %p\n", pNetlogonMain
);
60 pNetlogonMain(dwArgc
, pszArgv
);
68 _In_ DWORD fdwControl
)
70 TRACE("SamSsControlHandler(%lu)\n", fdwControl
);
81 SERVICE_STATUS_HANDLE hStatus
;
82 SERVICE_STATUS ServiceStatus
;
84 TRACE("SamSsServiceMain(%lu %p)\n", dwArgc
, pszArgv
);
86 hStatus
= RegisterServiceCtrlHandlerW(L
"SAMSS",
91 ServiceStatus
.dwServiceType
= SERVICE_WIN32_SHARE_PROCESS
;
92 ServiceStatus
.dwCurrentState
= SERVICE_START_PENDING
;
93 ServiceStatus
.dwControlsAccepted
= 0;
94 ServiceStatus
.dwWin32ExitCode
= ERROR_SUCCESS
;
95 ServiceStatus
.dwServiceSpecificExitCode
= ERROR_SUCCESS
;
96 ServiceStatus
.dwCheckPoint
= 1;
97 ServiceStatus
.dwWaitHint
= 0x7530;
99 SetServiceStatus(hStatus
, &ServiceStatus
);
101 ServiceStatus
.dwCurrentState
= SERVICE_RUNNING
;
102 ServiceStatus
.dwCheckPoint
= 0;
103 ServiceStatus
.dwWaitHint
= 0;
105 SetServiceStatus(hStatus
, &ServiceStatus
);
113 _In_ PVOID pParameter
)
118 TRACE("DispatcherThread(%p)\n", pParameter
);
120 /* Create or open the SECURITY_SERVICES_STARTED event */
121 hEvent
= CreateEventW(NULL
,
124 L
"SECURITY_SERVICES_STARTED");
127 dwError
= GetLastError();
128 if (dwError
!= ERROR_ALREADY_EXISTS
)
131 hEvent
= OpenEventW(SYNCHRONIZE
,
133 L
"SECURITY_SERVICES_STARTED");
135 return GetLastError();
138 /* Wait for the SECURITY_SERVICES_STARTED event to be signaled */
139 TRACE("Waiting for the SECURITY_SERVICES_STARTED event!\n");
140 dwError
= WaitForSingleObject(hEvent
, INFINITE
);
141 TRACE("WaitForSingleObject returned %lu\n", dwError
);
143 /* Close the event handle */
146 /* Fail, if the event was not signaled */
147 if (dwError
!= WAIT_OBJECT_0
)
149 ERR("Wait failed!\n");
153 /* This is the security process */
154 I_ScIsSecurityProcess();
156 /* Start the services */
157 TRACE("Start the security services!\n");
158 if (!StartServiceCtrlDispatcherW(ServiceTable
))
159 return GetLastError();
163 return ERROR_SUCCESS
;
174 TRACE("ServiceInit()\n");
176 hThread
= CreateThread(NULL
,
183 return (NTSTATUS
)GetLastError();
185 return STATUS_SUCCESS
;