Dela via


Ta bort lås

Borttagningslåsrutinerna är ett sätt att spåra antalet pågående I/O-operationer på en enhet och att avgöra när det är säkert att koppla från och ta bort drivrutinens enhetsobjekt. Systemet tillhandahåller dessa rutiner till drivrutinsförfattare som ett alternativ till att implementera sin egen spårningsmekanism.

En drivrutin kan använda den här mekanismen för två syften:

  1. För att säkerställa att drivrutinens DispatchPnP-rutin inte slutför en IRP_MN_REMOVE_DEVICE begäran medan låset hålls (till exempel medan en annan drivrutin har åtkomst till enheten).

  2. Räkna antalet orsaker till varför drivrutinen inte ska ta bort sitt enhetsobjekt och ange en händelse när antalet går till noll.

För att initiera ett borttagningslås ska en drivrutin allokera en IO_REMOVE_LOCK-struktur i enhetstillägg och sedan anropa IoInitializeRemoveLock. En drivrutin anropar vanligtvis IoInitializeRemoveLock i sin AddDevice-rutin när drivrutinen initierar resten av enhetstillägget för ett enhetsobjekt.

Drivrutinen måste anropa IoAcquireRemoveLock varje gång drivrutinen startar en I/O-åtgärd. Drivrutinen måste anropa IoReleaseRemoveLock varje gång den slutför en I/O-åtgärd. En förare kan låsa upp låset mer än en gång. Låsavlägsningsrutinerna upprätthåller en räkning över de pågående låsningarna. Varje anrop till IoAcquireRemoveLock ökar antalet och IoReleaseRemoveLock minskar antalet.

Drivrutinen bör också anropa IoAcquireRemoveLock när den skickar ut en referens till sin kod (för timers, DPCs, callbacks och så vidare). Drivrutinen måste sedan anropa IoReleaseRemoveLock när händelsen har återkommit.

I sin sändningskod för IRP_MN_REMOVE_DEVICE måste drivrutinen hämta låset igen och sedan anropa IoReleaseRemoveLockAndWait. Den här rutinen returneras inte förrän alla utestående förvärv av låset har släppts. Om du vill tillåta att köade I/O-åtgärder slutförs bör varje drivrutin anropa IoReleaseRemoveLockAndWaitnärden har godkänt IRP_MN_REMOVE_DEVICE begäran till nästa lägre drivrutin och innan den släpper minne anropar IoDetachDevice eller anropar IoDeleteDevice. När IoReleaseRemoveLockAndWait har anropats för ett visst borttagningslås misslyckas alla efterföljande anrop till IoAcquireRemoveLock för samma borttagningslås.

Efter att IoReleaseRemoveLockAndWait har returnerat, bör drivrutinen betrakta enheten som redo att tas bort och oförmögen att utföra I/O-åtgärder. Drivrutinen får därför inte anropa IoInitializeRemoveLock för att återinitiera borttagningslåset. Brott mot den här regeln när drivrutinen verifieras av drivrutinsverifieraren resulterar i en buggkontroll.

Eftersom en drivrutin lagrar en IO_REMOVE_LOCK struktur i enhetstillägget för ett enhetsobjekt tas borttagningslåset bort när drivrutinen tar bort enhetstillägget när en IRP_MN_REMOVE_DEVICE begäran bearbetas.