windows-nt/Source/XPSP1/NT/ds/security/common/wxlpc/server/wxsrv.c
2020-09-26 16:20:57 +08:00

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;
}