다음을 통해 공유


RemoveLockQueryMnRemove 규칙(wdm)

RemoveLockQueryMnRemove 규칙은 MinorFunction IRP_MN_QUERY_REMOVE_DEVICE IRP_MJ_PNP 처리할 때 IoAcquireRemoveLockIoReleaseRemoveLock에 대한 호출이 올바르게 사용되는지 확인합니다. 드라이버는 스택 아래로 IRP를 전달하기 전에 제거 잠금을 획득해야 합니다.

이 규칙은 FDO 및 FIDO 드라이버에만 적용됩니다.

예를 들어 필터 드라이버, FDO 및 PDO로 구성된 PnP 드라이버 스택을 고려합니다.

PnP 관리자는 스택을 통해 쿼리 제거를 보냅니다. 시스템이 실행되는 동안 FDO가 유휴 상태로 설정됩니다. FDO는 쿼리 제거 상태에서 전원을 빼기로 결정하므로 d0 IRP를 요청합니다. d0 IRP가 도착하기 전에 PnP 관리자는 PnP 제거 IRP를 보내고 필터 드라이버에서 IRP를 처리합니다. 필터 드라이버는 스택에서 분리되어 상태를 정리합니다. d0은 스택의 맨 위에 도착하지만 필터 드라이버는 더 이상 보낼 위치를 알 수 있는 컨텍스트나 데이터가 없기 때문에 스택 아래로 보내지 않습니다. FDO가 중단되어 d0 IRP가 도착할 때까지 기다리지만 IRP는 절대로 도착하지 않습니다.

이 오류를 방지하려면

  1. 디바이스가 디바이스 스택에서 분리되기 전에 IRP가 다음 IRP 유형에 대해 스택 아래로 전달되기 전에 IoAcquireRemoveLock 이 성공해야 합니다.

    • IRP_MN_QUERY_REMOVE
    • IRP_MN_SUPRISE_REMOVAL
    • IRP_MN_REMOVE_DEVICE
  2. IoDetachDevice 또는 IoDeleteDevice를 호출하기 전에 IoReleaseRemoveLockAndWait 호출해야 합니다. (이렇게 하면 모든 제거 잠금이 디바이스 드라이버에서 해제됩니다.)

드라이버 모델: WDM

테스트 방법

컴파일 시

정적 드라이버 검증 도구를 실행하고 RemoveLockQueryMnRemove 규칙을 지정합니다.

다음 단계를 사용하여 코드 분석을 실행합니다.
  1. 코드를 준비합니다(역할 형식 선언 사용).
  2. 정적 드라이버 검증 도구를 실행합니다.
  3. 결과를 보고 분석합니다.

자세한 내용은 정적 드라이버 검증 도구를 사용하여 드라이버에서 결함 찾기를 참조하세요.

적용 대상

IoAcquireRemoveLockIoCallDriverIoReleaseRemoveLockPoCallDriver