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.
Bekleyen G/Ç İsteklerini Zorla seçeneği, sürücünün IoCallDriverçağrılarına yanıt olarak rastgele STATUS_PENDING döndürür. Bu seçenek, IoCallDriver'den STATUS_PENDING dönüş değerlerine karşılık sürücünün yanıt mantığını test eder.
Bu seçenek yalnızca Windows Vista ve Windows işletim sisteminin sonraki sürümlerinde desteklenir.
Dikkat Sürücünün işlemi hakkında ayrıntılı bilgi sahibi değilseniz ve sürücünün tüm IoCallDriverçağrılarından STATUS_PENDING dönüş değerlerini işleyecek şekilde tasarlandığını doğrulamadıysanız bu seçeneği bir sürücüde kullanmayın. Bu seçeneğin tüm çağrılardan STATUS_PENDING işlemek için tasarlanmamış bir sürücüde çalıştırılması kilitlenmelere, bellek bozulmalarına ve hata ayıklaması veya düzeltilmesi zor olabilecek olağan dışı sistem davranışına neden olabilir.
Neden Bekleyen G/Ç İsteklerini Zorla Kullanmak?
Bir sürücü yığınındaki üst düzey sürücüler, IRP'yi sürücü yığınındaki alt düzey sürücülere geçirmek için IoCallDriverçağırır. IRP'yi alan alt düzey sürücüdeki sürücü gönderme yordamı, IRP'yi hemen tamamlayabilir veya STATUS_PENDING döndürebilir ve IRP'yi daha sonra tamamlayabilir.
Çağrıyı yapan kişinin her iki durumu da karşılamaya hazırlıklı olması gerekir. Ancak, çoğu dağıtım yordamı IRP'yi hemen işlediğinden, çağırandaki STATUS_PENDING mantığı genellikle kullanılmıyor ve ciddi mantık hataları algılanmayabilir. Bekleyen G/Ç İsteklerini Zorla seçeneği, IoCallDriver çağrılarını yakalar ve çağıran sürücünün nadiren kullanılan mantığını test etmek için STATUS_PENDING döndürür.
Bekleyen G/Ç İsteklerini Zorunlu Hale Getirme işlemini ne zaman kullanırsınız?
Bu testi çalıştırmadan önce sürücü tasarımını ve kaynak kodunu gözden geçirin ve sürücünün tüm IoCallDriver çağrılarından STATUS_PENDING işlemeye yönelik olduğunu onaylayın.
Birçok sürücü, IoCallDriver'e yapılan tüm çağrılarda STATUS_PENDING işleyecek şekilde tasarlanmamıştır. IRP'yi, IRP'yi hemen tamamlaması garanti edilen belirli ve iyi tanınan bir sürücüye gönderiyor olabilirler. STATUS_PENDING'i işlemeyen bir sürücüye göndermek, sürücü ve sistem kilitlenmelerine ve bellek bozulmasına neden olabilir.
Sürücüler STATUS_PENDING'i nasıl ele almalıdır?
Üst düzey sürücü, IoCallDriver'ü çağırdığında, bir STATUS_PENDING dönüş değeri aşağıdaki gibi işlenmelidir:
IoCallDriverçağırmadan önce, sürücünün IRP'nin zaman uyumlu işlenmesini düzenlemek için IoBuildSynchronousFsdRequestçağrısı yapması gerekir.
IoCallDriver STATUS_PENDING döndürürse, sürücü belirtilen olayda KeWaitForSingleObject çağırarak IRP'nin tamamlanmasını beklemelidir.
Sürücü, G/Ç Yöneticisi olaya işaret etmeden önce IRP'nin serbest olabileceğini tahmin etmelidir.
IoCallDriverçağrıldıktan sonra, çağıran IRP'ye başvuramaz.
Zorla Bekleyen G/Ç İsteği Hangi Hataları Algılar?
Bekleyen G/Ç İsteğini Zorla seçeneği, IoCallDriver çağıran ve STATUS_PENDING dönüş değeri alan sürücüde aşağıdaki hataları tespit eder:
Sürücü, zaman uyumlu işlemeyi düzenlemek için ioBuildSynchronousFsdRequest çağırmaz.
Sürücü KeWaitForSingleObjectçağırmaz.
Sürücü, IoCallDriverçağrıldıktan sonra IRP yapısındaki bir değere başvurur. ioCallDriver çağrıldıktan sonra, üst düzey sürücü bir tamamlama yordamı ayarlamadığı sürece ve ardından yalnızca tüm alt düzey sürücüler IRP'yi tamamladığında IRP'ye erişemez. IRP serbest bırakılırsa, sürücü çöker.
Sürücü ilgili bir işlevi yanlış çağırır. Örneğin, sürücü KeWaitForSingleObject çağırır ve olay nesnesine bir işaretçi geçirmek yerine, olay için bir tanıtıcı geçirir (bu tanıtıcı Nesne parametresi olarak verilir).
Sürücü yanlış olayı bekler. Örneğin, sürücü ioSetCompletionRoutine çağırır, ancak IRP tamamlandığında G/Ç Yöneticisi tarafından sinyal verilen IRP olayını beklemek yerine kendi tamamlama yordamıyla sinyal verilen bir iç olayı bekler.
Windows 7'de Tanıtılan Bekleyen G/Ç İsteklerini Zorlama Değişiklikleri
Windows 7'den başlayarak, Bekleyen G/Ç İsteklerini Zorla seçeneği, doğrulanmış sürücülerde STATUS_PENDING kod yollarının kullanılmasını zorlamada daha etkilidir. Önceki Windows sürümlerinde, Sürücü Doğrulayıcı bir IRP tamamlama işleminin yalnızca bu IRP için ilk IoCompleteRequest yürütülürken geciktirilmesine neden oldu. Bu, Driver1'i doğrulamanın etkinliğinin aynı cihaz yığınından Driver2'nin davranışıyla azaltılabildiği anlamına gelir. Driver2, kendi dağıtım rutininden Driver1'e dönmeden önce tamamlanması için eş zamanlı olarak bekleyebilir. IRP tamamlama işleminin zorlamalı gecikmesi, G/Ç isteği tamamlanma yolunda doğrulanmış sürücüye geri dönmeden önce tam olarak gerçekleşir. Bu, doğrulanmış sürücünün STATUS_PENDING kod yolunun gerçekten uygulandığı ve doğrulanan sürücünün tamamlanmada bir gecikme algıladığını gösterir.
Bu Seçeneği Etkinleştir
Bekleyen G/Ç İsteklerini Zorla etkinleştirmek için G/Ç Doğrulama'i de etkinleştirmeniz gerekir. 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 Bekleyen G/Ç İsteklerini Zorla seçeneğini etkinleştirebilirsiniz. Ayrıntılar için bkz. Sürücü Doğrulayıcı Seçeneklerini Seçme.
Bekleyen G/Ç İsteklerini Zorla seçeneği yalnızca Windows Vista ve Windows'un sonraki sürümlerinde desteklenir.
Komut satırında
Askıya Alınan G/Ç İsteklerini etkinleştirmek için 0x210 bayrak değerini kullanın veya bayrak değerine 0x210 ekleyin. Bu değer G/Ç Doğrulama (0x10) ve Beklemedeki G/Ç İsteklerini Zorlama (0x200) etkinleştirir.
Örneğin:
verifier /flags 0x210 /driver MyDriver.sysSeçenek bir sonraki önyüklemeden sonra etkin olacaktır.
Yalnızca Bekleyen G/Ç İsteklerini Zorla (verifier /flags 0x200) seçeneğini etkinleştirmeye çalışırsanız, Sürücü Doğrulayıcı otomatik olarak hem Bekleyen G/Ç İsteklerini Zorla (0x200) hem de G/Ç Doğrulamaseçeneklerini etkinleştirir.
Ayrıca, komutuna /volatile parametresini ekleyerek bilgisayarı yeniden başlatmadan Bekleyen G/Ç İsteklerini Zorla özelliğini etkinleştirebilir ve devre dışı bırakabilirsiniz. Örneğin:
verifier /volatile /flags 0x210 /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.
Sü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.
- G/Ç Doğrulama ve Bekleyen G/Ç İsteklerini Zorla seçeneklerini seçin.
Yalnızca Bekleyen G/Ç İsteklerini Zorlaseçerseniz, Sürücü Doğrulayıcı Yöneticisi size G/Ç Doğrulama gerektiğini anımsatır ve sizin için etkinleştirmeyi teklif eder.
Sonuçları Görüntüleme
Bekleyen G/Ç İsteklerini Zorla testinin sonuçlarını görüntülemek için !verifier hata ayıklayıcısı uzantısını 0x40 bayrak değeriyle kullanın.
!verifierhakkında bilgi için Windows için Hata Ayıklama Araçları belgelerinin!verifier konusuna bakın.
Test makinesi Zorla Beklemedeki G/Ç İstekleri testi sonucu kilitleniyorsa, nedenini bulmak için !verifier 40 komutunu kullanabilirsiniz. Mevcut bir yığın izlemesinde, sürücünüz tarafından son kullanılan IRP'nin adresini bulun. Örneğin, bir iş parçacığının yığın çerçevesini görüntüleyen kP komutunu kullanırsanız, geçerli yığın izlemesinin işlev parametreleri arasında IRP adresini bulabilirsiniz. Ardından !verifier 40 çalıştırın ve IRP'nin adresini arayın. En güncel bekleyen yığın izlemeleri, ekranın üst kısmında görünür.
Örneğin, aşağıdaki Pci.sys yığın izlemesi, Bekleyen G/Ç İsteklerini Zorlama yanıtını gösterir. Test, Pci.sys mantığında herhangi bir hata göstermez.
kd> !verifier 40
# Size of the log is 0x40
========================================================
IRP: 8f84ef00 - forced pending from stack trace:
817b21e4 nt!IovpLocalCompletionRoutine+0xb2
81422478 nt!IopfCompleteRequest+0x15c
817b2838 nt!IovCompleteRequest+0x9c
84d747df acpi!ACPIBusIrpDeviceUsageNotification+0xf5
84d2d36c acpi!ACPIDispatchIrp+0xe8
817b258f nt!IovCallDriver+0x19d
8142218e nt!IofCallDriver+0x1c
817c6a9d nt!ViFilterDispatchPnp+0xe9
817b258f nt!IovCallDriver+0x19d
8142218e nt!IofCallDriver+0x1c
84fed489 pci!PciCallDownIrpStack+0xbf
84fde1cb pci!PciDispatchPnpPower+0xdf
817b258f nt!IovCallDriver+0x19d
8142218e nt!IofCallDriver+0x1c
817c6a9d nt!ViFilterDispatchPnp+0xe9
817b258f nt!IovCallDriver+0x19d
8142218e nt!IofCallDriver+0x1c
84ff2ff5 pci!PciSendPnpIrp+0xbd
84fec820 pci!PciDevice_DeviceUsageNotification+0x6e
84fde1f8 pci!PciDispatchPnpPower+0x10c
817b258f nt!IovCallDriver+0x19d
8142218e nt!IofCallDriver+0x1c
84d76ce2 acpi!ACPIFilterIrpDeviceUsageNotification+0x96
84d2d36c acpi!ACPIDispatchIrp+0xe8
817b258f nt!IovCallDriver+0x19d
8142218e nt!IofCallDriver+0x1c
84f7f16c PCIIDEX!PortWdmForwardIrpSynchronous+0x8e
84f7b2b3 PCIIDEX!GenPnpFdoUsageNotification+0xcb
84f7d301 PCIIDEX!PciIdeDispatchPnp+0x45
817b258f nt!IovCallDriver+0x19d
8142218e nt!IofCallDriver+0x1c
Yığın izlemesi, Acpi.sys IRP 8f84ef00'i tamamlamaya çalıştığını gösterir. Sürücü Denetleyici, ertelenmiş bir tamamlamayı zorladı, bu nedenle Acpi.sys, pci!PciCallDownIrpStack'e STATUS_PENDING olarak döndü. Bu çağrı bir çökmeye neden olsaydı, sürücü sahibinin pci için kaynak kodunu gözden geçirmesi ve PciCallDownIrpStack'i STATUS_PENDING'i düzgün bir şekilde işlemek amacıyla düzeltmesi gerekirdi.