다음을 통해 공유


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 사용해야 합니다.

요구 사항

요구
대상 플랫폼 바탕 화면
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
IRQL IRQL <= DISPATCH_LEVEL
DDI 규정 준수 규칙 CompleteRequest(wdm), CompleteRequestStatusCheck(wdm), CompletionRoutineRegistered(wdm), IoAllocateForward(wdm), IoAllocateIrpSignalEventInCompletion(wdm), IoAllocateIrpSignalEventInCompletion 2(wdm), IoAllocateIrpSignalEventInCompletion3(wdm), IoAllocateIrpSignalEventInCompletionTimeout(wdm), IoBuildFsdForward(wdm), IoBuildFsdIrpSignalEventInCompletion(wdm), IoBuildFsdIrpSignalEventInCompletion2(wdm), IoBuildFsdIrpSignalEventInCompletion3(wdm), IoBuildFsdIrpSignalEventInCompletionTimeout(wdm), IoFreeIrp(storport), IoSetCompletionRoutineNonPnpDriver(wdm)LowerDriverReturn(wdm), MarkPower(wdm), MarkPowerDown(wdm), MarkQueryRelations(wdm)), MarkStartDevice(wdm), PendedCompletedRequest(wdm), SetCompletionRoutineFromDispatch(kmdf), SignalEventInCompletion(wdm), SignalEventInCompletion2(wdm), SignalEventInCompletion3(wdm), StartDeviceWait(wdm), StartDeviceWait3(wdm)

참고 항목

IO_STACK_LOCATION

IRP

IoAllocateIrp

IoBuildAsynchronousFsdRequest

IoBuildPartialMdl

IoFreeIrp

IoSetCompletionRoutineEx