diff --git a/reactos/include/reactos/subsys/sm/smmsg.h b/reactos/include/reactos/subsys/sm/smmsg.h index b95841e8b03..023a381e7dc 100644 --- a/reactos/include/reactos/subsys/sm/smmsg.h +++ b/reactos/include/reactos/subsys/sm/smmsg.h @@ -43,7 +43,7 @@ typedef struct _SM_CREATE_FOREIGN_SESSION_MSG typedef struct _SM_SESSION_COMPLETE_MSG { ULONG SessionId; - NTSTATUS Status; + NTSTATUS SessionStatus; } SM_SESSION_COMPLETE_MSG, *PSM_SESSION_COMPLETE_MSG; typedef struct _SM_TERMINATE_FOREIGN_SESSION_MSG @@ -218,6 +218,15 @@ C_ASSERT(sizeof(SB_CONNECTION_INFO) == 0xF4); C_ASSERT(sizeof(SB_API_MSG) == 0x110); #endif +// +// SB Message Handler +// +typedef +BOOLEAN +(NTAPI *PSB_API_ROUTINE)( + IN PSB_API_MSG SbApiMsg +); + // // The actual server functions that a client linking with smlib can call // @@ -238,4 +247,12 @@ SmExecPgm( IN BOOLEAN DebugFlag ); +NTSTATUS +NTAPI +SmSessionComplete( + IN HANDLE SmApiPort, + IN ULONG SessionId, + IN NTSTATUS SessionStatus +); + #endif diff --git a/reactos/lib/smlib/smclient.c b/reactos/lib/smlib/smclient.c index 24a5f0a25a6..3f6311edd6e 100644 --- a/reactos/lib/smlib/smclient.c +++ b/reactos/lib/smlib/smclient.c @@ -128,3 +128,41 @@ SmConnectToSm(IN PUNICODE_STRING SbApiPortName, /* Return if the connection was successful or not */ return Status; } + +NTSTATUS +NTAPI +SmSessionComplete(IN HANDLE SmApiPort, + IN ULONG SessionId, + IN NTSTATUS SessionStatus) +{ + NTSTATUS Status; + SM_API_MSG ApiMessage; + PSM_SESSION_COMPLETE_MSG SessionComplete = &ApiMessage.u.SessionComplete; + + /* Set the message data */ + SessionComplete->SessionId = SessionId; + SessionComplete->SessionStatus = SessionStatus; + + /* Set the API Message Port Message header */ + ApiMessage.ApiNumber = SmSessionCompleteApi; + ApiMessage.h.u1.s1.DataLength = sizeof(SM_SESSION_COMPLETE_MSG) + 8; + ApiMessage.h.u1.s1.TotalLength = sizeof(SM_API_MSG); + ApiMessage.h.u2.ZeroInit = 0; + + /* Sent the message and wait for a reply */ + Status = NtRequestWaitReplyPort(SmApiPort, + &ApiMessage.h, + &ApiMessage.h); + if (NT_SUCCESS(Status)) + { + /* Return the real status */ + Status = ApiMessage.ReturnValue; + } + else + { + DPRINT1("SmCompleteSession: NtRequestWaitReply failed\n"); + } + + /* Return status */ + return Status; +}