https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1a1dac04c7697a74765f4…
commit 1a1dac04c7697a74765f4c42b51246f58ad98e12
Author: Hervé Poussineau <hpoussin(a)reactos.org>
AuthorDate: Tue May 25 19:02:16 2021 +0200
Commit: Hervé Poussineau <hpoussin(a)reactos.org>
CommitDate: Tue May 25 19:02:16 2021 +0200
[SMLIB] Implement SmStartCsr and SmStopCsr
---
sdk/include/reactos/subsys/sm/smmsg.h | 17 ++++++++
sdk/lib/smlib/smclient.c | 81 +++++++++++++++++++++++++++++++++++
2 files changed, 98 insertions(+)
diff --git a/sdk/include/reactos/subsys/sm/smmsg.h
b/sdk/include/reactos/subsys/sm/smmsg.h
index 60a6c2da09d..a5af962fed6 100644
--- a/sdk/include/reactos/subsys/sm/smmsg.h
+++ b/sdk/include/reactos/subsys/sm/smmsg.h
@@ -263,4 +263,21 @@ SmSessionComplete(
IN NTSTATUS SessionStatus
);
+NTSTATUS
+NTAPI
+SmStartCsr(
+ IN HANDLE SmApiPort,
+ OUT PULONG pMuSessionId,
+ IN PUNICODE_STRING CommandLine,
+ OUT PHANDLE pWindowsSubSysProcessId,
+ OUT PHANDLE pInitialCommandProcessId
+);
+
+NTSTATUS
+NTAPI
+SmStopCsr(
+ IN HANDLE SmApiPort,
+ IN ULONG SessionId
+);
+
#endif
diff --git a/sdk/lib/smlib/smclient.c b/sdk/lib/smlib/smclient.c
index 924963d1d0e..d56c8e57d0a 100644
--- a/sdk/lib/smlib/smclient.c
+++ b/sdk/lib/smlib/smclient.c
@@ -167,3 +167,84 @@ SmSessionComplete(IN HANDLE SmApiPort,
/* Return status */
return Status;
}
+
+NTSTATUS
+NTAPI
+SmStartCsr(IN HANDLE SmApiPort,
+ OUT PULONG pMuSessionId,
+ IN PUNICODE_STRING CommandLine,
+ OUT PHANDLE pWindowsSubSysProcessId,
+ OUT PHANDLE pInitialCommandProcessId)
+{
+ NTSTATUS Status;
+ SM_API_MSG SmApiMsg;
+
+ /* Initialize the generic LPC header */
+ RtlZeroMemory(&SmApiMsg, sizeof(SmApiMsg));
+ SmApiMsg.h.u1.s1.DataLength = sizeof(SM_EXEC_PGM_MSG) + 8;
+ SmApiMsg.h.u1.s1.TotalLength = sizeof(SmApiMsg);
+
+ /* Initialize this specific API's parameters */
+ SmApiMsg.ApiNumber = SmpStartCsrApi;
+ if (CommandLine)
+ {
+ if (CommandLine->Length > ARRAYSIZE(SmApiMsg.u.StartCsr.Buffer))
+ {
+ DPRINT1("SmStartCsr: Command line too long\n");
+ return STATUS_INVALID_PARAMETER;
+ }
+ RtlCopyMemory(SmApiMsg.u.StartCsr.Buffer, CommandLine->Buffer,
CommandLine->Length);
+ SmApiMsg.u.StartCsr.Length = CommandLine->Length;
+ }
+
+ /* Send the message to SMSS */
+ Status = NtRequestWaitReplyPort(SmApiPort, &SmApiMsg.h, &SmApiMsg.h);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SmStartCsr: NtRequestWaitReply Failed %lx\n", Status);
+ }
+ else
+ {
+ /* Upon success, we use the API's return value */
+ Status = SmApiMsg.ReturnValue;
+ }
+
+ /* Give back informations to caller */
+ *pMuSessionId = SmApiMsg.u.StartCsr.MuSessionId;
+ *pWindowsSubSysProcessId = SmApiMsg.u.StartCsr.WindowsSubSysProcessId;
+ *pInitialCommandProcessId = SmApiMsg.u.StartCsr.SmpInitialCommandProcessId;
+
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+SmStopCsr(IN HANDLE SmApiPort,
+ IN ULONG SessionId)
+{
+ NTSTATUS Status;
+ SM_API_MSG SmApiMsg;
+
+ /* Initialize the generic LPC header */
+ RtlZeroMemory(&SmApiMsg, sizeof(SmApiMsg));
+ SmApiMsg.h.u1.s1.DataLength = sizeof(SM_EXEC_PGM_MSG) + 8;
+ SmApiMsg.h.u1.s1.TotalLength = sizeof(SmApiMsg);
+
+ /* Initialize this specific API's parameters */
+ SmApiMsg.ApiNumber = SmpStopCsrApi;
+ SmApiMsg.u.StopCsr.MuSessionId = SessionId;
+
+ /* Send the message to SMSS */
+ Status = NtRequestWaitReplyPort(SmApiPort, &SmApiMsg.h, &SmApiMsg.h);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("SmStopCsr: NtRequestWaitReply Failed %lx\n", Status);
+ }
+ else
+ {
+ /* Upon success, we use the API's return value */
+ Status = SmApiMsg.ReturnValue;
+ }
+
+ return Status;
+}