205 lines
4.9 KiB
C
205 lines
4.9 KiB
C
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1997.
|
|
//
|
|
// File: wxsrv.c
|
|
//
|
|
// Contents:
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 4-18-97 RichardW Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#include <wxlpc.h>
|
|
#include <wxlpcp.h>
|
|
|
|
NTSTATUS
|
|
WxpHandleRequest(
|
|
HANDLE Client,
|
|
PWXLPC_MESSAGE Message
|
|
)
|
|
{
|
|
WXLPC_GETKEYDATA * GetKey ;
|
|
WXLPC_REPORTRESULTS * ReportResults ;
|
|
|
|
switch ( Message->Api )
|
|
{
|
|
case WxGetKeyDataApi:
|
|
GetKey = & Message->Parameters.GetKeyData ;
|
|
|
|
if ( ( GetKey->ExpectedAuth != WxNone ) &&
|
|
( GetKey->ExpectedAuth != WxStored ) &&
|
|
( GetKey->ExpectedAuth != WxPrompt ) &&
|
|
( GetKey->ExpectedAuth != WxDisk ) )
|
|
{
|
|
Message->Status = STATUS_INVALID_PARAMETER ;
|
|
break;
|
|
}
|
|
|
|
if ( GetKey->BufferSize > 16 )
|
|
{
|
|
Message->Status = STATUS_INVALID_PARAMETER ;
|
|
break;
|
|
}
|
|
|
|
Message->Status = WxGetKeyData( NULL,
|
|
GetKey->ExpectedAuth,
|
|
GetKey->BufferSize,
|
|
GetKey->Buffer,
|
|
&GetKey->BufferData
|
|
);
|
|
break;
|
|
|
|
case WxReportResultsApi:
|
|
ReportResults = &Message->Parameters.ReportResults ;
|
|
|
|
Message->Status = WxReportResults( NULL,
|
|
ReportResults->Status
|
|
);
|
|
|
|
break;
|
|
|
|
default:
|
|
Message->Status = STATUS_NOT_IMPLEMENTED ;
|
|
break;
|
|
|
|
}
|
|
|
|
return NtReplyPort( Client, &Message->Message );
|
|
}
|
|
|
|
|
|
NTSTATUS
|
|
WxServerThread(
|
|
PVOID Ignored
|
|
)
|
|
{
|
|
HANDLE Port ;
|
|
HANDLE ClientPort = NULL ;
|
|
HANDLE RejectPort ;
|
|
OBJECT_ATTRIBUTES Obja ;
|
|
UNICODE_STRING PortName ;
|
|
NTSTATUS Status ;
|
|
WXLPC_MESSAGE Message ;
|
|
PVOID Context ;
|
|
|
|
|
|
//
|
|
// Initialize the port:
|
|
//
|
|
|
|
RtlInitUnicodeString( &PortName, WX_PORT_NAME );
|
|
|
|
InitializeObjectAttributes( &Obja,
|
|
&PortName,
|
|
0,
|
|
NULL,
|
|
NULL );
|
|
|
|
Status = NtCreatePort( &Port,
|
|
&Obja,
|
|
sizeof( ULONG ),
|
|
sizeof( WXLPC_MESSAGE ),
|
|
sizeof( WXLPC_MESSAGE )
|
|
);
|
|
|
|
if ( !NT_SUCCESS( Status ) )
|
|
{
|
|
return Status ;
|
|
}
|
|
|
|
//
|
|
// Now, wait for a connection:
|
|
//
|
|
|
|
Context = NULL ;
|
|
|
|
while ( Port )
|
|
{
|
|
Status = NtReplyWaitReceivePort(Port,
|
|
&Context,
|
|
NULL,
|
|
&Message.Message );
|
|
|
|
if ( !NT_SUCCESS( Status ) )
|
|
{
|
|
NtClose( Port );
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
switch ( Message.Message.u2.s2.Type )
|
|
{
|
|
case LPC_REQUEST:
|
|
|
|
//DbgPrint( "Received request\n" );
|
|
|
|
WxpHandleRequest( ClientPort, &Message );
|
|
|
|
break;
|
|
|
|
case LPC_PORT_CLOSED:
|
|
|
|
//DbgPrint( "Received Port Close\n" );
|
|
|
|
NtClose( ClientPort );
|
|
|
|
NtClose( Port );
|
|
|
|
WxClientDisconnect( NULL );
|
|
|
|
Port = NULL ;
|
|
|
|
break;
|
|
|
|
case LPC_CONNECTION_REQUEST:
|
|
|
|
//DbgPrint( "Received connection request\n" );
|
|
if ( Context != NULL )
|
|
{
|
|
Status = NtAcceptConnectPort(
|
|
&RejectPort,
|
|
NULL,
|
|
(PPORT_MESSAGE) &Message,
|
|
FALSE,
|
|
NULL,
|
|
NULL);
|
|
|
|
break;
|
|
|
|
}
|
|
else
|
|
{
|
|
Status = NtAcceptConnectPort(
|
|
&ClientPort,
|
|
&ClientPort,
|
|
&Message.Message,
|
|
TRUE,
|
|
NULL,
|
|
NULL );
|
|
|
|
if ( NT_SUCCESS( Status ) )
|
|
{
|
|
NtCompleteConnectPort( ClientPort );
|
|
}
|
|
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|