[ros-diffs] [ion] 55290: [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 ...

ion at svn.reactos.org ion at svn.reactos.org
Sun Jan 29 17:16:02 UTC 2012


Author: ion
Date: Sun Jan 29 17:16:01 2012
New Revision: 55290

URL: http://svn.reactos.org/svn/reactos?rev=55290&view=rev
Log:
[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.

Added:
    trunk/reactos/include/reactos/subsys/sm/smmsg.h   (with props)

Added: trunk/reactos/include/reactos/subsys/sm/smmsg.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/subsys/sm/smmsg.h?rev=55290&view=auto
==============================================================================
--- trunk/reactos/include/reactos/subsys/sm/smmsg.h (added)
+++ trunk/reactos/include/reactos/subsys/sm/smmsg.h [iso-8859-1] Sun Jan 29 17:16:01 2012
@@ -1,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);
+

Propchange: trunk/reactos/include/reactos/subsys/sm/smmsg.h
------------------------------------------------------------------------------
    svn:eol-style = native




More information about the Ros-diffs mailing list