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.
Çoğu ara ve en düşük düzeyli sürücü için, cihaz uzantısı bir cihaz nesnesiyle ilişkili en önemli veri yapısıdır. İç yapısı sürücü tanımlıdır ve genellikle şunları yapmak için kullanılır:
Cihaz durumu bilgilerini koruyun.
Sürücü tarafından kullanılan çekirdek tanımlı nesneler veya döndürme kilitleri gibi diğer sistem kaynakları için depolama alanı sağlayın.
Sürücünün G/Ç işlemlerini gerçekleştirmek için sistem alanında bulunması gereken tüm verileri saklayın.
Veri yolu, işlev ve filtre sürücülerinin çoğu (en düşük düzey ve ara sürücüler) keyfi bir iş parçacığı bağlamında (o anda çalışan iş parçacığı) yürütüldüğünden, cihaz genişletmesi her sürücünün cihaz durumunu ve sürücünün ihtiyaç duyduğu diğer tüm cihaza özgü verileri korumak için esastır. Örneğin, CustomTimerDpc veya CustomDpc yordamı uygulayan herhangi bir sürücü genellikle bir cihaz uzantısındaki gerekli çekirdek tanımlı zamanlayıcı ve/veya DPC nesneleri için depolama alanı sağlar.
ISR'si olan her sürücü, çekirdek tanımlı kesme nesneleri kümesine yönelik bir işaretçi için depolama alanı sağlamalıdır ve çoğu cihaz sürücüsü bu işaretçiyi bir cihaz uzantısında depolar. Her sürücü bir cihaz nesnesi oluşturduğunda cihaz uzantısının boyutunu belirler ve her sürücü kendi cihaz uzantılarının içeriğini ve yapısını tanımlar.
G/Ç yöneticisinin IoCreateDevice ve IoCreateDeviceSecure rutinleri, sayfasız bellek havuzundan cihaz nesnesi ve uzantısı için bellek ayırır.
IRP alan her standart sürücü yordamı, istenen G/Ç işlemi için hedef cihazı temsil eden bir cihaz nesnesine yönelik bir işaretçi de alır. Bu sürücü yordamları, bu işaretçi aracılığıyla ilgili cihaz uzantısına erişebilir. Genellikle , DeviceObject işaretçisi aynı zamanda en düşük düzey sürücünün ISR'sine yönelik bir giriş parametresidir.
Aşağıdaki şekilde, en düşük düzey bir sürücünün cihaz nesnesinin cihaz uzantısı için sürücü tanımlı verilerin temsili bir kümesi gösterilmektedir. Daha üst düzey bir sürücü IoConnectInterrupt tarafından döndürülen ve KeSynchronizeExecution ve IoDisconnectInterrupt'a geçirilen kesme nesnesi işaretçisi için depolama sağlamaz. Ancak, daha üst düzey bir sürücü customTimerDpc yordamına sahipse aşağıdaki şekilde gösterilen zamanlayıcı ve DPC nesneleri için depolama sağlar. Daha üst düzey bir sürücü, yönetici dönüş kilidi ve kilitlenmiş iş kuyruğu için depolama alanı da sağlayabilir.
Bir kesme nesnesi işaretçisi için depolama sağlamaya ek olarak, ISR farklı vektörlerdeki iki veya daha fazla cihaz için kesmeleri işlerse veya birden fazla ISR'ye sahipse, en düşük düzeyli bir cihaz sürücüsü kesme döndürme kilidi için depolama alanı sağlamalıdır. ISR kaydetme hakkında daha fazla bilgi için bkz. ISR kaydetme.
Sürücüler genellikle şekilde gösterildiği gibi cihaz nesnelerinin işaretçilerini cihaz uzantılarında depolar. Sürücü, uzantıda cihaz için kaynak listesinin bir kopyasını da tutabilir.
Daha üst düzey bir sürücü genellikle bir sonraki alt sürücünün cihaz nesnesine yönelik bir işaretçiyi kendi cihaz uzantısında depolar. IRP'leri İşleme bölümünde açıklandığı gibi, üst düzey bir sürücü, bir IRP'de bir sonraki alt sürücünün G/Ç yığını konumunu ayarladıktan sonra, IoCallDriver işlevine, sonraki alt sürücünün cihaz nesnesine yönelik bir işaretçi geçirmelidir.
Ayrıca, alt düzey sürücüler için IRP'leri ayıran herhangi bir üst düzey sürücünün, yeni IRP'lerin kaç yığın konumuna sahip olması gerektiğini belirtmesi gerektiğini unutmayın. Özellikle, üst düzey bir sürücü IoMakeAssociatedIrp, IoAllocateIrp veya IoInitializeIrp çağırırsa, bu destek yordamlarına bağımsız değişken olarak doğru StackSize değerini sağlamak için StackSize değerini okumak amacıyla sonraki alt düzey sürücünün hedef cihaz nesnesine erişmesi gerekir.
Daha üst düzey bir sürücü IoAttachDeviceToDeviceStack tarafından döndürülen işaretçi aracılığıyla bir sonraki alt düzey sürücünün cihaz nesnesinden veri okuyabilirken, bu tür bir sürücünün şu uygulama yönergelerini izlemesi gerekir:
Alt sürücünün cihaz nesnesine hiçbir zaman veri yazmayı denemeyin.
Bu yönergenin tek istisnaları, düşük seviyeli çıkarılabilir medya sürücülerinin cihaz nesneleri Flagsında DO_VERIFY_VOLUME ayarlayıp temizleyen dosya sistemleridir.
Aşağıdaki nedenlerden dolayı hiçbir zaman alt sürücünün cihaz uzantısına erişmeyi denemeyin:
İki sürücü arasında tek bir cihaz uzantısına erişimi eşitlemenin güvenli bir yolu yoktur.
Böyle bir arka kapı iletişim şeması uygulayan bir sürücü çifti tek başına yükseltilemez, mevcut sürücü kaynağı değiştirilmeden ara bir sürücü eklenemez ve bir Windows platformundan diğerine kolayca yeniden derlenemez ve taşınamaz.
Bir Windows platformundan veya sürümünden sonraki sürüme kadar alt düzey sürücülerle birlikte çalışabilirliklerini korumak için, üst düzey sürücülerin kendilerine verilen IP'leri yeniden kullanması veya yeni IP'ler oluşturması ve istekleri alt düzey sürücülere iletmek için IoCallDriver kullanması gerekir.