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 구조체의 매개 변수 공용 구조체를 수정해서는 안 되며 IoMarkIrpPending을 호출해서는 안 됩니다.

요구 사항

   
지원되는 최소 클라이언트 Windows 2000부터 사용할 수 있습니다.
대상 플랫폼 데스크톱
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
IRQL 모든 수준
DDI 규정 준수 규칙 CompleteRequestStatusCheck(wdm), CompletionEventChecking(wdm), IrpCancelField(wdm), LowerDriverReturn(wdm), MarkDevicePower(wdm), MarkingInterlockedQueuedIrps(wdm), MarkQueuedIrps(wdm), MarkIrpPending(wdm), MarkIrpPending2(wdm), MarkPower(wdm), MarkPowerDown(wdm), MarkQueryRelations(wdm), MarkStartDevice(wdm), PendedCompletedRequest3(wdm)

참고 항목

IO_STACK_LOCATION

IRP

IoCompleteRequest

IoSkipCurrentIrpStackLocation

IoStartPacket