内核驱动程序的延迟



我在内核驱动程序中使用while循环来读取内存,但是我的cpu使用率很高。

在c#中有Sleep();,它减少了while循环中的cpu使用。我可以在Windows的内核驱动程序中使用什么?

当内核驱动程序中的共享内存或数据准备就绪时。您可以创建事件来通知用户模式应用程序。

#define GT_GLOBAL_EVENTNAME L"\BaseNamedObjects\KernelEvent_6BAC23F4"
PKEVENT     g_UserModeEvent = NULL; 
HANDLE      g_hEvtHandle = NULL; 
UNICODE_STRING evtName;
RtlInitUnicodeString(&evtName, GT_GLOBAL_EVENTNAME);
g_UserModeEvent = IoCreateNotificationEvent(&evtName, &g_hEvtHandle);
if (g_UserModeEvent == NULL ||
g_hEvtHandle== NULL)
{
rtStatus = STATUS_UNSUCCESSFUL;
goto CleanUp;
}
KeResetEvent(g_UserModeEvent );

当数据准备好时,使用下面的代码通知应用程序。

KeSetEvent(g_UserModeEvent , 0, FALSE);                KeResetEvent(g_UserModeEvent );

应用程序可以获得内核驱动程序使用OpenEvent创建的事件句柄,并通过该句柄在WaitForSingleObject中等待。

HANDLE m_hEvent = NULL;
WCHAR tmpEvtName[1024] = { L"\BaseNamedObjects\KernelEvent_6BAC23F4" };
m_hEvent = OpenEvent(SYNCHRONIZE, FALSE, tmpEvtName);
WaitForSingleObject(m_hEvent, INFINITE);

之后,应用程序可以使用DeviceIoControl从内核驱动程序读取共享内存或请求数据。

最新更新