USB Filter Driver - Packet Analyzer 5 탄
Posted 2008/08/04 11:10|
|
|
댓글 하나가 운영자에겐 커다란 힘이 됩니다!
이번에는 "IRP_MJ_INTERNAL_DEVICE_CONTROL" IRP를 처리해 주는 루틴에 대해서 세부적인 사항을 알아 보겠습니다.
처리 로직은 간단합니다. "IRP_MJ_INTERNAL_DEVICE_CONTROL" 해당 IRP가 내려 오면, 현채 IRP의 Stack Location을 구한 다음에 "Parameters.DeviceIoControl.IoControlCode"를 가지고 와서 현재 이 IOCTL이 "IOCTL_INTERNAL_USB_SUBMIT_URB"인지 확인을 해서 맞으면 완료 루틴을 등록하면 되는 것입니다.
아래는 간략하게 함수가 어떻게 구성될지를 설명하고 있습니다.
***************** 생 략 *****************
// 현재 IRP의 Stack Location을 구함.
stack = IoGetCurrentIrpStackLocation(Irp);
pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
// 현재 IRP의 IOCTL Code를 읽어옴.
dwControlCode = stack->Parameters.DeviceIoControl.IoControlCode;
// USB Driver에서 하위 드라이버에게 요청하는 IRP가 맞는지 확인.
if (IOCTL_INTERNAL_USB_SUBMIT_URB == dwControlCode)
{
// 현재 상태의 Stack Location을 다음 Stack에 복사함.
IoCopyCurrentIrpStackLocationToNext(Irp);
// 해당 IRP가 완료되는 시점에 확인을 위해서 완료 루틴을 등록함.
IoSetCompletionRoutine(Irp,
CompletionRoutine,
(PVOID)uSequenceNumber,
TRUE,
TRUE,
TRUE);
// 해당 IRP를 하위 드라이버에게 넘김.
ntStatus = IoCallDriver(pdx->LowerDeviceObject, Irp);
***************** 생 략 *****************
}
***************** 생 략 *****************
위와 같이 구성이 되게 됩니다. 해당 IRP에 완료 루틴을 등록하는 이유는 이 IRP가 완료가 되었을 때 그 IRP에서 원하는
값을 얻어 내기 위한 것입니다. Packet Analyzer에서 가장 중요한 부분이 바로 위에서 설명한 완료 루틴입니다.
다음 시간에는 완료 루틴에서 처리해 주어야 할 사항에 대해서 설명을 하겠습니다.
출처 : http://blog.naver.com/gunner98
위의 정보가 도움이 되셨나요? 그렇다면 댓글 하나만 남겨주세요.
댓글 하나가 운영자에겐 커다란 힘이 됩니다!
- Filed under : 프로그래밍/Driver
- Tag : USB Filter Driver - Packet Analyzer 5 탄
- Comment Trackback

