VOID SepServerWaitForNextConnect( VOID ) { CONNECTION_REQUEST ConnectionRequest; ConnectionRequest.Length = (ULONG)sizeof(CONNECTION_REQUEST); // // Wait for the client to connect to the port // Status = NtListenPort( EarPort, &ConnectionRequest, NULL, 0L ); SEASSERT_SUCCESS(Status); Status = NtAcceptConnectPort( &TalkPort, NULL, &ConnectionRequest, TRUE, NULL, NULL, NULL, 0L ); SEASSERT_SUCCESS(Status); Status = NtCompleteConnectPort( TalkPort ); SEASSERT_SUCCESS(Status); return; }
int security_reference_monitor_t::run() { const int maxlen = 0x100; //dprintf("starting kthread %p p = %p\n", this, process); current = static_cast<thread_t*>( this ); //dprintf("current->process = %p\n", current->process); object_attributes_t rm_oa( (PCWSTR) L"\\SeRmCommandPort" ); HANDLE port = 0, client = 0; NTSTATUS r = NtCreatePort( &port, &rm_oa, 0x100, 0x100, 0 ); if (r == STATUS_THREAD_IS_TERMINATING) return 0; if (r < STATUS_SUCCESS) die("NtCreatePort(SeRmCommandPort) failed r = %08lx\n", r); BYTE buf[maxlen]; LPC_MESSAGE *req = (LPC_MESSAGE*) buf; r = NtListenPort( port, req ); if (r == STATUS_THREAD_IS_TERMINATING) return 0; if (r < STATUS_SUCCESS) die("NtListenPort(SeRmCommandPort) failed r = %08lx\n", r); HANDLE conn_port = 0; r = NtAcceptConnectPort( &conn_port, 0, req, TRUE, NULL, NULL ); if (r == STATUS_THREAD_IS_TERMINATING) return 0; if (r < STATUS_SUCCESS) die("NtAcceptConnectPort(SeRmCommandPort) failed r = %08lx\n", r); r = NtCompleteConnectPort( conn_port ); if (r == STATUS_THREAD_IS_TERMINATING) return 0; if (r < STATUS_SUCCESS) die("NtCompleteConnectPort(SeRmCommandPort) failed r = %08lx\n", r); unicode_string_t lsa; lsa.copy( (PCWSTR) L"\\SeLsaCommandPort" ); SECURITY_QUALITY_OF_SERVICE qos; qos.Length = sizeof(qos); qos.ImpersonationLevel = SecurityAnonymous; qos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING; qos.EffectiveOnly = TRUE; r = NtConnectPort( &client, &lsa, &qos, NULL, NULL, NULL, NULL, NULL ); if (r == STATUS_THREAD_IS_TERMINATING) return 0; if (r < STATUS_SUCCESS) die("NtConnectPort(SeLsaCommandPort) failed r = %08lx\n", r); while (!terminated) { ULONG client_handle; r = NtReplyWaitReceivePort( port, &client_handle, 0, req ); if (r == STATUS_THREAD_IS_TERMINATING) return 0; if (r < STATUS_SUCCESS) die("NtReplyWaitReceivePort(SeRmCommandPort) failed r = %08lx\n", r); dprintf("got message %ld\n", req->MessageId ); // send something back... r = NtReplyPort( port, req ); if (r == STATUS_THREAD_IS_TERMINATING) return 0; if (r < STATUS_SUCCESS) die("NtReplyPort(SeRmCommandPort) failed r = %08lx\n", r); } dprintf("done\n"); return 0; }
static DWORD WINAPI LsapRmServerThread( PVOID StartContext) { LSAP_RM_API_MESSAGE Message; PPORT_MESSAGE ReplyMessage; REMOTE_PORT_VIEW RemotePortView; HANDLE MessagePort, DummyPortHandle; NTSTATUS Status; /* Initialize the port message */ Message.Header.u1.s1.TotalLength = sizeof(Message); Message.Header.u1.s1.DataLength = 0; /* Listen on the LSA command port */ Status = NtListenPort(SeLsaCommandPort, &Message.Header); if (!NT_SUCCESS(Status)) { ERR("LsapRmServerThread - Port Listen failed 0x%lx\n", Status); return Status; } /* Setup the Port View Structure */ RemotePortView.Length = sizeof(REMOTE_PORT_VIEW); RemotePortView.ViewSize = 0; RemotePortView.ViewBase = NULL; /* Accept the connection */ Status = NtAcceptConnectPort(&MessagePort, 0, &Message.Header, TRUE, NULL, &RemotePortView); if (!NT_SUCCESS(Status)) { ERR("LsapRmServerThread - Port Accept Connect failed 0x%lx\n", Status); return Status; } /* Complete the connection */ Status = NtCompleteConnectPort(MessagePort); if (!NT_SUCCESS(Status)) { ERR("LsapRmServerThread - Port Complete Connect failed 0x%lx\n", Status); return Status; } /* No reply yet */ ReplyMessage = NULL; /* Start looping */ while (TRUE) { /* Wait for a message */ Status = NtReplyWaitReceivePort(MessagePort, NULL, ReplyMessage, &Message.Header); if (!NT_SUCCESS(Status)) { ERR("LsapRmServerThread - Failed to get message: 0x%lx", Status); ReplyMessage = NULL; continue; } /* Check if this is a connection request */ if (Message.Header.u2.s2.Type == LPC_CONNECTION_REQUEST) { /* Reject connection request */ NtAcceptConnectPort(&DummyPortHandle, NULL, &Message.Header, FALSE, NULL, NULL); /* Start over */ ReplyMessage = NULL; continue; } /* Check if this is an actual request */ if (Message.Header.u2.s2.Type == LPC_REQUEST) { ReplyMessage = &Message.Header; switch (Message.ApiNumber) { case LsapAdtWriteLogApi: LsapAdtWriteLog(&Message); break; case LsapAsyncApi: LsapAsync(&Message); break; case LsapComponentTestApi: LsapComponentTest(&Message); break; default: ERR("LsapRmServerThread - invalid API number: 0x%lx\n", Message.ApiNumber); ReplyMessage = NULL; } continue; } ERR("LsapRmServerThread - unexpected message type: 0x%lx\n", Message.Header.u2.s2.Type); /* Start over */ ReplyMessage = NULL; } }