我在内核驱动程序中使用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从内核驱动程序读取共享内存或请求数据。