Een IRP_MN_QUERY_REMOVE_DEVICE-aanvraag verwerken
De PnP-manager verzendt deze IRP- om stuurprogramma's te informeren dat een apparaat van de machine wordt verwijderd en te vragen of het apparaat kan worden verwijderd zonder de machine te verstoren. Deze IRP wordt ook verzonden wanneer een gebruiker vraagt stuurprogramma's voor het apparaat bij te werken.
De PnP-manager verzendt deze IRP bij IRQL PASSIVE_LEVEL in de context van een systeemthread.
Het doet het volgende voordat deze IRP naar de stuurprogramma's voor een apparaat wordt verzonden:
Hiermee worden alle toepassingen in de gebruikersmodus op de hoogte gebracht die zijn geregistreerd voor meldingen op het apparaat (of een gerelateerd apparaat).
Dit omvat toepassingen die zijn geregistreerd voor melding op het apparaat, op een van de afstammelingen van het apparaat (onderliggend apparaat, onderliggend kind, enzovoort), of op een van de verwijderingsrelaties van het apparaat. Een toepassing registreert zich voor een dergelijke melding door CM_Register_Notification of RegisterDeviceNotificationaan te roepen.
Als reactie op deze melding bereidt een toepassing zich voor op het verwijderen van apparaten (sluit ingangen voor het apparaat) of mislukt de query. Zie Registreren voor melding van ontvangst van apparaatinterface en apparaatverwijdering voor meer informatie over het afhandelen van deze meldingen.
Verstrekt meldingen aan alle stuurprogramma's in de kernelmodus die zijn geregistreerd voor meldingen op het apparaat (of een gerelateerd apparaat).
Dit omvat stuurprogramma's die zijn geregistreerd voor melding op het apparaat, op een van de afstammelingen van het apparaat of op een van de verwijderingsrelaties van het apparaat. Een stuurprogramma registreert zich voor deze melding door IoRegisterPlugPlayNotification aan te roepen met een gebeurteniscategorie van EventCategoryTargetDeviceChange.
Als reactie op deze melding bereidt een stuurprogramma zich voor op het verwijderen van het apparaat (sluit ingangen voor het apparaat) of mislukt de query.
Stuurt IRP_MN_QUERY_REMOVE_DEVICE IRP's naar de stuurprogramma's voor de nakomelingen van het apparaat. Zie hieronder voor meer informatie over hoe een apparaatstack deze IRP verwerkt.
(Windows 2000- en hogersystemen) Als een bestandssysteem op het apparaat is gekoppeld, verzendt de PnP-manager een aanvraag voor het verwijderen van query's naar het bestandssysteem en eventuele filters van het bestandssysteem. Als er open handles voor het apparaat zijn, verwerpt het bestandssysteem doorgaans het verwijderingsverzoek. Als dat niet het geval is, vergrendelt het bestandssysteem het volume meestal om te voorkomen dat toekomstige creaties slagen. Als een gekoppeld bestandssysteem geen ondersteuning biedt voor een aanvraag voor het verwijderen van query's, mislukt de PnP-manager de aanvraag voor het verwijderen van query's voor het apparaat.
Als alle bovenstaande stappen slagen, stuurt de PnP-manager de IRP_MN_QUERY_REMOVE_DEVICE naar de stuurprogramma's voor het apparaat.
Een IRP_MN_QUERY_REMOVE_DEVICE-aanvraag wordt eerst verwerkt door het bovenste stuurprogramma in de apparaatstack en vervolgens door elk volgend lager stuurprogramma. Een stuurprogramma behandelt verwijderings-IRP's in de DispatchPnP- routine.
Als reactie op een verzoek tot verwijdering van een apparaat (IRP_MN_QUERY_REMOVE_DEVICE) moet een stuurprogramma het volgende doen:
Bepaal of het apparaat veilig van de machine kan worden verwijderd.
Een stuurprogramma moet een query-remove IRP afwijzen als een van de volgende waar is:
Als het apparaat wordt verwijderd, kunnen er gegevens verloren gaan.
Als een component een open verbinding met het apparaat heeft. (Dit is alleen een probleem in Windows 98/Me. Windows 2000 en nieuwere versies van Windows houden open bestandskoppelingen bij en de query mislukt als er open bestandskoppelingen zijn nadat de IRP_MN_QUERY_REMOVE_DEVICE is afgerond.)
Als een stuurprogramma is gewaarschuwd (via een IRP_MN_DEVICE_USAGE_NOTIFICATION IRP) dat het apparaat zich in het pad bevindt voor een paginerings-, crashdump- of hibernatiebestand.
Als het stuurprogramma een uitstekende interfacereferentie heeft voor het apparaat. Dat wil zeggen, het stuurprogramma heeft een interface opgegeven in reactie op een IRP_MN_QUERY_INTERFACE verzoek en de interface is niet ongederefereerd.
Als het apparaat niet kan worden verwijderd, laat dan de query-verwijder-IRP mislukken.
Stel Irp->IoStatus.Status in op een juiste foutstatus (meestal STATUS_UNSUCCESSFUL), roep IoCompleteRequest- aan met IO_NO_INCREMENT en keer terug van de DispatchPnP- routine van het stuurprogramma. Geef de IRP niet door aan de volgende lagere bestuurder.
Als het stuurprogramma eerder een IRP_MN_WAIT_WAKE aanvraag heeft verzonden om het apparaat in te schakelen voor ontwaakbewerking, annuleert u de wacht-wake-IRP.
Noteer de vorige PnP-status van het apparaat.
Een stuurprogramma moet de PnP-status vastleggen waarin het apparaat zich bevond toen het stuurprogramma de IRP_MN_QUERY_REMOVE_DEVICE aanvraag ontving, omdat het stuurprogramma het apparaat naar die status moet retourneren als de query wordt geannuleerd (IRP_MN_CANCEL_REMOVE_DEVICE). De vorige status is doorgaans 'gestart'. Dit is de status die het apparaat invoert wanneer het stuurprogramma een IRP_MN_START_DEVICE aanvraag heeft voltooid.
Andere eerdere statussen zijn echter mogelijk. De gebruiker kan bijvoorbeeld het apparaat via Apparaatbeheer hebben uitgeschakeld. Of, als reactie op een IRP_MN_QUERY_CAPABILITIES aanvraag, kan het bovenliggende busstuurprogramma (of een filterstuurprogramma op het busstuurprogramma) hebben gemeld dat de hardware van het apparaat is uitgeschakeld. In beide gevallen kan het stuurprogramma voor het uitgeschakelde apparaat een IRP_MN_QUERY_REMOVE_DEVICE aanvraag ontvangen voordat er een IRP_MN_START_DEVICE aanvraag wordt ontvangen.
Voltooi de IRP:
In een functie of filterstuurprogramma:
Stel Irp->IoStatus.Status in op STATUS_SUCCESS.
Stel de volgende stacklocatie in met IoSkipCurrentIrpStackLocation,, en geef de IRP door aan de volgende lagere driver met IoCallDriver,.
Geef de status van IoCallDriver- door als de retourstatus van de DispatchPnP- routine.
Voltooi de IRP niet.
In een buschauffeur:
Stel Irp->IoStatus.Status in op STATUS_SUCCESS.
Voltooi het IRP (IoCompleteRequest) met IO_NO_INCREMENT.
Terugkeren van de DispatchPnP- routine.
Als een stuurprogramma in de apparaatstack een IRP_MN_QUERY_REMOVE_DEVICEmislukt, stuurt de PnP-manager een IRP_MN_CANCEL_REMOVE_DEVICE naar de apparaatstack. Hiermee voorkomt u dat stuurprogramma's een IoCompletion--routine nodig hebben voor een query-remove IRP om te detecteren of een lager stuurprogramma de IRP niet heeft verwerkt.
Zodra een stuurprogramma slaagt in een IRP_MN_QUERY_REMOVE_DEVICE en het apparaat als in "verwijderen in afwachting" beschouwt, moet het stuurprogramma alle daaropvolgende creatieverzoeken voor het apparaat afwijzen. Het stuurprogramma verwerkt alle andere IRP's zoals gebruikelijk, totdat het stuurprogramma een IRP_MN_CANCEL_REMOVE_DEVICE of een IRP_MN_REMOVE_DEVICEontvangt.