Udostępnij przez


Usuwanie urządzenia z sterownika magistrali

Podczas usuwania urządzenia podrzędnego (PDO podrzędnego) główny sterownik magistrali musi cofnąć wszystkie operacje, które zostały wykonane, aby dodać i uruchomić urządzenie.

Kierowca autobusu usuwa urządzenie podrzędne, stosując taką procedurę, jak poniższa w swojej procedurze DispatchPnP:

  1. Czy sterownik obsłużył poprzednie żądanie IRP_MN_SURPRISE_REMOVAL dla tego PDO?

    Jeśli tak, wykonaj pozostałe czyszczenie i przejdź do kroku 4.

    Sterownik zwykle utrzymuje flagę w rozszerzeniu urządzenia, która wskazuje, czy sterownik obsłużył żądanie IRP_MN_SURPRISE_REMOVAL dla urządzenia.

  2. Zrealizuj wszystkie żądania oczekujące w kolejce w sterowniku.

  3. Usuń zasilanie z urządzenia, jeśli sterownik magistrali jest w stanie to zrobić, i powiadomić menedżera zasilania przez wywołanie PoSetPowerState.

    Sterownik magistrali wyłącza urządzenie podrzędne, jeśli to możliwe, i powiadamia menedżera zasilania o zmianie stanu zasilania urządzenia. Kierowca autobusu robi to w odpowiedzi na żądanie IRP_MN_REMOVE_DEVICE ; właściciel zasad zasilania urządzenia nie wysyła żądania IRP_MN_SET_POWER po usunięciu urządzenia. Aby uzyskać dodatkowe informacje, zobacz Power Management.

  4. Jeśli sterownik magistrali zgłosił to urządzenie w najnowszej odpowiedzi na żądanie IRP_MN_QUERY_DEVICE_RELATIONS dotyczącym BusRelations, urządzenie jest nadal fizycznie obecne na maszynie. W tym przypadku kierowca autobusu:

    • Zachowuje PDO dla urządzenia aż do jego fizycznego usunięcia.

    • Ustawia parametr Irp-IoStatus.Status> na STATUS_SUCCESS.

    • Kończy proces IRP za pomocą funkcji IoCompleteRequest.

    • Zwraca wartość z procedury DispatchPnP .

    Sterownik magistrali musi nadal zgłaszać to urządzenie w kolejnych wyliczeniach (IRP_MN_QUERY_DEVICE_RELATIONS dla busRelations), dopóki urządzenie nie zostanie fizycznie usunięte. Menedżer PnP śledzi, czy urządzenie enumerowane zostało dodane i uruchomione.

  5. Jeśli urządzenie nie zostało uwzględnione w najnowszej odpowiedzi sterownika magistrali na żądanie IRP_MN_QUERY_DEVICE_RELATIONS dla BusRelations, sterownik magistrali uznaje, że urządzenie jest fizycznie usunięte z maszyny. W takim przypadku kierowca autobusu wykonuje następujące czynności:

    • Czyści alokacje specyficzne dla urządzenia, pamięć, zdarzenia itd.

    • Ustawia parametr Irp-IoStatus.Status> na STATUS_SUCCESS.

    • Kończy proces IRP za pomocą funkcji IoCompleteRequest.

    • Zwalnia PDO przy użyciu IoDeleteDevice.

      Kierowca autobusu musi usunąć PDO, jeśli pominął urządzenie na najnowszej liście BusRelations. Jeśli użytkownik ponownie podłączy urządzenie do maszyny, sterownik magistrali musi utworzyć nowe PDO w odpowiedzi na następne zapytanie BusRelations. Jeśli sterownik magistrali ponownie wykorzystuje to samo PDO dla nowego wystąpienia urządzenia, urządzenie nie będzie działać prawidłowo.

    • Zwraca wartość z procedury DispatchPnP .

Jeśli urządzenie jest nadal obecne, gdy Menedżer PnP wysyła żądanie IRP_MN_REMOVE_DEVICE, sterownik magistrali zachowuje PDO. Jeśli w późniejszym czasie urządzenie zostanie fizycznie usunięte z magistrali, menedżer PnP wyśle kolejny IRP_MN_REMOVE_DEVICE. Po otrzymaniu kolejnej operacji usuwania protokołu IRP sterownik magistrali usuwa obiekt PDO dla urządzenia.

Kierowca magistrali musi mieć możliwość obsługi IRP_MN_REMOVE_DEVICE dla urządzenia, które zostało już usunięte i którego pdO jest oznaczone do usunięcia. W odpowiedzi na taki IRP sterownik magistrali może zakończyć IRP z powodzeniem lub zwrócić STATUS_NO_SUCH_DEVICE. Opis uruchomieniowy urządzenia nie został jeszcze usunięty w tym przypadku, pomimo że sterownik magistrali wcześniej wywołał IoDeleteDevice, ponieważ jakiś komponent nadal ma odwołanie do obiektu. W związku z tym kierowca autobusu może uzyskać dostęp do obiektu PDO podczas obsługi drugiego usuwania IRP. Sterownik magistrali nie może wywołać IoDeleteDevice ponownie w przypadku PDO; system we/wy usuwa obiekt PDO, gdy jego liczba odwołań osiągnie zero.

Sterownik magistrali nie usuwa struktur danych dla urządzenia podrzędnego, dopóki nie otrzyma żądania IRP_MN_REMOVE_DEVICE dla urządzenia. Sterownik magistrali może wykryć, że urządzenie zostało usunięte i wywołać metodę IoInvalidateDeviceRelations, ale nie może usunąć PDO urządzenia, dopóki menedżer PnP nie wyśle żądania IRP_MN_REMOVE_DEVICE.