/* GLOBALS ******************************************************************/
-#define PIPE_BUFSIZE 1024
-#define PIPE_TIMEOUT 1000
-
/* Defined in include/reactos/services/services.h */
// #define SCM_START_EVENT L"SvcctrlStartEvent_A3752DX"
#define SCM_AUTOSTARTCOMPLETE_EVENT L"SC_AutoStartComplete"
-#define LSA_RPC_SERVER_ACTIVE L"LSA_RPC_SERVER_ACTIVE"
BOOL ScmInitialize = FALSE;
BOOL ScmShutdown = FALSE;
static HANDLE hScmShutdownEvent = NULL;
+static HANDLE hScmSecurityServicesEvent = NULL;
/* FUNCTIONS *****************************************************************/
}
+DWORD
+SetSecurityServicesEvent(VOID)
+{
+ DWORD dwError;
+
+ if (hScmSecurityServicesEvent != NULL)
+ return ERROR_SUCCESS;
+
+ /* Create or open the SECURITY_SERVICES_STARTED event */
+ hScmSecurityServicesEvent = CreateEventW(NULL,
+ TRUE,
+ FALSE,
+ L"SECURITY_SERVICES_STARTED");
+ if (hScmSecurityServicesEvent == NULL)
+ {
+ dwError = GetLastError();
+ if (dwError != ERROR_ALREADY_EXISTS)
+ return dwError;
+
+ hScmSecurityServicesEvent = OpenEventW(EVENT_MODIFY_STATE,
+ FALSE,
+ L"SECURITY_SERVICES_STARTED");
+ if (hScmSecurityServicesEvent == NULL)
+ return GetLastError();
+ }
+
+ SetEvent(hScmSecurityServicesEvent);
+
+ return ERROR_SUCCESS;
+}
+
+
VOID
ScmLogEvent(DWORD dwEventId,
WORD wType,
VOID
ScmWaitForLsa(VOID)
{
- HANDLE hEvent = CreateEventW(NULL, TRUE, FALSE, LSA_RPC_SERVER_ACTIVE);
+ HANDLE hEvent = CreateEventW(NULL, TRUE, FALSE, L"LSA_RPC_SERVER_ACTIVE");
if (hEvent == NULL)
{
- DPRINT1("Failed to create the notification event (Error %lu)\n", GetLastError());
+ DPRINT1("Failed to create or open the notification event (Error %lu)\n", GetLastError());
}
else
{
}
-BOOL
-ScmNamedPipeHandleRequest(PVOID Request,
- DWORD RequestSize,
- PVOID Reply,
- LPDWORD ReplySize)
-{
- DbgPrint("SCM READ: %p\n", Request);
-
- *ReplySize = 0;
- return FALSE;
-}
-
-
-DWORD WINAPI
-ScmNamedPipeThread(LPVOID Context)
-{
- CHAR chRequest[PIPE_BUFSIZE];
- CHAR chReply[PIPE_BUFSIZE];
- DWORD cbReplyBytes;
- DWORD cbBytesRead;
- DWORD cbWritten;
- BOOL bSuccess;
- HANDLE hPipe;
-
- hPipe = (HANDLE)Context;
-
- DPRINT("ScmNamedPipeThread(%p) - Accepting SCM commands through named pipe\n", hPipe);
-
- for (;;)
- {
- bSuccess = ReadFile(hPipe,
- &chRequest,
- PIPE_BUFSIZE,
- &cbBytesRead,
- NULL);
- if (!bSuccess || cbBytesRead == 0)
- {
- break;
- }
-
- if (ScmNamedPipeHandleRequest(&chRequest, cbBytesRead, &chReply, &cbReplyBytes))
- {
- bSuccess = WriteFile(hPipe,
- &chReply,
- cbReplyBytes,
- &cbWritten,
- NULL);
- if (!bSuccess || cbReplyBytes != cbWritten)
- {
- break;
- }
- }
- }
-
- DPRINT("ScmNamedPipeThread(%p) - Disconnecting named pipe connection\n", hPipe);
-
- FlushFileBuffers(hPipe);
- DisconnectNamedPipe(hPipe);
- CloseHandle(hPipe);
-
- DPRINT("ScmNamedPipeThread(%p) - Done.\n", hPipe);
-
- return ERROR_SUCCESS;
-}
-
-
-BOOL
-ScmCreateNamedPipe(VOID)
-{
- DWORD dwThreadId;
- BOOL bConnected;
- HANDLE hThread;
- HANDLE hPipe;
-
- DPRINT("ScmCreateNamedPipe() - CreateNamedPipe(\"\\\\.\\pipe\\Ntsvcs\")\n");
-
- hPipe = CreateNamedPipeW(L"\\\\.\\pipe\\Ntsvcs",
- PIPE_ACCESS_DUPLEX,
- PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
- PIPE_UNLIMITED_INSTANCES,
- PIPE_BUFSIZE,
- PIPE_BUFSIZE,
- PIPE_TIMEOUT,
- NULL);
- if (hPipe == INVALID_HANDLE_VALUE)
- {
- DPRINT("CreateNamedPipe() failed (%lu)\n", GetLastError());
- return FALSE;
- }
-
- DPRINT("CreateNamedPipe() - calling ConnectNamedPipe(%p)\n", hPipe);
- bConnected = ConnectNamedPipe(hPipe,
- NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
- DPRINT("CreateNamedPipe() - ConnectNamedPipe() returned %d\n", bConnected);
-
- if (bConnected)
- {
- DPRINT("Pipe connected\n");
- hThread = CreateThread(NULL,
- 0,
- ScmNamedPipeThread,
- (LPVOID)hPipe,
- 0,
- &dwThreadId);
- if (!hThread)
- {
- DPRINT("Could not create thread (%lu)\n", GetLastError());
- DisconnectNamedPipe(hPipe);
- CloseHandle(hPipe);
- DPRINT("CreateNamedPipe() - returning FALSE\n");
- return FALSE;
- }
-
- CloseHandle(hThread);
- }
- else
- {
- DPRINT("Pipe not connected\n");
- CloseHandle(hPipe);
- DPRINT("CreateNamedPipe() - returning FALSE\n");
- return FALSE;
- }
- DPRINT("CreateNamedPipe() - returning TRUE\n");
- return TRUE;
-}
-
-
-DWORD WINAPI
-ScmNamedPipeListenerThread(LPVOID Context)
-{
-// HANDLE hPipe;
- DPRINT("ScmNamedPipeListenerThread(%p) - aka SCM.\n", Context);
-
-// hPipe = (HANDLE)Context;
- for (;;)
- {
- DPRINT("SCM: Waiting for new connection on named pipe...\n");
- /* Create named pipe */
- if (!ScmCreateNamedPipe())
- {
- DPRINT1("\nSCM: Failed to create named pipe\n");
- break;
- //ExitThread(0);
- }
- DPRINT("\nSCM: named pipe session created.\n");
- Sleep(10);
- }
- DPRINT("\n\nWARNING: ScmNamedPipeListenerThread(%p) - Aborted.\n\n", Context);
- return ERROR_SUCCESS;
-}
-
-
-BOOL
-StartScmNamedPipeThreadListener(VOID)
-{
- DWORD dwThreadId;
- HANDLE hThread;
-
- hThread = CreateThread(NULL,
- 0,
- ScmNamedPipeListenerThread,
- NULL, /*(LPVOID)hPipe,*/
- 0,
- &dwThreadId);
- if (!hThread)
- {
- DPRINT1("SERVICES: Could not create thread (Status %lx)\n", GetLastError());
- return FALSE;
- }
-
- CloseHandle(hThread);
-
- return TRUE;
-}
-
-
BOOL WINAPI
ShutdownHandlerRoutine(DWORD dwCtrlType)
{
ScmAutoShutdownServices();
ScmShutdownServiceDatabase();
- /* Set the shutdwon event */
+ /* Set the shutdown event */
SetEvent(hScmShutdownEvent);
}
DPRINT("SERVICES: Service Control Manager\n");
+ /* Make us critical */
+ RtlSetProcessIsCritical(TRUE, NULL, TRUE);
+
/* We are initializing ourselves */
ScmInitialize = TRUE;
// ScmInitThreadManager();
+ ScmInitializeSecurity();
+
/* FIXME: more initialization */
- /* Read the control set values */
- if (!ScmGetControlSetValues())
+ /* Create the 'Last Known Good' control set */
+ dwError = ScmCreateLastKnownGoodControlSet();
+ if (dwError != ERROR_SUCCESS)
{
- DPRINT1("SERVICES: Failed to read the control set values\n");
+ DPRINT1("SERVICES: Failed to create the 'Last Known Good' control set (Error %lu)\n", dwError);
goto done;
}
goto done;
}
- /* Wait for the LSA server */
- ScmWaitForLsa();
-
/* Update the services database */
ScmGetBootAndSystemDriverState();
WaitForSingleObject(hScmShutdownEvent, INFINITE);
done:
+ ScmShutdownSecurity();
+
/* Delete our communication named pipe's critical section */
- if (bCanDeleteNamedPipeCriticalSection == TRUE)
+ if (bCanDeleteNamedPipeCriticalSection != FALSE)
ScmDeleteNamedPipeCriticalSection();
+ if (hScmSecurityServicesEvent != NULL)
+ CloseHandle(hScmSecurityServicesEvent);
+
/* Close the shutdown event */
if (hScmShutdownEvent != NULL)
CloseHandle(hScmShutdownEvent);