微过滤器向 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);
停止监听
我正在写一个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);
停止监听