Share via


버스 드라이버에서 디바이스 제거

자식 디바이스(자식 PDO)를 제거할 때 부모 버스 드라이버는 디바이스를 추가하고 시작하기 위해 수행한 작업을 실행 취소해야 합니다.

버스 드라이버는 DispatchPnP 루틴에서 다음과 같은 프로시저를 사용하여 자식 디바이스를 제거합니다.

  1. 드라이버가 이 PDO에 대한 이전 IRP_MN_SURPRISE_REMOVAL 요청을 처리했는지 여부

    그렇다면 나머지 클린 수행하고 4단계로 건너뜁니다.

    드라이버는 일반적으로 디바이스 확장에서 드라이버가 디바이스에 대한 IRP_MN_SURPRISE_REMOVAL 요청을 처리했는지 여부를 나타내는 플래그를 유지 관리합니다.

  2. 드라이버에서 큐에 대기 중인 모든 요청을 완료합니다.

  3. 버스 드라이버가 이 작업을 수행할 수 있는 경우 디바이스에서 전원을 제거하고 PoSetPowerState를 호출하여 전원 관리자에게 알립니다.

    버스 드라이버는 가능하면 자식 디바이스를 작동시키고 전원 관리자에게 디바이스의 전원 상태 변경에 대해 알릴 수 있습니다. 버스 드라이버는 IRP_MN_REMOVE_DEVICE 요청에 대한 응답으로 이 작업을 수행합니다. 디바이스의 전원 정책 소유자는 디바이스가 제거될 때 IRP_MN_SET_POWER 요청을 보내지 않습니다. 자세한 내용은 전원 관리를 참조하세요.

  4. 버스 드라이버가 BusRelations에 대한 IRP_MN_QUERY_DEVICE_RELATIONS 요청에 대한 가장 최근의 응답에서 이 디바이스를 보고한 경우 디바이스는 여전히 컴퓨터에 물리적으로 존재합니다. 이 경우 버스 드라이버는 다음과 같습니다.

    • 디바이스가 물리적으로 제거될 때까지 디바이스에 대한 PDO를 유지합니다.

    • Irp-IoStatus.Status>를 STATUS_SUCCESS 설정합니다.

    • IoCompleteRequest를 사용하여 IRP를 완료합니다.

    • DispatchPnP 루틴에서 를 반환합니다.

    버스 드라이버는 디바이스가 물리적으로 제거될 때까지 후속 열거형(BusRelationsIRP_MN_QUERY_DEVICE_RELATIONS)에서 이 디바이스를 계속 보고해야 합니다. PnP 관리자는 열거된 디바이스가 추가되고 시작되었는지 여부를 추적합니다.

  5. 디바이스가 BusRelations에 대한 IRP_MN_QUERY_DEVICE_RELATIONS 요청에 대한 버스 드라이버의 최신 응답에 포함되지 않은 경우 버스 드라이버는 디바이스를 컴퓨터에서 물리적으로 제거한 것으로 간주합니다. 이 경우 버스 드라이버는 다음을 수행합니다.

    • 디바이스별 할당, 메모리, 이벤트 등을 정리합니다.

    • Irp-IoStatus.Status>를 STATUS_SUCCESS 설정합니다.

    • IoCompleteRequest를 사용하여 IRP를 완료합니다.

    • IoDeleteDevice를 사용하여 PDO를 해제합니다.

      드라이버가 최신 BusRelations 목록에서 디바이스를 생략한 경우 버스 드라이버는 PDO를 삭제해야 합니다. 사용자가 디바이스를 컴퓨터에 다시 연결하는 경우 버스 드라이버는 다음 BusRelations 쿼리에 대한 응답으로 새 PDO를 만들어야 합니다. 버스 드라이버가 디바이스의 새 instance 동일한 PDO를 다시 사용하는 경우 컴퓨터가 제대로 작동하지 않습니다.

    • DispatchPnP 루틴에서 를 반환합니다.

PnP 관리자가 IRP_MN_REMOVE_DEVICE 요청을 보낼 때 디바이스가 여전히 있는 경우 버스 드라이버는 PDO를 유지합니다. 나중에 디바이스가 버스에서 물리적으로 제거되면 PnP 관리자는 다른 IRP_MN_REMOVE_DEVICE 보냅니다. 후속 제거 IRP가 수신되면 버스 드라이버는 디바이스에 대한 PDO를 삭제합니다.

버스 드라이버는 이미 제거되어 PDO가 삭제되도록 표시된 디바이스에 대한 IRP_MN_REMOVE_DEVICE 처리할 수 있어야 합니다. 이러한 IRP에 대한 응답으로 버스 드라이버는 IRP를 성공하거나 STATUS_NO_SUCH_DEVICE 반환할 수 있습니다. 일부 구성 요소에는 여전히 개체에 대한 참조가 있기 때문에 버스 드라이버가 이전에 IoDeleteDevice를 호출했음에도 불구하고 디바이스에 대한 PDO가 아직 삭제되지 않았습니다. 따라서 버스 드라이버는 두 번째 IRP 제거를 처리하는 동안 PDO에 액세스할 수 있습니다. 버스 드라이버는 PDO에 대해 IoDeleteDevice 를 두 번째로 호출해서는 안 됩니다. I/O 시스템은 참조 수가 0에 도달하면 PDO를 삭제합니다.

버스 드라이버는 디바이스에 대한 IRP_MN_REMOVE_DEVICE 요청을 받을 때까지 자식 디바이스에 대한 데이터 구조를 제거하지 않습니다. 버스 드라이버는 디바이스가 제거되었음을 감지하고 IoInvalidateDeviceRelations를 호출할 수 있지만 PnP 관리자가 IRP_MN_REMOVE_DEVICE 요청을 보낼 때까지 디바이스의 PDO를 삭제해서는 안 됩니다.