RemoveLockMnRemove2 규칙(wdm)
RemoveLockMnRemove2 규칙은 IRP가 낮은 드라이버로 전달되기 전에 IRP_MN_REMOVE_DEVICE 요청을 처리할 때 IoAcquireRemoveLock 및 IoReleaseRemoveLockAndWait에 대한 호출이 올바르게 사용되는지 확인합니다.
이 규칙은 FDO 및 FIDO 드라이버에만 적용됩니다.
예를 들어 필터 드라이버, FDO 및 PDO로 구성된 PnP 드라이버 스택을 고려합니다.
PnP 관리자는 스택을 통해 쿼리 제거를 보냅니다. 시스템이 실행되는 동안 FDO가 유휴 상태로 설정됩니다. FDO는 쿼리 제거 상태에서 전원을 빼기로 결정하므로 d0 IRP를 요청합니다. d0 IRP가 도착하기 전에 PnP 관리자는 PnP 제거 IRP를 보내고 필터 드라이버에서 IRP를 처리합니다. 필터 드라이버는 스택에서 분리되어 상태를 정리합니다. d0은 스택의 맨 위에 도착하지만 필터 드라이버는 더 이상 보낼 위치를 알 수 있는 컨텍스트나 데이터가 없기 때문에 스택 아래로 보내지 않습니다. FDO가 중단되어 d0 IRP가 도착할 때까지 기다리지만 IRP는 절대로 도착하지 않습니다.
이 오류를 방지하려면
디바이스가 디바이스 스택에서 분리되기 전에 IRP가 다음 IRP 유형에 대해 스택 아래로 전달되기 전에 IoAcquireRemoveLock 이 성공해야 합니다.
- IRP_MN_QUERY_REMOVE
- IRP_MN_SUPRISE_REMOVAL
- IRP_MN_REMOVE_DEVICE
IoDetachDevice 또는 IoDeleteDevice를 호출하기 전에 IoReleaseRemoveLockAndWait을 호출해야 합니다. (이렇게 하면 모든 제거 잠금이 디바이스 드라이버에서 해제됩니다.)
드라이버 모델: WDM
테스트 방법
컴파일 시 |
---|
정적 드라이버 검증 도구를 실행하고 RemoveLockMnRemove2 규칙을 지정합니다. 다음 단계를 사용하여 코드 분석을 실행합니다. |
적용 대상
IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockIoReleaseRemoveLockAndWaitPoCallDriver