In my minifilter, I use a system worker thread via FltQueueDeferredIoWorkItem to wait with a timeout on an event from my user-mode service. The user-mode service sends the event correctly, but it is not received in kernel mode. There are no errors at all when setting the event in user mode or waiting on the corresponding object in kernel mode. I’ve included the abbreviate source code below. Any help would be appreciated.
Here’s essentially what my user-mode code does (I do check for all errors, but exclude that code here):
context->Event = CreateEvent( NULL, // Default security
FALSE, // Auto reset
FALSE, // non-signaled state
NULL); // No
myThread = CreateThread( NULL,
0,
ScannerWorker,
context,
0,
&threadId );
// ScannerWorker routine:
if (SetEvent(Context->Event) == TRUE)
{
printf(“Sent event %X to the kernel to let it know our processing is complete!\n”, Context->Event);
}
else
{
printf( “Unable to send event %p to the kernel. Got error %X\n”, Context->Event, HRESULT_FROM_WIN32(GetLastError()) );
}
FreeScannerThreadContext(Context);
ExitThread(hr);
// Now here is the corresponding callback routine I pass to FltQueueDeferredIoWorkItem
// Error checking excluded
PRKEVENT gpEventObject;
OBJECT_HANDLE_INFORMATION objHandleInfo;
hr = ObReferenceObjectByHandle(
pWorkerContext->hUserModeEvent,
GENERIC_ALL,
NULL,
KernelMode,
&gpEventObject,
&objHandleInfo);
// Wait for the handle (actually the object returned by ObReferenceObjectByHandle
hr = KeWaitForSingleObject(
(PVOID) gpEventObject,
Executive,
KernelMode,
FALSE,
GetKernelWorkerTimeout());
When the last line returns hr always = STATUS_TIMEOUT. Any ideas? Thanks for your help!
Bill