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:
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