Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
När du tar bort en underordnad enhet (PDO) måste den överordnade drivrutinen ångra alla åtgärder som den utförde för att lägga till och starta enheten.
En busschaufför tar bort en barnenhet med hjälp av en procedur som den följande i sin DispatchPnP-rutin:
Har drivrutinen hanterat en tidigare IRP_MN_SURPRISE_REMOVAL-begäran för denna PDO?
I så fall utför du eventuell återstående rensning och går vidare till steg 4.
En drivrutin har vanligtvis en flagga i enhetstillägget som anger om drivrutinen har hanterat en IRP_MN_SURPRISE_REMOVAL begäran för enheten.
Slutför alla begäranden i kö i drivrutinen.
Ta bort strömmen från enheten, om busschauffören kan göra det, och meddela energihanteraren genom att anropa PoSetPowerState.
Busschauffören stänger av den underordnade enheten, om möjligt, och meddelar energihanteraren om enhetens ändrade energisparläge. Busschauffören gör detta som svar på IRP_MN_REMOVE_DEVICE begäran. enhetens energiprincipägare skickar inte någon IRP_MN_SET_POWER begäran när enheten tas bort. Mer information finns i Power Management.
Om busschauffören rapporterade den här enheten i sitt senaste svar på en begäran om IRP_MN_QUERY_DEVICE_RELATIONS för BusRelations, finns enheten fortfarande fysiskt på datorn. I det här fallet, busschauffören:
Behåller PDO:n för enheten tills enheten har tagits bort fysiskt.
Sätter Irp-IoStatus.Status> till STATUS_SUCCESS.
Slutför IRP med IoCompleteRequest.
Returnerar från rutinen DispatchPnP.
Busschauffören måste fortsätta att rapportera den här enheten i efterföljande uppräkningar (IRP_MN_QUERY_DEVICE_RELATIONS för BusRelations) tills enheten tas bort fysiskt. PnP-chefen håller reda på om en uppräknad enhet har lagts till och startats.
Om enheten inte ingick i busschaufförens senaste svar på en IRP_MN_QUERY_DEVICE_RELATIONS begäran om BusRelations anser busschauffören att enheten tas bort fysiskt från datorn. I det här fallet gör busschauffören följande:
Rensar enhetsspecifika allokeringar, minne, händelser och så vidare.
Tilldelar Irp-IoStatus.Status> värdet STATUS_SUCCESS.
Slutför IRP med IoCompleteRequest.
Frigör PDO med IoDeleteDevice.
Busschauffören måste ta bort PDO:n om föraren utelämnade enheten från sin senaste BusRelations-lista. Om en användare ansluter enheten till datorn igen måste bussdrivrutinen skapa en ny PDO som svar på nästa BusRelations-fråga . Om en busschaufför återanvänder samma PDO för en ny instans av en enhet fungerar inte datorn korrekt.
Returnerar från rutinen DispatchPnP.
Om enheten fortfarande finns kvar när PnP-hanteraren skickar IRP_MN_REMOVE_DEVICE begäran behåller busschauffören PDO:n. Om enheten vid ett senare tillfälle tas bort fysiskt från bussen skickar PnP-hanteraren en annan IRP_MN_REMOVE_DEVICE. Vid mottagandet av den efterföljande borttagnings-IRP:n tar bussdrivrutinen bort PDO:n för enheten.
En busschaufför måste kunna hantera en IRP_MN_REMOVE_DEVICE för en enhet som den redan har tagit bort och vars PDO har markerats för borttagning. Som svar på en sådan IRP kan busschauffören genomföra IRP:n eller returnera STATUS_NO_SUCH_DEVICE. PDO:n för enheten har ännu inte tagits bort i det här fallet, trots busschaufförens tidigare anrop till IoDeleteDevice, eftersom någon komponent fortfarande har en referens till objektet. Busschauffören kan därför komma åt PDO samtidigt som hen hanterar den andra IRP-borttagningen. Busschauffören får inte anropa IoDeleteDevice en andra gång för PDO:en. I/O-systemet tar bort PDO:n när dess referensantal når noll.
En busschaufför tar inte bort sina datastrukturer för en underordnad enhet förrän den tar emot en IRP_MN_REMOVE_DEVICE begäran för enheten. En bussdrivrutin kan identifiera att en enhet har tagits bort och anropa IoInvalidateDeviceRelations, men den får inte ta bort enhetens PDO förrän PnP-chefen skickar en IRP_MN_REMOVE_DEVICE begäran.