Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

181 lines
4.3 KiB

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
sbreqst.c
Abstract:
This module contains the Server Request thread procedure for the Sb
API calls exported by the OS/2 Emulation SubSystem to the Session
Manager SubSystem.
Author:
Steve Wood (stevewo) 20-Sep-1989
Revision History:
--*/
#include "os2srv.h"
//PSB_API_ROUTINE Os2ServerSbApiDispatch[ SbMaxApiNumber+1 ] = {
// Os2SbCreateSession,
// Os2SbTerminateSession,
// Os2SbForeignSessionComplete,
// NULL
//};
#if DBG
PSZ Os2ServerSbApiName[ SbMaxApiNumber+1 ] = {
"SbCreateSession",
"SbTerminateSession",
"SbForeignSessionComplete",
"Unknown Os2 Sb Api Number"
};
#endif // DBG
NTSTATUS
Os2SbApiHandleConnectionRequest(
IN PSBAPIMSG Message
);
NTSTATUS
Os2SbApiRequestThread(
IN PVOID Parameter
)
{
NTSTATUS Status;
SBAPIMSG ReceiveMsg;
PSBAPIMSG ReplyMsg;
UNREFERENCED_PARAMETER(Parameter);
ReplyMsg = NULL;
while (TRUE) {
#if DBG
IF_OS2_DEBUG( LPC ) {
KdPrint(( "OS2SRV: Sb Api Request Thread waiting...\n" ));
}
#endif
Status = NtReplyWaitReceivePort( Os2SbApiPort,
NULL,
(PPORT_MESSAGE)ReplyMsg,
(PPORT_MESSAGE)&ReceiveMsg
);
if (Status != 0) {
if (NT_SUCCESS( Status )) {
continue; // Try again if alerted or a failure
}
else {
#if DBG
KdPrint(( "OS2SRV: ReceivePort failed - Status == %X\n", Status ));
#endif
break;
}
}
//
// Check to see if this is a connection request and handle
//
if (ReceiveMsg.h.u2.s2.Type == LPC_CONNECTION_REQUEST) {
Os2SbApiHandleConnectionRequest( &ReceiveMsg );
ReplyMsg = NULL;
continue;
}
if (ReceiveMsg.ApiNumber >= SbMaxApiNumber) {
#if DBG
KdPrint(( "OS2SRV: %lx is invalid Sb ApiNumber\n",
ReceiveMsg.ApiNumber
));
#endif
ReceiveMsg.ApiNumber = SbMaxApiNumber;
}
#if DBG
IF_OS2_DEBUG( LPC ) {
KdPrint(( "OS2SRV: %s Sb Api Request received from %lx.%lx\n",
Os2ServerSbApiName[ ReceiveMsg.ApiNumber ],
ReceiveMsg.h.ClientId.UniqueProcess,
ReceiveMsg.h.ClientId.UniqueThread
));
}
#endif // DBG
ReplyMsg = &ReceiveMsg;
if (ReceiveMsg.ApiNumber < SbMaxApiNumber) {
// if (!(*Os2ServerSbApiDispatch[ ReceiveMsg.ApiNumber ])( &ReceiveMsg )) {
ReplyMsg = NULL;
// }
// }
// else {
// ReplyMsg->ReturnedStatus = STATUS_NOT_IMPLEMENTED;
}
#if DBG
IF_OS2_DEBUG( LPC ) {
if (ReplyMsg != NULL) {
KdPrint(( "OS2SRV: %s Sb Api sending %lx status reply to %lx.%lx\n",
Os2ServerSbApiName[ ReceiveMsg.ApiNumber ],
ReplyMsg->ReturnedStatus,
ReplyMsg->h.ClientId.UniqueProcess,
ReplyMsg->h.ClientId.UniqueThread
));
}
}
#endif // DBG
}
NtTerminateThread( NtCurrentThread(), Status );
//
// This line should never be executed
//
return STATUS_SUCCESS;
}
NTSTATUS
Os2SbApiHandleConnectionRequest(
IN PSBAPIMSG Message
)
{
NTSTATUS st;
REMOTE_PORT_VIEW ClientView;
HANDLE CommunicationPort;
//
// The protocol for a subsystem is to connect to the session manager,
// then to listen and accept a connection from the session manager
//
ClientView.Length = sizeof(ClientView);
st = NtAcceptConnectPort(
&CommunicationPort,
NULL,
(PPORT_MESSAGE)Message,
TRUE,
NULL,
&ClientView
);
if ( !NT_SUCCESS(st) ) {
KdPrint(("OS2SS: Sb Accept Connection failed %lx\n",st));
return st;
}
st = NtCompleteConnectPort(CommunicationPort);
if ( !NT_SUCCESS(st) ) {
KdPrint(("OS2SS: Sb Complete Connection failed %lx\n",st));
}
return st;
}