Exemplo n.º 1
0
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;

}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
Arquivo: srm.c Projeto: GYGit/reactos
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;
    }
}