자식 디바이스(자식 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 루틴에서 반환합니다.
버스 드라이버는 디바이스가 물리적으로 제거될 때까지 이후의 열거형 (IRP_MN_QUERY_DEVICE_RELATIONS에서 BusRelations)에 이 디바이스에 대한 보고를 계속해야 합니다. PnP 관리자는 열거된 디바이스가 추가되고 시작되었는지 여부를 추적합니다.
BusRelations대한 IRP_MN_QUERY_DEVICE_RELATIONS 요청에 대한 버스 드라이버의 최신 응답에 디바이스가 포함되지 않은 경우 버스 드라이버는 디바이스를 컴퓨터에서 물리적으로 제거한 것으로 간주합니다. 이 경우 버스 드라이버는 다음을 수행합니다.
디바이스별 할당, 메모리, 이벤트 등을 정리합니다.
Irp->IoStatus.Status를 STATUS_SUCCESS로 설정합니다.
IoCompleteRequest사용하여 IRP를 완료합니다.
IoDeleteDevice를 사용하여 PDO를 해제합니다.
드라이버가 가장 최근 BusRelations 목록에서 디바이스를 생략한 경우 버스 드라이버는 PDO를 삭제해야 합니다. 사용자가 디바이스를 컴퓨터에 다시 연결하는 경우 버스 드라이버는 다음 BusRelations 쿼리에 대한 응답으로 새 PDO를 만들어야 합니다. 버스 드라이버가 디바이스의 새 인스턴스에 동일한 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를 삭제해서는 안 됩니다.