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 :
  1. Préparez votre code (utilisez les déclarations de type).
  2. Exécutez le vérificateur de pilote statique.
  3. Affichez et analysez les résultats.

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