Anteckning
Å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.
Drivrutiner för fysiska enheter som genererar avbrott måste ha minst en avbrottstjänstrutin (ISR). ISR måste göra vad som är nödvändigt för enheten för att återställa avbrottet, eventuellt inklusive att stoppa enheten från att generera fler avbrott. Sedan bör den bara göra vad som krävs för att spara tillstånd och köa en DPC för att slutföra I/O-åtgärden med en lägre prioritet (IRQL) än den där ISR körs.
En drivrutins ISR körs i en avbrottskontext, vid någon systemtilldelad DIRQL, enligt parametern SynchronizeIrql till IoConnectInterruptEx.
ISR:er är avbrottsbara. En annan enhet med en högre systemtilldelad DIRQL kan avbryta, eller så kan ett systemavbrott med hög IRQL inträffa när som helst.
Innan systemet anropar en ISR hämtas avbrottets spinnlås så att ISR inte kan köras samtidigt på en annan processor. När ISR:en returnerar släpper systemet spinnlåset.
Eftersom en ISR körs på en relativt hög IRQL, som maskerar avbrott med en motsvarande eller lägre IRQL på den aktuella processorn, bör den returnera kontrollen så snabbt som möjligt. Dessutom begränsar körningen av en ISR på DIRQL den uppsättning supportrutiner som ISR kan anropa. Mer information finns i Hantera maskinvaruprioriteringar.
Vanligtvis utför en ISR följande allmänna steg:
Om enheten som orsakade avbrottet inte stöds av ISR returnerar ISR omedelbart FALSE.
Annars återställer ISR avbrottet om det behövs, sparar den enhetskontext som behövs och köar en DPC för att slutföra I/O-åtgärden vid en lägre IRQL. Mer information finns i DPC-objekt och DPC:er . ISR måste sedan returnera TRUE.
I drivrutiner som inte överlappar enhetens I/O-åtgärder bör ISR göra följande:
Avgör om avbrottet är falskt. I så fall returnerar du FALSE omedelbart så att ISR för enheten som avbröts anropas omedelbart. Annars fortsätter du att avbryta bearbetningen.
Stoppa enheten från att avbryta om det behövs.
Samla in den kontextinformation som rutinen DpcForIsr (eller CustomDpc) behöver för att slutföra I/O-bearbetningen för den aktuella åtgärden.
Lagra den här kontexten i ett område som är tillgängligt för DpcForIsr - eller CustomDpc-rutinen , vanligtvis i enhetstillägget för målenhetsobjektet för vilket bearbetning av den aktuella I/O-begäran orsakade avbrottet.
Om en drivrutin överlappar I/O-åtgärder måste kontextinformationen innehålla ett antal utestående begäranden som DPC-rutinen krävs för att slutföra, tillsammans med den kontext som DPC-rutinen behöver för att slutföra varje begäran. Om ISR anropas för att hantera ett annat avbrott innan DPC har körts får den inte skriva över den sparade kontexten för en begäran som ännu inte har slutförts av DPC.
Om drivrutinen har en DpcForIsr-rutin anropar du IoRequestDpc med pekare till aktuell IRP, målenhetsobjektet och den sparade kontexten. IoRequestDpc köar rutinen DpcForIsr, som ska köras så snart IRQL faller under DISPATCH_LEVEL på en processor.
Om drivrutinen har en CustomDpc-rutinanropar du KeInsertQueueDpc med en pekare till DPC-objektet (associerat med CustomDpc-rutinen ) och pekare till valfri sparad kontext som CustomDpc-rutinen behöver för att slutföra åtgärden. Vanligtvis överför ISR också pekare till det aktuella IRP och målenhetsobjektet. CustomDpc-rutinen körs så snart IRQL understiger DISPATCH_LEVEL på en processor.
Returnera TRUE för att ange att enheten genererade avbrottet.
I allmänhet utför en ISR ingen faktisk I/O-bearbetning för att uppfylla en IRP. I stället stoppar den enheten från att avbryta, ställer in nödvändig tillståndsinformation och köar drivrutinens DpcForIsr eller CustomDpc för att göra den I/O-bearbetning som krävs för att uppfylla den aktuella begäran som gjorde att enheten avbröt.
En ISR måste köras vid DIRQL för kortast möjliga intervall. Om du följer den här riktlinjen ökar I/O-dataflödet för varje enhet på datorn eftersom körning vid DIRQL maskerar alla avbrott som systemet har tilldelat ett mindre eller lika med IRQL-värde.
SynkroniseraIrql för drivrutinens avbrottsobjekt, som anges när drivrutinen kallas IoConnectInterrupt, avgör dirql där drivrutinens ISR körs. Mer information finns i Synkronisera åtkomst till enhetsdata.