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 반환합니다. Csq가 IoCsqInitializeEx로 초기화된 경우 IoCsqInsertIrpEx는 드라이버의 CsqInsertIrpEx 루틴에서 반환된 값을 반환합니다.
설명
IoCsqInsertIrpEx 는 큐의 디스패치 루틴을 사용하여 IRP를 삽입합니다. IoCsqInsertIrpEx 루틴:
- 큐의 CsqAcquireLock 루틴을 호출하여 큐를 잠급니다.
- 큐의 IO_CSQ 구조가 IoCsqInitialize에 의해 초기화된 경우 IoCsqInsertIrpEx 는 큐의 CsqInsertIrp 루틴을 호출하여 IRP를 삽입합니다. 큐의 IO_CSQ 구조가 IoCsqInitializeEx에 의해 초기화된 경우 IoCsqInsertIrpEx는 큐의 CsqInsertIrpEx 루틴을 호출하여 IRP를 삽입하고 InsertContext 매개 변수를 CsqInsertIrpEx의 InsertContext 매개 변수로 전달합니다.
- 큐의 CsqReleaseLock 루틴을 호출하여 큐의 잠금을 해제합니다.
자세한 내용은 Cancel-Safe IRP 큐를 참조하세요.
IoCsqXxx 루틴은 IRP의 DriverContext[3] 멤버를 사용하여 IRP 컨텍스트 정보를 보유합니다. 이러한 루틴을 사용하여 IRP를 큐에 대기시키는 드라이버는 해당 멤버를 사용하지 않은 상태로 두어야 합니다.
IoCsqInsertIrpEx의 호출자는 IRQL <= DISPATCH_LEVEL 실행 중이어야 합니다. 드라이버의 콜백 루틴은 이 IRQL에서 올바르게 작동해야 합니다.