//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1997. // // File: wxsrv.c // // Contents: // // Classes: // // Functions: // // History: 4-18-97 RichardW Created // //---------------------------------------------------------------------------- #include #include #include #include #include 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; }