windows-nt/Source/XPSP1/NT/base/subsys/sm/client/smcsup.c
2020-09-26 16:20:57 +08:00

126 lines
2.8 KiB
C

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
smcsup.c
Abstract:
Session Manager Client Support APIs
Author:
Mark Lucovsky (markl) 05-Oct-1989
Revision History:
--*/
#include "smdllp.h"
#include <string.h>
NTSTATUS
SmConnectToSm(
IN PUNICODE_STRING SbApiPortName OPTIONAL,
IN HANDLE SbApiPort OPTIONAL,
IN ULONG SbImageType OPTIONAL,
OUT PHANDLE SmApiPort
)
/*++
Routine Description:
This function is used to connect to the NT Session Manager
Arguments:
SbApiPortName - Supplies the name of the sub system's session management
API port (for Sb APIs). That the session manager is to connect with.
SbApiPort - Supplies a port handle to the connection port where the
subsystem's session management (Sb) APIs are exported.
SbImageType - Supplies the image type that the connecting subsystem
serves.
SmApiPort - Returns the communication port which is connected to the
session manager and over which Sm APIs may be made.
Return Value:
TBD.
--*/
{
NTSTATUS st;
UNICODE_STRING PortName;
ULONG ConnectInfoLength;
PSBCONNECTINFO ConnectInfo;
SBAPIMSG Message;
SECURITY_QUALITY_OF_SERVICE DynamicQos;
//
// Set up the security quality of service parameters to use over the
// port. Use the most efficient (least overhead) - which is dynamic
// rather than static tracking.
//
DynamicQos.ImpersonationLevel = SecurityImpersonation;
DynamicQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING;
DynamicQos.EffectiveOnly = TRUE;
RtlInitUnicodeString(&PortName,L"\\SmApiPort");
ConnectInfoLength = sizeof(SBCONNECTINFO);
ConnectInfo = &Message.ConnectionRequest;
//
// Subsystems must specify an SbApiPortName
//
if ( ARGUMENT_PRESENT(SbApiPortName) ) {
if ( !ARGUMENT_PRESENT(SbApiPort) ) {
return STATUS_INVALID_PARAMETER_MIX;
}
if ( !SbImageType ) {
return STATUS_INVALID_PARAMETER_MIX;
}
RtlMoveMemory(
ConnectInfo->EmulationSubSystemPortName,
SbApiPortName->Buffer,
SbApiPortName->Length
);
ConnectInfo->EmulationSubSystemPortName[SbApiPortName->Length>>1] = UNICODE_NULL;
ConnectInfo->SubsystemImageType = SbImageType;
} else {
ConnectInfo->EmulationSubSystemPortName[0] = UNICODE_NULL;
ConnectInfo->SubsystemImageType = 0;
}
st = NtConnectPort(
SmApiPort,
&PortName,
&DynamicQos,
NULL,
NULL,
NULL,
ConnectInfo,
&ConnectInfoLength
);
if ( !NT_SUCCESS(st) ) {
KdPrint(("SmConnectToSm: Connect to Sm failed %lx\n",st));
return st;
}
return STATUS_SUCCESS;
}