From da87b757122229f40cc90a38e07e2c7bea7c6e5f Mon Sep 17 00:00:00 2001 From: Emanuele Aliberti Date: Thu, 2 Jun 2005 13:17:37 +0000 Subject: [PATCH] SM/CSR: move win32k.sys loading from the SM to the Win32 user mode server. svn path=/trunk/; revision=15729 --- reactos/include/sm/helper.h | 8 +- reactos/include/sm/ns.h | 26 ++-- reactos/lib/smdll/smdll.def | 1 + reactos/lib/smlib/compses.c | 126 +++++++++---------- reactos/lib/smlib/connect.c | 212 ++++++++++++++++---------------- reactos/lib/smlib/execpgm.c | 174 +++++++++++++------------- reactos/lib/smlib/lookupss.c | 155 +++++++++++++++++++++++ reactos/lib/smlib/smlib.xml | 1 + reactos/subsys/csrss/csrss.c | 3 +- reactos/subsys/csrss/init.c | 68 ++++++++-- reactos/subsys/smss/initss.c | 45 +------ reactos/subsys/smss/smapiexec.c | 124 +------------------ reactos/subsys/smss/smss.h | 6 - 13 files changed, 492 insertions(+), 457 deletions(-) create mode 100644 reactos/lib/smlib/lookupss.c diff --git a/reactos/include/sm/helper.h b/reactos/include/sm/helper.h index 3ca42dfcbe6..ff22296f539 100644 --- a/reactos/include/sm/helper.h +++ b/reactos/include/sm/helper.h @@ -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 */ diff --git a/reactos/include/sm/ns.h b/reactos/include/sm/ns.h index fde7f80a431..56279a9222c 100644 --- a/reactos/include/sm/ns.h +++ b/reactos/include/sm/ns.h @@ -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 */ diff --git a/reactos/lib/smdll/smdll.def b/reactos/lib/smdll/smdll.def index df6394e5f0a..938851cc85a 100644 --- a/reactos/lib/smdll/smdll.def +++ b/reactos/lib/smdll/smdll.def @@ -4,3 +4,4 @@ SmCompleteSession@12 SmConnectApiPort@16 SmExecuteProgram@8 SmQueryInformation@20 +SmLookupSubsystem@20 diff --git a/reactos/lib/smlib/compses.c b/reactos/lib/smlib/compses.c index 54542380583..56445f9a92c 100644 --- a/reactos/lib/smlib/compses.c +++ b/reactos/lib/smlib/compses.c @@ -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 -#include - -#define NDEBUG -#include - -/********************************************************************** - * 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 +#include + +#define NDEBUG +#include + +/********************************************************************** + * 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 */ diff --git a/reactos/lib/smlib/connect.c b/reactos/lib/smlib/connect.c index dfd5925cbf6..8f9124527fb 100644 --- a/reactos/lib/smlib/connect.c +++ b/reactos/lib/smlib/connect.c @@ -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 -#include -#include - -#define NDEBUG -#include - -/********************************************************************** - * 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 +#include +#include + +#define NDEBUG +#include + +/********************************************************************** + * 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 */ diff --git a/reactos/lib/smlib/execpgm.c b/reactos/lib/smlib/execpgm.c index fd29e70ede7..288a78e6370 100644 --- a/reactos/lib/smlib/execpgm.c +++ b/reactos/lib/smlib/execpgm.c @@ -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 -#include -#include - -#define NDEBUG -#include - -/********************************************************************** - * 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 +#include +#include + +#define NDEBUG +#include + +/********************************************************************** + * 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 index 00000000000..2ab324aea63 --- /dev/null +++ b/reactos/lib/smlib/lookupss.c @@ -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 +#include + +#define NDEBUG +#include + +/********************************************************************** + * 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 */ diff --git a/reactos/lib/smlib/smlib.xml b/reactos/lib/smlib/smlib.xml index 6b06eb10210..1946df69463 100644 --- a/reactos/lib/smlib/smlib.xml +++ b/reactos/lib/smlib/smlib.xml @@ -4,4 +4,5 @@ connect.c execpgm.c compses.c + lookupss.c diff --git a/reactos/subsys/csrss/csrss.c b/reactos/subsys/csrss/csrss.c index 307ba19360b..5114f539522 100644 --- a/reactos/subsys/csrss/csrss.c +++ b/reactos/subsys/csrss/csrss.c @@ -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; diff --git a/reactos/subsys/csrss/init.c b/reactos/subsys/csrss/init.c index fa8515171d9..e8510b33187 100644 --- a/reactos/subsys/csrss/init.c +++ b/reactos/subsys/csrss/init.c @@ -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"}, }; /********************************************************************** diff --git a/reactos/subsys/smss/initss.c b/reactos/subsys/smss/initss.c index 0c2f338ffa8..d59b4653d43 100644 --- a/reactos/subsys/smss/initss.c +++ b/reactos/subsys/smss/initss.c @@ -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; diff --git a/reactos/subsys/smss/smapiexec.c b/reactos/subsys/smss/smapiexec.c index 1c14dec6bbb..7274261b3cd 100644 --- a/reactos/subsys/smss/smapiexec.c +++ b/reactos/subsys/smss/smapiexec.c @@ -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? */ diff --git a/reactos/subsys/smss/smss.h b/reactos/subsys/smss/smss.h index bc099bf1d36..ec71c149fb1 100644 --- a/reactos/subsys/smss/smss.h +++ b/reactos/subsys/smss/smss.h @@ -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 */ -- 2.17.1