IoSetCompletionRoutine 함수(wdm.h)
IoSetCompletionRoutine 루틴은 다음 하위 수준 드라이버가 지정된 IRP에 대해 요청된 작업을 완료할 때 호출되는 IoCompletion 루틴을 등록합니다.
구문
void IoSetCompletionRoutine(
[in] PIRP Irp,
[in, optional] PIO_COMPLETION_ROUTINE CompletionRoutine,
[in, optional] __drv_aliasesMem PVOID Context,
[in] BOOLEAN InvokeOnSuccess,
[in] BOOLEAN InvokeOnError,
[in] BOOLEAN InvokeOnCancel
);
매개 변수
[in] Irp
드라이버가 처리 중인 IRP 에 대한 포인터입니다.
[in, optional] CompletionRoutine
다음 하위 드라이버가 패킷을 완료할 때 호출되는 드라이버 제공 IoCompletion 루틴의 진입점을 지정합니다.
[in, optional] Context
IoCompletion 루틴에 전달할 드라이버 결정 컨텍스트에 대한 포인터입니다. IoCompletion 루틴은 IRQL <= DISPATCH_LEVEL 호출되므로 컨텍스트 정보는 페이지가 없는 메모리에 저장되어야 합니다.
[in] InvokeOnSuccess
NT_SUCCESS 매크로의 결과에 따라 IRP가 IRP의 IO_STATUS_BLOCK 구조에서 성공 상태 값으로 완료될 경우 완료 루틴이 호출되는지 여부를 지정합니다(NTSTATUS 값 사용 참조).
[in] InvokeOnError
IRP의 IO_STATUS_BLOCK 구조에서 비uccess 상태 값으로 IRP가 완료될 경우 완료 루틴이 호출되는지 여부를 지정합니다.
[in] InvokeOnCancel
드라이버 또는 커널이 IRP를 취소하기 위해 IoCancelIrp 을 호출한 경우 완료 루틴이 호출되는지 여부를 지정합니다.
반환 값
없음
설명
완료 루틴이 완료되기 전에 언로드되지 않도록 보장할 수 있는 드라이버만 IoSetCompletionRoutine을 사용할 수 있습니다. 그렇지 않으면 드라이버가 IoSetCompletionRoutineEx를 사용해야 합니다. 이렇게 하면 완료 루틴이 실행될 때까지 드라이버가 언로드되지 않습니다.
이 루틴은 지정된 IRP에서 IoCompletion 루틴의 전송 주소를 설정합니다. 계층화된 드라이버 체인의 최저 수준 드라이버는 이 루틴을 호출할 수 없습니다.
IoSetCompletionRoutine 은 다음 하위 수준 드라이버가 요청된 작업을 다음 방법 중 일부 또는 전부에서 완료할 때 호출할 지정된 루틴을 등록합니다.
성공 상태 값 사용
비uccess 상태 값 사용
IRP를 취소하여
일반적으로 I/O 상태 블록은 기본 디바이스 드라이버에 의해 설정됩니다. 읽기는 하지만 상위 수준의 드라이버의 IoCompletion 루틴에 의해 변경되지 않습니다.
IoAllocateIrp 또는 IoBuildAsynchronousFsdRequest를 사용하여 IRP를 할당하는 상위 수준 드라이버는 드라이버 할당 IRP를 IoCallDriver에 전달하기 전에 모든 InvokeOnXxx 매개 변수를 TRUE로 설정하여 이 루틴을 호출해야 합니다. 이러한 IRP를 사용하여 IoCompletion 루틴을 호출하는 경우 드라이버 할당 IRP 및 드라이버가 요청에 대해 설정한 기타 리소스(예: IoBuildPartialMdl을 사용하는 MDL)를 해제해야 합니다. 이러한 드라이버는 IoFreeIrp 을 호출하여 드라이버 할당 IRP에 대한 I/O 관리자의 완료 처리를 포리스트할 때 STATUS_MORE_PROCESSING_REQUIRED 반환해야 합니다.
IoCompletion 루틴을 실행하기 전에 언로드될 수 있는 PnP가 아닌 드라이버는 대신 IoSetCompletionRoutineEx를 사용해야 합니다.