CancelIO() 에 대한 취소요청을 수락하기 위한 작업을 해야 한다.
주어진 IRP가 취소할 때를 대비해서 CancelRoutine을 셋팅한다.
IRP가 가지는 특별한 약속이 있다.
1. 생성된 IRP는 반드시 해제되어야 한다.
2. 응용프로그램의 요청에 의해서 생성된 IRP는 반드시 완료 요청되어야 한다.
3. IRP가 완료 요청되는 상황은 "성공", "에러", "취소" 의 3가지 경우가 되어야 한다.
IRP를 취소하는 방법은 실제로 DDK함수 IoCancelIrp()를 이용하는 방법이다.
사용자 프로그램이 의도적으로 취소요청을 하는 경우에는 Win32 API CancelIO() 함수를 사용한다.
물론 이함수는 내부적으로 IoCancelIrp()를 호출한다.
IoCancelIrp()는 해당 IRP에 등록된 취소루틴(IoSetCancelRoutine())을 찾아서 호출한다.
취소루틴을 호출하는 이유는 IRP가 완료요청되어 질 수 있돌고 하기 위해서 이다.
*** 취소루틴 작성 예제 ***
void MyCancelRoutine(
PDEVICE_OBJECT DeviceObject,
PIRP Irp
)
{
...............
}
IoSetCancelRoutine(Irp, MyCancelRoutine);
댓글 영역