다음을 통해 공유


IoCsqInsertIrpEx 함수(wdm.h)

IoCsqInsertIrpEx 루틴은 IRP를 드라이버의 취소 안전 IRP 큐에 삽입합니다.

구문

NTSTATUS IoCsqInsertIrpEx(
  [in, out]       PIO_CSQ             Csq,
  [in, out]       PIRP                Irp,
  [out, optional] PIO_CSQ_IRP_CONTEXT Context,
  [in, optional]  PVOID               InsertContext
);

매개 변수

[in, out] Csq

드라이버의 취소 안전 IRP 큐에 대한 IO_CSQ 구조체에 대한 포인터입니다. 이 구조체는 IoCsqInitialize 또는 IoCsqInitializeEx에 의해 초기화되어야 합니다.

[in, out] Irp

큐에 대기할 IRP에 대한 포인터입니다.

[out, optional] Context

IO_CSQ_IRP_CONTEXT 구조체에 대한 포인터입니다. IoCsqInsertIrpEx 는 삽입된 IRP에 대한 컨텍스트 정보를 사용하여 이 구조를 초기화합니다. 드라이버는 이 값을 IoCsqRemoveIrp 에 전달하여 큐에서 IRP를 삭제합니다. 드라이버가 IoCsqRemoveIrp을 사용하여 큐에서 이 IRP를 제거하지 않는 경우 컨텍스트NULL일 수 있습니다.

[in, optional] InsertContext

드라이버 정의 컨텍스트 값에 대한 포인터입니다. 이 매개 변수는 드라이버의 CsqInsertIrpEx 루틴(있는 경우)에 전달됩니다. 그렇지 않으면 이 매개 변수는 무시됩니다.

반환 값

Csq 매개 변수가 IoCsqInitialize로 초기화된 경우 IoCsqInsertIrpEx는 항상 STATUS_SUCCESS 반환합니다. CsqIoCsqInitializeEx로 초기화된 경우 IoCsqInsertIrpEx는 드라이버의 CsqInsertIrpEx 루틴에서 반환된 값을 반환합니다.

설명

IoCsqInsertIrpEx 는 큐의 디스패치 루틴을 사용하여 IRP를 삽입합니다. IoCsqInsertIrpEx 루틴:

  1. 큐의 CsqAcquireLock 루틴을 호출하여 큐를 잠급니다.
  2. 큐의 IO_CSQ 구조가 IoCsqInitialize에 의해 초기화된 경우 IoCsqInsertIrpEx 는 큐의 CsqInsertIrp 루틴을 호출하여 IRP를 삽입합니다. 큐의 IO_CSQ 구조가 IoCsqInitializeEx에 의해 초기화된 경우 IoCsqInsertIrpEx는 큐의 CsqInsertIrpEx 루틴을 호출하여 IRP를 삽입하고 InsertContext 매개 변수를 CsqInsertIrpExInsertContext 매개 변수로 전달합니다.
  3. 큐의 CsqReleaseLock 루틴을 호출하여 큐의 잠금을 해제합니다.
삽입할 IRP가 이미 취소된 경우 IoCsqInsertIrpEx 는 IRP를 큐에 삽입하려고 시도하지 않습니다.

자세한 내용은 Cancel-Safe IRP 큐를 참조하세요.

IoCsqXxx 루틴은 IRP의 DriverContext[3] 멤버를 사용하여 IRP 컨텍스트 정보를 보유합니다. 이러한 루틴을 사용하여 IRP를 큐에 대기시키는 드라이버는 해당 멤버를 사용하지 않은 상태로 두어야 합니다.

IoCsqInsertIrpEx의 호출자는 IRQL <= DISPATCH_LEVEL 실행 중이어야 합니다. 드라이버의 콜백 루틴은 이 IRQL에서 올바르게 작동해야 합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Server 2003 이상 버전의 Windows 운영 체제에서 사용할 수 있습니다. 루틴은 WDK(Windows 드라이버 키트) 및 Windows Server 2003용 DDK(드라이버 개발 키트)와 함께 제공되는 Csq.lib 라이브러리에서도 사용할 수 있습니다. Windows XP, Windows 2000 및 Windows 98/Me에서도 작동해야 하는 드라이버는 대신 Csq.lib에 연결하여 루틴을 사용할 수 있습니다.
대상 플랫폼 유니버설
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)
라이브러리 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL(설명 섹션 참조)
DDI 규정 준수 규칙 IoAllocateFree(wdm), IoReuseIrp(wdm), IrpCancelField(wdm), RemoveLockCheck(wdm), RemoveLockForward(wdm), RemoveLockForward2(wdm), RemoveLockForwardDeviceControl(wdm), RemoveLockForwardDeviceControl2(wdm), RemoveLockForwardDeviceControlInternal(wdm), RemoveLockForwardDeviceControlInternal2(wdm), RemoveLockForwardRead(wdm), RemoveLockForwardRead2(wdm) , RemoveLockForwardWrite(wdm), RemoveLockForwardWrite2(wdm), RemoveLockReleaseCleanup(wdm), RemoveLockReleaseClose(wdm), RemoveLockReleaseCreate(wdm), RemoveLockReleaseDeviceControl(wdm), RemoveLockReleaseInternalDeviceControl(wdm), RemoveLockReleasePower(wdm), RemoveLockReleaseShutdown(wdm), RemoveLockReleaseSystemControl(wdm), RemoveLockReleaseWrite(wdm)

추가 정보

CsqAcquireLock

CsqCompleteCanceledIrp

CsqInsertIrp

CsqInsertIrpEx

CsqPeekNextIrp

CsqReleaseLock

CsqRemoveIrp

IO_CSQ

IO_CSQ_IRP_CONTEXT

IoCsqInitialize

IoCsqInitializeEx

IoCsqInsertIrp

IoCsqRemoveIrp

IoCsqRemoveNextIrp