Aturan IrqlExAllocatePool (wdm)

Aturan IrqlExAllocatePool menentukan bahwa driver memanggil ExAllocatePoolWithTag dan ExAllocatePoolWithTagPriority hanya ketika dijalankan di IRQL<=DISPATCH_LEVEL.

Penelepon yang dijalankan di DISPATCH_LEVEL harus menentukan nilaiXxx NonPaged untuk PoolType. Penelepon yang dijalankan di IRQL <= APC_LEVEL dapat menentukan nilai POOL_TYPE apa pun.

Model driver: WDM

Pemeriksaan bug ditemukan dengan aturan ini: 0xC4 Pemeriksaan Bug: DRIVER_VERIFIER_DETECTED_VIOLATION (0x00020004), 0xA Pemeriksaan Bug: IRQL_NOT_LESS_OR_EQUAL

Contoh

Dalam contoh berikut, rutinitas ExAllocatePoolWithTag dipanggil setelah rutinitas KeAcquireSpinLock , yang mengatur IRQL ke DISPATCH_LEVEL. Rutinitas ExAllocatePoolWithTag dipanggil dengan PagedPool, yang melanggar aturan.

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;
}

Cara menguji

Pada waktu kompilasi

Jalankan Pemverifikasi Driver Statis dan tentukan aturan IrqlExAllocatePool .

Gunakan langkah-langkah berikut untuk menjalankan analisis kode Anda:
  1. Siapkan kode Anda (gunakan deklarasi jenis peran).
  2. Jalankan Pemverifikasi Driver Statis.
  3. Lihat dan analisis hasilnya.

Untuk informasi selengkapnya, lihat Menggunakan Pemverifikasi Driver Statis untuk Menemukan Cacat pada Driver.

Pada durasi

Jalankan Pemverifikasi Driver dan pilih opsi pemeriksaan kepatuhan DDI .

Berlaku untuk

ExAllocatePoolWithTagExAllocatePoolWithTagPriority

Lihat juga

Mengelola Prioritas Perangkat KerasMencegah Kesalahan dan Kebuntuan Saat Menggunakan Kunci Spin