Dispatch-rutiner och IRQLs

De flesta drivrutiners sändningsrutiner anropas i en godtycklig trådkontext vid IRQL = PASSIVE_LEVEL, med följande undantag:

  • Alla rutiner för att skicka drivrutiner på högsta nivå anropas i kontexten för den tråd som har sitt ursprung i I/O-begäran, som vanligtvis är en programtråd i användarläge.

    Med andra ord anropas sändningsrutinerna för filsystemdrivrutiner och andra drivrutiner på högsta nivå i en icke-linjär trådkontext på IRQL = PASSIVE_LEVEL.

  • Rutinerna DispatchRead, DispatchWrite och DispatchDeviceControl för drivrutiner på lägsta nivå och mellanliggande drivrutiner som ligger ovanför dem i systemväxlingssökvägen kan anropas på IRQL = APC_LEVEL och i en godtycklig trådkontext.

    DispatchRead- och/eller DispatchWrite-rutinerna och alla andra rutiner som även bearbetar läs- och/eller skrivbegäranden i en sådan enhet på lägsta nivå eller mellanliggande drivrutin måste vara bosatta hela tiden. Dessa drivrutinsrutiner kan varken vara sidladdningsbara eller ingå i en drivrutins sidladdningsbildssektion; de får inte komma åt något sidladdningsbart minne. Dessutom bör de inte vara beroende av några blockeringsanrop (till exempel KeWaitForSingleObject med en tidsgräns som inte överskrider noll).

  • DispatchPower-rutinen för drivrutiner i viloläge och/eller personsökvägar kan anropas vid IRQL = DISPATCH_LEVEL. DispatchPnP-rutinerna för sådana drivrutiner måste vara beredda att hantera PnP-IRP_MN_DEVICE_USAGE_NOTIFICATION begäranden.

  • DispatchPower-rutinen för drivrutiner som kräver strömrusning vid uppstart kan anropas på IRQL = DISPATCH_LEVEL.

Mer information finns i Hantera maskinvaruprioriteringar.