Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Sürücü Doğrulayıcı'nın Çeşitli Denetimler seçeneği, sürücü veya sistemin kilitlenmesine neden olan yaygın hatalar (etkin çekirdek nesneleri içeren belleği boşaltma gibi) için sürücüyü izler.
Özel olarak, Çeşitli Denetimler seçeneği aşağıdaki hatalı sürücü davranışını arar:
Boş bellekteki etkin iş öğeleri. Sürücü, IoQueueWorkItem kullanılarak kuyruğa alınan iş öğelerini içeren bir havuz bloğunu boşaltmak için ExFreePool'u çağırır.
Boş bellekteki etkin kaynaklar. Sürücü, etkin ERESOURCE yapıları içeren bir havuz bloğunu boşaltmak için ExFreePool'u çağırır. Sürücü, ExFreePool'u çağırmadan önce ERESOURCE nesnelerini silmek için ExDeleteResource'u çağırmalıdır.
Serbest bellekteki etkin görünüm listeleri. Sürücü, halen etkin görünüm listeleri (NPAGED_LOOKASIDE_LIST veya PAGED_LOOKASIDE_LIST yapıları) içeren bir havuz bloğunu boşaltmak amacıyla ExFreePool'u çağırır. Sürücü ExFreePool'u çağırmadan önce lookaside listelerini silmek için ExDeleteNPagedLookasideList veya ExDeletePagedLookasideList çağırmalıdır.
Windows Yönetim Araçları (WMI) ve Windows için Olay İzleme (ETW) kayıt sorunları. Sürücü Doğrulayıcı tarafından algılanan bu tür sorunlar şunlardır:
WMI geri çağırma kaydını kaldırmadan yüklemeyi deneyen bir sürücü.
WMI'den kaydı kaldırılmamış bir cihaz nesnesini silmeye çalışan bir sürücü.
ETW çekirdek modu sağlayıcılarının kaydını kaldırmadan yüklemeyi deneyen bir sürücü.
Zaten kaydı kaldırılmış bir sağlayıcının kaydını kaldırmaya çalışan bir sürücü.
Çekirdek işleme hataları. (Windows Vista ve sonraki sürümler) Çeşitli Denetimler seçeneğini etkinleştirmek, sistem işlemi için tanıtıcı izlemeyi etkinleştirerek çekirdek tanıtıcı sızıntılarını ve Hata Denetimi 0x93: INVALID_KERNEL_HANDLE kodunu araştırmanıza yardımcı olur. Tanıtıcı izleme etkinleştirildiğinde çekirdek, son tanıtıcı açma ve kapatma işlemleri için yığın izlemeleri toplar. Yığın izlemeleri , !htrace hata ayıklayıcısı uzantısı kullanılarak çekirdek hata ayıklayıcısında görüntülenebilir. !htrace hakkında daha fazla bilgi için Windows için Hata Ayıklama Araçları belgelerine bakın.
Çekirdek modu erişimiyle kullanıcı modu tutamacı Windows 7'den başlayarak Çeşitli Denetimler seçeneğini belirlediğinizde, Sürücü Doğrulayıcı ObReferenceObjectByHandle çağrılarını da denetler. Bir kullanıcı modu tutamacını çekirdek modu erişimi ile kullanamazsınız. Böyle bir işlem gerçekleşirse, Sürücü Doğrulayıcı hata kontrolü 0xC4 verir ve 1. parametrenin değeri 0xF6 olur.
UserMode Çekirdek Yığınında Ayrılan Eşitleme Nesnelerini Bekleme
Windows 7'den başlayarak, Sürücü Doğrulayıcı sürücülerin işletim sisteminin sağladığı çoklu iş parçacığı eşitleme mekanizmalarını yanlış kullanabilmesi için ek yollar algılayabilir.
KeVENT yapıları gibi eşitleme nesnelerini çekirdek yığınında yerel değişkenler olarak ayırma yaygın bir uygulamadır. Bir işlem belleğe yüklenirken, iş parçacıklarının çekirdek yığınları hiçbir zaman çalışma kümesinden kırpılmaz veya diske çağrılamaz. Bu tür sayfalanamayan bellekte eşitleme nesnelerini ayırma işlemi doğrudur.
Ancak, sürücüler KeWaitForSingleObject veya KeWaitForMultipleObjects gibi API'leri çağırarak yığında ayrılan bir nesneyi beklediklerinde, API'nin WaitMode parametresi için KernelMode değerini belirtmeleri gerekir. Bir işlemin tüm iş parçacıkları UserMode modunda beklerken, bu işlem diske değiştirilmeye uygun hale gelir. Bu nedenle, eğer bir sürücü UserMode’u WaitMode parametresi olarak belirttiyse, aynı işlemdeki diğer tüm iş parçacıkları UserMode olarak beklediği sürece, işletim sistemi geçerli işlemi yerinden çıkarabilir. Bir işlemin tamamını diske değiştirmek, çekirdek yığınlarını sayfalandırmayı içerir. İşletim sisteminin değiştirdiği bir eşitleme nesnesini beklemek yanlıştır. Bir noktada bir iş parçacığının gelip eşitleme nesnesine sinyal vermesi gerekir. Eşitleme nesnesinin sinyallenmesi, Windows çekirdeğinin nesneyi IRQL = DISPATCH_LEVEL veya üzerinde düzenlemesini içerir. DISPATCH_LEVEL veya üzerinde, sayfalama yapılmış veya değiştirilmiş belleğe dokunulması sistemin çökmesine neden olur.
Windows 7'den başlayarak Çeşitli Denetimler seçeneğini belirlediğinizde, Sürücü Doğrulayıcı doğrulanmış sürücünün UserMode'da beklerken kullandığı eşitleme nesnelerinin geçerli iş parçacığının çekirdek yığınında ayrılmadığını denetler. Sürücü Doğrulayıcı bu kadar yanlış bir bekleme algıladığında, parametre 1 değeri 0x123 olan bir Hata Denetimi 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION verir.
Yanlış Çekirdek Tutucu Referansları
Her Windows işleminin bir tanıtıcı tablosu vardır. Tanıtıcı tablosunu tanıtıcı girdileri dizisi olarak görüntüleyebilirsiniz. Her geçerli tanıtıcı değeri, bu dizideki geçerli bir girdiye başvurur.
Sistem işleminin tanıtıcı tablosu için geçerli bir tanıtıcı olarak çekirdek tanıtıcısı. Kullanıcı tanıtıcısı, Sistem işlemi dışındaki tüm işlemler için geçerli olan bir tanıtıcıdır.
Windows 7'de Sürücü Doğrulayıcı, yanlış çekirdek tanıtıcı değerlerine başvurulmaya çalışıldığını tespit eder. Sürücü Doğrulayıcı Çeşitli Denetimler seçeneği etkinleştirildiğinde, bu sürücü hataları Hata Denetimi 0x93: INVALID_KERNEL_HANDLE olarak rapor edilir. Genellikle bu tür bir yanlış tanıtıcı başvurusu, sürücünün bu tanıtıcıyı zaten kapatmış olduğu ancak kullanmaya devam etmeye çalıştığı anlamına gelir. Başvurulan tanıtıcı değeri, ilgili olmayan başka bir sürücü tarafından zaten yeniden kullanılmış olabileceğinden, bu tür bir hata sistem için öngörülemeyen sorunlara neden olabilir.
Eğer bir kernel sürücüsü yakın zamanda bir kernel sapını kapattıysa ve daha sonra kapatılan sapı referans alıyorsa, Driver Verifier, daha önce açıklandığı gibi hata kontrolünü zorlar. Bu durumda !htrace hata ayıklayıcı uzantısının çıktısı, bu tanıtıcıyı kapatan kod yolunun yığın izini sağlar. !htrace parametresi olarak Sistem işleminin adresini kullanın. Sistem işleminin adresini bulmak için !process 4 0 komutunu kullanın.
Windows 7'den başlayarak, Sürücü Doğrulayıcı ObReferenceObjectByHandle'a bir denetim ekler. Artık KernelMode erişimiyle bir kullanıcı alanı tutamacının aktarılması yasaktır. Böyle bir bileşim algılanırsa, Sürücü Doğrulayıcı hata denetimi 0xC4 verir: DRIVER_VERIFIER_DETECTED_VIOLATION, parametre 1 değeri 0xF6.
Bu Seçeneği Etkinleştirme
Sürücü Doğrulayıcı Yöneticisi'ni veya Verifier.exe komut satırını kullanarak bir veya daha fazla sürücü için Çeşitli Denetimler seçeneğini etkinleştirebilirsiniz. Ayrıntılar için bkz. Sürücü Doğrulayıcı Seçeneklerini Seçme.
Komut satırında
Komut satırında Çeşitli Denetimler seçeneği Bit 11 (0x800) ile gösterilir. Çeşitli Denetimler'i etkinleştirmek için, 0x800 bayrak değerini kullanın veya bayrak değerine 0x800 ekleyin. Örneğin:
verifier /flags 0x800 /driver MyDriver.sysSeçenek bir sonraki önyüklemeden sonra etkin olacaktır.
Windows Vista ve Windows'un sonraki sürümlerinde, / volatile parametresini komutuna ekleyerek bilgisayarı yeniden başlatmadan Çeşitli Denetimler'i etkinleştirebilir ve devre dışı bırakabilirsiniz. Örneğin:
verifier /volatile /flags 0x800 /adddriver MyDriver.sysBu ayar hemen etkindir, ancak bilgisayarı kapattığınızda veya yeniden başlattığınızda kaybolur. Ayrıntılar için bkz. Geçici Ayarları Kullanma.
Çeşitli Denetimler seçeneği de standart ayarlara eklenir. Örneğin:
verifier /standard /driver MyDriver.sysSürücü Doğrulayıcı Yöneticisini Kullanarak
Sürücü Doğrulayıcı Yöneticisi'ni başlatın. Komut İstemi penceresine Doğrulayıcı yazın.
Özel ayarlar oluştur (kod geliştiricileri için)seçin ve ardından İleritıklayın.
Tam liste'den tek tek ayarları seçin.
Çeşitli Denetimler'i seçin.
Çeşitli Denetimler özelliği standart ayarlara da dahildir. Bu özelliği kullanmak için Sürücü Doğrulayıcı Yöneticisi'nde Standart Ayarlar Oluştur'a tıklayın.
Sonuçları Görüntüleme
Çeşitli Denetimler seçeneğinin sonuçlarını görüntülemek için çekirdek hata ayıklayıcısında !verifier uzantısını kullanın. (!verifier hakkında bilgi için Windows için Hata Ayıklama Araçları belgelerine bakın.)
Aşağıdaki örnekte, Çeşitli Denetimler seçeneği bellekte sürücünün serbest bırakmaya çalıştığı etkin bir ERESOURCE yapısını algılayarak Hata Denetimi 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION ile sonuçlanmıştır. Hata Denetimi 0xC4 görüntüsü, ERESOURCE adresini ve etkilenen belleği içerir.
1: kd> !verifier 1
Verify Level 800 ... enabled options are:
Miscellaneous checks enabled
Summary of All Verifier Statistics
RaiseIrqls 0x0
AcquireSpinLocks 0x0
Synch Executions 0x0
Trims 0x0
Pool Allocations Attempted 0x1
Pool Allocations Succeeded 0x1
Pool Allocations Succeeded SpecialPool 0x0
Pool Allocations With NO TAG 0x0
Pool Allocations Failed 0x0
Resource Allocations Failed Deliberately 0x0
Current paged pool allocations 0x0 for 00000000 bytes
Peak paged pool allocations 0x0 for 00000000 bytes
Current nonpaged pool allocations 0x0 for 00000000 bytes
Peak nonpaged pool allocations 0x0 for 00000000 bytes
Driver Verification List
Entry State NonPagedPool PagedPool Module
8459ca50 Loaded 00000000 00000000 buggy.sys
*** Fatal System Error: 0x000000c4
(0x000000D2,0x9655D4A8,0x9655D468,0x000000B0)
0xD2 : Freeing pool allocation that contains active ERESOURCE.
2 - ERESOURCE address.
3 - Pool allocation start address.
4 - Pool allocation size.
Havuz ayırmayı araştırmak için, havuz ayırmanın başlangıç adresi olan 9655D468 ile !pool hata ayıklayıcısı uzantısını kullanın. ( 2 bayrağı yalnızca belirtilen adresi içeren havuz için üst bilgi bilgilerini görüntüler. Diğer havuzlar için üst bilgi bilgileri gizlendi.)
1: kd> !pool 9655d468 2
Pool page 9655d468 region is Paged pool
*9655d468 size: b0 previous size: 8 (Allocated) *Bug_
ERESOURCE hakkında bilgi bulmak için yapı adresiyle !locks (!kdext*.locks) hata ayıklayıcısı uzantısını kullanın.
1: kd> !locks 0x9655D4A8 <<<<<- ERESOURCE @0x9655D4A8 lives inside the pool block being freed
Resource @ 0x9655d4a8 Available
1 total locks
Hata ayıklamaya neden olan çağrıların yığın izlemesini görüntülemek için kb hata ayıklayıcısı komutunu da kullanabilirsiniz. Aşağıdaki örnek, Driver Verifier'ın engellediği ExFreePoolWithTag çağrısı da dahil olmak üzere yığını gösterir.
1: kd> kb
ChildEBP RetAddr Args to Child
92f6374c 82c2c95a 00000003 92f68cdc 00000000 nt!RtlpBreakWithStatusInstruction
92f6379c 82c2d345 00000003 9655d468 000000c4 nt!KiBugCheckDebugBreak+0x1c
92f63b48 82c2c804 000000c4 000000d2 9655d4a8 nt!KeBugCheck2+0x5a9
92f63b6c 82e73bae 000000c4 000000d2 9655d4a8 nt!KeBugCheckEx+0x1e
92f63b88 82e78c32 9655d4a8 9655d468 000000b0 nt!VerifierBugCheckIfAppropriate+0x3c
92f63ba4 82ca7dcb 9655d468 000000b0 00000000 nt!VfCheckForResource+0x52
92f63bc8 82e7fb2d 000000b0 00000190 9655d470 nt!ExpCheckForResource+0x21
92f63be4 82e6dc6c 9655d470 92f63c18 89b6c58c nt!ExFreePoolSanityChecks+0x1fb
92f63bf0 89b6c58c 9655d470 00000000 89b74194 nt!VerifierExFreePoolWithTag+0x28
92f63c00 89b6c0f6 846550c8 846550c8 846e2200 buggy!MmTestProbeLockForEverStress+0x2e
92f63c18 82e6c5f1 846e2200 846550c8 85362e30 buggy!TdDeviceControl+0xc4
92f63c38 82c1fd81 82d4d148 846550c8 846e2200 nt!IovCallDriver+0x251
92f63c4c 82d4d148 85362e30 846550c8 84655138 nt!IofCallDriver+0x1b
92f63c6c 82d4df9e 846e2200 85362e30 00000000 nt!IopSynchronousServiceTail+0x1e6
92f63d00 82d527be 00000001 846550c8 00000000 nt!IopXxxControlFile+0x684
92f63d34 82cb9efc 0000004c 00000000 00000000 nt!NtDeviceIoControlFile+0x2a
92f63d34 6a22b204 0000004c 00000000 00000000 nt!KiFastCallEntry+0x12c