버스 드라이버에서 디바이스 제거
자식 디바이스(자식 PDO)를 제거할 때 부모 버스 드라이버는 디바이스를 추가하고 시작하기 위해 수행한 작업을 실행 취소해야 합니다.
버스 드라이버는 DispatchPnP 루틴에서 다음과 같은 프로시저를 사용하여 자식 디바이스를 제거합니다.
드라이버가 이 PDO에 대한 이전 IRP_MN_SURPRISE_REMOVAL 요청을 처리했는지 여부
그렇다면 나머지 클린 수행하고 4단계로 건너뜁니다.
드라이버는 일반적으로 디바이스 확장에서 드라이버가 디바이스에 대한 IRP_MN_SURPRISE_REMOVAL 요청을 처리했는지 여부를 나타내는 플래그를 유지 관리합니다.
드라이버에서 큐에 대기 중인 모든 요청을 완료합니다.
버스 드라이버가 이 작업을 수행할 수 있는 경우 디바이스에서 전원을 제거하고 PoSetPowerState를 호출하여 전원 관리자에게 알립니다.
버스 드라이버는 가능하면 자식 디바이스를 작동시키고 전원 관리자에게 디바이스의 전원 상태 변경에 대해 알릴 수 있습니다. 버스 드라이버는 IRP_MN_REMOVE_DEVICE 요청에 대한 응답으로 이 작업을 수행합니다. 디바이스의 전원 정책 소유자는 디바이스가 제거될 때 IRP_MN_SET_POWER 요청을 보내지 않습니다. 자세한 내용은 전원 관리를 참조하세요.
버스 드라이버가 BusRelations에 대한 IRP_MN_QUERY_DEVICE_RELATIONS 요청에 대한 가장 최근의 응답에서 이 디바이스를 보고한 경우 디바이스는 여전히 컴퓨터에 물리적으로 존재합니다. 이 경우 버스 드라이버는 다음과 같습니다.
디바이스가 물리적으로 제거될 때까지 디바이스에 대한 PDO를 유지합니다.
Irp-IoStatus.Status>를 STATUS_SUCCESS 설정합니다.
IoCompleteRequest를 사용하여 IRP를 완료합니다.
DispatchPnP 루틴에서 를 반환합니다.
버스 드라이버는 디바이스가 물리적으로 제거될 때까지 후속 열거형(BusRelations용 IRP_MN_QUERY_DEVICE_RELATIONS)에서 이 디바이스를 계속 보고해야 합니다. PnP 관리자는 열거된 디바이스가 추가되고 시작되었는지 여부를 추적합니다.
디바이스가 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를 삭제해서는 안 됩니다.