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.
En drivrutins DispatchPnP-rutin stöder Plug and Play genom att hantera IRP:er för IRP_MJ_PNP I/O-funktionskod. Associerad med IRP_MJ_PNP funktionskod är flera mindre I/O-funktionskoder (se Plug and Play Minor IRPs), varav vissa alla drivrutiner måste hantera och några av dem kan hanteras valfritt. PnP-hanteraren använder dessa mindre funktionskoder för att dirigera drivrutiner för att starta, stoppa och ta bort enheter och för att fråga drivrutiner om sina enheter.
Alla drivrutiner för en enhet måste ha möjlighet att hantera PnP-IRP:er för enheten, förutom i några fall där en funktions- eller filterdrivrutin tillåts att avvisa IRP.
Varje drivrutins DispatchPnP-rutin måste följa dessa regler:
En funktions- eller filterdrivrutin måste skicka PnP-IP-adresser till nästa drivrutin i enhetsstacken, såvida inte funktionen eller filterdrivrutinen hanterar IRP:n och stöter på ett fel (till exempel på grund av otillräckliga resurser).
Alla drivrutiner för en enhet måste ha möjlighet att hantera PnP-IP-adresser för enheten om inte någon av drivrutinerna får ett fel. PnP-hanteraren skickar IRPs till den högsta drivrutinen i en enhetsstapel. Funktions- och filterdrivrutiner skickar IRP till nästa drivrutin och den överordnade bussdrivrutinen slutför IRP. Mer information finns i Skicka PnP-IRP:er nedåt i enhetsstacken .
En drivrutin kan misslyckas med en IRP om den försöker hantera IRP och stöter på ett fel (till exempel otillräckliga resurser). Om en drivrutin tar emot en IRP med en kod som den inte hanterar får drivrutinen inte misslyckas med IRP. Den måste skicka en sådan IRP till nästa drivrutin utan att ändra IRP:s status.
En drivrutin måste hantera vissa PnP IRP:er och kan välja att hantera andra.
Varje PnP-drivrutin måste hantera vissa IRP:er, till exempel IRP_MN_REMOVE_DEVICE, och kan även hantera andra. Se Plug and Play Minor IRP:er för information om vilka IRP:er som krävs och är valfria för varje typ av drivrutin (funktionsdrivrutiner, filterdrivrutiner och bussdrivrutiner).
En drivrutin kan misslyckas med en obligatorisk PnP-IRP med lämplig felstatus, men en drivrutin får inte returnera STATUS_NOT_SUPPORTED för en sådan IRP.
När en drivrutin hanterar en PnP-IRP framgångsrikt ställer den in IRP-statusen till "lyckad". Det är inte beroende av någon annan drivrutin i stacken för att ställa in statusen.
En drivrutin ställer in Irp->IoStatus.Status till STATUS_SUCCESS för att informera PnP-hanteraren om att drivrutinen har hanterat IRP på ett framgångsrikt sätt. För vissa IRP:er kanske en icke-bussdrivrutin kan förlita sig på sin överordnade bussdrivrutin för att ange statusen till lyckad. Detta är dock en riskfylld praxis. För konsekvens och robusthet måste en drivrutin ställa in IRP-statusen så att den är 'framgång' för varje PnP-IRP som den hanterar korrekt.
Om en drivrutin misslyckas med en IRP slutför drivrutinen IRP med en felstatus och skickar inte IRP till nästa drivrutin.
För att neka en IRP som IRP_MN_QUERY_STOP_DEVICE, anger en drivrutin Irp-IoStatus.Status> till STATUS_UNSUCCESSFUL. Ytterligare felstatusvärden för andra IRPs inkluderar STATUS_INSUFFICIENT_RESOURCES och STATUS_INVALID_DEVICE_STATE.
Drivrutiner ställer inte in STATUS_NOT_SUPPORTED för IP-adresser som de hanterar. Det här är den inledande statusen som angetts av PnP-chefen. Om en IRP har slutförts med den här statusen innebär det att inga drivrutiner i stacken hanterade IRP. alla drivrutiner har precis skickat IRP till nästa drivrutin.
En drivrutin måste hantera en PnP-IRP i sin dispatch-rutin (på IRP:ns väg nedåt i enhetsstacken), i en IoCompletion-rutin (på IRP:ns väg tillbaka upp i enhetsstacken), eller både och, enligt IRP:s referenssida.
Vissa PnP-IRP:er, till exempel IRP_MN_REMOVE_DEVICE, måste först hanteras av drivrutinen överst på enhetsstacken och sedan av varje drivrutin på en lägre nivå. Andra, till exempel IRP_MN_START_DEVICE, måste hanteras först av den överordnade busschauffören. Ytterligare andra, till exempel IRP_MN_QUERY_CAPABILITIES, kan hanteras både på vägen ner i enhetsstacken och på vägen upp igen. Se Plug and Play Minor IRPs för de regler som gäller för varje PnP-IRP. Se Skjuta upp PnP IRP-bearbetning tills underliggande drivrutiner har slutförts för information om hantering av PnP-IRP:er som måste bearbetas först av den överordnade bussdrivrutinen.
En drivrutin måste lägga till information i en IRP på IRP:ns väg nedåt i enhetsstacken och ändra eller ta bort information om IRP:ns väg tillbaka.
Vid returnering av information som svar på en PnP-fråge-IRP måste en drivrutin följa denna konvention för att möjliggöra ordnad informationsöverföring mellan skiktade drivrutiner för en enhet.
Förutom när det uttryckligen dokumenteras får en drivrutin inte vara beroende av att PnP-IP-adresser skickas i någon viss ordning.
När en drivrutin skickar en PnP-IRP måste den skicka IRP till den översta drivrutinen i enhetsstacken.
De flesta PnP-IRP:er skickas av PnP-chefen, men vissa kan skickas av drivrutiner (till exempel IRP_MN_QUERY_INTERFACE). En drivrutin måste skicka en PnP-IRP till den översta drivrutinen i enhetsstacken. Anropa IoGetAttachedDeviceReference för att hämta en pekare till enhetsobjektet för drivrutinen överst i enhetsstacken.