완료 루틴에 대한 제약 조건
다음 지침에서는 파일 시스템 필터 드라이버 완료 루틴에서 일반적인 프로그래밍 오류를 방지하는 방법을 간략하게 설명합니다.
IRQL 관련 제약 조건
완료 루틴은 IRQL DISPATCH_LEVEL 호출할 수 있으므로 다음과 같은 제약 조건이 적용됩니다.
완료 루틴은 IoDeleteDevice 또는 ObQueryNameString과 같이 더 낮은 IRQL이 필요한 커널 모드 루틴을 안전하게 호출할 수 없습니다.
완료 루틴에 사용되는 모든 데이터 구조는 페이지가 없는 풀에서 할당되어야 합니다.
완료 루틴은 페이지 가능으로 만들 수 없습니다.
완료 루틴은 리소스, 뮤텍스 또는 빠른 뮤텍스를 가져올 수 없습니다. 그러나 스핀 잠금을 획득할 수 있습니다.
PendingReturned 플래그 확인
완료 루틴이 이벤트에 신호를 표시하지 않는 한 Irp-PendingReturned> 플래그를 확인해야 합니다. 이 플래그가 설정되면 완료 루틴에서 IoMarkIrpPending을 호출하여 IRP를 보류 중으로 표시해야 합니다.
완료 루틴이 이벤트에 신호를 보낼 경우 IoMarkIrpPending을 호출하면 안 됩니다.
반환 상태에 대한 제약 조건
- 파일 시스템 필터 드라이버 완료 루틴은 STATUS_SUCCESS 또는 STATUS_MORE_PROCESSING_REQUIRED 반환해야 합니다. 다른 모든 NTSTATUS 값은 I/O 관리자가 STATUS_SUCCESS 다시 설정됩니다.
반환 STATUS_MORE_PROCESSING_REQUIRED 대한 제약 조건
완료 루틴이 STATUS_MORE_PROCESSING_REQUIRED 반환해야 하는 세 가지 경우가 있습니다.
해당 디스패치 루틴이 완료 루틴에 의해 이벤트가 신호를 받을 때까지 대기하는 경우 이 경우 완료 루틴이 반환된 후 I/O 관리자가 IRP를 조기에 완료하지 못하도록 STATUS_MORE_PROCESSING_REQUIRED 반환하는 것이 중요합니다.
완료 루틴이 작업자 큐에 IRP를 게시하고 해당 디스패치 루틴이 STATUS_PENDING 반환한 경우 이 경우에도 완료 루틴이 반환된 후 I/O 관리자가 IRP를 조기에 완료하지 못하도록 STATUS_MORE_PROCESSING_REQUIRED 반환하는 것이 중요합니다.
동일한 드라이버가 IoAllocateIrp 또는 IoBuildAsynchronousFsdRequest를 호출하여 IRP를 만든 경우 드라이버가 상위 수준 드라이버에서 이 IRP를 받지 못했기 때문에 완료 루틴에서 IRP를 안전하게 해제할 수 있습니다. IoFreeIrp를 호출한 후 완료 루틴은 추가 완료 처리가 필요하지 않음을 나타내기 위해 STATUS_MORE_PROCESSING_REQUIRED 반환해야 합니다.
완료 루틴은 oplock 작업에 대한 STATUS_MORE_PROCESSING_REQUIRED 반환할 수 없습니다. Oplock 작업은 보류(작업자 큐에 게시)할 수 없으며 디스패치 루틴은 해당 작업에 대한 STATUS_PENDING 반환할 수 없습니다.
작업 큐에 IRP 게시에 대한 제약 조건
- 완료 루틴이 작업 큐에 IRP를 게시하는 경우 작업자 큐에 각 IRP를 게시하기 전에 IoMarkIrpPending 을 호출해야 합니다. 그렇지 않으면 IRP를 큐에서 제거하고, 다른 드라이버 루틴에 의해 완료하고, IoMarkIrpPending 에 대한 호출이 발생하기 전에 시스템에서 해제하여 충돌이 발생할 수 있습니다.