Règle IrqlExAllocatePool (wdm)
La règle IrqlExAllocatePool spécifie que le pilote appelle ExAllocatePoolWithTag et ExAllocatePoolWithTagPriority uniquement lorsqu’il s’exécute à IRQL<=DISPATCH_LEVEL.
Un appelant qui s’exécute à DISPATCH_LEVEL doit spécifier une valeurXxx nonpaged pour PoolType. Un appelant qui s’exécute dans IRQL <= APC_LEVEL peut spécifier n’importe quelle valeur POOL_TYPE .
Modèle de pilote : WDM
Bogues case activée trouvés avec cette règle : 0xC4 de vérification des bogues : DRIVER_VERIFIER_DETECTED_VIOLATION (0x00020004), 0xA de vérification des bogues : IRQL_NOT_LESS_OR_EQUAL
Exemple
Dans l’exemple suivant, la routine ExAllocatePoolWithTag est appelée après la routine KeAcquireSpinLock , qui définit IRQL sur DISPATCH_LEVEL. La routine ExAllocatePoolWithTag est appelée avec PagedPool, ce qui enfreint la règle.
NTSTATUS
DispatchRequest (
__in PDEVICE_REQUEST DeviceRequest
)
{
KIRQL OldIrql;
KSPIN_LOCK SpinLock;
NTSTATUS Status;
...
KeInitializeSpinLock(&SpinLock);
//
// KeAcquireSpinLock sets IRQL to DISPATCH_LEVEL and the previous IRQL is
// written to OldIrql after the lock is acquired.
//
KeAcquireSpinLock(&SpinLock, &OldIrql);
...
Status = ProcessRequest(DeviceRequest);
//
// KeReleaseSpinLock sets IRQL to the OldIrql returned by KeAcquireSpinLock.
//
KeReleaseSpinLock(&SpinLock, &OldIrql);
...
}
NTSTATUS
ProcessRequest (
__in PDEVICE_REQUEST DeviceRequest
)
{
NTSTATUS Status;
...
//
// RULE VIOLATION! - IrqlExAllocatePool executing at DISPATCH_LEVEL must specify
// a NonPagedXxx value for PoolType.
//
DeviceRequest->Context = ExAllocatePool(PagedPool, sizeof(REQUEST_CONTEXT));
if (DeviceRequest->Context == NULL) {
Status = STATUS_INSUFFICIENT_RESOURCES;
}
...
return Status;
}
Comment tester
Au moment de la compilation |
---|
Exécutez Static Driver Verifier et spécifiez la règle IrqlExAllocatePool . Utilisez les étapes suivantes pour exécuter l’analyse de votre code :
Pour plus d’informations, consultez Utilisation du vérificateur de pilote statique pour rechercher des défauts dans les pilotes. |
Au moment de l'exécution |
---|
Exécutez Driver Verifier et sélectionnez l’option de vérification de conformité DDI . |
S’applique à
ExAllocatePoolWithTagExAllocatePoolWithTagPriority
Voir aussi
Gestion des prioritésmatérielles Empêchant les erreurs et les interblocages lors de l’utilisation de verrous de rotation