/*++ Copyright (c) 1989 Microsoft Corporation Module Name: smstub.c Abstract: Session Manager Client Support APIs Author: Mark Lucovsky (markl) 05-Oct-1989 Revision History: --*/ #include "smdllp.h" #include NTSTATUS SmExecPgm( IN HANDLE SmApiPort, IN PRTL_USER_PROCESS_INFORMATION ProcessInformation, IN BOOLEAN DebugFlag ) /*++ Routine Description: This routine allows a process to start a process using the facilities provided by the NT Session manager. This function closes all handles passed to it. Arguments: SmApiPort - Supplies a handle to a communications port connected to the Session Manager. ProcessInformation - Supplies a process description as returned by RtlCreateUserProcess. DebugFlag - Supplies and optional parameter which if set indicates that the caller wants to debug this process and act as its debug user interface. Return Value: TBD. --*/ { NTSTATUS st; SMAPIMSG SmApiMsg; PSMEXECPGM args; args = &SmApiMsg.u.ExecPgm; args->ProcessInformation = *ProcessInformation; args->DebugFlag = DebugFlag; SmApiMsg.ApiNumber = SmExecPgmApi; SmApiMsg.h.u1.s1.DataLength = sizeof(*args) + 8; SmApiMsg.h.u1.s1.TotalLength = sizeof(SmApiMsg); SmApiMsg.h.u2.ZeroInit = 0L; st = NtRequestWaitReplyPort( SmApiPort, (PPORT_MESSAGE) &SmApiMsg, (PPORT_MESSAGE) &SmApiMsg ); if ( NT_SUCCESS(st) ) { st = SmApiMsg.ReturnedStatus; } else { KdPrint(("SmExecPgm: NtRequestWaitReply Failed %lx\n",st)); } NtClose(ProcessInformation->Process); NtClose(ProcessInformation->Thread); return st; } NTSTATUS NTAPI SmLoadDeferedSubsystem( IN HANDLE SmApiPort, IN PUNICODE_STRING DeferedSubsystem ) /*++ Routine Description: This routine allows a process to start a defered subsystem. Arguments: SmApiPort - Supplies a handle to a communications port connected to the Session Manager. DeferedSubsystem - Supplies the name of the defered subsystem to load. Return Value: TBD. --*/ { NTSTATUS st; SMAPIMSG SmApiMsg; PSMLOADDEFERED args; if ( DeferedSubsystem->Length >> 1 > SMP_MAXIMUM_SUBSYSTEM_NAME ) { return STATUS_INVALID_PARAMETER; } args = &SmApiMsg.u.LoadDefered; args->SubsystemNameLength = DeferedSubsystem->Length; RtlCopyMemory(args->SubsystemName,DeferedSubsystem->Buffer,DeferedSubsystem->Length); SmApiMsg.ApiNumber = SmLoadDeferedSubsystemApi; SmApiMsg.h.u1.s1.DataLength = sizeof(*args) + 8; SmApiMsg.h.u1.s1.TotalLength = sizeof(SmApiMsg); SmApiMsg.h.u2.ZeroInit = 0L; st = NtRequestWaitReplyPort( SmApiPort, (PPORT_MESSAGE) &SmApiMsg, (PPORT_MESSAGE) &SmApiMsg ); if ( NT_SUCCESS(st) ) { st = SmApiMsg.ReturnedStatus; } else { KdPrint(("SmExecPgm: NtRequestWaitReply Failed %lx\n",st)); } return st; } NTSTATUS SmSessionComplete( IN HANDLE SmApiPort, IN ULONG SessionId, IN NTSTATUS CompletionStatus ) /*++ Routine Description: This routine is used to report completion of a session to the NT Session manager. Arguments: SmApiPort - Supplies a handle to a communications port connected to the Session Manager. SessionId - Supplies the session id of the session which is now completed. CompletionStatus - Supplies the completion status of the session. Return Value: TBD. --*/ { NTSTATUS st; SMAPIMSG SmApiMsg; PSMSESSIONCOMPLETE args; args = &SmApiMsg.u.SessionComplete; args->SessionId = SessionId; args->CompletionStatus = CompletionStatus; SmApiMsg.ApiNumber = SmSessionCompleteApi; SmApiMsg.h.u1.s1.DataLength = sizeof(*args) + 8; SmApiMsg.h.u1.s1.TotalLength = sizeof(SmApiMsg); SmApiMsg.h.u2.ZeroInit = 0L; st = NtRequestWaitReplyPort( SmApiPort, (PPORT_MESSAGE) &SmApiMsg, (PPORT_MESSAGE) &SmApiMsg ); if ( NT_SUCCESS(st) ) { st = SmApiMsg.ReturnedStatus; } else { KdPrint(("SmCompleteSession: NtRequestWaitReply Failed %lx\n",st)); } return st; } NTSTATUS SmStartCsr( IN HANDLE SmApiPort, OUT PULONG pMuSessionId, IN PUNICODE_STRING InitialCommand, OUT PULONG_PTR pInitialCommandProcessId, OUT PULONG_PTR pWindowsSubSysProcessId ) /*++ Routine Description: This routine allows TERMSRV to start a new CSR. Arguments: SmApiPort - Supplies a handle to a communications port connected to the Session Manager. MuSessionId - Hydra Terminal Session Id to start CSR in. InitialCommand - String for Initial Command (for debug) pInitialCommandProcessId - pointer to Process Id of initial command. pWindowsSubSysProcessId - pointer to Process Id of Windows subsystem. Return Value: Whether it worked. --*/ { NTSTATUS st; SMAPIMSG SmApiMsg; PSMSTARTCSR args; args = &SmApiMsg.u.StartCsr; args->MuSessionId = *pMuSessionId; //Sm will reassign the actuall sessionID if ( InitialCommand && ( InitialCommand->Length >> 1 > SMP_MAXIMUM_INITIAL_COMMAND ) ) { return STATUS_INVALID_PARAMETER; } if ( !InitialCommand ) { args->InitialCommandLength = 0; } else { args->InitialCommandLength = InitialCommand->Length; RtlCopyMemory(args->InitialCommand,InitialCommand->Buffer,InitialCommand->Length); } SmApiMsg.ApiNumber = SmStartCsrApi; SmApiMsg.h.u1.s1.DataLength = sizeof(*args) + 8; SmApiMsg.h.u1.s1.TotalLength = sizeof(SmApiMsg); SmApiMsg.h.u2.ZeroInit = 0L; st = NtRequestWaitReplyPort( SmApiPort, (PPORT_MESSAGE) &SmApiMsg, (PPORT_MESSAGE) &SmApiMsg ); if ( NT_SUCCESS(st) ) { st = SmApiMsg.ReturnedStatus; } else { DbgPrint("SmStartCsr: NtRequestWaitReply Failed %lx\n",st); } *pInitialCommandProcessId = args->InitialCommandProcessId; *pWindowsSubSysProcessId = args->WindowsSubSysProcessId; *pMuSessionId = args->MuSessionId; return st; } NTSTATUS SmStopCsr( IN HANDLE SmApiPort, IN ULONG MuSessionId ) /*++ Routine Description: This routine allows TERMSRV to stop a CSR. Arguments: SmApiPort - Supplies a handle to a communications port connected to the Session Manager. MuSessionId - Terminal Server Session Id to stop Return Value: Whether it worked. --*/ { NTSTATUS st; SMAPIMSG SmApiMsg; PSMSTOPCSR args; args = &SmApiMsg.u.StopCsr; args->MuSessionId = MuSessionId; SmApiMsg.ApiNumber = SmStopCsrApi; SmApiMsg.h.u1.s1.DataLength = sizeof(*args) + 8; SmApiMsg.h.u1.s1.TotalLength = sizeof(SmApiMsg); SmApiMsg.h.u2.ZeroInit = 0L; st = NtRequestWaitReplyPort( SmApiPort, (PPORT_MESSAGE) &SmApiMsg, (PPORT_MESSAGE) &SmApiMsg ); if ( NT_SUCCESS(st) ) { st = SmApiMsg.ReturnedStatus; } else { DbgPrint("SmStopCsr: NtRequestWaitReply Failed %lx\n",st); } return st; }