Application과 Driver 이벤트 공유하기
[ Application에서 처리 ]
// 1. Application에서 Driver와 이벤트 공유를 위해서 Named Event 객체 생성.
m_hWaitEvent = CreateEvent(NULL, FALSE, FALSE, "WaitUpdateEvent");
// 2. Driver에서 이벤트 공유를 위한 시점을 알려 주기 위한 IOCTL Code 선언.
#define IOCTL_EVENT_SETTING CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
// 3. Driver에게 IOCTL Code 전송.
DeviceIoControl(pDev->hDevice, IOCTL_EVENT_SETTING, NULL, NULL, NULL, NULL, &dwRet, NULL);
// 4. Driver에서 통지하는 Event를 대기함.
WaitForSingleObject(pDev->m_hWaitEvent, INFINITE);
[ Driver에서 처리 ]
// 1. IOCTL_EVENT_SETTING의 Ioctl Code를 받아서 처리.
irpStack = IoGetCurrentIrpStackLocation(Irp);
cbin =
irpStack->Parameters.DeviceIoControl.InputBufferLength;
cbout =
irpStack->Parameters.DeviceIoControl.OutputBufferLength;
code =
irpStack->Parameters.DeviceIoControl.IoControlCode;
switch (code)
{
case IOCTL_EVENT_SETTING:
KdPrint(("[FileIODriver] - IOCTL_EVENT_SETTING\n"));
RtlInitUnicodeString(&EventName, (L"\\BaseNamedObjects\\WaitUpdateEvent"));
SharedEvent = IoCreateNotificationEvent(&EventName,
&SharedEventHandle);
if( NULL != SharedEvent)
{
KdPrint(("[FileIODriver] - Success to
IoCreateNotificationEvent().\n"));
ObReferenceObject(SharedEvent);
}
else
{
KdPrint(("[FileIODriver] - Fail to
IoCreateNotificationEvent().\n"));
status =
STATUS_UNSUCCESSFUL;
}
break;
default:
break;
}
// 2. Application에게 이벤트 통지함.
KeSetEvent(SharedEvent, 0, FALSE);