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;