mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +00:00
[SMSS]: Add a new header which precisely documents the SB and SM packet structure and protocol. These match the Server 2003 SP1 definitions and sizes and would allow a ReactOS SMSS to talk to a Windows CSRSS and vice-versa.
svn path=/trunk/; revision=55290
This commit is contained in:
parent
07155c928c
commit
bb0bb575b6
1 changed files with 207 additions and 0 deletions
207
reactos/include/reactos/subsys/sm/smmsg.h
Normal file
207
reactos/include/reactos/subsys/sm/smmsg.h
Normal file
|
@ -0,0 +1,207 @@
|
|||
/*
|
||||
* PROJECT: ReactOS Windows-Compatible Session Manager
|
||||
* LICENSE: BSD 2-Clause License
|
||||
* FILE: include/reactos/subsystems/sm/smmsg.h
|
||||
* PURPOSE: SMSS (SB and SM) Message Format
|
||||
* PROGRAMMERS: Alex Ionescu
|
||||
*/
|
||||
|
||||
//
|
||||
// There are the APIs that a Client (such as CSRSS) can send to the SMSS Server.
|
||||
//
|
||||
// These are called "SM" APIs.
|
||||
//
|
||||
// The exact names are not known, but we are basing them on the SmpApiName array
|
||||
// in the checked build of SMSS, which is probably a close approximation. We add
|
||||
// "p" to use the similar nomenclature seen/leaked out in the Base CSRSS APIs.
|
||||
//
|
||||
//
|
||||
typedef enum _SMSRV_API_NUMBER
|
||||
{
|
||||
SmpCreateForeignSession,
|
||||
SmpSessionComplete,
|
||||
SmpTerminateForeignSession,
|
||||
SmpExecPgm,
|
||||
SmpLoadDeferedSubsystem,
|
||||
SmpStartCsr,
|
||||
SmpStopCsr,
|
||||
SmpMaxApiNumber // Based on BasepMaxApiNumber, UserpMaxApiNumber...
|
||||
} SMSRV_API_NUMBER;
|
||||
|
||||
//
|
||||
// These are the structures making up the SM_API_MSG packet structure defined
|
||||
// below. Each one corresponds to an equivalent API from the list above.
|
||||
//
|
||||
typedef struct _SM_CREATE_FOREIGN_SESSION_MSG
|
||||
{
|
||||
ULONG NotImplemented;
|
||||
} SM_CREATE_FOREIGN_SESSION_MSG, *PSM_CREATE_FOREIGN_SESSION_MSG;
|
||||
|
||||
typedef struct _SM_SESSION_COMPLETE_MSG
|
||||
{
|
||||
ULONG SessionId;
|
||||
NTSTATUS Status;
|
||||
} SM_SESSION_COMPLETE_MSG, *PSM_SESSION_COMPLETE_MSG;
|
||||
|
||||
typedef struct _SM_TERMINATE_FOREIGN_SESSION_MSG
|
||||
{
|
||||
ULONG NotImplemented;
|
||||
} SM_TERMINATE_FOREIGN_SESSION_MSG, *PSM_TERMINATE_FOREIGN_SESSION_MSG;
|
||||
|
||||
typedef struct _SM_EXEC_PGM_MSG
|
||||
{
|
||||
RTL_USER_PROCESS_INFORMATION ProcessInformation;
|
||||
BOOLEAN DebugFlag;
|
||||
} SM_EXEC_PGM_MSG, *PM_EXEC_PGM_MSG;
|
||||
|
||||
typedef struct _SM_LOAD_DEFERED_SUBSYSTEM_MSG
|
||||
{
|
||||
ULONG Length;
|
||||
WCHAR Buffer[32];
|
||||
} SM_LOAD_DEFERED_SUBSYSTEM_MSG, *PSM_LOAD_DEFERED_SUBSYSTEM_MSG;
|
||||
|
||||
typedef struct _SM_START_CSR_MSG
|
||||
{
|
||||
ULONG MuSessionId;
|
||||
ULONG Length;
|
||||
WCHAR Buffer[128];
|
||||
HANDLE WindowsSubSysProcessId;
|
||||
HANDLE SmpInitialCommandProcessId;
|
||||
} SM_START_CSR_MSG, *PSM_START_CSR_MSG;
|
||||
|
||||
typedef struct _SM_STOP_CSR_MSG
|
||||
{
|
||||
ULONG MuSessionId;
|
||||
} SM_STOP_CSR_MSG, *PSM_STOP_CSR_MSG;
|
||||
|
||||
//
|
||||
// This is the actual packet structure sent over LCP to the \SmApiPort
|
||||
//
|
||||
typedef struct _SM_API_MSG
|
||||
{
|
||||
PORT_MESSAGE h;
|
||||
SMSRV_API_NUMBER ApiNumber;
|
||||
NTSTATUS ReturnValue;
|
||||
union
|
||||
{
|
||||
SM_CREATE_FOREIGN_SESSION_MSG CreateForeignSession;
|
||||
SM_SESSION_COMPLETE_MSG SessionComplete;
|
||||
SM_TERMINATE_FOREIGN_SESSION_MSG TerminateForeignComplete;
|
||||
SM_EXEC_PGM_MSG ExecPgm;
|
||||
SM_LOAD_DEFERED_SUBSYSTEM_MSG LoadDefered;
|
||||
SM_START_CSR_MSG StartCsr;
|
||||
SM_STOP_CSR_MSG StopCsr;
|
||||
} u;
|
||||
} SM_API_MSG, *PSM_API_MSG;
|
||||
|
||||
//
|
||||
// This is the size that Server 2003 SP1 SMSS expects, so make sure we conform.
|
||||
//
|
||||
C_ASSERT(sizeof(SM_API_MSG) == 0x130);
|
||||
|
||||
//
|
||||
// There are the APIs that the SMSS Serve can send to a client (such as CSRSS)
|
||||
//
|
||||
// These are called "SB" APIs.
|
||||
//
|
||||
// The exact names are unknown but we are basing them on the CsrServerSbApiName
|
||||
// array in the checked build of CSRSRV which is probably a close approximation.
|
||||
// We add "p" to use the similar nomenclature seen/leaked out in the Base CSRSS
|
||||
// APIs.
|
||||
//
|
||||
//
|
||||
typedef enum _SB_API_NUMBER
|
||||
{
|
||||
SbpCreateSession,
|
||||
SbpTerminateSession,
|
||||
SbpForeignSessionComplete,
|
||||
SbpCreateProcess,
|
||||
SbpMaxApiNumber // Based on BasepMaxApiNumber, UserpMaxApiNumber...
|
||||
} SB_API_NUMBER;
|
||||
|
||||
//
|
||||
// These are the structures making up the SB_API_MSG packet structure defined
|
||||
// below. Each one corresponds to an equivalent API from the list above.
|
||||
//
|
||||
typedef struct _SB_CREATE_SESSION_MSG
|
||||
{
|
||||
ULONG SessionId;
|
||||
RTL_USER_PROCESS_INFORMATION ProcessInfo;
|
||||
} SB_CREATE_SESSION_MSG, *PSB_CREATE_SESSION_MSG;
|
||||
|
||||
typedef struct _SB_TERMINATE_SESSION_MSG
|
||||
{
|
||||
ULONG SessionId;
|
||||
} SB_TERMINATE_SESSION_MSG, *PSB_TERMINATE_SESSION_MSG;
|
||||
|
||||
typedef struct _SB_FOREIGN_SESSION_COMPLETE_MSG
|
||||
{
|
||||
ULONG SessionId;
|
||||
} SB_FOREIGN_SESSION_COMPLETE_MSG, *PSB_FOREIGN_SESSION_COMPLETE_MSG;
|
||||
|
||||
#define SB_PROCESS_FLAGS_DEBUG 0x1
|
||||
#define SB_PROCESS_FLAGS_WAIT_ON_THREAD 0x2
|
||||
#define SB_PROCESS_FLAGS_RESERVE_1MB 0x8
|
||||
#define SB_PROCESS_FLAGS_SKIP_CHECKS 0x20
|
||||
typedef struct _SB_CREATE_PROCESS_MSG
|
||||
{
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
PUNICODE_STRING ImageName;
|
||||
PUNICODE_STRING CurrentDirectory;
|
||||
PUNICODE_STRING CommandLine;
|
||||
PUNICODE_STRING DllPath;
|
||||
ULONG Flags;
|
||||
ULONG DebugFlags;
|
||||
} In;
|
||||
struct
|
||||
{
|
||||
HANDLE ProcessHandle;
|
||||
HANDLE ThreadHandle;
|
||||
ULONG SubsystemType;
|
||||
CLIENT_ID ClientId;
|
||||
} Out;
|
||||
};
|
||||
} SB_CREATE_PROCESS_MSG, *PSB_CREATE_PROCESS_MSG;
|
||||
|
||||
//
|
||||
// When the server connects to a client, this structure is exchanged
|
||||
//
|
||||
typedef struct _SB_CONNECTION_INFO
|
||||
{
|
||||
ULONG SubsystemType;
|
||||
WCHAR SbApiPortName[120];
|
||||
} SB_CONNECTION_INFO, *PSB_CONNECTION_INFO;
|
||||
|
||||
//
|
||||
// This is the actual packet structure sent over LCP to the \SbApiPort
|
||||
//
|
||||
typedef struct _SB_API_MSG
|
||||
{
|
||||
PORT_MESSAGE Header;
|
||||
union
|
||||
{
|
||||
SB_CONNECTION_INFO ConnectionInfo;
|
||||
struct
|
||||
{
|
||||
SB_API_NUMBER ApiNumber;
|
||||
NTSTATUS ReturnValue;
|
||||
union
|
||||
{
|
||||
SB_CREATE_SESSION_MSG CreateSession;
|
||||
SB_TERMINATE_SESSION_MSG TerminateSession;
|
||||
SB_FOREIGN_SESSION_COMPLETE_MSG ForeignSessionComplete;
|
||||
SB_CREATE_PROCESS_MSG CreateProcess;
|
||||
};
|
||||
};
|
||||
};
|
||||
} SB_API_MSG, *PSB_API_MSG;
|
||||
|
||||
//
|
||||
// This is the size that Server 2003 SP1 SMSS expects, so make sure we conform.
|
||||
//
|
||||
C_ASSERT(sizeof(SB_CONNECTION_INFO) == 0xF4);
|
||||
C_ASSERT(sizeof(SB_API_MSG) == 0x110);
|
||||
|
Loading…
Reference in a new issue