From 90b5ddc4624e6657d35275c243de552404ca92a8 Mon Sep 17 00:00:00 2001 From: Emanuele Aliberti Date: Sun, 6 Feb 2005 17:00:53 +0000 Subject: [PATCH 1/1] SMDLL: helper to use the SM svn path=/trunk/; revision=13443 --- reactos/lib/smdll/compses.c | 39 +++++++++++++++++ reactos/lib/smdll/connect.c | 83 ++++++++++++++++++++++++++++++++++++ reactos/lib/smdll/dllmain.c | 17 ++++++++ reactos/lib/smdll/execpgm.c | 49 +++++++++++++++++++++ reactos/lib/smdll/makefile | 34 +++++++++++++++ reactos/lib/smdll/readme.txt | 18 ++++++++ reactos/lib/smdll/smdll.def | 5 +++ reactos/lib/smdll/smdll.rc | 4 ++ reactos/lib/smdll/testapi.c | 20 +++++++++ 9 files changed, 269 insertions(+) create mode 100644 reactos/lib/smdll/compses.c create mode 100644 reactos/lib/smdll/connect.c create mode 100644 reactos/lib/smdll/dllmain.c create mode 100644 reactos/lib/smdll/execpgm.c create mode 100644 reactos/lib/smdll/makefile create mode 100644 reactos/lib/smdll/readme.txt create mode 100644 reactos/lib/smdll/smdll.def create mode 100644 reactos/lib/smdll/smdll.rc create mode 100644 reactos/lib/smdll/testapi.c diff --git a/reactos/lib/smdll/compses.c b/reactos/lib/smdll/compses.c new file mode 100644 index 00000000000..9f7e324f957 --- /dev/null +++ b/reactos/lib/smdll/compses.c @@ -0,0 +1,39 @@ +/* $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 +#include + +NTSTATUS STDCALL +SmCompleteSession (HANDLE hSmApiPort, HANDLE hSbApiPort, HANDLE hApiPort) +{ + NTSTATUS Status; + SM_PORT_MESSAGE SmReqMsg; + + /* Marshal Ses in the LPC message */ + SmReqMsg.CompSes.hApiPort = hApiPort; + SmReqMsg.CompSes.hSbApiPort = hSbApiPort; + + /* SM API to invoke */ + SmReqMsg.ApiIndex = SM_API_COMPLETE_SESSION; + + /* Port message */ + SmReqMsg.Header.MessageType = LPC_NEW_MESSAGE; + SmReqMsg.Header.DataSize = SM_PORT_DATA_SIZE(SmReqMsg.CompSes); + SmReqMsg.Header.MessageSize = SM_PORT_MESSAGE_SIZE; + Status = NtRequestWaitReplyPort (hSmApiPort, (PLPC_MESSAGE) & SmReqMsg, (PLPC_MESSAGE) & SmReqMsg); + if (NT_SUCCESS(Status)) + { + return SmReqMsg.Status; + } + DbgPrint ("%s failed (Status=0x%08lx)\n", __FUNCTION__, Status); + return Status; +} + +/* EOF */ diff --git a/reactos/lib/smdll/connect.c b/reactos/lib/smdll/connect.c new file mode 100644 index 00000000000..1ac5d51d6f6 --- /dev/null +++ b/reactos/lib/smdll/connect.c @@ -0,0 +1,83 @@ +/* $Id$ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: reactos/lib/smdll/connect.c + * PURPOSE: Connect to the API LPC port exposed by the SM + */ +#define NTOS_MODE_USER +#include +#include +#include +#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); + * dwSubsystem: a valid IMAGE_SUBSYSTEM_xxx value; + * phSmApiPort: a pointer to a HANDLE, which will be + * filled with a valid client-side LPC comm port. + * + * RETURN VALUE + * If all three optional values are omitted, an LPC status. + * STATUS_INVALID_PARAMETER_MIX if PortName is defined and + * both hSbApiPort and dwSubsystem are 0. + */ +NTSTATUS STDCALL +SmConnectApiPort (IN PUNICODE_STRING pSbApiPortName OPTIONAL, + IN HANDLE hSbApiPort OPTIONAL, + IN DWORD dwSubsystem OPTIONAL, + IN OUT PHANDLE phSmApiPort) +{ + UNICODE_STRING SmApiPortName; + SECURITY_QUALITY_OF_SERVICE SecurityQos; + NTSTATUS Status = STATUS_SUCCESS; + SM_CONNECT_DATA ConnectData = {0,{0}}; + ULONG ConnectDataLength = 0; + + if (pSbApiPortName) + { + if (NULL == hSbApiPort || IMAGE_SUBSYSTEM_UNKNOWN == dwSubsystem) + { + return STATUS_INVALID_PARAMETER_MIX; + } + ConnectData.Subsystem = dwSubsystem; + memmove (& 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; + } + DbgPrint ("%s failed (Status=0x%08lx)\n", __FUNCTION__, Status); + return Status; +} + +/* EOF */ diff --git a/reactos/lib/smdll/dllmain.c b/reactos/lib/smdll/dllmain.c new file mode 100644 index 00000000000..3d6e48820d3 --- /dev/null +++ b/reactos/lib/smdll/dllmain.c @@ -0,0 +1,17 @@ +/* $Id$ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS + * FILE: lib/smdll/dllmain.c + * PURPOSE: SM Helper Library + */ + +#define NTOS_MODE_USER +#include + +BOOL STDCALL DllMain(HANDLE hinstDll, DWORD fdwReason, LPVOID fImpLoad) +{ + return TRUE; +} + +/* EOF */ diff --git a/reactos/lib/smdll/execpgm.c b/reactos/lib/smdll/execpgm.c new file mode 100644 index 00000000000..f5b2e5fa514 --- /dev/null +++ b/reactos/lib/smdll/execpgm.c @@ -0,0 +1,49 @@ +/* $Id$ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * FILE: lib/smdll/execpgm.c + * PURPOSE: Call SM API SM_API_EXECPGM + */ +#define NTOS_MODE_USER +#include +#include +#include +#include + +NTSTATUS STDCALL +SmExecPgm (HANDLE hSmApiPort, PUNICODE_STRING Pgm) +{ + NTSTATUS Status; + SM_PORT_MESSAGE SmReqMsg; + + + /* 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.ExecPgm.NameLength = Pgm->Length; + RtlCopyMemory (SmReqMsg.ExecPgm.Name, Pgm->Buffer, Pgm->Length); + + /* SM API to invoke */ + SmReqMsg.ApiIndex = SM_API_EXECUTE_PROGRAMME; + + /* LPC message */ + SmReqMsg.Header.MessageType = LPC_NEW_MESSAGE; + SmReqMsg.Header.DataSize = SM_PORT_DATA_SIZE(SmReqMsg.ExecPgm); + SmReqMsg.Header.MessageSize = SM_PORT_MESSAGE_SIZE; + + /* Call SM and wait for a reply */ + Status = NtRequestWaitReplyPort (hSmApiPort, (PLPC_MESSAGE) & SmReqMsg, (PLPC_MESSAGE) & SmReqMsg); + if (NT_SUCCESS(Status)) + { + return SmReqMsg.Status; + } + DbgPrint ("%s failed (Status=0x%08lx)\n", __FUNCTION__, Status); + return Status; +} + +/* EOF */ diff --git a/reactos/lib/smdll/makefile b/reactos/lib/smdll/makefile new file mode 100644 index 00000000000..d14e1d598f4 --- /dev/null +++ b/reactos/lib/smdll/makefile @@ -0,0 +1,34 @@ +# $Id$ + +PATH_TO_TOP = ../.. + +TARGET_TYPE = dynlink + +TARGET_NAME = smdll + +TARGET_SDKLIBS = ntdll.a + +TARGET_CFLAGS = -I./include -Wall -Werror + +# require os code to explicitly request A/W version of structs/functions +TARGET_CFLAGS += -D_DISABLE_TIDENTS + +TARGET_LFLAGS = -nostartfiles -nostdlib + +#TARGET_BASE = + +TARGET_OBJECTS = \ + dllmain.o \ + connect.o \ + execpgm.o \ + compses.o + +DEP_OBJECTS = $(TARGET_OBJECTS) + +include $(PATH_TO_TOP)/rules.mak + +include $(TOOLS_PATH)/helper.mk + +include $(TOOLS_PATH)/depend.mk + +# EOF diff --git a/reactos/lib/smdll/readme.txt b/reactos/lib/smdll/readme.txt new file mode 100644 index 00000000000..8265e596dcf --- /dev/null +++ b/reactos/lib/smdll/readme.txt @@ -0,0 +1,18 @@ +$Id$ + +This is SMDLL: a helper library to talk to the ReactOS session manager (SM). + +It should be linked in the following components: + +a) the SM itself, because iy registers for managing native processes + IMAGE_SUBSYSTEM_NATIVE; + +b) environment subsystem servers, because each one should register in + the SM its own subsystem (willing to manageg those processes); + +c) terminal emulators for optional subsystems, like posixw32 and os2w32, + to ask the SM to start the optional subsystem server they need connect to; + +d) system and development utilites to debug/query the SM. + +2004-02-15 ea \ No newline at end of file diff --git a/reactos/lib/smdll/smdll.def b/reactos/lib/smdll/smdll.def new file mode 100644 index 00000000000..76d524637b6 --- /dev/null +++ b/reactos/lib/smdll/smdll.def @@ -0,0 +1,5 @@ +LIBRARY SMDLL.DLL +EXPORTS +SmCompleteSession@12 +SmConnectApiPort@16 +SmExecPgm@8 \ No newline at end of file diff --git a/reactos/lib/smdll/smdll.rc b/reactos/lib/smdll/smdll.rc new file mode 100644 index 00000000000..ae16f7bbdd8 --- /dev/null +++ b/reactos/lib/smdll/smdll.rc @@ -0,0 +1,4 @@ +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS SM Helper\0" +#define REACTOS_STR_INTERNAL_NAME "smdll.dll\0" +#define REACTOS_STR_ORIGINAL_FILENAME "smdll.dll\0" +#include diff --git a/reactos/lib/smdll/testapi.c b/reactos/lib/smdll/testapi.c new file mode 100644 index 00000000000..a1ecde2cf7f --- /dev/null +++ b/reactos/lib/smdll/testapi.c @@ -0,0 +1,20 @@ +/* $Id$ */ +#define NTOS_MODE_USER +#include +#include + +VOID STDCALL SmPrintPortMessage (PSM_PORT_MESSAGE SmMessage) +{ + DbgPrint ("SM_PORT_MESSAGE %08lx:\n", (ULONG) SmMessage); + DbgPrint (" Header:\n"); + DbgPrint (" MessageType = %u\n", SmMessage->Header.MessageType); + DbgPrint (" DataSize = %d\n", SmMessage->Header.DataSize); + DbgPrint (" MessageSize = %d\n", SmMessage->Header.MessageSize); + DbgPrint (" ApiIndex = %ld\n", SmMessage->ApiIndex); + DbgPrint (" Status = %08lx\n", SmMessage->Status); + DbgPrint (" ExecPgm:\n"); + DbgPrint (" NameLength = %ld\n", SmMessage->ExecPgm.NameLength); + DbgPrint (" Name = %ls\n", (LPWSTR) & SmMessage->ExecPgm.Name); +} +/* EOF */ + -- 2.17.1