mirror of
https://github.com/reactos/reactos.git
synced 2024-08-01 09:01:13 +00:00
SMDLL + SMLIB (static code in SMSS.EXE)
SM now self registers for IMAGE_SUBSYSTEM_NATIVE. svn path=/trunk/; revision=14080
This commit is contained in:
parent
f689818f82
commit
9cc503a1b2
|
@ -61,8 +61,8 @@ DLLS_SHELLEXT = shellext
|
|||
DLLS = acledit aclui advapi32 advpack cabinet cards comctl32 crtdll comdlg32 d3d8thk dbghelp expat fmifs freetype \
|
||||
gdi32 gdiplus glu32 hid imagehlp imm32 iphlpapi kernel32 lzexpand mesa32 midimap mmdrv mpr msacm msafd \
|
||||
msgina msi msimg32 msvcrt20 msvideo mswsock netapi32 ntdll ole32 oleaut32 oledlg olepro32 opengl32 \
|
||||
packet psapi riched20 richedit rpcrt4 samlib secur32 setupapi shell32 shlwapi smdll snmpapi syssetup \
|
||||
twain user32 userenv version wininet winmm winspool ws2help ws2_32 wsock32 wshirda dnsapi \
|
||||
packet psapi riched20 richedit rpcrt4 samlib secur32 setupapi shell32 shlwapi smlib smdll snmpapi \
|
||||
syssetup twain user32 userenv version wininet winmm winspool ws2help ws2_32 wsock32 wshirda dnsapi \
|
||||
urlmon shdocvw dinput dinput8 dxdiagn devenum dsound lsasrv $(DLLS_KBD) $(DLLS_CPL) $(DLLS_SHELLEXT)
|
||||
|
||||
SUBSYS = smss win32k csrss ntvdm
|
||||
|
|
|
@ -3,21 +3,31 @@
|
|||
|
||||
/* $Id$ */
|
||||
|
||||
/* smdll/connect.c */
|
||||
/* smlib/connect.c */
|
||||
NTSTATUS STDCALL
|
||||
SmConnectApiPort (IN PUNICODE_STRING pSbApiPortName OPTIONAL,
|
||||
IN HANDLE hSbApiPort OPTIONAL,
|
||||
IN DWORD dwSubsystem OPTIONAL, /* pe.h */
|
||||
IN OUT PHANDLE phSmApiPort);
|
||||
/* smdll/compses.c */
|
||||
/* smlib/compses.c */
|
||||
NTSTATUS STDCALL
|
||||
SmCompleteSession (IN HANDLE hSmApiPort,
|
||||
IN HANDLE hSbApiPort,
|
||||
IN HANDLE hApiPort);
|
||||
/* smdll/execpgm.c */
|
||||
/* smlib/execpgm.c */
|
||||
NTSTATUS STDCALL
|
||||
SmExecuteProgram (IN HANDLE hSmApiPort,
|
||||
IN PUNICODE_STRING Pgm
|
||||
);
|
||||
/* smdll/query.c */
|
||||
typedef enum {
|
||||
SM_BASE_INFORMATION
|
||||
} SM_INFORMATION_CLASS, *PSM_INFORMATION_CLASS;
|
||||
|
||||
NTSTATUS STDCALL
|
||||
SmQuery (IN HANDLE SmApiPort,
|
||||
IN SM_INFORMATION_CLASS SmInformationClass,
|
||||
IN OUT PVOID Data,
|
||||
IN OUT PULONG DataLength);
|
||||
|
||||
#endif /* ndef INCLUDE_SM_HELPER_H */
|
||||
|
|
|
@ -6,7 +6,7 @@ TARGET_TYPE = dynlink
|
|||
|
||||
TARGET_NAME = smdll
|
||||
|
||||
TARGET_SDKLIBS = ntdll.a
|
||||
TARGET_SDKLIBS = smlib.a ntdll.a
|
||||
|
||||
TARGET_CFLAGS = -I./include -Wall -Werror
|
||||
|
||||
|
@ -19,9 +19,7 @@ TARGET_LFLAGS = -nostartfiles -nostdlib
|
|||
|
||||
TARGET_OBJECTS = \
|
||||
dllmain.o \
|
||||
connect.o \
|
||||
execpgm.o \
|
||||
compses.o
|
||||
query.o
|
||||
|
||||
DEP_OBJECTS = $(TARGET_OBJECTS)
|
||||
|
||||
|
|
39
reactos/lib/smdll/query.c
Normal file
39
reactos/lib/smdll/query.c
Normal file
|
@ -0,0 +1,39 @@
|
|||
/* $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/smdll/query.c
|
||||
* PURPOSE: Call SM API SM_API_QUERY (not in NT)
|
||||
*/
|
||||
#define NTOS_MODE_USER
|
||||
#include <ntos.h>
|
||||
#include <sm/api.h>
|
||||
#include <sm/helper.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <debug.h>
|
||||
|
||||
/**********************************************************************
|
||||
* NAME EXPORTED
|
||||
* SmQuery/4
|
||||
*
|
||||
* DESCRIPTION
|
||||
*
|
||||
* ARGUMENTS
|
||||
*
|
||||
* RETURN VALUE
|
||||
*/
|
||||
NTSTATUS STDCALL
|
||||
SmQuery (IN HANDLE SmApiPort,
|
||||
IN SM_INFORMATION_CLASS SmInformationClass,
|
||||
IN OUT PVOID Data,
|
||||
IN OUT PULONG DataLength)
|
||||
{
|
||||
/* TODO */
|
||||
if(NULL != DataLength)
|
||||
{
|
||||
*DataLength = 0;
|
||||
}
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
/* EOF */
|
|
@ -3,3 +3,4 @@ EXPORTS
|
|||
SmCompleteSession@12
|
||||
SmConnectApiPort@16
|
||||
SmExecuteProgram@8
|
||||
SmQuery@16
|
||||
|
|
|
@ -1,64 +1,64 @@
|
|||
/* $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/api.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("SMDLL: %s called\n", __FUNCTION__);
|
||||
|
||||
/* 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;
|
||||
}
|
||||
DPRINT("SMDLL: %s failed (Status=0x%08lx)\n", __FUNCTION__, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
/* $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/api.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.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;
|
||||
}
|
||||
DPRINT("SMLIB: %s failed (Status=0x%08lx)\n", __FUNCTION__, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* EOF */
|
|
@ -1,98 +1,98 @@
|
|||
/* $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 <ntos.h>
|
||||
#include <sm/api.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);
|
||||
* 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;
|
||||
|
||||
DPRINT("SMDLL: %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 == dwSubsystem)
|
||||
{
|
||||
return STATUS_INVALID_PARAMETER_MIX;
|
||||
}
|
||||
RtlZeroMemory (& ConnectData, sizeof ConnectData);
|
||||
ConnectData.Subsystem = dwSubsystem;
|
||||
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("SMDLL: %s failed (Status=0x%08lx)\n", __FUNCTION__, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
/* $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/api.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);
|
||||
* 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;
|
||||
|
||||
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 == dwSubsystem)
|
||||
{
|
||||
return STATUS_INVALID_PARAMETER_MIX;
|
||||
}
|
||||
RtlZeroMemory (& ConnectData, sizeof ConnectData);
|
||||
ConnectData.Subsystem = dwSubsystem;
|
||||
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 */
|
|
@ -1,76 +1,76 @@
|
|||
/* $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 <ntos.h>
|
||||
#include <sm/api.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("SMDLL: %s called\n", __FUNCTION__);
|
||||
|
||||
/* 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;
|
||||
}
|
||||
DPRINT("SMDLL: %s failed (Status=0x%08lx)\n", __FUNCTION__, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
/* $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/api.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 called\n", __FUNCTION__);
|
||||
|
||||
/* 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;
|
||||
}
|
||||
DPRINT("SMLIB: %s failed (Status=0x%08lx)\n", __FUNCTION__, Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
/* EOF */
|
35
reactos/lib/smlib/makefile
Normal file
35
reactos/lib/smlib/makefile
Normal file
|
@ -0,0 +1,35 @@
|
|||
|
||||
PATH_TO_TOP = ../..
|
||||
|
||||
TARGET_TYPE = library
|
||||
|
||||
TARGET_NAME = smlib
|
||||
|
||||
include $(PATH_TO_TOP)/config
|
||||
|
||||
TARGET_CFLAGS = -Wall -Werror -ffreestanding
|
||||
|
||||
# require os code to explicitly request A/W version of structs/functions
|
||||
TARGET_CFLAGS += -D_DISABLE_TIDENTS
|
||||
|
||||
ifneq ($(DBG), 0)
|
||||
TARGET_CFLAGS += -DDBG
|
||||
endif
|
||||
|
||||
TARGET_OBJECTS = \
|
||||
connect.o \
|
||||
execpgm.o \
|
||||
compses.o
|
||||
|
||||
|
||||
include $(PATH_TO_TOP)/rules.mak
|
||||
|
||||
include $(TOOLS_PATH)/helper.mk
|
||||
|
||||
DEP_OBJECTS := $(TARGET_OBJECTS)
|
||||
|
||||
TARGET_CLEAN = $(DEP_FILES)
|
||||
|
||||
include $(PATH_TO_TOP)/tools/depend.mk
|
||||
|
||||
# EOF
|
|
@ -60,7 +60,7 @@ HANDLE hSmApiPort = (HANDLE) 0;
|
|||
* (programmatically). This also open hSmApiPort to be used
|
||||
* in loading required subsystems.
|
||||
*/
|
||||
#if 0
|
||||
|
||||
static NTSTATUS
|
||||
SmpRegisterSmss(VOID)
|
||||
{
|
||||
|
@ -68,7 +68,8 @@ SmpRegisterSmss(VOID)
|
|||
UNICODE_STRING SbApiPortName = {0,0,NULL};
|
||||
|
||||
DPRINT("SM: %s called\n",__FUNCTION__);
|
||||
|
||||
|
||||
RtlInitUnicodeString (& SbApiPortName, L"");
|
||||
Status = SmConnectApiPort(& SbApiPortName,
|
||||
(HANDLE) 0,
|
||||
IMAGE_SUBSYSTEM_NATIVE,
|
||||
|
@ -79,6 +80,7 @@ SmpRegisterSmss(VOID)
|
|||
__FUNCTION__,Status);
|
||||
return Status;
|
||||
}
|
||||
DPRINT("SM self registered\n");
|
||||
/*
|
||||
* Note that you don't need to call complete session
|
||||
* because connection handling code autocompletes
|
||||
|
@ -86,7 +88,7 @@ SmpRegisterSmss(VOID)
|
|||
*/
|
||||
return Status;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/**********************************************************************
|
||||
*/
|
||||
|
@ -103,13 +105,12 @@ SmLoadSubsystems(VOID)
|
|||
DPRINT("SM: loading subsystems\n");
|
||||
|
||||
/* SM self registers */
|
||||
#if 0
|
||||
Status = SmpRegisterSmss();
|
||||
if(!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("SM: SM failed to self register: system is not secure!\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Load Kmode subsystem (aka win32k.sys) */
|
||||
Status = SmLookupSubsystem (L"Kmode",
|
||||
Data,
|
||||
|
@ -136,7 +137,7 @@ SmLoadSubsystems(VOID)
|
|||
}
|
||||
/* TODO: load Required subsystems (Debug Windows) */
|
||||
#if 0
|
||||
Status = SmExecuteProgram(L"DEBUG");
|
||||
Status = SmExecuteProgram (hSmApiPort, L"DEBUG");
|
||||
if(!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT1("SM: DBSS failed to initialize!\n");
|
||||
|
|
|
@ -6,7 +6,7 @@ TARGET_TYPE = program
|
|||
|
||||
TARGET_APPTYPE = native
|
||||
|
||||
TARGET_SDKLIBS = ntdll.a smdll.a
|
||||
TARGET_SDKLIBS = smlib.a ntdll.a
|
||||
|
||||
TARGET_NAME = smss
|
||||
|
||||
|
|
Loading…
Reference in a new issue