Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Wanneer u een apparaat verwijdert, moet een functiestuurprogramma alle bewerkingen ongedaan maken die worden uitgevoerd om het apparaat toe te voegen en te starten. Deze discussie omvat functiestuurprogramma's voor randapparatuur en functiestuurprogramma's voor busapparaten.
Een functiestuurprogramma verwijdert een apparaat met behulp van een procedure zoals de volgende in de DispatchPnP- routine:
Is dit een functiestuurprogramma voor een busapparaat?
Als dat het geval is, verwijdert u mogelijk eventuele uitstaande onderliggende PDO’s voor apparaten op de bus.
Als het busstuurprogramma een eerdere IRP_MN_SURPRISE_REMOVAL aanvraag voor het onderliggende apparaat heeft verwerkt, maar het stuurprogramma de volgende IRP_MN_REMOVE_DEVICE aanvraag nog niet heeft ontvangen, laat de buschauffeur de onderliggende PDO intact. Op een later tijdstip, wanneer alle grepen naar het kindapparaat zijn gesloten, verzendt de PnP-manager het verwijder-IRP voor het kindapparaat en verwijdert het busstuurprogramma vervolgens de kind-PDO.
Als het busstuurprogramma een vorige IRP_MN_REMOVE_DEVICE aanvraag voor het apparaat heeft verwerkt en er geen volgende IRP_MN_SURPRISE_REMOVAL aanvraag is, verwijdert het busstuurprogramma de onderliggende PDO. In dit geval zorgt de PnP-manager ervoor dat alle functie- en filterstuurprogramma's zijn verwijderd van het onderliggende apparaat (FDO en filter-DO's) voordat er een verwijder-IRP naar het bovenliggende busapparaat wordt verzonden. De child-PDO is mogelijk nog aanwezig, dus moet de buschauffeur de child-PDO verwijderen voordat hij het busapparaat verwijdert.
Heeft het stuurprogramma al een eerdere IRP_MN_SURPRISE_REMOVAL aanvraag voor deze FDO verwerkt?
Als dat het geval is, voert u de resterende opschoning uit en gaat u verder met stap 8, IoCallDriver.
Een stuurprogramma onderhoudt doorgaans een vlag in de apparaatextensie die aangeeft of het stuurprogramma een IRP_MN_SURPRISE_REMOVAL aanvraag voor het apparaat heeft verwerkt.
Als de bestuurder het apparaat eerder heeft ingeschakeld voor ontwaking, annuleert u de IRP_MN_WAIT_WAKE aanvraag.
Zorg ervoor dat het apparaat inactief is.
Als het apparaat nog niet inactief is als reactie op een eerdere IRP_MN_QUERY_REMOVE_DEVICE, moet de stuurprogramma het apparaat markeren als niet accepterend van nieuwe verzoeken en moet het de verzoeken voltooien die al in de wachtrij van deze stuurprogramma staan. Het stuurprogramma moet alle openstaande aanvragen die toegang tot het apparaat vereisen, afwijzen.
Een bestuurder kan de IoXxxRemoveLockXxx routines gebruiken om openstaande I/O te tellen en een gebeurtenis instellen die aangeeft dat de verwijderverwerking kan worden voortgezet.
Voer alle uitschakelbewerkingen uit.
Elk stuurprogramma voor het apparaat voert zijn afsluitbewerkingen uit, indien van toepassing, wanneer het de IRP_MN_REMOVE_DEVICE-aanvraag ontvangt. De eigenaar van het energiebeleid voor het apparaat, meestal het functiestuurprogramma, verzendt geen afzonderlijke IRP_MN_SET_POWER aanvraag om de energiestatus van het apparaat in te stellen op D3. De bovenliggende busbeheerder schakelt doorgaans de sleuf uit en geeft de powermanager een bericht met PoSetPowerState wanneer de busbeheerder het verwijder-IRP ontvangt. Zie Power Managementvoor meer informatie.
Schakel apparaatinterfaces uit door IoSetDeviceInterfaceStateaan te roepen.
Maak hardwarebronnen vrij voor het apparaat dat door de driver wordt gebruikt.
De exacte bewerkingen zijn afhankelijk van het apparaat en het stuurprogramma, maar kunnen een onderbreking verbreken met IoDisconnectInterrupt-, fysieke adresbereiken vrijmaken met MmUnmapIoSpaceen I/O-poorten vrijmaken.
Geef de IRP_MN_REMOVE_DEVICE aanvraag door aan het volgende stuurprogramma.
Stel de IRP-stacklocatie in voor het volgende lagere stuurprogramma met IoSkipCurrentIrpStackLocation en geef de IRP door aan het volgende stuurprogramma met IoCallDriver.
Een stuurprogramma hoeft niet te wachten tot onderliggende stuurprogramma's hun verwijderbewerkingen hebben voltooid voordat het verdergaat met zijn verwijderactiviteiten.
Verwijder het apparaatobject uit de apparaatstack met IoDetachDevice-.
Geef een aanwijzer op naar het volgende lagere apparaatobject als de parameter TargetDevice. Het stuurprogramma ontvangt een dergelijke aanwijzer van de aanroep naar IoAttachDeviceToDeviceStack in de AddDevice- routine van het stuurprogramma.
Eventuele apparaatspecifieke toewijzingen, geheugen, gebeurtenissen enzovoort opschonen.
Maak de FDO vrij met IoDeleteDevice.
Retour van de DispatchPnP- routine, waarbij de retourstatus van IoCallDriver-wordt doorgegeven.
Een functiestuurprogramma geeft geen IoCompletion- routine op voor een verwijder-IRP, noch voltooit het de IRP. Verwijder-IRP's worden voltooid door het busstuurprogramma van de ouder.