Synchronisation et DPC threads
Pour synchroniser l’accès à un emplacement de mémoire accessible à partir de l’intérieur et de l’extérieur d’une routine CustomThreadedDpc , un pilote peut utiliser des verrous de rotation ordinaires ou des verrous de rotation en file d’attente. Dans ce cas, le pilote doit respecter certaines règles pour synchroniser correctement à IRQL = PASSIVE_LEVEL et à IRQL = DISPATCH_LEVEL, car une routine CustomThreadedDpc peut s’exécuter sur les deux IRQL.
Pour un verrou de rotation ordinaire, les règles suivantes s’appliquent :
Pour acquérir et libérer le verrou de rotation, le pilote peut appeler KeAcquireSpinLock et KeReleaseSpinLock à l’intérieur et à l’extérieur de la routine CustomThreadedDpc .
Le pilote peut appeler KeAcquireSpinLockForDpc et KeReleaseSpinLockForDpc à partir de la routine CustomThreadedDpc . Notez que la routine CustomThreadedDpc ne doit pas appeler KeAcquireSpinLockAtDpcLevel ou KeReleaseSpinLockFromDpcLevel, car ces routines peuvent être appelées en toute sécurité uniquement dans IRQL = DISPATCH_LEVEL.
Les règles pour les verrous de rotation en file d’attente sont similaires :
Pour acquérir et libérer le verrou de rotation, le pilote peut appeler KeAcquireInStackQueuedSpinLock et KeReleaseInStackQueuedSpinLock à partir de l’intérieur et de l’extérieur de la routine CustomThreadedDpc .
Le pilote peut appeler KeAcquireInStackQueuedSpinLockForDpc et KeReleaseInStackQueuedSpinLockForDpc à partir de la routine CustomThreadedDpc . Notez que la routine CustomThreadedDpc ne doit pas appeler KeAcquireInStackQueuedSpinLockAtDpcLevel ou KeReleaseInStackQueuedSpinLockFromDpcLevel, car ces routines peuvent être appelées en toute sécurité uniquement à l’adresse IRQL = DISPATCH_LEVEL.
Étant donné que KeAcquireSpinLockForDpc et KeAcquireInStackQueuedSpinLockForDpc ne réinitialisent pas l’IRQL lorsqu’ils sont appelés à DISPATCH_LEVEL, ils s’exécutent plus rapidement que KeAcquireSpinLock et KeAcquireInStackQueuedSpinLock, respectivement.
Pour plus d’informations sur les verrous de rotation, consultez Spin Locks.