Aracılığıyla paylaş


Cihaz Nesnesi Başlatma

IoCreateDevice döndürdüğünde, çağırana cihaz uzantısına yönelik bir işaretçi içeren bir DeviceObject işaretçisi verdikten sonra, sürücülerin ilgili fiziksel, mantıksal ve/veya sanal cihazları için cihaz nesnelerinde belirli alanları ayarlaması gerekir.

IoCreateDevice , yeni oluşturulan bir cihaz nesnesinin StackSize alanını bir olarak ayarlar. En düşük düzey sürücü bu alanı yoksayabilir. Üst düzey bir sürücü ioAttachDeviceToDeviceStack'i çağırarak kendisini bir sonraki alt sürücüye iliştirdiğinde, bu yordam cihaz nesnesindeki StackSize alanını otomatik olarak sonraki alt sürücünün cihaz nesnesine artı bir olarak ayarlar. Ancak bazı cihaz türleri için, cihaza özgü belgelerde belirtildiği gibi üst düzey sürücünün StackSize alanını daha büyük bir değere ayarlaması gerekebilir. Yığın boyutunun ayarlanması, üst düzey sürücüye gönderilen IRP'lerin sürücüye özgü bir G/Ç yığını konumu ve zincirdeki tüm alt düzey sürücüler için doğru G/Ç yığını konumu sayısını içermesini sağlar.

IoCreateDevice , doğrudan G/Ç'de kullanılan arabelleklerin doğru hizalandığından emin olmak için yeni oluşturulan bir cihaz nesnesinin AlignmentRequirement alanını işlemcinin veri önbelleği satır boyutu eksi bir olarak ayarlar. IoCreateDevice döndürdüğünde, en düşük düzey fiziksel cihaz sürücüleri aşağıdakileri yapmalıdır:

  1. Cihazın hizalama gereksiniminden birini çıkarın.

  2. 1. adımın sonucunu cihaz nesnesinin AlignmentRequirement geçerli değeriyle karşılaştırın.

  3. Cihazın hizalama gereksinimi daha yüksekse AlignmentRequirement değerini 1. adımın sonucuna ayarlayın. Aksi takdirde, IoCreateDevice tarafından ayarlanan AlignmentRequirement değerini bırakın.

Herhangi bir üst düzey sürücü IoGetDeviceObjectPointer'ı çağırarak kendisini başka bir sürücüye zincirledikten sonra, üst düzey sürücünün yeni oluşturulan cihaz nesnesinin AlignmentRequirement alanını sonraki alt düzey sürücünün cihaz nesnesine ayarlaması gerekir. Genel bir kural olarak, daha üst düzey bir sürücü bu değeri değiştirmemelidir. Daha üst düzey bir sürücü IoAttachDevice veya IoAttachDeviceToDeviceStack'i çağırırsa, bu yordamlar cihaz nesnesindeki AlignmentRequirement alanını otomatik olarak alt düzey sürücünün cihaz nesnesine ayarlar.

IoGetDeviceObjectPointer , hem alt düzey sürücünün cihaz nesnesine hem de ilişkili dosya nesnesine işaretçiler döndürür. Döndürülen dosya nesnesi işaretçisini yalnızca bir FSD (veya büyük olasılıkla başka bir en üst düzey sürücü) kullanabilir. IoGetDeviceObjectPointer'ı çağıran bir ara sürücü, sürücü kaldırıldığında ObDereferenceObject çağrılarak başvurulabilmesi için bu dosya nesnesi işaretçisini kaydetmelidir.

FSD, daha düşük bir sürücünün cihaz nesnesini temsil eden dosya nesnesini içeren birimi bağladıktan sonra, bir ara sürücü IoAttachDevice veya IoAttachDeviceToDeviceStack çağrısı yaparak kendisini dosya sistemiyle alt sürücü arasında zincirleyemez. Ayrıca, bir bağlama gerçekleştiğinde, bir FSD, temel birim donanımının geometrisine göre cihaz nesnesinin SectorSize üyesini ayarlayabilir. Daha fazla bilgi için bkz. DEVICE_OBJECT.

Orta veya en düşük seviyeli bir sürücü ayrıca oluşturduğu her cihaz nesnesinde DO_DIRECT_IO veya DO_BUFFERED_IO ile cihaz nesnesinin Bayrakları'nda bir bit ayarlar. Mantıksal veya sanal cihazların en üst düzey sürücüleri, sürücü yazıcısı ilgili ek çalışmanın daha iyi sürücü performansında ödeme yapacağına karar verirse arabelleğe alınan veya doğrudan G/Ç için Bayraklar ayarlanmasını önleyebilir. Ara sürücü, cihaz nesnesinin Bayraklar alanını sonraki alt sürücünün cihaz nesnesiyle eşleşecek şekilde ayarlamalıdır.

Cihaz nesnesinin DO_DIRECT_IO veya DO_BUFFERED_IO ile bayraklar alanı ayarlanması, G/Ç yöneticisinin daha sonra sürücüye gönderilen tüm veri aktarım isteklerindeki kullanıcı arabelleklerine erişimi nasıl geçireceğini belirler.

Daha sonra sürücü, cihaz nesnesindeki diğer cihaza bağımlı değerleri ayarlayabilir. Örneğin, çıkarılabilir medya cihazları için WDM olmayan sürücüler, G/Ç işlemleri sırasında medyada bir değişiklik algılarsa (veya şüphelendiklerinde), cihaz nesnesinin Bayraklar üyesini DO_VERIFY_VOLUME ile OR işlemine tabi tutmalıdır. tr-TR: (Daha fazla bilgi için Çıkarılabilir Medyayı Destekleme'ye bakın.) Ani güç gerektiren cihazların sürücüleri, Flags üyesini DO_POWER_INRUSH ile mantıksal OR işlemine tabi tutmalıdır ve sistem disk belleği yolunda olmayan cihazların sürücüleri, Flags üyesini DO_POWER_PAGABLE ile mantıksal OR işlemine tabi tutmalıdır. İşlev ve filtre sürücülerinin DO_DEVICE_INITIALIZING bayrağını temizlemesi gerekir.

Bir sürücü, cihaz nesnesini başlattıktan sonra, cihaz uzantısında depolama sağladığı Çekirdek tanımlı nesneleri ve diğer sistem tanımlı veri yapılarını da başlatabilir. Tam olarak bir sürücü bu görevleri gerçekleştirdiğinde cihazına, nesnenin türüne ve/veya verilerin doğasına bağlıdır. Genel olarak, PnP başlatma ve durdurma istekleri aracılığıyla kalıcı olabilecek tüm nesneler veya veri yapıları AddDevice yordamında başlatılabilir. PnP IRP_MN_START_DEVICE isteğiyle sağlanan veya cihaz durdurulduğunda ve/veya yeniden başlatıldığında değişiklik gerektirebilecek kaynak bilgilerini gerektirenler, sürücü IRP_MN_START_DEVICE isteğini işlediğinde başlatılmalıdır. AddDevice yordamları hakkında daha fazla bilgi için bkz. AddDevice Yordamı Yazma.