Aracılığıyla paylaş


IRQL kural kümesi (WDM)

Sürücünüzün gerekli IRQL'de DDI çağrıları yaptığını doğrulamak için bu kuralları kullanın.

IRQL kurallarına uymayan bir sürücü, işlem sırasında kilitlenme koşullarına veya bilgisayar kilitlenmelerine yol açabilecek ciddi sorunlara neden olabilir.

Bu bölümde

Konu Açıklama

ForwardedAtBadIrql

ForwardedAtBadIrql kuralı, IRP ana işlev kodu aşağıdakilerden biri olmadığı sürece sürücünün IRQL<DISPATCH_LEVEL IoCallDriver ve PoCallDriver'ı çağırması gerektiğini belirtir:

ForwardedAtBadIrqlAllocate

ForwardedAtBadIrqlAllocate kuralı, IRP ana işlev kodu aşağıdakilerden biri olmadığı sürece sürücünün IRQL<DISPATCH_LEVEL'de IoCallDriver ve PoCallDriver'ı çağırması gerektiğini belirtir:

ForwardedAtBadIrqlFsdAsync

ForwardedAtBadIrqlFsdAsync kuralı, IRP ana işlev kodu aşağıdakilerden biri olmadığı sürece sürücünün IRQL<DISPATCH_LEVEL'de IoCallDriver ve PoCallDriver'ı çağırdığını belirtir:

ForwardedAtBadIrqlFsdSync

ForwardedAtBadIrqlFsdSync kuralı, IRP ana işlev kodu aşağıdakilerden biri olmadığı sürece sürücünün IRQL<DISPATCH_LEVEL'de IoCallDriver ve PoCallDriver'ı çağırdığını belirtir:

IrqlApcLte

IrqlApcLte kuralı, sürücünün yalnızca IRQL <= APC_LEVEL'de yürütülürken ObGetObjectSecurity ve ObReleaseObjectSecurity'yi çağırdığını belirtir.

IrqlDispatch

IrqlDispatch kuralı, sürücünün yalnızca IRQL = DISPATCH_LEVEL yürütülürken aşağıdaki DDI'leri çağırdığını belirtir.

IrqlExAllocatePool

IrqlExAllocatePool kuralı, sürücünün ExAllocatePoolWithTag ve ExAllocatePoolWithTagPriority'yi yalnızca IRQL<=DISPATCH_LEVEL konumunda yürütürken çağırdığını belirtir.

IrqlExApcLte1

IrqlExApcLte1 kuralı, sürücünün Yalnızca IRQL <= APC_LEVEL'de ExAcquireFastMutex ve ExTryToAcquireFastMutex'i çağırdığını belirtir.

IrqlExApcLte2

IrqlExApcLte2 kuralı, sürücünün yalnızca IRQL <= APC_LEVEL'de aşağıdaki yordamları çağırdığını belirtir.

IrqlExApcLte3

IrqlExApcLte3 kuralı, sürücünün yalnızca IRQL <= APC_LEVEL'de aşağıdaki yönetici destek yordamlarını çağırdığını belirtir.

IrqlExApcLteInline

IrqlExApcLteInline kuralı, DDI'lerin yalnızca uygun IRQL düzeylerinde çağrıldığını belirtir

IrqlExFree1

IrqlExFree1 kuralı, ExFreePool ve ExFreePoolWithTag'ın uygun IRQL'de çağrıldığını belirtir.

IrqlExFree2

IrqlExFree2 kuralı, ExFreePool ve ExFreePoolWithTag'ın uygun IRQL'de çağrıldığını belirtir.

IrqlExFree3

IrqlExFree3 kuralı, ExFreePool ve ExFreePoolWithTag'ın uygun IRQL'de çağrıldığını belirtir.

IrqlExPassive

IrqlExPassive kuralı, sürücünün yalnızca IRQL = PASSIVE_LEVEL'de aşağıdaki yönetici destek yordamlarını çağırdığını belirtir:

IrqlExPassive kuralı, sürücünün IRQL <= APC_LEVEL'de ExRaiseStatus'ı çağırdığını da belirtir

IrqlIoApcLte

IrqlIoApcLte kuralı, sürücünün aşağıdaki G/Ç yöneticisi yordamlarını yalnızca IRQL <= APC_LEVEL yürütülürken çağırdığını belirtir:

IrqlIoDispatch

IrqlIoDispatch kuralı, sürücünün yalnızca IRQL <= DISPATCH_LEVEL yürütülürken aşağıdaki G/Ç Yöneticisi yordamlarını çağırdığını belirtir: IoGetDeviceToVerify, IoSetDeviceToVerify.

IrqlIoPassive1

IrqlIoPassive1 kuralı, sürücünün yalnızca IRQL = PASSIVE_LEVEL yürütülürken aşağıdaki yordamları çağırdığını belirtir:

IrqlIoPassive2

IrqlIoPassive2 kuralı, sürücünün yalnızca IRQL = PASSIVE_LEVEL'de aşağıdaki G/Ç Yöneticisi yordamlarını çağırdığını belirtir:

IrqlIoPassive3

IrqlIoPassive3 kuralı, sürücünün yalnızca IRQL = PASSIVE_LEVEL yürütülürken aşağıdaki yordamları çağırdığını belirtir:

IrqlIoPassive4

IrqlIoPassive4 kuralı, sürücünün yalnızca IRQL = PASSIVE_LEVEL yürütülürken aşağıdaki yordamları çağırdığını belirtir:

IrqlIoPassive5

IrqlIoPassive5 kuralı, sürücünün yalnızca IRQL = PASSIVE_LEVEL'de yürütülürken belirli G/Ç Yöneticisi yordamlarını çağırdığını belirtir.

IrqlIoRtlZwPassive

IrqlIoRtlZwPassive kuralı, sürücünün yalnızca IRQL = PASSIVE_LEVEL'de yürütülürken belirli G/Ç Yöneticisi yordamlarını çağırdığını belirtir.

IrqlKeApcLte1

IrqlKeApcLte1 kuralı, sürücünün aşağıdaki çekirdek yordamlarını yalnızca IRQL <= APC_LEVEL yürütülürken çağırdığını belirtir:

IrqlKeApcLte2

IrqlKeApcLte2 kuralı, sürücünün aşağıdaki çekirdek yordamlarını yalnızca IRQL <= APC_LEVEL yürütülürken çağırdığını belirtir:

IrqlKeDispatchLte

IrqlKeDispatchLte kuralı, sürücünün aşağıdaki çekirdek yordamlarını yalnızca IRQL <= DISPATCH_LEVEL yürütülürken çağırdığını belirtir:

IrqlKeRaiseLower

IrqlKeRaiseLower kuralı, sürücünün IRQL'i yükseltirken ve indirirken aşağıdakileri yaptığını belirtir:

Sürücü KeRaiseIrql'i çağırdığında, NewIrql parametresinin değerinden düşük veya buna eşit bir IRQL'de yürütülür.
Sürücü KeLowerIrql'i yalnızca KeRaiseIrql veya KeRaiseIrqlToDpcLevel çağrısı yaptıktan sonra çağırır.

IrqlKeRaiseLower2

IrqlKeRaiseLower2 kuralı, sürücülerin KeRaiseIrql veya KeRaiseIrqlToDpcLevel'a önceki bir çağrıyla tetiklenen özgün IRQL'i geri yüklemek için KeLowerIrql kullandığını belirtir.

IrqlKeReleaseSpinLock

IrqlKeReleaseSpinLock kuralı, sürücünün KeReleaseSpinLock'u yalnızca IRQL = DISPATCH_LEVEL yürütülürken çağırdığını belirtir.

IrqlKeSetEvent

IrqlKeSetEvent kuralı, KeSetEvent yordamının yalnızca Waitdeğeri YANLIŞ olarak ayarlandığında IRQL <= DISPATCH_LEVEL ve Beklemetrue olarak ayarlandığında IRQL <= APC_LEVEL olarak çağrıldığını belirtir.

IrqlKeWaitForMutexObject

IrqlKeWaitForMutexObject kuralı, Timeout parametresinin değerine göre uygun IRQL'de KeWaitForMutexObject yordamını çağıracak sürücüyü belirtir:

IrqlKeWaitForMultipleObjects

IrqlKeWaitForMultipleObjects kuralı, KeWaitForMultipleObjects yordamının çağıranlarının Timeout parametresine göre uygun IRQL'de çalışması gerektiğini belirtir.

IrqlMmApcLte

IrqlMmApcLte kuralı, sürücünün yalnızca IRQL <= APC_LEVEL yürütülürken aşağıdaki bellek yöneticisi yordamlarını çağırdığını belirtir:

IrqlMmDispatch

IrqlMmDispatch kuralı, sürücünün yalnızca IRQL <= DISPATCH_LEVEL yürütülürken MmFreeContiguousMemory çağırdığını belirtir.

IrqlNtifsApcPassive

IIrqlNtifsApcPassive kuralı, sürücünün kuralda listelenen DDI'leri yalnızca IRQL = PASSIVE_LEVEL veya IRQL <= APC_LEVEL yürütürken çağırdığını belirtir.

IrqlObPassive

IrqlObPassive kuralı, sürücünün yalnızca IRQL = PASSIVE_LEVEL'de yürütülürken ObReferenceObjectByHandle'ı çağırdığını belirtir.

IrqlPsPassive

IrqlPsPassive kuralı, sürücünün yalnızca IRQL = PASSIVE_LEVEL'de yürütülürken belirli İşlem Yapısı yordamlarını çağırdığını belirtir.

IrqlReturn

IrqlReturn kuralı, sürücünün dağıtım yordamlarının çağrıldıkları aynı IRQL'de döndürüldüğünü belirtir.

IrqlRtlPassive

IrqlRtlPassive kuralı, sürücünün RtlDeleteRegistryValue'yi yalnızca IRQL = PASSIVE_LEVEL'de yürütülürken çağırdığını belirtir.

IrqlZwPassive

IrqlZwPassive kuralı, sürücünün yalnızca IRQL = PASSIVE_LEVEL yürütülürken ZwClose çağırdığını belirtir.

Irql kural kümesini seçmek için

  1. Microsoft Visual Studio'da sürücü projenizi (.vcxProj) seçin. Sürücüsü menüsünde tıklayın, Statik Sürücü Doğrulayıcıyı Başlat....

  2. Kurallar sekmesine tıklayın. Kural Kümeleri'nin altında Irql'i seçin.

    Visual Studio geliştirici komut istemi penceresinden varsayılan kural kümesini seçmek için /check seçeneğiyle Irql.sdv belirtin. Örneğin:

    msbuild /t:sdv /p:Inputs="/check:Irql.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
    

    Daha fazla bilgi için Sürücülerdeki Hataları Bulmak için Statik Sürücü Doğrulayıcı Kullanma ve Statik Sürücü Doğrulayıcı Komutları (MSBuild)bölümüne bakın.