태터데스크 관리자

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

태터데스크 메시지

저장하였습니다.


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

 
< USB Filter Driver - Packet Analyzer 5 >

이번에는 "IRP_MJ_INTERNAL_DEVICE_CONTROL" IRP를 처리해 주는 루틴에 대해서 세부적인 사항을 알아 보겠습니다.

처리 로직은 간단합니다. "IRP_MJ_INTERNAL_DEVICE_CONTROL" 해당 IRP가 내려 오면, 현채 IRPStack Location구한 다음에 "Parameters.DeviceIoControl.IoControlCode"를 가지고 와서 현재 이 IOCTL"IOCTL_INTERNAL_USB_SUBMIT_URB"인지 확인을 해서 맞으면 완료 루틴을 등록하면 되는 것입니다.

아래는 간략하게 함수가 어떻게 구성될지를 설명하고 있습니다.

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

 // 현재 IRPStack Location을 구함.

 stack = IoGetCurrentIrpStackLocation(Irp);
 pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

 // 현재 IRPIOCTL 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

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

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