I have build the code in VS 2013 and using WDK 8.1.
I have tested it on Windows 7 x86 machine.
Steps:
- Install driver using .inf file.
- Run an app which will create an event and will send an IOCTL.
- Wait for kernel to signal this event.
Code is as below:
#define FILTER_DRIVER_PORT_NAME L"\FltDriverPort"
Kernel Mode :
case eIOCTL_TEST_IOCTL_1:
DbgPrint(“\n%s:: eIOCTL_TEST_IOCTL_1.\n”, FUNCTION);
/**
* Process IOCTL.
*/
RtlInitUnicodeString(&ucEventName, L"\BaseNamedObjects\SharedEvent");
sharedEvent = IoCreateNotificationEvent(&ucEventName, &hEvent);
if (sharedEvent != NULL) {
DbgPrint(“\n%s:: IoCreateNotificationEvent Successful.”, FUNCTION);
nsStatus = STATUS_SUCCESS;
ObReferenceObject(sharedEvent);
}
else {
DbgPrint(“\n%s:: IoCreateNotificationEvent Unsuccessful.”, FUNCTION);
nsStatus = STATUS_UNSUCCESSFUL;
}
lRet = KeSetEvent(sharedEvent, 0, FALSE);
DbgPrint(“\n%s:: Return value of KeSetEvent(): %ld.”, FUNCTION, lRet);
User Mode :
hResult = FilterConnectCommunicationPort(FILTER_DRIVER_PORT_NAME, 0, NULL, 0, NULL, &hPort);
if (FAILED(hResult))
{
_tprintf(_T(“\nFilterConnectCommunicationPort(HRESULT: 0x%lX)(ErrCode: %d)…FAILED.”),
hResult, HRESULT_CODE(hResult));
return hResult;
}
Ioctl.TestIoctl = (PTEST_IOCTL_1)malloc(sizeof(TEST_IOCTL_1));
if (NULL == Ioctl.TestIoctl)
{
return -1;
}
hEvent = CreateEvent(NULL, TRUE, FALSE, L"SharedEvent");
if (NULL == hEvent)
{
printf(“Cannot create named event!\n”);
return 0;
}
Ioctl.OpCode = eIOCTL_TEST_IOCTL_1;
hResult = FilterSendMessage(hPort, &Ioctl, sizeof(Ioctl), &TestIoctl_1_Return, sizeof(TestIoctl_1_Return), &dwLen);
if (FAILED(hResult))
{
_tprintf(_T(“\nFilterSendMessage(HRESULT: 0x%lX)(ErrCode: %d)…FAILED.”), hResult, HRESULT_CODE(hResult));
free(Ioctl.TestIoctl);
CloseHandle(hPort);
return hResult;
}
_tprintf(_T(“\neIOCTL_TEST_IOCTL_1 sent successfully…!!!”));
WaitStatus = WaitForSingleObject(hEvent, 10000);
if (WaitStatus != WAIT_OBJECT_0) {
printf(“\nDriver failed to signal event! WaitForSingleObject returned 0x%8.8x\n”,
WaitStatus);
}
else {
printf(“\nThe driver has successfully signaled our named event!\n”);
}
/**
* Clean-up.
*/
free(Ioctl.TestIoctl);
CloseHandle(hEvent);
CloseHandle(hPort);