SM - some more work
authorEmanuele Aliberti <ea@iol.it>
Sun, 13 Feb 2005 22:55:28 +0000 (22:55 +0000)
committerEmanuele Aliberti <ea@iol.it>
Sun, 13 Feb 2005 22:55:28 +0000 (22:55 +0000)
svn path=/trunk/; revision=13547

reactos/subsys/smss/client.c
reactos/subsys/smss/init.c
reactos/subsys/smss/smapi.c
reactos/subsys/smss/smss.c
reactos/subsys/smss/smss.h

index b25535e..78d1011 100644 (file)
 #include <ntos.h>\r
 #include "smss.h"\r
 \r
-/* Private ADT */\r
+#define NDEBUG\r
+#include <debug.h>\r
 \r
-typedef struct _SM_CLIENT_DATA\r
-{\r
-       USHORT  SubsystemId;\r
-       BOOL    Initialized;\r
-       HANDLE  ServerProcess;\r
-       HANDLE  ApiPort;\r
-       HANDLE  SbApiPort;\r
-       struct _SM_CLIENT_DATA * Next;\r
-       \r
-} SM_CLIENT_DATA, *PSM_CLIENT_DATA;\r
+/* Private ADT */\r
 \r
 \r
 struct _SM_CLIENT_DIRECTORY\r
@@ -55,6 +47,7 @@ struct _SM_CLIENT_DIRECTORY
 NTSTATUS\r
 SmInitializeClientManagement (VOID)\r
 {\r
+       DPRINT("SM: %s called\n", __FUNCTION__);\r
        RtlInitializeCriticalSection(& SmpClientDirectory.Lock);\r
        SmpClientDirectory.Count = 0;\r
        SmpClientDirectory.Client = NULL;\r
@@ -64,22 +57,24 @@ SmInitializeClientManagement (VOID)
 /**********************************************************************\r
  *     SmpLookupClient/1\r
  */\r
-PSM_CLIENT_DATA STDCALL\r
+static PSM_CLIENT_DATA STDCALL\r
 SmpLookupClient (USHORT SubsystemId)\r
 {\r
        PSM_CLIENT_DATA Client = NULL;\r
 \r
+       DPRINT("SM: %s called\n", __FUNCTION__);\r
+\r
+       RtlEnterCriticalSection (& SmpClientDirectory.Lock);\r
        if (SmpClientDirectory.Count > 0)\r
        {\r
-               RtlEnterCriticalSection (& SmpClientDirectory.Lock);\r
                Client = SmpClientDirectory.Client;\r
-               while (NULL != Client->Next)\r
+               while (NULL != Client)\r
                {\r
                        if (SubsystemId == Client->SubsystemId) break;\r
                        Client = Client->Next;\r
                }\r
-               RtlLeaveCriticalSection (& SmpClientDirectory.Lock);\r
        }\r
+       RtlLeaveCriticalSection (& SmpClientDirectory.Lock);\r
        return Client;\r
 }\r
 \r
@@ -87,14 +82,17 @@ SmpLookupClient (USHORT SubsystemId)
  *     SmpCreateClient/1\r
  */\r
 NTSTATUS STDCALL\r
-SmpCreateClient(SM_PORT_MESSAGE Request)\r
+SmCreateClient(PSM_PORT_MESSAGE Request, PSM_CLIENT_DATA * ClientData)\r
 {\r
        PSM_CLIENT_DATA pClient = NULL;\r
+       PSM_CONNECT_DATA ConnectData = (PSM_CONNECT_DATA) ((PBYTE) Request) + sizeof (LPC_REQUEST);\r
+\r
+       DPRINT("SM: %s called\n", __FUNCTION__);\r
 \r
        /*\r
         * Check if a client for the ID already exist.\r
         */\r
-       if (SmpLookupClient(0)) //FIXME\r
+       if (SmpLookupClient(ConnectData->Subsystem))\r
        {\r
                DbgPrint("SMSS: %s: attempt to register again subsystem %d.\n",__FUNCTION__,0);\r
                return STATUS_UNSUCCESSFUL;\r
@@ -105,11 +103,15 @@ SmpCreateClient(SM_PORT_MESSAGE Request)
        pClient = RtlAllocateHeap (SmpHeap,\r
                                   HEAP_ZERO_MEMORY,\r
                                   sizeof (SM_CLIENT_DATA));\r
-       if (NULL == pClient) return STATUS_NO_MEMORY;\r
+       if (NULL == pClient)\r
+       {\r
+               DPRINT("SM: %s: out of memory!\n",__FUNCTION__);\r
+               return STATUS_NO_MEMORY;\r
+       }\r
        /*\r
         * Initialize the client data\r
         */\r
-//     pClient->SubsystemId = Request->Subsystem;\r
+       pClient->SubsystemId = ConnectData->Subsystem;\r
        pClient->Initialized = FALSE;\r
        // TODO\r
        /*\r
@@ -128,8 +130,10 @@ SmpCreateClient(SM_PORT_MESSAGE Request)
                        pCD = pCD->Next);\r
                pCD->Next = pClient;\r
        }\r
+       pClient->Next = NULL;\r
        ++ SmpClientDirectory.Count;\r
        RtlLeaveCriticalSection (& SmpClientDirectory.Lock);\r
+       if (ClientData) *ClientData = pClient;\r
        return STATUS_SUCCESS;\r
 }\r
 \r
@@ -137,8 +141,10 @@ SmpCreateClient(SM_PORT_MESSAGE Request)
  *     SmpDestroyClient/1\r
  */\r
 NTSTATUS STDCALL\r
-SmpDestroyClient (ULONG SubsystemId)\r
+SmDestroyClient (ULONG SubsystemId)\r
 {\r
+       DPRINT("SM: %s called\n", __FUNCTION__);\r
+\r
        RtlEnterCriticalSection (& SmpClientDirectory.Lock);\r
        /* TODO */\r
        RtlLeaveCriticalSection (& SmpClientDirectory.Lock);\r
index 0dcd79d..be2125b 100644 (file)
@@ -98,7 +98,7 @@ struct {
 };
 
 NTSTATUS
-InitSessionManager(HANDLE Children[])
+InitSessionManager(VOID)
 {
   int i;
   NTSTATUS Status;
index 1e13237..05be26a 100644 (file)
@@ -1,19 +1,16 @@
 /* $Id$
  *
- * Reactos Session Manager
+ * 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 <rosrtl/string.h>
 #include "smss.h"
+#include <rosrtl/string.h>
 
 #define NDEBUG
+#include <debug.h>
 
 /* GLOBAL VARIABLES *********************************************************/
 
@@ -26,20 +23,20 @@ NTSTATUS FASTCALL n (PSM_PORT_MESSAGE Request)
 
 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 @@ SM_PORT_API SmApi [] =
 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 @@ VOID STDCALL
 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)
                        {
index 80ee0e6..72d0656 100644 (file)
@@ -36,7 +36,7 @@ NtProcessStartup(PPEB Peb)
 {
   NTSTATUS Status;
 
-  Status = InitSessionManager(Children);
+  Status = InitSessionManager();
   if (!NT_SUCCESS(Status))
     {
       int i;
index 0a8a3d1..1ed5d26 100644 (file)
@@ -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 @@ NTSTATUS SmCreateApiPort(VOID);
 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;