SM/CSR: move win32k.sys loading from the SM to the Win32 user mode server.
Modified: trunk/reactos/include/sm/helper.h
Modified: trunk/reactos/include/sm/ns.h
Modified: trunk/reactos/lib/smdll/smdll.def
Modified: trunk/reactos/lib/smlib/compses.c
Modified: trunk/reactos/lib/smlib/connect.c
Modified: trunk/reactos/lib/smlib/execpgm.c
Added: trunk/reactos/lib/smlib/lookupss.c
Modified: trunk/reactos/lib/smlib/smlib.xml
Modified: trunk/reactos/subsys/csrss/csrss.c
Modified: trunk/reactos/subsys/csrss/init.c
Modified: trunk/reactos/subsys/smss/initss.c
Modified: trunk/reactos/subsys/smss/smapiexec.c
Modified: trunk/reactos/subsys/smss/smss.h

Modified: trunk/reactos/include/sm/helper.h
--- trunk/reactos/include/sm/helper.h	2005-06-02 13:10:57 UTC (rev 15728)
+++ trunk/reactos/include/sm/helper.h	2005-06-02 13:17:37 UTC (rev 15729)
@@ -30,5 +30,11 @@
 		    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 */

Modified: trunk/reactos/include/sm/ns.h
--- trunk/reactos/include/sm/ns.h	2005-06-02 13:10:57 UTC (rev 15728)
+++ trunk/reactos/include/sm/ns.h	2005-06-02 13:17:37 UTC (rev 15729)
@@ -1,13 +1,13 @@
-#if !defined(INCLUDE_SM_NS_H)
-#define INCLUDE_SM_NS_H
-
-/* $Id: helper.h 13689 2005-02-20 16:46:10Z ea $ */
-
-#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 */
+#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 */
Property changes on: trunk/reactos/include/sm/ns.h
___________________________________________________________________
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Modified: trunk/reactos/lib/smdll/smdll.def
--- trunk/reactos/lib/smdll/smdll.def	2005-06-02 13:10:57 UTC (rev 15728)
+++ trunk/reactos/lib/smdll/smdll.def	2005-06-02 13:17:37 UTC (rev 15729)
@@ -4,3 +4,4 @@
 SmConnectApiPort@16
 SmExecuteProgram@8
 SmQueryInformation@20
+SmLookupSubsystem@20

Modified: trunk/reactos/lib/smlib/compses.c
--- trunk/reactos/lib/smlib/compses.c	2005-06-02 13:10:57 UTC (rev 15728)
+++ trunk/reactos/lib/smlib/compses.c	2005-06-02 13:17:37 UTC (rev 15729)
@@ -1,63 +1,63 @@
-/* $Id: compses.c 13731 2005-02-23 23:37:06Z ea $
- *
- * 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 */
+/* $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 */
Property changes on: trunk/reactos/lib/smlib/compses.c
___________________________________________________________________
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Modified: trunk/reactos/lib/smlib/connect.c
--- trunk/reactos/lib/smlib/connect.c	2005-06-02 13:10:57 UTC (rev 15728)
+++ trunk/reactos/lib/smlib/connect.c	2005-06-02 13:17:37 UTC (rev 15729)
@@ -1,106 +1,106 @@
-/* $Id: connect.c 14015 2005-03-13 17:00:19Z ea $
- *
- * 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 */
+/* $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 */
Property changes on: trunk/reactos/lib/smlib/connect.c
___________________________________________________________________
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Modified: trunk/reactos/lib/smlib/execpgm.c
--- trunk/reactos/lib/smlib/execpgm.c	2005-06-02 13:10:57 UTC (rev 15728)
+++ trunk/reactos/lib/smlib/execpgm.c	2005-06-02 13:17:37 UTC (rev 15729)
@@ -1,87 +1,87 @@
-/* $Id: execpgm.c 13731 2005-02-23 23:37:06Z ea $
- *
- * 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 */
+/* $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 */
Property changes on: trunk/reactos/lib/smlib/execpgm.c
___________________________________________________________________
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Added: trunk/reactos/lib/smlib/lookupss.c
--- trunk/reactos/lib/smlib/lookupss.c	2005-06-02 13:10:57 UTC (rev 15728)
+++ trunk/reactos/lib/smlib/lookupss.c	2005-06-02 13:17:37 UTC (rev 15729)
@@ -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 */
Property changes on: trunk/reactos/lib/smlib/lookupss.c
___________________________________________________________________
Name: svn:keywords
   + id author date revision
Name: svn:eol-style
   + native

Modified: trunk/reactos/lib/smlib/smlib.xml
--- trunk/reactos/lib/smlib/smlib.xml	2005-06-02 13:10:57 UTC (rev 15728)
+++ trunk/reactos/lib/smlib/smlib.xml	2005-06-02 13:17:37 UTC (rev 15729)
@@ -4,4 +4,5 @@
 	<file>connect.c</file>
 	<file>execpgm.c</file>
 	<file>compses.c</file>
+	<file>lookupss.c</file>
 </module>

Modified: trunk/reactos/subsys/csrss/csrss.c
--- trunk/reactos/subsys/csrss/csrss.c	2005-06-02 13:10:57 UTC (rev 15728)
+++ trunk/reactos/subsys/csrss/csrss.c	2005-06-02 13:17:37 UTC (rev 15729)
@@ -52,6 +52,8 @@
 
 } COMMAND_LINE_ARGUMENT, *PCOMMAND_LINE_ARGUMENT;
 
+PRTL_USER_PROCESS_PARAMETERS RtlProcessParameters = NULL;
+
 /**********************************************************************
  * NAME							PRIVATE
  * 	CsrpParseCommandLine/3
@@ -150,7 +152,6 @@
 
 VOID STDCALL NtProcessStartup(PPEB Peb)
 {
-   PRTL_USER_PROCESS_PARAMETERS RtlProcessParameters = NULL;
    COMMAND_LINE_ARGUMENT        CmdLineArg = {0};
    NTSTATUS                     Status = STATUS_SUCCESS;
 

Modified: trunk/reactos/subsys/csrss/init.c
--- trunk/reactos/subsys/csrss/init.c	2005-06-02 13:10:57 UTC (rev 15728)
+++ trunk/reactos/subsys/csrss/init.c	2005-06-02 13:17:37 UTC (rev 15729)
@@ -34,6 +34,7 @@
 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 @@
 /* === INIT ROUTINES === */
 
 /**********************************************************************
- * CsrpCreateCallbackPort/0
+ * CsrpCreateHeap/2
  */
 static NTSTATUS
 CsrpCreateHeap (ULONG argc, PWSTR* argv)
@@ -327,7 +328,7 @@
 }
 
 /**********************************************************************
- * CsrpCreateCallbackPort/0
+ * CsrpCreateCallbackPort/2
  */
 static NTSTATUS
 CsrpCreateCallbackPort (ULONG argc, PWSTR* argv)
@@ -401,9 +402,49 @@
 }
 
 /**********************************************************************
- * 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)
 {
 	DPRINT("CSR: %s called\n", __FUNCTION__);
@@ -495,16 +536,17 @@
 	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"},
 };
 
 /**********************************************************************
Property changes on: trunk/reactos/subsys/smss/client.c
___________________________________________________________________
Name: eol-style
   + native
Property changes on: trunk/reactos/subsys/smss/debug.c
___________________________________________________________________
Name: author
   + client.c
Name: id
   + client.c
Name: date
   + client.c
Name: eol-style
   + native
Name: revision
   + client.c
Property changes on: trunk/reactos/subsys/smss/init.c
___________________________________________________________________
Name: author
   + client.c
Name: id
   + client.c
Name: date
   + client.c
Name: eol-style
   + native
Name: revision
   + client.c
Property changes on: trunk/reactos/subsys/smss/initdosdev.c
___________________________________________________________________
Name: author
   + client.c
Name: id
   + client.c
Name: date
   + client.c
Name: eol-style
   + native
Name: revision
   + client.c
Property changes on: trunk/reactos/subsys/smss/initenv.c
___________________________________________________________________
Name: author
   + client.c
Name: id
   + client.c
Name: date
   + client.c
Name: eol-style
   + native
Name: revision
   + client.c
Property changes on: trunk/reactos/subsys/smss/initheap.c
___________________________________________________________________
Name: author
   + client.c
Name: id
   + client.c
Name: date
   + client.c
Name: eol-style
   + native
Name: revision
   + client.c
Property changes on: trunk/reactos/subsys/smss/initmv.c
___________________________________________________________________
Name: author
   + client.c
Name: id
   + client.c
Name: date
   + client.c
Name: eol-style
   + native
Name: revision
   + client.c
Property changes on: trunk/reactos/subsys/smss/initobdir.c
___________________________________________________________________
Name: author
   + client.c
Name: id
   + client.c
Name: date
   + client.c
Name: eol-style
   + native
[truncated at 1000 lines; 376 more skipped]