亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? complete.c

?? winNT技術操作系統,國外開放的原代碼和LIUX一樣
?? C
字號:
/*
* PROJECT:         ReactOS Kernel
* LICENSE:         GPL - See COPYING in the top level directory
* FILE:            ntoskrnl/lpc/complete.c
* PURPOSE:         Local Procedure Call: Connection Completion
* PROGRAMMERS:     Alex Ionescu (alex.ionescu@reactos.org)
*/

/* INCLUDES ******************************************************************/

#include <ntoskrnl.h>
#include "lpc.h"
#define NDEBUG
#include <internal/debug.h>

/* PRIVATE FUNCTIONS *********************************************************/

VOID
NTAPI
LpcpPrepareToWakeClient(IN PETHREAD Thread)
{
    PAGED_CODE();

    /* Make sure the thread isn't dying and it has a valid chain */
    if (!(Thread->LpcExitThreadCalled) &&
        !(IsListEmpty(&Thread->LpcReplyChain)))
    {
        /* Remove it from the list and reinitialize it */
        RemoveEntryList(&Thread->LpcReplyChain);
        InitializeListHead(&Thread->LpcReplyChain);
    }
}

/* PUBLIC FUNCTIONS **********************************************************/

/*
 * @implemented
 */
NTSTATUS
NTAPI
NtAcceptConnectPort(OUT PHANDLE PortHandle,
                    IN PVOID PortContext OPTIONAL,
                    IN PPORT_MESSAGE ReplyMessage,
                    IN BOOLEAN AcceptConnection,
                    IN PPORT_VIEW ServerView,
                    IN PREMOTE_PORT_VIEW ClientView)
{
    PLPCP_PORT_OBJECT ConnectionPort, ServerPort, ClientPort;
    PVOID ClientSectionToMap = NULL;
    HANDLE Handle;
    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
    NTSTATUS Status;
    ULONG ConnectionInfoLength;
    PLPCP_MESSAGE Message;
    PLPCP_CONNECTION_MESSAGE ConnectMessage;
    PEPROCESS ClientProcess;
    PETHREAD ClientThread;
    LARGE_INTEGER SectionOffset;
    PAGED_CODE();
    LPCTRACE(LPC_COMPLETE_DEBUG,
             "Context: %p. Message: %p. Accept: %lx. Views: %p/%p\n",
             PortContext,
             ReplyMessage,
             AcceptConnection,
             ClientView,
             ServerView);

    /* Validate the size of the server view */
    if ((ServerView) && (ServerView->Length != sizeof(PORT_VIEW)))
    {
        /* Invalid size */
        return STATUS_INVALID_PARAMETER;
    }

    /* Validate the size of the client view */
    if ((ClientView) && (ClientView->Length != sizeof(REMOTE_PORT_VIEW)))
    {
        /* Invalid size */
        return STATUS_INVALID_PARAMETER;
    }

    /* Get the client process and thread */
    Status = PsLookupProcessThreadByCid(&ReplyMessage->ClientId,
                                        &ClientProcess,
                                        &ClientThread);
    if (!NT_SUCCESS(Status)) return Status;

    /* Acquire the LPC Lock */
    KeAcquireGuardedMutex(&LpcpLock);

    /* Make sure that the client wants a reply, and this is the right one */
    if (!(ClientThread->LpcReplyMessage) ||
        !(ReplyMessage->MessageId) ||
        (ClientThread->LpcReplyMessageId != ReplyMessage->MessageId))
    {
        /* Not the reply asked for, or no reply wanted, fail */
        KeReleaseGuardedMutex(&LpcpLock);
        ObDereferenceObject(ClientProcess);
        ObDereferenceObject(ClientThread);
        return STATUS_REPLY_MESSAGE_MISMATCH;
    }

    /* Now get the message and connection message */
    Message = ClientThread->LpcReplyMessage;
    ConnectMessage = (PLPCP_CONNECTION_MESSAGE)(Message + 1);

    /* Get the client and connection port as well */
    ClientPort = ConnectMessage->ClientPort;
    ConnectionPort = ClientPort->ConnectionPort;

    /* Make sure that the reply is being sent to the proper server process */
    if (ConnectionPort->ServerProcess != PsGetCurrentProcess())
    {
        /* It's not, so fail */
        KeReleaseGuardedMutex(&LpcpLock);
        ObDereferenceObject(ClientProcess);
        ObDereferenceObject(ClientThread);
        return STATUS_REPLY_MESSAGE_MISMATCH;
    }

    /* At this point, don't let other accept attempts happen */
    ClientThread->LpcReplyMessage = NULL;
    ClientThread->LpcReplyMessageId = 0;

    /* Clear the client port for now as well, then release the lock */
    ConnectMessage->ClientPort = NULL;
    KeReleaseGuardedMutex(&LpcpLock);

    /* Get the connection information length */
    ConnectionInfoLength = ReplyMessage->u1.s1.DataLength;
    if (ConnectionInfoLength > ConnectionPort->MaxConnectionInfoLength)
    {
        /* Normalize it since it's too large */
        ConnectionInfoLength = ConnectionPort->MaxConnectionInfoLength;
    }

    /* Set the sizes of our reply message */
    Message->Request.u1.s1.DataLength = sizeof(LPCP_CONNECTION_MESSAGE) +
                                    ConnectionInfoLength;
    Message->Request.u1.s1.TotalLength = sizeof(LPCP_MESSAGE) +
                                     Message->Request.u1.s1.DataLength;

    /* Setup the reply message */
    Message->Request.u2.s2.Type = LPC_REPLY;
    Message->Request.u2.s2.DataInfoOffset = 0;
    Message->Request.ClientId = ReplyMessage->ClientId;
    Message->Request.MessageId = ReplyMessage->MessageId;
    Message->Request.ClientViewSize = 0;
    RtlMoveMemory(ConnectMessage + 1, ReplyMessage + 1, ConnectionInfoLength);

    /* At this point, if the caller refused the connection, go to cleanup */
    if (!AcceptConnection) goto Cleanup;

    /* Otherwise, create the actual port */
    Status = ObCreateObject(PreviousMode,
                            LpcPortObjectType,
                            NULL,
                            PreviousMode,
                            NULL,
                            sizeof(LPCP_PORT_OBJECT),
                            0,
                            0,
                            (PVOID*)&ServerPort);
    if (!NT_SUCCESS(Status)) goto Cleanup;

    /* Set it up */
    RtlZeroMemory(ServerPort, sizeof(LPCP_PORT_OBJECT));
    ServerPort->PortContext = PortContext;
    ServerPort->Flags = LPCP_COMMUNICATION_PORT;
    ServerPort->MaxMessageLength = ConnectionPort->MaxMessageLength;
    InitializeListHead(&ServerPort->LpcReplyChainHead);
    InitializeListHead(&ServerPort->LpcDataInfoChainHead);

    /* Reference the connection port until we're fully setup */
    ObReferenceObject(ConnectionPort);

    /* Link the ports together */
    ServerPort->ConnectionPort = ConnectionPort;
    ServerPort->ConnectedPort = ClientPort;
    ClientPort->ConnectedPort = ServerPort;

    /* Also set the creator CID */
    ServerPort->Creator = PsGetCurrentThread()->Cid;
    ClientPort->Creator = Message->Request.ClientId;

    /* Get the section associated and then clear it, while inside the lock */
    KeAcquireGuardedMutex(&LpcpLock);
    ClientSectionToMap = ConnectMessage->SectionToMap;
    ConnectMessage->SectionToMap = NULL;
    KeReleaseGuardedMutex(&LpcpLock);

    /* Now check if there's a client section */
    if (ClientSectionToMap)
    {
        /* Setup the offset */
        SectionOffset.QuadPart = ConnectMessage->ClientView.SectionOffset;

        /* Map the section */
        Status = MmMapViewOfSection(ClientSectionToMap,
                                    PsGetCurrentProcess(),
                                    &ServerPort->ClientSectionBase,
                                    0,
                                    0,
                                    &SectionOffset,
                                    &ConnectMessage->ClientView.ViewSize,
                                    ViewUnmap,
                                    0,
                                    PAGE_READWRITE);

        /* Update the offset and check for mapping status */
        ConnectMessage->ClientView.SectionOffset = SectionOffset.LowPart;
        if (NT_SUCCESS(Status))
        {
            /* Set the view base */
            ConnectMessage->ClientView.ViewRemoteBase = ServerPort->
                                                        ClientSectionBase;
        }
        else
        {
            /* Otherwise, quit */
            ObDereferenceObject(ServerPort);
            goto Cleanup;
        }
    }

    /* Check if there's a server section */
    if (ServerView)
    {
        /* FIXME: TODO */
        ASSERT(FALSE);
    }

    /* Reference the server port until it's fully inserted */
    ObReferenceObject(ServerPort);

    /* Insert the server port in the namespace */
    Status = ObInsertObject(ServerPort,
                            NULL,
                            PORT_ALL_ACCESS,
                            0,
                            NULL,
                            &Handle);
    if (!NT_SUCCESS(Status))
    {
        /* We failed, remove the extra reference and cleanup */
        ObDereferenceObject(ServerPort);
        goto Cleanup;
    }

    /* Check if the caller gave a client view */
    if (ClientView)
    {
        /* Fill it out */
        ClientView->ViewBase = ConnectMessage->ClientView.ViewRemoteBase;
        ClientView->ViewSize = ConnectMessage->ClientView.ViewSize;
    }

    /* Return the handle to user mode */
    *PortHandle = Handle;
    LPCTRACE(LPC_COMPLETE_DEBUG,
             "Handle: %lx. Messages: %p/%p. Ports: %p/%p/%p\n",
             Handle,
             Message,
             ConnectMessage,
             ServerPort,
             ClientPort,
             ConnectionPort);

    /* If there was no port context, use the handle by default */
    if (!PortContext) ServerPort->PortContext = Handle;
    ServerPort->ClientThread = ClientThread;

    /* Set this message as the LPC Reply message while holding the lock */
    KeAcquireGuardedMutex(&LpcpLock);
    ClientThread->LpcReplyMessage = Message;
    KeReleaseGuardedMutex(&LpcpLock);

    /* Clear the thread pointer so it doesn't get cleaned later */
    ClientThread = NULL;

    /* Remove the extra reference we had added */
    ObDereferenceObject(ServerPort);

Cleanup:
    /* If there was a section, dereference it */
    if (ClientSectionToMap) ObDereferenceObject(ClientSectionToMap);

    /* Check if we got here while still having a client thread */
    if (ClientThread)
    {
        /* FIXME: Complex cleanup code */
        ASSERT(FALSE);
    }

    /* Dereference the client port if we have one, and the process */
    LPCTRACE(LPC_COMPLETE_DEBUG,
             "Status: %lx. Thread: %p. Process: [%.16s]\n",
             Status,
             ClientThread,
             ClientProcess->ImageFileName);
    if (ClientPort) ObDereferenceObject(ClientPort);
    ObDereferenceObject(ClientProcess);
    return Status;
}

/*
 * @implemented
 */
NTSTATUS
NTAPI
NtCompleteConnectPort(IN HANDLE PortHandle)
{
    NTSTATUS Status;
    PLPCP_PORT_OBJECT Port;
    KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
    PETHREAD Thread;
    PAGED_CODE();
    LPCTRACE(LPC_COMPLETE_DEBUG, "Handle: %lx\n", PortHandle);

    /* Get the Port Object */
    Status = ObReferenceObjectByHandle(PortHandle,
                                       PORT_ALL_ACCESS,
                                       LpcPortObjectType,
                                       PreviousMode,
                                       (PVOID*)&Port,
                                       NULL);
    if (!NT_SUCCESS(Status)) return Status;

    /* Make sure this is a connection port */
    if ((Port->Flags & LPCP_PORT_TYPE_MASK) != LPCP_COMMUNICATION_PORT)
    {
        /* It isn't, fail */
        ObDereferenceObject(Port);
        return STATUS_INVALID_PORT_HANDLE;
    }

    /* Acquire the lock */
    KeAcquireGuardedMutex(&LpcpLock);

    /* Make sure we have a client thread */
    if (!Port->ClientThread)
    {
        /* We don't, fail */
        KeReleaseGuardedMutex(&LpcpLock);
        ObDereferenceObject(Port);
        return STATUS_INVALID_PARAMETER;
    }

    /* Get the thread */
    Thread = Port->ClientThread;

    /* Make sure it has a reply message */
    if (!Thread->LpcReplyMessage)
    {
        /* It doesn't, fail */
        KeReleaseGuardedMutex(&LpcpLock);
        ObDereferenceObject(Port);
        return STATUS_PORT_DISCONNECTED;
    }

    /* Clear the client thread and wake it up */
    Port->ClientThread = NULL;
    LpcpPrepareToWakeClient(Thread);

    /* Release the lock and wait for an answer */
    KeReleaseGuardedMutex(&LpcpLock);
    LpcpCompleteWait(&Thread->LpcReplySemaphore);

    /* Dereference the Thread and Port  and return */
    ObDereferenceObject(Port);
    ObDereferenceObject(Thread);
    LPCTRACE(LPC_COMPLETE_DEBUG, "Port: %p. Thread: %p\n", Port, Thread);
    return Status;
}

/* EOF */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
五月综合激情网| 精品视频一区三区九区| 欧美精品一区二区三区蜜桃 | 蜜臀av一区二区| 精品视频123区在线观看| 亚洲国产精品影院| 日韩一区二区在线观看视频| 久久er精品视频| 久久精品人人做人人综合| 成人国产亚洲欧美成人综合网| 综合色天天鬼久久鬼色| 欧美日韩一区二区三区在线| 日本vs亚洲vs韩国一区三区 | 爽爽淫人综合网网站| 欧美一区二区视频在线观看2020 | 国产精品99久久久久久久女警| 国产精品色哟哟| 一道本成人在线| 奇米精品一区二区三区在线观看| 久久久久久亚洲综合影院红桃| hitomi一区二区三区精品| 美国一区二区三区在线播放| 久久久久久久综合狠狠综合| 色婷婷久久久综合中文字幕| 麻豆一区二区在线| 91福利在线导航| 亚洲444eee在线观看| 2023国产精华国产精品| aaa亚洲精品| 麻豆成人久久精品二区三区小说| 国产精品电影一区二区| 6080日韩午夜伦伦午夜伦| 处破女av一区二区| 亚洲一级不卡视频| 久久久久久一二三区| 欧美三电影在线| 成人激情动漫在线观看| 国产suv精品一区二区6| 日韩成人免费电影| 国产农村妇女精品| 欧美日韩视频在线一区二区| 国产成人av一区二区三区在线| 亚洲国产成人高清精品| 国产视频一区二区三区在线观看 | 成人欧美一区二区三区在线播放| 日韩视频国产视频| 国产在线麻豆精品观看| 亚洲午夜精品久久久久久久久| 国产欧美综合在线观看第十页| 欧美日韩国产片| 一本一道综合狠狠老| 国产成人精品综合在线观看| 秋霞影院一区二区| 香蕉加勒比综合久久| 一区二区免费在线| 国产精品嫩草99a| 精品国产99国产精品| 欧美精选午夜久久久乱码6080| av中文字幕不卡| 国产成人在线看| 精品一二三四在线| 秋霞电影网一区二区| 亚洲午夜在线观看视频在线| 亚洲天堂精品在线观看| 亚洲一二三四久久| 国产精品久久久久久久久免费相片 | 日本在线不卡视频| 一级日本不卡的影视| 亚洲色图都市小说| 中文字幕字幕中文在线中不卡视频| 国产午夜精品理论片a级大结局| www国产精品av| 久久久久久久网| 国产三级欧美三级| 中文字幕欧美三区| 中文字幕在线一区| 亚洲欧美日韩中文字幕一区二区三区| 国产精品三级视频| 专区另类欧美日韩| 亚洲视频在线观看一区| 一区二区三区在线影院| 亚洲一区二区欧美日韩 | 亚洲成在人线在线播放| 一区二区三区中文在线观看| 亚洲激情男女视频| 亚洲国产aⅴ成人精品无吗| 亚洲图片欧美视频| 婷婷成人激情在线网| 奇米影视一区二区三区小说| 精品综合免费视频观看| 久久精品国产亚洲高清剧情介绍| 青青草精品视频| 国产精品一区专区| 不卡的电视剧免费网站有什么| 91在线一区二区三区| 欧美视频日韩视频| 日韩欧美一级二级三级| 久久伊99综合婷婷久久伊| 国产日产欧美精品一区二区三区| 亚洲国产日韩在线一区模特| 亚欧色一区w666天堂| 精一区二区三区| 99精品一区二区| 欧美午夜寂寞影院| 日韩一级免费观看| 欧美国产乱子伦 | 精品久久免费看| 综合色天天鬼久久鬼色| 视频一区二区中文字幕| 国内欧美视频一区二区| 色又黄又爽网站www久久| 日韩一区二区精品葵司在线| 国产精品美女久久久久aⅴ| 亚洲午夜激情网站| 国产精品一级二级三级| 欧美天堂一区二区三区| 国产午夜精品理论片a级大结局| 一区二区三区视频在线观看| 国产做a爰片久久毛片| 91久久精品网| 国产亚洲综合在线| 亚洲成人免费影院| 国产成人av在线影院| 欧美久久高跟鞋激| 亚洲欧洲另类国产综合| 久久99在线观看| 91高清在线观看| 国产女人18毛片水真多成人如厕| 爽爽淫人综合网网站| 99视频国产精品| 日韩网站在线看片你懂的| ...av二区三区久久精品| 美女性感视频久久| 欧美综合色免费| 亚洲欧美在线高清| 国产制服丝袜一区| 7777精品伊人久久久大香线蕉经典版下载| 国产日韩欧美一区二区三区综合| 日韩电影一区二区三区四区| 555夜色666亚洲国产免| 亚洲人成网站精品片在线观看| 国产一区二区三区在线观看免费视频| 欧美调教femdomvk| 亚洲三级免费观看| 国产另类ts人妖一区二区| 欧美一区二视频| 亚洲国产一区二区三区青草影视| 成人v精品蜜桃久久一区| 精品国产人成亚洲区| 亚洲国产一二三| 欧洲精品中文字幕| 中文字幕在线观看不卡视频| 国产一区二区三区黄视频 | 精品综合免费视频观看| 欧美老人xxxx18| 午夜精品福利一区二区三区蜜桃| 在线观看成人免费视频| 亚洲精品国产成人久久av盗摄 | 精品在线免费观看| 欧美一级片在线看| 视频一区在线视频| 欧美放荡的少妇| 婷婷丁香激情综合| 69久久夜色精品国产69蝌蚪网| 亚洲福利视频三区| 欧美日韩精品欧美日韩精品一| 亚洲国产精品精华液网站| 欧美视频一区二区三区| 亚洲一区二区三区自拍| 欧洲亚洲国产日韩| 亚洲国产精品久久久久婷婷884| 色94色欧美sute亚洲线路一久 | 日韩一级免费观看| 免费高清在线一区| 精品欧美一区二区久久| 麻豆国产欧美日韩综合精品二区 | 国产精品888| 国产精品女同互慰在线看| 成人午夜在线视频| 日韩美女精品在线| 欧美在线观看一区二区| 午夜精品久久久久久久久| 欧美另类一区二区三区| 秋霞午夜av一区二区三区| 欧美va亚洲va在线观看蝴蝶网| 国产一区二区免费看| 国产网站一区二区三区| 成人黄色av电影| 亚洲黄色尤物视频| 欧美丰满嫩嫩电影| 久久国产精品色婷婷| 欧美极品少妇xxxxⅹ高跟鞋| jizzjizzjizz欧美| 亚洲成人免费影院| 久久久久国产精品麻豆ai换脸 | 国产激情偷乱视频一区二区三区 | 久久久久久久久岛国免费| 99国产精品99久久久久久| 亚洲激情男女视频| 日韩欧美国产不卡|