IoMarkIrpPending 함수(wdm.h)

IoMarkIrpPending 루틴은 지정된 IRP를 표시하며, 이는 다른 드라이버 루틴에서 추가 처리가 필요하기 때문에 드라이버의 디스패치 루틴이 이후에 STATUS_PENDING 반환했음을 나타냅니다.

구문

void IoMarkIrpPending(
  [in, out] PIRP Irp
);

매개 변수

[in, out] Irp

보류 중으로 표시할 IRP에 대한 포인터입니다.

반환 값

없음

설명

드라이버의 디스패치 루틴이 IRP를 완료하거나( IoCompleteRequest를 호출하여) IRP를 하위 드라이버에 전달하지 않는 한 IRP를 사용하여 IoMarkIrpPending을 호출해야 합니다. 그렇지 않으면 I/O 관리자는 디스패치 루틴이 컨트롤을 반환하는 즉시 IRP를 완료하려고 시도합니다.

IoMarkIrpPending을 호출한 후 IoMarkIrpPending이라는 디스패치 루틴이 반환되기 전에 일부 루틴이 IRP를 완료하더라도(IoCompleteRequest를 호출하여) 디스패치 루틴은 STATUS_PENDING 반환해야 합니다.

드라이버가 들어오는 IRP를 큐에 대기하는 경우 각 IRP를 큐에 넣기 전에 IoMarkIrpPending 을 호출해야 합니다. 그렇지 않으면 IRP가 큐에서 해제되고, 다른 드라이버 루틴에서 완료되고, IoMarkIrpPending 호출이 발생하기 전에 시스템에서 해제되어 충돌이 발생할 수 있습니다.

드라이버가 IRP에 대한 IoCompletion 루틴을 설정한 다음 IRP를 하위 드라이버로 전달하는 경우 IoCompletion 루틴은 IRP-PendingReturned> 플래그를 검사 합니다. 플래그가 설정된 경우 IoCompletion 루틴은 IRP를 사용하여 IoMarkIrpPending을 호출해야 합니다. IoCompletion 루틴은 STATUS_PENDING 반환하지 않습니다. 자세한 내용은 IoCompletion 루틴 구현을 참조하세요.

IRP를 만들고 다른 스택으로 보내는 드라이버는 완료 루틴에서 IoMarkIrpPending을 호출하면 안 됩니다. 이 호출은 해당 드라이버에 대한 스택 위치가 없으므로 다음 할당의 풀 헤더를 손상합니다.

IRP를 전달한 다음 이벤트를 기다리는 드라이버는 보류 중인 IRP를 표시해서는 안 됩니다. 대신 IoCompletion 루틴은 이벤트를 알리고 STATUS_MORE_PROCESSING_REQUIRED 반환해야 합니다.

드라이버가 IoSkipCurrentIrpStackLocation을 호출하는 경우 해당 드라이버와 관련하여 의도치 않게 낮은 드라이버 또는 시스템의 동작에 영향을 줄 수 있는 방식으로 IO_STACK_LOCATION 구조를 수정하지 않도록 주의해야 합니다. 특히 드라이버는 IO_STACK_LOCATION 구조체의 Parameters 공용 구조체를 수정해서는 안 되며 IoMarkIrpPending을 호출해서는 안 됩니다.

요구 사항

요구 사항
대상 플랫폼 데스크톱
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
IRQL 모든 수준
DDI 규정 준수 규칙 CompleteRequestStatusCheck(wdm), CompletionEventChecking(wdm), IrpCancelField(wdm), LowerDriverReturn(wdm), MarkDevicePower(wdm), MarkInterlockedQueuedIrps(wdm), MarkQueuedIrps(wdm), MarkIrpPending(wdm), MarkIrpPending2(wdm), MarkPowerDown(wdm), MarkQueryRelations(wdm), MarkStartDevice(wdm), PendedCompletedRequest3(wdm)

추가 정보

IO_STACK_LOCATION

IRP

IoCompleteRequest

IoSkipCurrentIrpStackLocation

IoStartPacket