Delen via


Een apparaat verwijderen in een busstuurprogramma

Wanneer u een child-apparaat (child PDO) verwijdert, moet het busstuurprogramma de bewerkingen ongedaan maken die zijn uitgevoerd om het apparaat toe te voegen en te starten.

Een buschauffeur verwijdert een kindapparaat met een procedure zoals de volgende in zijn DispatchPnP--routine:

  1. Heeft het stuurprogramma eerder een IRP_MN_SURPRISE_REMOVAL-aanvraag voor deze PDO verwerkt?

    Als dat het geval is, voert u een resterende opschoonbewerking uit en gaat u verder met stap 4.

    Een stuurprogramma houdt doorgaans een vlag bij in de apparaatextensie die aangeeft of het stuurprogramma een IRP_MN_SURPRISE_REMOVAL-aanvraag voor het apparaat heeft verwerkt.

  2. Voltooi alle aanvragen in de wachtrij in het stuurprogramma.

  3. Verwijder de stroom van het apparaat, als de buschauffeur dit kan doen en informeer de power manager door PoSetPowerStateaan te roepen.

    De buschauffeur schakelt het onderliggende apparaat, indien mogelijk, uit en meldt de energiebeheerder over de verandering in de energiestatus van het apparaat. De buschauffeur doet dit in reactie op de IRP_MN_REMOVE_DEVICE aanvraag; De eigenaar van het energiebeleid van het apparaat verzendt geen IRP_MN_SET_POWER aanvraag wanneer het apparaat wordt verwijderd. Zie Power Managementvoor meer informatie.

  4. Als het busstuurprogramma dit apparaat heeft gerapporteerd in de meest recente reactie op een IRP_MN_QUERY_DEVICE_RELATIONS-aanvraag voor BusRelations, is het apparaat nog steeds fysiek aanwezig op de computer. In dit geval is het buschauffeur:

    • Behoudt de PDO voor het apparaat totdat het apparaat fysiek is verwijderd.

    • Stelt Irp->IoStatus.Status in op STATUS_SUCCESS.

    • Voltooit de IRP met IoCompleteRequest.

    • Retourneert van de DispatchPnP routine.

    De buschauffeur moet dit apparaat blijven melden in volgende enumeraties (IRP_MN_QUERY_DEVICE_RELATIONS voor BusRelations) totdat het apparaat fysiek wordt verwijderd. De PnP-manager houdt bij of er een geïnventariseerd apparaat is toegevoegd en gestart.

  5. Als het apparaat niet is opgenomen in het meest recente antwoord van het busstuurprogramma op een IRP_MN_QUERY_DEVICE_RELATIONS-aanvraag voor BusRelations, beschouwt het busstuurprogramma het apparaat als fysiek uit de machine verwijderd. In dit geval doet de buschauffeur het volgende:

    • Hiermee worden apparaatspecifieke toewijzingen, geheugen, gebeurtenissen enzovoort opgeschoond.

    • Stelt Irp->IoStatus.Status in op STATUS_SUCCESS.

    • Voltooit de IRP met IoCompleteRequest.

    • Hiermee wordt de PDO met IoDeleteDevice-vrijgemaakt.

      Het busstuurprogramma moet de PDO verwijderen als het stuurprogramma het apparaat weglaat uit de meest recente BusRelations lijst. Als een gebruiker het apparaat opnieuw op de computer aansluit, moet het busstuurprogramma een nieuwe PDO maken als reactie op de volgende BusRelations query. Als een busbestuurder dezelfde PDO opnieuw gebruikt voor een nieuwe instantie van een apparaat, werkt de machine niet goed.

    • Retour van de routine DispatchPnP.

Als het apparaat nog steeds aanwezig is wanneer de PnP-manager de IRP_MN_REMOVE_DEVICE aanvraag verzendt, behoudt het busstuurprogramma de PDO. Als het apparaat op een later tijdstip fysiek uit de bus wordt verwijderd, verzendt de PnP-manager nog een IRP_MN_REMOVE_DEVICE. Na ontvangst van de volgende verwijder IRP, verwijdert de bus-driver de PDO voor het apparaat.

Een busstuurprogramma moet een IRP_MN_REMOVE_DEVICE kunnen verwerken voor een apparaat dat al is verwijderd en waarvan de PDO voor verwijdering is gemarkeerd. Als reactie op een dergelijk IRP kan de buschauffeur de IRP voltooien of STATUS_NO_SUCH_DEVICE retourneren. De PDO voor het apparaat is in dit geval nog niet verwijderd, ondanks de eerdere aanroep van het busstuurprogramma naar IoDeleteDevice, omdat een onderdeel nog steeds een verwijzing naar het object heeft. Daarom heeft de busbestuurder toegang tot de PDO terwijl hij de tweede verwijder-IRP afhandelt. De buschauffeur mag niet IoDeleteDevice een tweede keer bellen voor de PDO; het I/O-systeem verwijdert de PDO wanneer het aantal verwijzingen nul bereikt.

Een busstuurprogramma verwijdert de gegevensstructuren voor een kindapparaat pas nadat het een IRP_MN_REMOVE_DEVICE aanvraag voor het apparaat ontvangt. Een busstuurprogramma detecteert mogelijk dat een apparaat is verwijderd en roept IoInvalidateDeviceRelationsaan, maar mag de PDO van het apparaat pas verwijderen als de PnP-manager een IRP_MN_REMOVE_DEVICE aanvraag verzendt.