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의 IO_STATUS_BLOCK 구조에서 성공 상태 값으로 IRP가 완료될 경우 완료 루틴이 호출되는지 여부를 지정합니다(NTSTATUS 값 사용참조).
[in] InvokeOnError
IRP의 IO_STATUS_BLOCK 구조에서 비구조적 상태 값으로 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 사용해야 합니다.