구리의 창고

Application과 Driver 이벤트 공유하기 본문

Window Driver

Application과 Driver 이벤트 공유하기

구리z 2010. 3. 5. 10:39

[ 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);

Comments