SM - some more work Modified: trunk/reactos/subsys/smss/client.c Modified: trunk/reactos/subsys/smss/init.c Modified: trunk/reactos/subsys/smss/smapi.c Modified: trunk/reactos/subsys/smss/smss.c Modified: trunk/reactos/subsys/smss/smss.h _____
Modified: trunk/reactos/subsys/smss/client.c --- trunk/reactos/subsys/smss/client.c 2005-02-13 22:54:35 UTC (rev 13546) +++ trunk/reactos/subsys/smss/client.c 2005-02-13 22:55:28 UTC (rev 13547) @@ -27,20 +27,12 @@
#include <ntos.h> #include "smss.h"
+#define NDEBUG +#include <debug.h> + /* Private ADT */
-typedef struct _SM_CLIENT_DATA -{ - USHORT SubsystemId; - BOOL Initialized; - HANDLE ServerProcess; - HANDLE ApiPort; - HANDLE SbApiPort; - struct _SM_CLIENT_DATA * Next; - -} SM_CLIENT_DATA, *PSM_CLIENT_DATA;
- struct _SM_CLIENT_DIRECTORY { RTL_CRITICAL_SECTION Lock; @@ -55,6 +47,7 @@ NTSTATUS SmInitializeClientManagement (VOID) { + DPRINT("SM: %s called\n", __FUNCTION__); RtlInitializeCriticalSection(& SmpClientDirectory.Lock); SmpClientDirectory.Count = 0; SmpClientDirectory.Client = NULL; @@ -64,22 +57,24 @@ /********************************************************************** * SmpLookupClient/1 */ -PSM_CLIENT_DATA STDCALL +static PSM_CLIENT_DATA STDCALL SmpLookupClient (USHORT SubsystemId) { PSM_CLIENT_DATA Client = NULL;
+ DPRINT("SM: %s called\n", __FUNCTION__); + + RtlEnterCriticalSection (& SmpClientDirectory.Lock); if (SmpClientDirectory.Count > 0) { - RtlEnterCriticalSection (& SmpClientDirectory.Lock); Client = SmpClientDirectory.Client; - while (NULL != Client->Next) + while (NULL != Client) { if (SubsystemId == Client->SubsystemId) break; Client = Client->Next; } - RtlLeaveCriticalSection (& SmpClientDirectory.Lock); } + RtlLeaveCriticalSection (& SmpClientDirectory.Lock); return Client; }
@@ -87,14 +82,17 @@ * SmpCreateClient/1 */ NTSTATUS STDCALL -SmpCreateClient(SM_PORT_MESSAGE Request) +SmCreateClient(PSM_PORT_MESSAGE Request, PSM_CLIENT_DATA * ClientData) { PSM_CLIENT_DATA pClient = NULL; + PSM_CONNECT_DATA ConnectData = (PSM_CONNECT_DATA) ((PBYTE) Request) + sizeof (LPC_REQUEST);
+ DPRINT("SM: %s called\n", __FUNCTION__); + /* * Check if a client for the ID already exist. */ - if (SmpLookupClient(0)) //FIXME + if (SmpLookupClient(ConnectData->Subsystem)) { DbgPrint("SMSS: %s: attempt to register again subsystem %d.\n",__FUNCTION__,0); return STATUS_UNSUCCESSFUL; @@ -105,11 +103,15 @@ pClient = RtlAllocateHeap (SmpHeap, HEAP_ZERO_MEMORY, sizeof (SM_CLIENT_DATA)); - if (NULL == pClient) return STATUS_NO_MEMORY; + if (NULL == pClient) + { + DPRINT("SM: %s: out of memory!\n",__FUNCTION__); + return STATUS_NO_MEMORY; + } /* * Initialize the client data */ -// pClient->SubsystemId = Request->Subsystem; + pClient->SubsystemId = ConnectData->Subsystem; pClient->Initialized = FALSE; // TODO /* @@ -128,8 +130,10 @@ pCD = pCD->Next); pCD->Next = pClient; } + pClient->Next = NULL; ++ SmpClientDirectory.Count; RtlLeaveCriticalSection (& SmpClientDirectory.Lock); + if (ClientData) *ClientData = pClient; return STATUS_SUCCESS; }
@@ -137,8 +141,10 @@ * SmpDestroyClient/1 */ NTSTATUS STDCALL -SmpDestroyClient (ULONG SubsystemId) +SmDestroyClient (ULONG SubsystemId) { + DPRINT("SM: %s called\n", __FUNCTION__); + RtlEnterCriticalSection (& SmpClientDirectory.Lock); /* TODO */ RtlLeaveCriticalSection (& SmpClientDirectory.Lock); _____
Modified: trunk/reactos/subsys/smss/init.c --- trunk/reactos/subsys/smss/init.c 2005-02-13 22:54:35 UTC (rev 13546) +++ trunk/reactos/subsys/smss/init.c 2005-02-13 22:55:28 UTC (rev 13547) @@ -98,7 +98,7 @@
};
NTSTATUS -InitSessionManager(HANDLE Children[]) +InitSessionManager(VOID) { int i; NTSTATUS Status; _____
Modified: trunk/reactos/subsys/smss/smapi.c --- trunk/reactos/subsys/smss/smapi.c 2005-02-13 22:54:35 UTC (rev 13546) +++ trunk/reactos/subsys/smss/smapi.c 2005-02-13 22:55:28 UTC (rev 13547) @@ -1,19 +1,16 @@
/* $Id$ * + * smapi.c - \SmApiPort LPC port message management + * * Reactos Session Manager * - * */
-/*#include <ddk/ntddk.h> -#include <ntdll/rtl.h>*/ -#define NTOS_MODE_USER -#include <ntos.h> -#include <sm/api.h> +#include "smss.h" #include <rosrtl/string.h> -#include "smss.h"
#define NDEBUG +#include <debug.h>
/* GLOBAL VARIABLES *********************************************************/
@@ -26,20 +23,20 @@
SMAPI(SmInvalid) { - DbgPrint("SMSS: %s called\n",__FUNCTION__); + DPRINT("SM: %s called\n",__FUNCTION__); Request->Status = STATUS_NOT_IMPLEMENTED; return STATUS_SUCCESS; }
SMAPI(SmCompSes) { - DbgPrint("SMSS: %s called\n",__FUNCTION__); + DPRINT("SM: %s called\n",__FUNCTION__); Request->Status = STATUS_NOT_IMPLEMENTED; return STATUS_SUCCESS; } SMAPI(SmExecPgm) { - DbgPrint("SMSS: %s called\n",__FUNCTION__); + DPRINT("SM: %s called\n",__FUNCTION__); Request->Status = STATUS_NOT_IMPLEMENTED; return STATUS_SUCCESS; } @@ -67,8 +64,54 @@ NTSTATUS STDCALL SmpHandleConnectionRequest (HANDLE Port, PSM_PORT_MESSAGE Request) { - DbgPrint("SMSS: %s called\n",__FUNCTION__); - return STATUS_SUCCESS; + NTSTATUS Status = STATUS_SUCCESS; + PSM_CLIENT_DATA ClientData = NULL; + PVOID Context = NULL; + + DPRINT("SM: %s called\n",__FUNCTION__); + + Status = SmCreateClient (Request, & ClientData); + if(STATUS_SUCCESS == Status) + { +#ifdef __USE_NT_LPC__ + Status = NtAcceptConnectPort (& ClientData->ApiPort, + Context, + SmApiPort, + TRUE, //accept + NULL, + NULL); +#else + Status = NtAcceptConnectPort (& ClientData->ApiPort, + Context, + (PLPC_MESSAGE) Request, + TRUE, //accept + NULL, + NULL); +#endif + if(NT_SUCCESS(Status)) + { + Status = NtCompleteConnectPort(ClientData->ApiPort); + } + return STATUS_SUCCESS; + } else { + /* Reject the subsystem */ +#ifdef __USE_NT_LPC__ + Status = NtAcceptConnectPort (& ClientData->ApiPort, + Context, + SmApiPort, + FALSE, //reject + NULL, + NULL); +#else + Status = NtAcceptConnectPort (& ClientData->ApiPort, + Context, + (PLPC_MESSAGE) Request, + FALSE, //reject + NULL, + NULL); +#endif + } + return Status; }
/********************************************************************** @@ -82,23 +125,25 @@ SmpApiThread(HANDLE Port) { NTSTATUS Status = STATUS_SUCCESS; - ULONG Unknown = 0; + PVOID Unknown = NULL; PLPC_MESSAGE Reply = NULL; SM_PORT_MESSAGE Request = {{0}};
- DbgPrint("SMSS: %s running.\n",__FUNCTION__); + DPRINT("SM: %s running\n",__FUNCTION__);
while (TRUE) { - DbgPrint("SMSS: %s: waiting for message\n",__FUNCTION__); + DPRINT("SM: %s: waiting for message\n",__FUNCTION__);
Status = NtReplyWaitReceivePort(Port, - & Unknown, + (PULONG) & Unknown, Reply, (PLPC_MESSAGE) & Request); if (NT_SUCCESS(Status)) { - DbgPrint("SMSS: %s: message received\n",__FUNCTION__); + DPRINT("SM: %s: message received (type=%d)\n", + __FUNCTION__, + PORT_MESSAGE_TYPE(Request));
switch (Request.Header.MessageType) { _____
Modified: trunk/reactos/subsys/smss/smss.c --- trunk/reactos/subsys/smss/smss.c 2005-02-13 22:54:35 UTC (rev 13546) +++ trunk/reactos/subsys/smss/smss.c 2005-02-13 22:55:28 UTC (rev 13547) @@ -36,7 +36,7 @@
{ NTSTATUS Status;
- Status = InitSessionManager(Children); + Status = InitSessionManager(); if (!NT_SUCCESS(Status)) { int i; _____
Modified: trunk/reactos/subsys/smss/smss.h --- trunk/reactos/subsys/smss/smss.h 2005-02-13 22:54:35 UTC (rev 13546) +++ trunk/reactos/subsys/smss/smss.h 2005-02-13 22:55:28 UTC (rev 13547) @@ -4,15 +4,16 @@
#define NTOS_MODE_USER #include <ntos.h> #include <sm/api.h> +#include <sm/helper.h>
#define CHILD_CSRSS 0 #define CHILD_WINLOGON 1
/* init.c */ -extern HANDLE SmpHeap; -NTSTATUS InitSessionManager(HANDLE Children[]); +NTSTATUS InitSessionManager(VOID);
/* initheap.c */ +extern HANDLE SmpHeap; NTSTATUS SmCreateHeap(VOID);
/* initenv.c */ @@ -53,9 +54,20 @@ VOID STDCALL SmpApiThread(HANDLE Port);
/* client.c */ +typedef struct _SM_CLIENT_DATA +{ + USHORT SubsystemId; + BOOL Initialized; + HANDLE ServerProcess; + HANDLE ApiPort; + HANDLE SbApiPort; + WCHAR SbApiPortName [SM_SB_NAME_MAX_LENGTH]; + struct _SM_CLIENT_DATA * Next; + +} SM_CLIENT_DATA, *PSM_CLIENT_DATA; NTSTATUS SmInitializeClientManagement(VOID); -NTSTATUS STDCALL SmpCreateClient(SM_PORT_MESSAGE); -NTSTATUS STDCALL SmpDestroyClient(ULONG); +NTSTATUS STDCALL SmCreateClient(PSM_PORT_MESSAGE,PSM_CLIENT_DATA*); +NTSTATUS STDCALL SmDestroyClient(ULONG);
/* debug.c */ extern HANDLE DbgSsApiPort;