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
--- 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 */
--- 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
--- 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
--- 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
--- 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
--- 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
--- 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
--- 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>
--- 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;
--- 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]