태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.


댓글 하나가 운영자에겐 커다란 힘이 됩니다!

 < USB Filter Driver - Packet Analyzer 3 >

이번 시간에는 ApplicationDriver간의 이벤트를 공유하는 방법에 대해서 소개를 하겠습니다.


이벤트를 공유하는 방법크게 3가지로 구분이 되어 있습니다.


 1. Application에서 Event를 생성하고, 생성된 Event HandleIOCTL을 통해서 Driver에서 전달하는

    방법.

 2. DriverEvent를 생성하고, 생성된 Event HandleIOCTL를 통해서 Application에게 전달하는 방

    .

 3. Driver가 미리 정한 이름으로 Envet를 생성하고, Application이 생성된 EventOpen하는 방법.


저는 이들 방법 중에서 Named Event를 이용하여 이벤트 공유하는 방법에 대해서 설명을 하겠습니다.


주의해서 볼 사항이 우리가 Named Event를 만들게 되면, BaseNamedObjects 디렉토리에 위치하는데 반드시 이 디렉토리 안에 위치를 해야지 우리가 하고 싶은 이벤트 공유를 할 수가 있습니다.


[Application Soucre]


// Event Object 생성.

m_hWaitEvent = CreateEvent(NULL, FALSE, FALSE, "WaitUpdateEvent");


************** 생 략 **************


// Drvier에게 생성된 시점을 IOCTL를 통해서 알려줌.

if (0 == DeviceIoControl(pDev->hDevice,

                                 IOCTL_EVENT_SETTING,

                                 NULL,

                                 NULL,

                                 NULL,

                                 NULL,

                                 &dwRet,

                                 NULL))
 {
  DWORD dwError = GetLastError();
  strError.Format("Event Setting Fail : [ %d ]", dwError);
  AfxMessageBox(strError);
 }
 else
  OutputDebugString("[Application] - Success to Setting Event");


************** 생 략 **************


// 생성된 Event ObjectSignal되는 시점을 대기함.

m_dwRetCode = WaitForSingleObject(m_hWaitEvent, INFINITE);
switch (m_dwRetCode)
{
  case
WAIT_OBJECT_0
:
          OutputDebugString("[Application] - Receive to Read Event");
          break;
  default:
          OutputDebugString("[Application] - Reveice to Unexpected Event.");
          break;

}


[Driver Source]


************** 생 략 **************


switch (irpStack->MajorFunction)
 {
    case
IRP_MJ_DEVICE_CONTROL
:
            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;
            }
            break;

}


************** 생 략 **************


// 특정 시점에 EventSignal 상태로 만듦.

KeSetEvent(SharedEvent, 0, FALSE);


위와 같은 방법으로 간단하게 ApplicationDriver가 이벤트 공유를 할 수가 있습니다.

위의 방법의 단점은 보안에 취약하는 것입니다. 이벤트 객체의 이름이 공개되어 버리니 보안에 취약하다는 단점을 제외하고는 간편하게 이용할 수가 있습니다.


다음 시간에는 드라이버 구조에서 좀 더 세분화하여 드라이버에서 처리 루틴에 대해서 설명을 하겠습니다.

출처 : http://blog.naver.com/gunner98

위의 정보가 도움이 되셨나요? 그렇다면 댓글 하나만 남겨주세요.
댓글 하나가 운영자에겐 커다란 힘이 됩니다!

Write your message and submit
« PREV : 1 : ... 220 : 221 : 222 : 223 : 224 : 225 : 226 : 227 : 228 : ... 436 : NEXT »