메모장 입니다2

Windows] IRP 콜백 함수 본문

Study/Programming

Windows] IRP 콜백 함수

Wooum@n 2017. 8. 24. 20:33

1.CompletionRoutine 개요


 -IRP 처리 과정에서 IoCompleteRequest()가 호출되면, IRP가 디바이스스텍의 최하단, 

즉 버스드라이버의 처리까지 완료된 후에 스텍을 거슬러 돌아오는 시점에 자동으로 호출된다.

(등록되있을 경우)

 -후처리용 콜백함수라 함.




2.선언


-콜백함수 형식

 NTSTATUS

IoCompletion(

PDEVICE_OBjECT DeviceObject,

PRIP irp,

PVOID Context

);



 -콜백함수 등록

VOID

IoSetCompletionroutine(

IN PIRP irp,

IN PIO_COMPLETION_ROUTINE CompletionRoutine,

IN PVOID Context,

IN BOOLEAN InvokeOnSuccess,

IN BOOLEAN InvokeOnError,

IN BOOLEAN InvokeOnCancel

);


*Invoke~~ : IRP의 처리 결과.





3.주의사항


 -irp의 PendingReturned를 검사하여, 펜딩처리를 꼭 해주어야 한다.

   //안하고 실행하니, IRP가 처음 패킷만 처리되고 나머지는 동작을 하지 않았다.

 if(irp->Pendingreturned)

{

IoMarkIrpPending(irp);

}

참고: https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/checking-the-pendingreturned-flag