mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 07:02:56 +00:00
First draft of a ScmNamedPipeListenerThread implementation.
Some debug noise from winlogon and as always edited an ignore file. svn path=/trunk/; revision=3898
This commit is contained in:
parent
e464b1cd43
commit
70544cdae0
3 changed files with 298 additions and 244 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $Id: services.c,v 1.9 2002/10/20 14:54:34 ekohl Exp $
|
||||
/* $Id: services.c,v 1.10 2002/12/27 13:54:28 robd Exp $
|
||||
*
|
||||
* service control manager
|
||||
*
|
||||
|
@ -74,27 +74,20 @@ ScmCreateStartEvent(PHANDLE StartEvent)
|
|||
TRUE,
|
||||
FALSE,
|
||||
_T("SvcctrlStartEvent_A3725DX"));
|
||||
if (hEvent == NULL)
|
||||
{
|
||||
if (GetLastError() == ERROR_ALREADY_EXISTS)
|
||||
{
|
||||
if (hEvent == NULL) {
|
||||
if (GetLastError() == ERROR_ALREADY_EXISTS) {
|
||||
hEvent = OpenEvent(EVENT_ALL_ACCESS,
|
||||
FALSE,
|
||||
_T("SvcctrlStartEvent_A3725DX"));
|
||||
if (hEvent == NULL)
|
||||
{
|
||||
return(FALSE);
|
||||
if (hEvent == NULL) {
|
||||
return FALSE;
|
||||
}
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
*StartEvent = hEvent;
|
||||
|
||||
return(TRUE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -108,15 +101,13 @@ ScmNamedPipeHandleRequest(
|
|||
DbgPrint("SCM READ: %s\n", Request);
|
||||
|
||||
*ReplySize = 0;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
DWORD
|
||||
WINAPI
|
||||
ScmNamedPipeThread(
|
||||
LPVOID Context)
|
||||
ScmNamedPipeThread(LPVOID Context)
|
||||
{
|
||||
CHAR chRequest[PIPE_BUFSIZE];
|
||||
CHAR chReply[PIPE_BUFSIZE];
|
||||
|
@ -126,46 +117,38 @@ ScmNamedPipeThread(
|
|||
BOOL fSuccess;
|
||||
HANDLE hPipe;
|
||||
|
||||
DPRINT("Accepting SCM commands through named pipe\n");
|
||||
|
||||
hPipe = (HANDLE)Context;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
fSuccess = ReadFile(
|
||||
hPipe,
|
||||
DPRINT("ScmNamedPipeThread(%x) - Accepting SCM commands through named pipe\n", hPipe);
|
||||
|
||||
for (;;) {
|
||||
fSuccess = ReadFile(hPipe,
|
||||
&chRequest,
|
||||
PIPE_BUFSIZE,
|
||||
&cbBytesRead,
|
||||
NULL);
|
||||
if (!fSuccess || cbBytesRead == 0)
|
||||
{
|
||||
if (!fSuccess || cbBytesRead == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (ScmNamedPipeHandleRequest(&chRequest, cbBytesRead, &chReply, &cbReplyBytes))
|
||||
{
|
||||
fSuccess = WriteFile(
|
||||
hPipe,
|
||||
if (ScmNamedPipeHandleRequest(&chRequest, cbBytesRead, &chReply, &cbReplyBytes)) {
|
||||
fSuccess = WriteFile(hPipe,
|
||||
&chReply,
|
||||
cbReplyBytes,
|
||||
&cbWritten,
|
||||
NULL);
|
||||
if (!fSuccess || cbReplyBytes != cbWritten)
|
||||
{
|
||||
if (!fSuccess || cbReplyBytes != cbWritten) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DPRINT("ScmNamedPipeThread(%x) - Disconnecting named pipe connection\n", hPipe);
|
||||
FlushFileBuffers(hPipe);
|
||||
DisconnectNamedPipe(hPipe);
|
||||
CloseHandle(hPipe);
|
||||
|
||||
DPRINT("ScmNamedPipeThread(%x) - Done.\n", hPipe);
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
BOOL ScmCreateNamedPipe(VOID)
|
||||
{
|
||||
DWORD dwThreadId;
|
||||
|
@ -173,6 +156,8 @@ BOOL ScmCreateNamedPipe(VOID)
|
|||
HANDLE hThread;
|
||||
HANDLE hPipe;
|
||||
|
||||
DPRINT("ScmCreateNamedPipe() - CreateNamedPipe(\"\\\\.\\pipe\\Ntsvcs\")\n");
|
||||
|
||||
hPipe = CreateNamedPipe("\\\\.\\pipe\\Ntsvcs",
|
||||
PIPE_ACCESS_DUPLEX,
|
||||
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
|
||||
|
@ -181,44 +166,82 @@ BOOL ScmCreateNamedPipe(VOID)
|
|||
PIPE_BUFSIZE,
|
||||
PIPE_TIMEOUT,
|
||||
NULL);
|
||||
if (hPipe == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
if (hPipe == INVALID_HANDLE_VALUE) {
|
||||
DPRINT("CreateNamedPipe() failed (%d)\n", GetLastError());
|
||||
return(FALSE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
DPRINT("CreateNamedPipe() - calling ConnectNamedPipe(%x)\n", hPipe);
|
||||
fConnected = ConnectNamedPipe(hPipe,
|
||||
NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED);
|
||||
if (fConnected)
|
||||
{
|
||||
DPRINT("Pipe connected\n");
|
||||
DPRINT("CreateNamedPipe() - ConnectNamedPipe() returned %d\n", fConnected);
|
||||
|
||||
if (fConnected) {
|
||||
DPRINT("Pipe connected\n");
|
||||
hThread = CreateThread(NULL,
|
||||
0,
|
||||
ScmNamedPipeThread,
|
||||
(LPVOID)hPipe,
|
||||
0,
|
||||
&dwThreadId);
|
||||
if (!hThread)
|
||||
{
|
||||
if (!hThread) {
|
||||
DPRINT("Could not create thread (%d)\n", GetLastError());
|
||||
|
||||
DisconnectNamedPipe(hPipe);
|
||||
CloseHandle(hPipe);
|
||||
return(FALSE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT("Pipe not connected\n");
|
||||
|
||||
CloseHandle(hPipe);
|
||||
DPRINT("CreateNamedPipe() - returning FALSE\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
} 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(%x) - aka SCM.\n", Context);
|
||||
|
||||
// hPipe = (HANDLE)Context;
|
||||
for (;;) {
|
||||
PrintString("SCM: Waiting for connection on named pipe...\n");
|
||||
/* Create named pipe */
|
||||
if (!ScmCreateNamedPipe()) {
|
||||
PrintString("\nSCM: Failed to create named pipe\n");
|
||||
break;
|
||||
//ExitThread(0);
|
||||
}
|
||||
PrintString("\nSCM: named pipe session created.\n");
|
||||
Sleep(10);
|
||||
}
|
||||
DPRINT("\n\nWARNING: ScmNamedPipeListenerThread(%x) - 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) {
|
||||
PrintString("SERVICES: Could not create thread (Status %lx)\n", GetLastError());
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int STDCALL
|
||||
WinMain(HINSTANCE hInstance,
|
||||
|
@ -230,7 +253,7 @@ WinMain(HINSTANCE hInstance,
|
|||
HANDLE hEvent;
|
||||
NTSTATUS Status;
|
||||
|
||||
PrintString("Service Control Manager\n");
|
||||
PrintString("SERVICES: Service Control Manager\n");
|
||||
|
||||
/* Create start event */
|
||||
if (!ScmCreateStartEvent(&hScmStartEvent))
|
||||
|
@ -239,6 +262,7 @@ WinMain(HINSTANCE hInstance,
|
|||
ExitThread(0);
|
||||
}
|
||||
|
||||
PrintString("SERVICES: created start event with handle %x.\n", hScmStartEvent);
|
||||
|
||||
/* FIXME: more initialization */
|
||||
|
||||
|
@ -247,7 +271,7 @@ WinMain(HINSTANCE hInstance,
|
|||
Status = ScmCreateServiceDataBase();
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
PrintString("ScmCreateServiceDataBase() failed (Status %lx)\n", Status);
|
||||
PrintString("SERVICES: failed to create SCM database (Status %lx)\n", Status);
|
||||
ExitThread(0);
|
||||
}
|
||||
|
||||
|
@ -255,12 +279,20 @@ WinMain(HINSTANCE hInstance,
|
|||
ScmGetBootAndSystemDriverState();
|
||||
|
||||
#if 0
|
||||
PrintString("SERVICES: Attempting to create named pipe...\n");
|
||||
/* Create named pipe */
|
||||
if (!ScmCreateNamedPipe())
|
||||
{
|
||||
if (!ScmCreateNamedPipe()) {
|
||||
PrintString("SERVICES: Failed to create named pipe\n");
|
||||
ExitThread(0);
|
||||
}
|
||||
PrintString("SERVICES: named pipe created successfully.\n");
|
||||
#else
|
||||
PrintString("SERVICES: Attempting to create named pipe listener...\n");
|
||||
if (!StartScmNamedPipeThreadListener()) {
|
||||
PrintString("SERVICES: Failed to create named pipe listener thread.\n");
|
||||
ExitThread(0);
|
||||
}
|
||||
PrintString("SERVICES: named pipe listener thread created.\n");
|
||||
#endif
|
||||
/* FIXME: create listener thread for pipe */
|
||||
|
||||
|
@ -285,9 +317,10 @@ WinMain(HINSTANCE hInstance,
|
|||
|
||||
PrintString("SERVICES: Running.\n");
|
||||
|
||||
#if 1
|
||||
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
WaitForSingleObject(hEvent, INFINITE);
|
||||
#if 0
|
||||
#else
|
||||
for (;;)
|
||||
{
|
||||
NtYieldExecution();
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: winlogon.c,v 1.12 2002/09/08 10:23:48 chorns Exp $
|
||||
/* $Id: winlogon.c,v 1.13 2002/12/27 13:54:28 robd Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -18,7 +18,7 @@
|
|||
|
||||
#include <wchar.h>
|
||||
|
||||
#define NDEBUG
|
||||
#define DBG
|
||||
#include <debug.h>
|
||||
|
||||
/* GLOBALS ******************************************************************/
|
||||
|
@ -64,6 +64,8 @@ BOOLEAN StartServices(VOID)
|
|||
StartupInfo.cbReserved2 = 0;
|
||||
StartupInfo.lpReserved2 = 0;
|
||||
|
||||
PrintString("WL: Creating new process - \"services.exe\".\n");
|
||||
|
||||
Result = CreateProcess(CommandLine,
|
||||
NULL,
|
||||
NULL,
|
||||
|
@ -85,6 +87,7 @@ BOOLEAN StartServices(VOID)
|
|||
{
|
||||
Sleep(1000);
|
||||
|
||||
//DbgPrint("WL: Attempting to open event \"SvcctrlStartEvent_A3725DX\"\n");
|
||||
ServicesInitEvent = OpenEvent(EVENT_ALL_ACCESS, //SYNCHRONIZE,
|
||||
FALSE,
|
||||
"SvcctrlStartEvent_A3725DX");
|
||||
|
@ -94,9 +97,18 @@ BOOLEAN StartServices(VOID)
|
|||
}
|
||||
}
|
||||
|
||||
if (ServicesInitEvent == NULL)
|
||||
{
|
||||
DbgPrint("WL: Failed to open event \"SvcctrlStartEvent_A3725DX\"\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* wait for event signalization */
|
||||
//DbgPrint("WL: Waiting forever on event handle: %x\n", ServicesInitEvent);
|
||||
WaitForSingleObject(ServicesInitEvent, INFINITE);
|
||||
//DbgPrint("WL: Closing event object \"SvcctrlStartEvent_A3725DX\"\n");
|
||||
CloseHandle(ServicesInitEvent);
|
||||
DbgPrint("WL: StartServices() Done.\n");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -116,7 +128,7 @@ BOOLEAN StartLsass(VOID)
|
|||
|
||||
if (LsassInitEvent == NULL)
|
||||
{
|
||||
DbgPrint("Failed to create lsass notification event\n");
|
||||
DbgPrint("WL: Failed to create lsass notification event\n");
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
|
@ -230,7 +242,7 @@ WinMain(HINSTANCE hInstance,
|
|||
CreateWindowStationW(L"WinSta0", 0, GENERIC_ALL, NULL);
|
||||
if (InteractiveWindowStation == NULL)
|
||||
{
|
||||
DbgPrint("Failed to create window station (0x%X)\n", GetLastError());
|
||||
DbgPrint("WL: Failed to create window station (0x%X)\n", GetLastError());
|
||||
NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, 0, 0, 0, 0, 0);
|
||||
ExitProcess(1);
|
||||
}
|
||||
|
@ -287,15 +299,23 @@ WinMain(HINSTANCE hInstance,
|
|||
Success = SwitchDesktop(ApplicationDesktop);
|
||||
if (!Success)
|
||||
{
|
||||
DbgPrint("Cannot switch to Winlogon desktop (0x%X)\n", GetLastError());
|
||||
DbgPrint("WL: Cannot switch to Winlogon desktop (0x%X)\n", GetLastError());
|
||||
}
|
||||
|
||||
AllocConsole();
|
||||
SetConsoleTitle( "Winlogon" );
|
||||
/* start system processes (services.exe & lsass.exe) */
|
||||
StartServices();
|
||||
Success = StartServices();
|
||||
if (!Success)
|
||||
{
|
||||
DbgPrint("WL: Failed to Start Services (0x%X)\n", GetLastError());
|
||||
}
|
||||
#if 0
|
||||
StartLsass();
|
||||
Success = StartLsass();
|
||||
if (!Success)
|
||||
{
|
||||
DbgPrint("WL: Failed to Start Security System (0x%X)\n", GetLastError());
|
||||
}
|
||||
#endif
|
||||
|
||||
/* FIXME: What name does the real WinLogon use? */
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
base.tmp
|
||||
junk.tmp
|
||||
temp.exp
|
||||
win32k.coff
|
||||
win32k.sys
|
||||
win32k.nostrip.sys
|
||||
win32k.coff
|
||||
win32k.sym
|
||||
*.d
|
||||
*.o
|
||||
*.sym
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue