USB Filter Driver - Packet Analyzer 3 탄
Posted 2008/08/04 11:07|
|
|
댓글 하나가 운영자에겐 커다란 힘이 됩니다!
이번 시간에는 Application과 Driver간의 이벤트를 공유하는 방법에 대해서 소개를 하겠습니다.
이벤트를 공유하는 방법은 크게 3가지로 구분이 되어 있습니다.
1. Application에서 Event를 생성하고, 생성된 Event Handle을 IOCTL을 통해서 Driver에서 전달하는
방법.
2. Driver가 Event를 생성하고, 생성된 Event Handle을 IOCTL를 통해서 Application에게 전달하는 방
법.
3. Driver가 미리 정한 이름으로 Envet를 생성하고, Application이 생성된 Event를 Open하는 방법.
저는 이들 방법 중에서 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 Object의 Signal되는 시점을 대기함.
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;
}
************** 생 략 **************
// 특정 시점에 Event를 Signal 상태로 만듦.
KeSetEvent(SharedEvent, 0, FALSE);
위와 같은 방법으로 간단하게 Application과 Driver가 이벤트 공유를 할 수가 있습니다.
위의 방법의 단점은 보안에 취약하는 것입니다. 이벤트 객체의 이름이 공개되어 버리니 보안에 취약하다는 단점을 제외하고는 간편하게 이용할 수가 있습니다.
다음 시간에는 드라이버 구조에서 좀 더 세분화하여 드라이버에서 처리 루틴에 대해서 설명을 하겠습니다.
출처 : http://blog.naver.com/gunner98
위의 정보가 도움이 되셨나요? 그렇다면 댓글 하나만 남겨주세요.
댓글 하나가 운영자에겐 커다란 힘이 됩니다!
- Filed under : 프로그래밍/Driver
- Tag : USB Filter Driver - Packet Analyzer 3 탄
- Comment Trackback

