微过滤器向 r3 发送消息

minifilter send message to r3

我正在写一个minifilter,它想在某些情况下通知r3 应用程序弹出一个消息框。我在 minifilter 中使用了 fltsendmessage,在 r3 中使用了 filtergetmessage。在 r3 应用程序中,我这样写:

    while (INVALID_HANDLE_VALUE == s_portWorker.m_clientPort)
    {
        hResult = FilterConnectCommunicationPort(SERVER_PORTNAME_POPUP, 0, NULL, 0, NULL, &s_portWorker.m_clientPort);
        if (IS_ERROR(hResult)) {
            Sleep(1000);
        }
        while (true)
        {
            ZeroMemory(&getStruct, sizeof(GET_STRUCT));
            hResult = FilterGetMessage(s_portWorker.m_clientPort, (PFILTER_MESSAGE_HEADER)&getStruct, sizeof(GET_STRUCT), NULL);
        }
    }
    

它工作正常。但是当我停止我的微过滤器时,在驱动程序卸载中调用 FltCloseCommunicationPort()。端口已关闭,但连接仍在,我的 r3 进程将阻塞在 FilterGetMessage 上,永远不会 return。 我想在端口关闭时停止等待消息,并尝试重新连接到我的微过滤器。我应该怎么办?由于 FilterGetMessage() 例程不支持超时机制,我是否必须创建一个事件以在停止过滤器时通知 r3?

您可以使用 lpOverlapped 参数实现超时机制。

HANDLE hWait = CreateEvent(NULL, TRUE, FALSE, NULL);
OVERLAPPED op = {0};
op.hEvent = hWait;
HRESULT hResult = FilterGetMessage(s_portWorker.m_clientPort, (PFILTER_MESSAGE_HEADER)&getStruct, sizeof(GET_STRUCT), &op);
if (hResult == HRESULT_FROM_WIN32(ERROR_IO_PENDING))
{
    HANDLE phHandles[2] = { hWait, g_hTerm };
    WaitForMultipleObjects(2, phHandles, TIME_OUT_VALUE);
}

并且您可以通过调用 SetEvent(g_hTerm);

停止监听