SM/CSR: move win32k.sys loading from the SM to the Win32 user mode server.
authorEmanuele Aliberti <ea@iol.it>
Thu, 2 Jun 2005 13:17:37 +0000 (13:17 +0000)
committerEmanuele Aliberti <ea@iol.it>
Thu, 2 Jun 2005 13:17:37 +0000 (13:17 +0000)
svn path=/trunk/; revision=15729

13 files changed:
reactos/include/sm/helper.h
reactos/include/sm/ns.h
reactos/lib/smdll/smdll.def
reactos/lib/smlib/compses.c
reactos/lib/smlib/connect.c
reactos/lib/smlib/execpgm.c
reactos/lib/smlib/lookupss.c [new file with mode: 0644]
reactos/lib/smlib/smlib.xml
reactos/subsys/csrss/csrss.c
reactos/subsys/csrss/init.c
reactos/subsys/smss/initss.c
reactos/subsys/smss/smapiexec.c
reactos/subsys/smss/smss.h

index 3ca42df..ff22296 100644 (file)
@@ -30,5 +30,11 @@ SmQueryInformation (IN      HANDLE                SmApiPort,
                    IN OUT  PVOID                 Data,
                    IN      ULONG                 DataLength,
                    IN OUT  PULONG                ReturnedDataLength OPTIONAL);
-
+/* smlib/lookupss.c */
+NTSTATUS STDCALL
+SmLookupSubsystem (IN     PWSTR   Name,
+                  IN OUT PWSTR   Data,
+                  IN OUT PULONG  DataLength,
+                  IN OUT PULONG  DataType,
+                  IN     PVOID   Environment OPTIONAL);
 #endif /* ndef INCLUDE_SM_HELPER_H */
index fde7f80..56279a9 100644 (file)
@@ -1,13 +1,13 @@
-#if !defined(INCLUDE_SM_NS_H)\r
-#define INCLUDE_SM_NS_H\r
-\r
-/* $Id: helper.h 13689 2005-02-20 16:46:10Z ea $ */\r
-\r
-#define SM_REGISTRY_ROOT_NAME       L"\\Session Manager"\r
-#define SM_REGISTRY_SUBSYSTEMS_NAME  L"SubSystems"\r
-\r
-#define SM_API_PORT_NAME    L"\\SmApiPort"\r
-#define SM_DBGSS_PORT_NAME  L"\\DbgSsApiPort"\r
-#define SM_DBGUI_PORT_NAME  L"\\DbgUiApiPort"\r
-\r
-#endif /* ndef INCLUDE_SM_NS_H */\r
+#if !defined(INCLUDE_SM_NS_H)
+#define INCLUDE_SM_NS_H
+
+/* $Id$ */
+
+#define SM_REGISTRY_ROOT_NAME       L"\\Session Manager"
+#define SM_REGISTRY_SUBSYSTEMS_NAME  L"SubSystems"
+
+#define SM_API_PORT_NAME    L"\\SmApiPort"
+#define SM_DBGSS_PORT_NAME  L"\\DbgSsApiPort"
+#define SM_DBGUI_PORT_NAME  L"\\DbgUiApiPort"
+
+#endif /* ndef INCLUDE_SM_NS_H */
index df6394e..938851c 100644 (file)
@@ -4,3 +4,4 @@ SmCompleteSession@12
 SmConnectApiPort@16
 SmExecuteProgram@8
 SmQueryInformation@20
+SmLookupSubsystem@20
index 5454238..56445f9 100644 (file)
@@ -1,63 +1,63 @@
-/* $Id: compses.c 13731 2005-02-23 23:37:06Z ea $\r
- *\r
- * COPYRIGHT:       See COPYING in the top level directory\r
- * PROJECT:         ReactOS system libraries\r
- * FILE:            lib/smlib/compses.c\r
- * PURPOSE:         Call SM API SM_API_COMPLETE_SESSION\r
- */\r
-#define NTOS_MODE_USER\r
-#include <ntos.h>\r
-#include <sm/helper.h>\r
-\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/**********************************************************************\r
- * NAME                                                        EXPORTED\r
- *     SmCompleteSession/3\r
- *\r
- * DESCRIPTION\r
- *     This function is called by an environment subsystem server to\r
- *     tell the SM it finished initialization phase and is ready to\r
- *     manage processes it registered for (SmConnectApiPort).\r
- *\r
- * ARGUMENTS\r
- *     hSmApiPort: port handle returned by SmConnectApiPort;\r
- *     hSbApiPort: call back API port of the subsystem (handle);\r
- *     hApiPort  : API port of the subsystem (handle).\r
- *\r
- * RETURN VALUE\r
- *     Success status as handed by the SM reply; otherwise a failure\r
- *     status code.\r
- */\r
-NTSTATUS STDCALL\r
-SmCompleteSession (IN HANDLE hSmApiPort,\r
-                  IN HANDLE hSbApiPort,\r
-                  IN HANDLE hApiPort)\r
-{\r
-  NTSTATUS         Status;\r
-  SM_PORT_MESSAGE  SmReqMsg;\r
-    \r
-  DPRINT("SMLIB: %s called\n", __FUNCTION__);\r
-\r
-  /* Marshal Ses in the LPC message */\r
-  SmReqMsg.Request.CompSes.hApiPort   = hApiPort;\r
-  SmReqMsg.Request.CompSes.hSbApiPort = hSbApiPort;\r
-\r
-  /* SM API to invoke */\r
-  SmReqMsg.SmHeader.ApiIndex = SM_API_COMPLETE_SESSION;\r
-\r
-  /* Port message */\r
-  SmReqMsg.Header.MessageType = LPC_NEW_MESSAGE;\r
-  SmReqMsg.Header.DataSize    = SM_PORT_DATA_SIZE(SmReqMsg.Request);\r
-  SmReqMsg.Header.MessageSize = SM_PORT_MESSAGE_SIZE;\r
-  Status = NtRequestWaitReplyPort (hSmApiPort, (PLPC_MESSAGE) & SmReqMsg, (PLPC_MESSAGE) & SmReqMsg);\r
-  if (NT_SUCCESS(Status))\r
-  {\r
-    return SmReqMsg.SmHeader.Status;\r
-  }\r
-  DPRINT("SMLIB: %s failed (Status=0x%08lx)\n", __FUNCTION__, Status);\r
-  return Status;\r
-}\r
-\r
-/* EOF */\r
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS system libraries
+ * FILE:            lib/smlib/compses.c
+ * PURPOSE:         Call SM API SM_API_COMPLETE_SESSION
+ */
+#define NTOS_MODE_USER
+#include <ntos.h>
+#include <sm/helper.h>
+
+#define NDEBUG
+#include <debug.h>
+
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     SmCompleteSession/3
+ *
+ * DESCRIPTION
+ *     This function is called by an environment subsystem server to
+ *     tell the SM it finished initialization phase and is ready to
+ *     manage processes it registered for (SmConnectApiPort).
+ *
+ * ARGUMENTS
+ *     hSmApiPort: port handle returned by SmConnectApiPort;
+ *     hSbApiPort: call back API port of the subsystem (handle);
+ *     hApiPort  : API port of the subsystem (handle).
+ *
+ * RETURN VALUE
+ *     Success status as handed by the SM reply; otherwise a failure
+ *     status code.
+ */
+NTSTATUS STDCALL
+SmCompleteSession (IN HANDLE hSmApiPort,
+                  IN HANDLE hSbApiPort,
+                  IN HANDLE hApiPort)
+{
+  NTSTATUS         Status;
+  SM_PORT_MESSAGE  SmReqMsg;
+    
+  DPRINT("SMLIB: %s called\n", __FUNCTION__);
+
+  /* Marshal Ses in the LPC message */
+  SmReqMsg.Request.CompSes.hApiPort   = hApiPort;
+  SmReqMsg.Request.CompSes.hSbApiPort = hSbApiPort;
+
+  /* SM API to invoke */
+  SmReqMsg.SmHeader.ApiIndex = SM_API_COMPLETE_SESSION;
+
+  /* Port message */
+  SmReqMsg.Header.MessageType = LPC_NEW_MESSAGE;
+  SmReqMsg.Header.DataSize    = SM_PORT_DATA_SIZE(SmReqMsg.Request);
+  SmReqMsg.Header.MessageSize = SM_PORT_MESSAGE_SIZE;
+  Status = NtRequestWaitReplyPort (hSmApiPort, (PLPC_MESSAGE) & SmReqMsg, (PLPC_MESSAGE) & SmReqMsg);
+  if (NT_SUCCESS(Status))
+  {
+    return SmReqMsg.SmHeader.Status;
+  }
+  DPRINT("SMLIB: %s failed (Status=0x%08lx)\n", __FUNCTION__, Status);
+  return Status;
+}
+
+/* EOF */
index dfd5925..8f91245 100644 (file)
-/* $Id: connect.c 14015 2005-03-13 17:00:19Z ea $\r
- *\r
- * COPYRIGHT:  See COPYING in the top level directory\r
- * PROJECT:    ReactOS system libraries\r
- * FILE:       reactos/lib/smlib/connect.c\r
- * PURPOSE:    Connect to the API LPC port exposed by the SM\r
- */\r
-#define NTOS_MODE_USER\r
-#include <ntos.h>\r
-#include <sm/helper.h>\r
-#include <pe.h>\r
-\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/**********************************************************************\r
- * NAME                                                        EXPORTED\r
- *     SmConnectApiPort/4\r
- *\r
- * DESCRIPTION\r
- *     Connect to SM API port and register a session "begin" port (Sb)\r
- *     or to issue API requests to SmApiPort.\r
- *\r
- * ARGUMENTS\r
- *     pSbApiPortName: name of the Sb port the calling subsystem\r
- *             server already created in the system name space;\r
- *     hSbApiPort: LPC port handle (checked, but not used: the\r
- *             subsystem is required to have already created\r
- *             the callback port before it connects to the SM);\r
- *     wSubsystem: a valid IMAGE_SUBSYSTEM_xxx value;\r
- *     phSmApiPort: a pointer to a HANDLE, which will be\r
- *             filled with a valid client-side LPC comm port.\r
- *\r
- *     There should be only two ways to call this API:\r
- *     a) subsystems willing to register with SM will use it\r
- *        with full parameters (the function checks them);\r
- *     b) regular SM clients, will set to 0 the 1st, the 2nd,\r
- *        and the 3rd parameter.\r
- *     \r
- * RETURN VALUE\r
- *     If all three optional values are omitted, an LPC status.\r
- *     STATUS_INVALID_PARAMETER_MIX if PortName is defined and\r
- *     both hSbApiPort and wSubsystem are 0.\r
- */\r
-NTSTATUS STDCALL\r
-SmConnectApiPort (IN      PUNICODE_STRING  pSbApiPortName  OPTIONAL,\r
-                 IN      HANDLE           hSbApiPort      OPTIONAL,\r
-                 IN      WORD             wSubSystemId    OPTIONAL,\r
-                 IN OUT  PHANDLE          phSmApiPort)\r
-{\r
-  UNICODE_STRING              SmApiPortName;\r
-  SECURITY_QUALITY_OF_SERVICE SecurityQos;\r
-  NTSTATUS                    Status = STATUS_SUCCESS;\r
-  SM_CONNECT_DATA             ConnectData = {0,0,{0}};\r
-  ULONG                       ConnectDataLength = 0;\r
-\r
-  DPRINT("SMLIB: %s called\n", __FUNCTION__);\r
-\r
-  if (pSbApiPortName)\r
-  {\r
-    if (pSbApiPortName->Length > (sizeof pSbApiPortName->Buffer[0] * SM_SB_NAME_MAX_LENGTH))\r
-    {\r
-         return STATUS_INVALID_PARAMETER_1;\r
-    }\r
-    if (NULL == hSbApiPort || IMAGE_SUBSYSTEM_UNKNOWN == wSubSystemId)\r
-    {\r
-      return STATUS_INVALID_PARAMETER_MIX;\r
-    }\r
-    RtlZeroMemory (& ConnectData, sizeof ConnectData);\r
-    ConnectData.Unused = 0;\r
-    ConnectData.SubSystemId = wSubSystemId;\r
-    if (pSbApiPortName->Length > 0)\r
-    {\r
-      RtlCopyMemory (& ConnectData.SbName,\r
-                    pSbApiPortName->Buffer,\r
-                    pSbApiPortName->Length);\r
-    }\r
-  }\r
-  ConnectDataLength = sizeof ConnectData;\r
-\r
-  SecurityQos.Length              = sizeof (SecurityQos);\r
-  SecurityQos.ImpersonationLevel  = SecurityIdentification;\r
-  SecurityQos.ContextTrackingMode = TRUE;\r
-  SecurityQos.EffectiveOnly       = TRUE;\r
-\r
-  RtlInitUnicodeString (& SmApiPortName, SM_API_PORT_NAME);\r
-\r
-  Status = NtConnectPort (\r
-             phSmApiPort,\r
-             & SmApiPortName,\r
-             & SecurityQos,\r
-             NULL,\r
-             NULL,\r
-             NULL,\r
-             & ConnectData,\r
-             & ConnectDataLength\r
-             );\r
-  if (NT_SUCCESS(Status))\r
-  {\r
-    return STATUS_SUCCESS;\r
-  }\r
-  DPRINT("SMLIB: %s failed (Status=0x%08lx)\n", __FUNCTION__, Status);\r
-  return Status;\r
-}\r
-\r
-/* EOF */\r
+/* $Id$
+ *
+ * COPYRIGHT:  See COPYING in the top level directory
+ * PROJECT:    ReactOS system libraries
+ * FILE:       reactos/lib/smlib/connect.c
+ * PURPOSE:    Connect to the API LPC port exposed by the SM
+ */
+#define NTOS_MODE_USER
+#include <ntos.h>
+#include <sm/helper.h>
+#include <pe.h>
+
+#define NDEBUG
+#include <debug.h>
+
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     SmConnectApiPort/4
+ *
+ * DESCRIPTION
+ *     Connect to SM API port and register a session "begin" port (Sb)
+ *     or to issue API requests to SmApiPort.
+ *
+ * ARGUMENTS
+ *     pSbApiPortName: name of the Sb port the calling subsystem
+ *             server already created in the system name space;
+ *     hSbApiPort: LPC port handle (checked, but not used: the
+ *             subsystem is required to have already created
+ *             the callback port before it connects to the SM);
+ *     wSubsystem: a valid IMAGE_SUBSYSTEM_xxx value;
+ *     phSmApiPort: a pointer to a HANDLE, which will be
+ *             filled with a valid client-side LPC comm port.
+ *
+ *     There should be only two ways to call this API:
+ *     a) subsystems willing to register with SM will use it
+ *        with full parameters (the function checks them);
+ *     b) regular SM clients, will set to 0 the 1st, the 2nd,
+ *        and the 3rd parameter.
+ *     
+ * RETURN VALUE
+ *     If all three optional values are omitted, an LPC status.
+ *     STATUS_INVALID_PARAMETER_MIX if PortName is defined and
+ *     both hSbApiPort and wSubsystem are 0.
+ */
+NTSTATUS STDCALL
+SmConnectApiPort (IN      PUNICODE_STRING  pSbApiPortName  OPTIONAL,
+                 IN      HANDLE           hSbApiPort      OPTIONAL,
+                 IN      WORD             wSubSystemId    OPTIONAL,
+                 IN OUT  PHANDLE          phSmApiPort)
+{
+  UNICODE_STRING              SmApiPortName;
+  SECURITY_QUALITY_OF_SERVICE SecurityQos;
+  NTSTATUS                    Status = STATUS_SUCCESS;
+  SM_CONNECT_DATA             ConnectData = {0,0,{0}};
+  ULONG                       ConnectDataLength = 0;
+
+  DPRINT("SMLIB: %s called\n", __FUNCTION__);
+
+  if (pSbApiPortName)
+  {
+    if (pSbApiPortName->Length > (sizeof pSbApiPortName->Buffer[0] * SM_SB_NAME_MAX_LENGTH))
+    {
+         return STATUS_INVALID_PARAMETER_1;
+    }
+    if (NULL == hSbApiPort || IMAGE_SUBSYSTEM_UNKNOWN == wSubSystemId)
+    {
+      return STATUS_INVALID_PARAMETER_MIX;
+    }
+    RtlZeroMemory (& ConnectData, sizeof ConnectData);
+    ConnectData.Unused = 0;
+    ConnectData.SubSystemId = wSubSystemId;
+    if (pSbApiPortName->Length > 0)
+    {
+      RtlCopyMemory (& ConnectData.SbName,
+                    pSbApiPortName->Buffer,
+                    pSbApiPortName->Length);
+    }
+  }
+  ConnectDataLength = sizeof ConnectData;
+
+  SecurityQos.Length              = sizeof (SecurityQos);
+  SecurityQos.ImpersonationLevel  = SecurityIdentification;
+  SecurityQos.ContextTrackingMode = TRUE;
+  SecurityQos.EffectiveOnly       = TRUE;
+
+  RtlInitUnicodeString (& SmApiPortName, SM_API_PORT_NAME);
+
+  Status = NtConnectPort (
+             phSmApiPort,
+             & SmApiPortName,
+             & SecurityQos,
+             NULL,
+             NULL,
+             NULL,
+             & ConnectData,
+             & ConnectDataLength
+             );
+  if (NT_SUCCESS(Status))
+  {
+    return STATUS_SUCCESS;
+  }
+  DPRINT("SMLIB: %s failed (Status=0x%08lx)\n", __FUNCTION__, Status);
+  return Status;
+}
+
+/* EOF */
index fd29e70..288a78e 100644 (file)
@@ -1,87 +1,87 @@
-/* $Id: execpgm.c 13731 2005-02-23 23:37:06Z ea $\r
- *\r
- * COPYRIGHT:       See COPYING in the top level directory\r
- * PROJECT:         ReactOS system libraries\r
- * FILE:            lib/smlib/execpgm.c\r
- * PURPOSE:         Call SM API SM_API_EXECPGM\r
- */\r
-#define NTOS_MODE_USER\r
-#include <ntos.h>\r
-#include <sm/helper.h>\r
-#include <string.h>\r
-\r
-#define NDEBUG\r
-#include <debug.h>\r
-\r
-/**********************************************************************\r
- * NAME                                                        EXPORTED\r
- *     SmExecuteProgram/2\r
- *\r
- * DESCRIPTION\r
- *     This function is used to make the SM start an environment\r
- *     subsystem server process.\r
- *\r
- * ARGUMENTS\r
- *     hSmApiPort: port handle returned by SmConnectApiPort;\r
- *     Pgm       : name of the subsystem (to be used by the SM to\r
- *                 lookup the image name from the registry).\r
- *                 Valid names are: DEBUG, WINDOWS, POSIX, OS2,\r
- *                 and VMS.\r
- *     \r
- * RETURN VALUE\r
- *     Success status as handed by the SM reply; otherwise a failure\r
- *     status code.\r
- */\r
-NTSTATUS STDCALL\r
-SmExecuteProgram (IN HANDLE          hSmApiPort,\r
-                 IN PUNICODE_STRING Pgm)\r
-{\r
-  NTSTATUS         Status;\r
-  SM_PORT_MESSAGE  SmReqMsg;\r
-\r
-\r
-  DPRINT("SMLIB: %s(%08lx,'%S') called\n",\r
-       __FUNCTION__, hSmApiPort, Pgm->Buffer);\r
-\r
-  /* Check Pgm's length */\r
-  if (Pgm->Length > (sizeof (Pgm->Buffer[0]) * SM_EXEXPGM_MAX_LENGTH))\r
-  {\r
-    return STATUS_INVALID_PARAMETER;\r
-  }\r
-  /* Marshal Pgm in the LPC message */\r
-  RtlZeroMemory (& SmReqMsg, sizeof SmReqMsg);\r
-  SmReqMsg.Request.ExecPgm.NameLength = Pgm->Length;\r
-  RtlCopyMemory (SmReqMsg.Request.ExecPgm.Name,\r
-                Pgm->Buffer,\r
-                Pgm->Length);\r
-               \r
-  /* SM API to invoke */\r
-  SmReqMsg.SmHeader.ApiIndex = SM_API_EXECUTE_PROGRAMME;\r
-\r
-  /* LPC message */\r
-  SmReqMsg.Header.MessageType = LPC_NEW_MESSAGE;\r
-  SmReqMsg.Header.DataSize    = SM_PORT_DATA_SIZE(SmReqMsg.Request);\r
-  SmReqMsg.Header.MessageSize = SM_PORT_MESSAGE_SIZE;\r
-\r
-  DPRINT("SMLIB: %s:\n"\r
-         "  MessageType = %d\n"\r
-         "  DataSize    = %d\n"\r
-         "  MessageSize = %d\n"\r
-         "  sizeof(LPC_MESSAGE)==%d\n",\r
-         __FUNCTION__,\r
-         SmReqMsg.Header.MessageType,\r
-         SmReqMsg.Header.DataSize,\r
-         SmReqMsg.Header.MessageSize,\r
-         sizeof(LPC_MESSAGE));\r
-\r
-  /* Call SM and wait for a reply */\r
-  Status = NtRequestWaitReplyPort (hSmApiPort, (PLPC_MESSAGE) & SmReqMsg, (PLPC_MESSAGE) & SmReqMsg);\r
-  if (NT_SUCCESS(Status))\r
-  {\r
-    return SmReqMsg.SmHeader.Status;\r
-  }\r
-  DPRINT("SMLIB: %s failed (Status=0x%08lx)\n", __FUNCTION__, Status);\r
-  return Status;\r
-}\r
-\r
-/* EOF */\r
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS system libraries
+ * FILE:            lib/smlib/execpgm.c
+ * PURPOSE:         Call SM API SM_API_EXECPGM
+ */
+#define NTOS_MODE_USER
+#include <ntos.h>
+#include <sm/helper.h>
+#include <string.h>
+
+#define NDEBUG
+#include <debug.h>
+
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     SmExecuteProgram/2
+ *
+ * DESCRIPTION
+ *     This function is used to make the SM start an environment
+ *     subsystem server process.
+ *
+ * ARGUMENTS
+ *     hSmApiPort: port handle returned by SmConnectApiPort;
+ *     Pgm       : name of the subsystem (to be used by the SM to
+ *                 lookup the image name from the registry).
+ *                 Valid names are: DEBUG, WINDOWS, POSIX, OS2,
+ *                 and VMS.
+ *     
+ * RETURN VALUE
+ *     Success status as handed by the SM reply; otherwise a failure
+ *     status code.
+ */
+NTSTATUS STDCALL
+SmExecuteProgram (IN HANDLE          hSmApiPort,
+                 IN PUNICODE_STRING Pgm)
+{
+  NTSTATUS         Status;
+  SM_PORT_MESSAGE  SmReqMsg;
+
+
+  DPRINT("SMLIB: %s(%08lx,'%S') called\n",
+       __FUNCTION__, hSmApiPort, Pgm->Buffer);
+
+  /* Check Pgm's length */
+  if (Pgm->Length > (sizeof (Pgm->Buffer[0]) * SM_EXEXPGM_MAX_LENGTH))
+  {
+    return STATUS_INVALID_PARAMETER;
+  }
+  /* Marshal Pgm in the LPC message */
+  RtlZeroMemory (& SmReqMsg, sizeof SmReqMsg);
+  SmReqMsg.Request.ExecPgm.NameLength = Pgm->Length;
+  RtlCopyMemory (SmReqMsg.Request.ExecPgm.Name,
+                Pgm->Buffer,
+                Pgm->Length);
+               
+  /* SM API to invoke */
+  SmReqMsg.SmHeader.ApiIndex = SM_API_EXECUTE_PROGRAMME;
+
+  /* LPC message */
+  SmReqMsg.Header.MessageType = LPC_NEW_MESSAGE;
+  SmReqMsg.Header.DataSize    = SM_PORT_DATA_SIZE(SmReqMsg.Request);
+  SmReqMsg.Header.MessageSize = SM_PORT_MESSAGE_SIZE;
+
+  DPRINT("SMLIB: %s:\n"
+         "  MessageType = %d\n"
+         "  DataSize    = %d\n"
+         "  MessageSize = %d\n"
+         "  sizeof(LPC_MESSAGE)==%d\n",
+         __FUNCTION__,
+         SmReqMsg.Header.MessageType,
+         SmReqMsg.Header.DataSize,
+         SmReqMsg.Header.MessageSize,
+         sizeof(LPC_MESSAGE));
+
+  /* Call SM and wait for a reply */
+  Status = NtRequestWaitReplyPort (hSmApiPort, (PLPC_MESSAGE) & SmReqMsg, (PLPC_MESSAGE) & SmReqMsg);
+  if (NT_SUCCESS(Status))
+  {
+    return SmReqMsg.SmHeader.Status;
+  }
+  DPRINT("SMLIB: %s failed (Status=0x%08lx)\n", __FUNCTION__, Status);
+  return Status;
+}
+
+/* EOF */
diff --git a/reactos/lib/smlib/lookupss.c b/reactos/lib/smlib/lookupss.c
new file mode 100644 (file)
index 0000000..2ab324a
--- /dev/null
@@ -0,0 +1,155 @@
+/* $Id$
+ *
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS system libraries
+ * FILE:            lib/smlib/lookupss.c
+ */
+#define NTOS_MODE_USER
+#include <ntos.h>
+#include <sm/helper.h>
+
+#define NDEBUG
+#include <debug.h>
+
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     SmLookupSubsystem/6
+ *
+ * DESCRIPTION
+ *     Read from the registry key
+ *     \Registry\SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems
+ *     the value which name is Name.
+ *
+ * ARGUMENTS
+ *     Name: name of the program to run, that is a value's name in
+ *           the SM registry key Subsystems;
+ *     Data: what the registry gave back for Name;
+ *     DataLength: how much Data the registry returns;
+ *     DataType: what is Data?
+ *     Environment: set it if you want this function to use it
+ *           to possibly expand Data before giving it back; if set
+ *           to NULL, no expansion will be performed.
+ */
+NTSTATUS STDCALL
+SmLookupSubsystem (IN     PWSTR   Name,
+                  IN OUT PWSTR   Data,
+                  IN OUT PULONG  DataLength,
+                  IN OUT PULONG  DataType,
+                  IN     PVOID   Environment OPTIONAL)
+{
+       NTSTATUS           Status = STATUS_SUCCESS;
+       UNICODE_STRING     usKeyName = {0};
+       OBJECT_ATTRIBUTES  Oa = {0};
+       HANDLE             hKey = (HANDLE) 0;
+
+       DPRINT("SM: %s(Name='%S') called\n", __FUNCTION__, Name);
+       /*
+        * Prepare the key name to scan and
+        * related object attributes.
+        */
+       RtlInitUnicodeString (& usKeyName,
+               L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\SubSystems");
+
+       InitializeObjectAttributes (& Oa,
+                                   & usKeyName,
+                                   OBJ_CASE_INSENSITIVE,
+                                   NULL,
+                                   NULL);
+       /*
+        * Open the key. This MUST NOT fail, if the
+        * request is for a legitimate subsystem.
+        */
+       Status = NtOpenKey (& hKey,
+                             MAXIMUM_ALLOWED,
+                             & Oa);
+       if(NT_SUCCESS(Status))
+       {
+               UNICODE_STRING usValueName = {0};
+               PWCHAR         KeyValueInformation = NULL;
+               ULONG          KeyValueInformationLength = 1024;
+               ULONG          ResultLength = 0L;
+               PKEY_VALUE_PARTIAL_INFORMATION kvpi = NULL;
+
+               KeyValueInformation = RtlAllocateHeap (RtlGetProcessHeap(),
+                                                      0,
+                                                      KeyValueInformationLength);
+               if (NULL == KeyValueInformation)
+               {
+                       return STATUS_NO_MEMORY;
+               }
+               kvpi = (PKEY_VALUE_PARTIAL_INFORMATION) KeyValueInformation;
+               RtlInitUnicodeString (& usValueName, Name);
+               Status = NtQueryValueKey (hKey,
+                                         & usValueName,
+                                         KeyValuePartialInformation,
+                                         KeyValueInformation,
+                                         KeyValueInformationLength,
+                                         & ResultLength);
+               if(NT_SUCCESS(Status))
+               {
+                       DPRINT("nkvpi.TitleIndex = %ld\n", kvpi->TitleIndex);
+                       DPRINT("kvpi.Type        = %ld\n", kvpi->Type);
+                       DPRINT("kvpi.DataLength  = %ld\n", kvpi->DataLength);
+
+                       if((NULL != Data) && (NULL != DataLength) && (NULL != DataType))
+                       {
+                               *DataType = kvpi->Type;
+                               if((NULL != Environment) && (REG_EXPAND_SZ == *DataType))
+                               {
+                                       UNICODE_STRING Source;
+                                       PWCHAR         DestinationBuffer = NULL;
+                                       UNICODE_STRING Destination;
+                                       ULONG          Length = 0;
+
+                                       DPRINT("SM: %s: value will be expanded\n", __FUNCTION__);
+
+                                       DestinationBuffer = RtlAllocateHeap (RtlGetProcessHeap(),
+                                                                            0,
+                                                                            (2 * KeyValueInformationLength));
+                                       if (NULL == DestinationBuffer)
+                                       {
+                                               Status = STATUS_NO_MEMORY;
+                                       }
+                                       else
+                                       {
+                                               Source.Length        = kvpi->DataLength;
+                                               Source.MaximumLength = kvpi->DataLength;
+                                               Source.Buffer        = (PWCHAR) & kvpi->Data;
+
+                                               Destination.Length        = 0;
+                                               Destination.MaximumLength = (2 * KeyValueInformationLength);
+                                               Destination.Buffer        = DestinationBuffer;
+
+                                               Status = RtlExpandEnvironmentStrings_U (Environment,
+                                                                                       & Source,
+                                                                                       & Destination,
+                                                                                       & Length);
+                                               if(NT_SUCCESS(Status))
+                                               {
+                                                       *DataLength = min(*DataLength, Destination.Length);
+                                                       RtlCopyMemory (Data, Destination.Buffer, *DataLength);                          
+                                               }
+                                               RtlFreeHeap (RtlGetProcessHeap(), 0, DestinationBuffer);
+                                       }                       
+                               }else{
+                                       DPRINT("SM: %s: value won't be expanded\n", __FUNCTION__);
+                                       *DataLength = min(*DataLength, kvpi->DataLength);
+                                       RtlCopyMemory (Data, & kvpi->Data, *DataLength);
+                               }
+                               *DataType = kvpi->Type;
+                       }else{
+                               DPRINT1("SM: %s: Data or DataLength or DataType is NULL!\n", __FUNCTION__);
+                               Status = STATUS_INVALID_PARAMETER;
+                       }
+               }else{
+                       DPRINT1("%s: NtQueryValueKey failed (Status=0x%08lx)\n", __FUNCTION__, Status);
+               }
+               RtlFreeHeap (RtlGetProcessHeap(), 0, KeyValueInformation);
+               NtClose (hKey);
+       }else{
+               DPRINT1("%s: NtOpenKey failed (Status=0x%08lx)\n", __FUNCTION__, Status);
+       }
+       return Status;
+}
+
+/* EOF */
index 6b06eb1..1946df6 100644 (file)
@@ -4,4 +4,5 @@
        <file>connect.c</file>
        <file>execpgm.c</file>
        <file>compses.c</file>
+       <file>lookupss.c</file>
 </module>
index 307ba19..5114f53 100644 (file)
@@ -52,6 +52,8 @@ typedef struct _COMMAND_LINE_ARGUMENT
 
 } COMMAND_LINE_ARGUMENT, *PCOMMAND_LINE_ARGUMENT;
 
+PRTL_USER_PROCESS_PARAMETERS RtlProcessParameters = NULL;
+
 /**********************************************************************
  * NAME                                                        PRIVATE
  *     CsrpParseCommandLine/3
@@ -150,7 +152,6 @@ CsrpFreeCommandLine (HANDLE                 ProcessHeap,
 
 VOID STDCALL NtProcessStartup(PPEB Peb)
 {
-   PRTL_USER_PROCESS_PARAMETERS RtlProcessParameters = NULL;
    COMMAND_LINE_ARGUMENT        CmdLineArg = {0};
    NTSTATUS                     Status = STATUS_SUCCESS;
 
index fa85151..e8510b3 100644 (file)
@@ -34,6 +34,7 @@ HANDLE CsrObjectDirectory = (HANDLE) 0;
 UNICODE_STRING CsrDirectoryName;
 
 extern HANDLE CsrssApiHeap;
+extern PRTL_USER_PROCESS_PARAMETERS RtlProcessParameters;
 
 static unsigned InitCompleteProcCount;
 static CSRPLUGIN_INIT_COMPLETE_PROC *InitCompleteProcs = NULL;
@@ -306,7 +307,7 @@ CsrpCreateListenPort (IN     LPWSTR  Name,
 /* === INIT ROUTINES === */
 
 /**********************************************************************
- * CsrpCreateCallbackPort/0
+ * CsrpCreateHeap/2
  */
 static NTSTATUS
 CsrpCreateHeap (ULONG argc, PWSTR* argv)
@@ -327,7 +328,7 @@ CsrpCreateHeap (ULONG argc, PWSTR* argv)
 }
 
 /**********************************************************************
- * CsrpCreateCallbackPort/0
+ * CsrpCreateCallbackPort/2
  */
 static NTSTATUS
 CsrpCreateCallbackPort (ULONG argc, PWSTR* argv)
@@ -401,7 +402,47 @@ CsrpRegisterSubsystem (ULONG argc, PWSTR* argv)
 }
 
 /**********************************************************************
- * CsrpCreateApiPort/0
+ *     CsrpLoadKernelModeDriver/2
+ */
+static NTSTATUS
+CsrpLoadKernelModeDriver (ULONG argc, PWSTR* argv)
+{
+       NTSTATUS  Status = STATUS_SUCCESS;
+       WCHAR     Data [MAX_PATH + 1];
+       ULONG     DataLength = sizeof Data;
+       ULONG     DataType = 0;
+
+
+       DPRINT("SM: %s called\n", __FUNCTION__);
+
+       Status = SmLookupSubsystem (L"Kmode",
+                                   Data,
+                                   & DataLength,
+                                   & DataType,
+                                   RtlProcessParameters->Environment);
+       if((STATUS_SUCCESS == Status) && (DataLength > sizeof Data[0]))
+       {
+               WCHAR                      ImagePath [MAX_PATH + 1] = {0};
+               SYSTEM_LOAD_AND_CALL_IMAGE ImageInfo;
+
+               wcscpy (ImagePath, L"\\??\\");
+               wcscat (ImagePath, Data);
+               RtlZeroMemory (& ImageInfo, sizeof ImageInfo);
+               RtlInitUnicodeString (& ImageInfo.ModuleName, ImagePath);
+               Status = NtSetSystemInformation(SystemLoadAndCallImage,
+                                               & ImageInfo,
+                                               sizeof ImageInfo);
+               if(!NT_SUCCESS(Status))
+               {
+                       DPRINT("WIN: %s: loading Kmode failed (Status=0x%08lx)\n",
+                               __FUNCTION__, Status);
+               }
+       }
+       return Status;
+}
+
+/**********************************************************************
+ * CsrpCreateApiPort/2
  */
 static NTSTATUS
 CsrpCreateApiPort (ULONG argc, PWSTR* argv)
@@ -495,16 +536,17 @@ struct {
        CSR_INIT_ROUTINE EntryPoint;
        PCHAR ErrorMessage;
 } InitRoutine [] = {
-       {TRUE, CsrpCreateCallbackPort, "create the callback port \\Windows\\SbApiPort"},
-       {TRUE, CsrpRegisterSubsystem,  "register with SM"},
-       {TRUE, CsrpCreateHeap,         "create the CSR heap"},
-       {TRUE, CsrpCreateApiPort,      "create the api port \\Windows\\ApiPort"},
-       {TRUE, CsrpParseCommandLine,   "parse the command line"},
-       {TRUE, CsrpInitVideo,          "initialize video"},
-       {TRUE, CsrpApiRegisterDef,     "initialize api definitions"},
-       {TRUE, CsrpCCTS,               "connect client to server"},
-       {TRUE, CsrpInitWin32Csr,       "load usermode dll"},
-       {TRUE, CsrpRunWinlogon,        "run WinLogon"},
+       {TRUE, CsrpCreateCallbackPort,   "create the callback port \\Windows\\SbApiPort"},
+       {TRUE, CsrpRegisterSubsystem,    "register with SM"},
+       {TRUE, CsrpCreateHeap,           "create the CSR heap"},
+       {TRUE, CsrpCreateApiPort,        "create the api port \\Windows\\ApiPort"},
+       {TRUE, CsrpParseCommandLine,     "parse the command line"},
+       {TRUE, CsrpLoadKernelModeDriver, "load Kmode driver"},
+       {TRUE, CsrpInitVideo,            "initialize video"},
+       {TRUE, CsrpApiRegisterDef,       "initialize api definitions"},
+       {TRUE, CsrpCCTS,                 "connect client to server"},
+       {TRUE, CsrpInitWin32Csr,         "load usermode dll"},
+       {TRUE, CsrpRunWinlogon,          "run WinLogon"},
 };
 
 /**********************************************************************
index 0c2f338..d59b465 100644 (file)
@@ -98,46 +98,6 @@ SmpRegisterSmss(VOID)
 }
 
 
-/**********************************************************************
- *     SmpLoadKernelModeSubsystem/0
- */
-static NTSTATUS
-SmpLoadKernelModeSubsystem (VOID)
-{
-       NTSTATUS  Status = STATUS_SUCCESS;
-       WCHAR     Data [MAX_PATH + 1];
-       ULONG     DataLength = sizeof Data;
-       ULONG     DataType = 0;
-
-
-       DPRINT("SM: %s called\n", __FUNCTION__);
-
-       Status = SmLookupSubsystem (L"Kmode",
-                                   Data,
-                                   & DataLength,
-                                   & DataType,
-                                   TRUE);
-       if((STATUS_SUCCESS == Status) && (DataLength > sizeof Data[0]))
-       {
-               WCHAR                      ImagePath [MAX_PATH + 1] = {0};
-               SYSTEM_LOAD_AND_CALL_IMAGE ImageInfo;
-
-               wcscpy (ImagePath, L"\\??\\");
-               wcscat (ImagePath, Data);
-               RtlZeroMemory (& ImageInfo, sizeof ImageInfo);
-               RtlInitUnicodeString (& ImageInfo.ModuleName, ImagePath);
-               Status = NtSetSystemInformation(SystemLoadAndCallImage,
-                                               & ImageInfo,
-                                               sizeof ImageInfo);
-               if(!NT_SUCCESS(Status))
-               {
-                       DPRINT("SM: %s: loading Kmode failed (Status=0x%08lx)\n",
-                               __FUNCTION__, Status);
-               }
-       }
-       return Status;
-}
-
 /**********************************************************************
  *     SmpLoadRequiredSubsystems/0
  */
@@ -157,7 +117,7 @@ SmpLoadRequiredSubsystems (VOID)
                                    Data,
                                    & DataLength,
                                    & DataType,
-                                   FALSE);
+                                   NULL);
        if((STATUS_SUCCESS == Status) && (DataLength > sizeof Data[0]))
        {
                PWCHAR Name = NULL;
@@ -206,9 +166,6 @@ SmLoadSubsystems(VOID)
        /* SM self registers */
        Status = SmpRegisterSmss();
        if(!NT_SUCCESS(Status)) return Status;
-       /* Load Kmode subsystem (aka win32k.sys) */
-       Status = SmpLoadKernelModeSubsystem();
-       if(!NT_SUCCESS(Status)) return Status;
        /* Load Required subsystems (Debug Windows) */
        Status = SmpLoadRequiredSubsystems();
        if(!NT_SUCCESS(Status)) return Status;
index 1c14dec..7274261 100644 (file)
@@ -135,128 +135,6 @@ SmCreateUserProcess (LPWSTR ImagePath,
        return Status;
 }
 
-/**********************************************************************
- * NAME
- *     SmLookupSubsystem/5
- *
- * DESCRIPTION
- *     Read from the registry key
- *     \Registry\SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems
- *     the value which name is Name.
- *
- * ARGUMENTS
- *     Name: name of the program to run, that is a value's name in
- *           the SM registry key Subsystems;
- *     Data: what the registry gave back for Name;
- *     DataLength: how much Data the registry returns;
- *     DataType: what is Data?
- *     Expand: set it TRUE if you want this function to use the env
- *           to possibly expand Data before giving it back.
- */
-NTSTATUS STDCALL
-SmLookupSubsystem (IN     PWSTR   Name,
-                  IN OUT PWSTR   Data,
-                  IN OUT PULONG  DataLength,
-                  IN OUT PULONG  DataType,
-                  IN     BOOLEAN Expand)
-{
-       NTSTATUS           Status = STATUS_SUCCESS;
-       UNICODE_STRING     usKeyName = {0};
-       OBJECT_ATTRIBUTES  Oa = {0};
-       HANDLE             hKey = (HANDLE) 0;
-
-       DPRINT("SM: %s(Name='%S') called\n", __FUNCTION__, Name);
-       /*
-        * Prepare the key name to scan and
-        * related object attributes.
-        */
-       RtlInitUnicodeString (& usKeyName,
-               L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\SubSystems");
-
-       InitializeObjectAttributes (& Oa,
-                                   & usKeyName,
-                                   OBJ_CASE_INSENSITIVE,
-                                   NULL,
-                                   NULL);
-       /*
-        * Open the key. This MUST NOT fail, if the
-        * request is for a legitimate subsystem.
-        */
-       Status = NtOpenKey (& hKey,
-                             MAXIMUM_ALLOWED,
-                             & Oa);
-       if(NT_SUCCESS(Status))
-       {
-               UNICODE_STRING usValueName = {0};
-               WCHAR          KeyValueInformation [1024] = {L'\0'};
-               ULONG          ResultLength = 0L;
-               PKEY_VALUE_PARTIAL_INFORMATION
-                              kvpi = (PKEY_VALUE_PARTIAL_INFORMATION) KeyValueInformation;
-
-               
-               RtlInitUnicodeString (& usValueName, Name);
-               Status = NtQueryValueKey (hKey,
-                                         & usValueName,
-                                         KeyValuePartialInformation,
-                                         KeyValueInformation,
-                                         sizeof KeyValueInformation,
-                                         & ResultLength);
-               if(NT_SUCCESS(Status))
-               {
-                       DPRINT("nkvpi.TitleIndex = %ld\n", kvpi->TitleIndex);
-                       DPRINT("kvpi.Type        = %ld\n", kvpi->Type);
-                       DPRINT("kvpi.DataLength  = %ld\n", kvpi->DataLength);
-
-                       if((NULL != Data) && (NULL != DataLength) && (NULL != DataType))
-                       {
-                               *DataType = kvpi->Type;
-                               if((Expand) && (REG_EXPAND_SZ == *DataType))
-                               {
-                                       UNICODE_STRING Source;
-                                       WCHAR          DestinationBuffer [2048] = {0};
-                                       UNICODE_STRING Destination;
-                                       ULONG          Length = 0;
-
-                                       DPRINT("SM: %s: value will be expanded\n", __FUNCTION__);
-
-                                       Source.Length        = kvpi->DataLength;
-                                       Source.MaximumLength = kvpi->DataLength;
-                                       Source.Buffer        = (PWCHAR) & kvpi->Data;
-
-                                       Destination.Length        = 0;
-                                       Destination.MaximumLength = sizeof DestinationBuffer;
-                                       Destination.Buffer        = DestinationBuffer;
-
-                                       Status = RtlExpandEnvironmentStrings_U (SmSystemEnvironment,
-                                                                               & Source,
-                                                                               & Destination,
-                                                                               & Length);
-                                       if(NT_SUCCESS(Status))
-                                       {
-                                               *DataLength = min(*DataLength, Destination.Length);
-                                               RtlCopyMemory (Data, Destination.Buffer, *DataLength);                          
-                                       }
-                                                       
-                               }else{
-                                       DPRINT("SM: %s: value won't be expanded\n", __FUNCTION__);
-                                       *DataLength = min(*DataLength, kvpi->DataLength);
-                                       RtlCopyMemory (Data, & kvpi->Data, *DataLength);
-                               }
-                               *DataType = kvpi->Type;
-                       }else{
-                               DPRINT1("SM: %s: Data or DataLength or DataType is NULL!\n", __FUNCTION__);
-                               Status = STATUS_INVALID_PARAMETER;
-                       }
-               }else{
-                       DPRINT1("%s: NtQueryValueKey failed (Status=0x%08lx)\n", __FUNCTION__, Status);
-               }
-               NtClose (hKey);
-       }else{
-               DPRINT1("%s: NtOpenKey failed (Status=0x%08lx)\n", __FUNCTION__, Status);
-       }
-       return Status;
-}
-
 
 /**********************************************************************
  * SmExecPgm/1                                                 API
@@ -298,7 +176,7 @@ SMAPI(SmExecPgm)
                                            Data,
                                            & DataLength,
                                            & DataType,
-                                           TRUE); /* expand */
+                                           SmSystemEnvironment /* expand */);
                if(NT_SUCCESS(Status))
                {
                        /* Is the subsystem definition non-empty? */
index bc099bf..ec71c14 100644 (file)
@@ -61,12 +61,6 @@ NTSTATUS STDCALL SmCreateUserProcess(LPWSTR ImagePath,
                                     BOOLEAN WaitForIt,
                                     PLARGE_INTEGER Timeout OPTIONAL,
                                     PRTL_PROCESS_INFO UserProcessInfo OPTIONAL);
-NTSTATUS STDCALL
-SmLookupSubsystem (IN     PWSTR   Name,
-                  IN OUT PWSTR   Data,
-                  IN OUT PULONG  DataLength,
-                  IN OUT PULONG  DataType,
-                  IN     BOOLEAN Expand);
 NTSTATUS FASTCALL SmExecPgm(PSM_PORT_MESSAGE);
 
 /* smapicomp.c */