Aracılığıyla paylaş


İşlev veya Filtre Sürücülerindeki AddDevice Rutinleri

Bir işlev veya filtre sürücüsündeki AddDevice yordamı aşağıdaki adımları gerçekleştirmelidir:

  1. Eklenen cihaz için işlevsel bir cihaz nesnesi (FDO veya filtre DO) oluşturmak için IoCreateDevice'i çağırın.

    Cihaz nesnesi için bir DeviceName belirtmeyin, çünkü bunu yaptığınızda PnP yöneticisinin güvenliği atlanır. Kullanıcı modu bileşeninin cihaza sembolik bir bağlantıya ihtiyacı varsa bir cihaz arabirimi kaydedin (aşağıdaki sonraki adıma bakın). Çekirdek modu bileşeninin eski bir cihaz adına ihtiyacı varsa, sürücünün cihaz nesnesini adlandırması gerekir, ancak adlandırma önerilmez.

    DeviceCharacteristics parametresine FILE_DEVICE_SECURE_OPEN ekleyin. Bu özellik, G/Ç yöneticisini, göreli açmalar ve sondaki dosya adı açmalar dahil olmak üzere tüm açılış istekleri için cihaz nesnesine karşı güvenlik denetimleri gerçekleştirmeye yönlendirir.

  2. [isteğe bağlı] Cihaza bir veya daha fazla sembolik bağlantı oluşturun.

    Cihaz işlevselliğini kaydetmek ve uygulamaların veya sistem bileşenlerinin cihazı açmak için kullanabileceği sembolik bir bağlantı oluşturmak için IoRegisterDeviceInterface'i çağırın. Sürücü, IRP_MN_START_DEVICE isteğini işlerken IoSetDeviceInterfaceState çağrısı yaparak arabirimi etkinleştirmelidir. Daha fazla bilgi için bkz. Cihaz Arabirimi Sınıfları.

  3. İşaretçiyi cihazın PDO'sunun cihaz uzantısında depolayın.

    PnP yöneticisi, AddDevice için PhysicalDeviceObject parametresi olarak PDO'ya bir işaretçi sağlar. Sürücüler , IoGetDeviceProperty gibi yordamlara yapılan çağrılarda PDO işaretçisini kullanır.

  4. Cihazın duraklatılmış, kaldırılmış ve sürpriz şekilde kaldırılmış gibi belirli PnP durumlarını izlemek için cihaz uzantısında bayraklar tanımlayın.

    Örneğin, cihaz duraklatıldığında gelen IRP'lerin tutulması gerektiğini belirtmek için bir bayrak tanımlamak. Sürücünün IRP'leri kuyruğa almak için bir mekanizması yoksa, IRP'leri tutmak için bir kuyruk oluşturun. Daha fazla bilgi için bkz. IRP'leri Kuyruklama ve Kuyruktan Çıkarma.

    Ayrıca cihaz uzantısında bir IO_REMOVE_LOCK yapısı ayırın ve bu yapıyı başlatmak için IoInitializeRemoveLock'u çağırın. Daha fazla bilgi için bkz. Kilitleri Kaldır'ı kullanma.

  5. Cihaz yığınına gönderilen G/Ç istekleri için G/Ç yöneticisinin kullanacağını arabelleğe alma türünü belirtmek için cihaz nesnesindeki DO_BUFFERED_IO veya DO_DIRECT_IO bayrağı bitini ayarlayın. Daha üst seviyedeki sürücüler YA DA bu üye, en üst düzey sürücüler hariç olmak üzere, yığın içindeki bir alt seviyedeki sürücü ile aynı değere sahip olabilir. Daha fazla bilgi için bkz. Cihaz Nesnesi Başlatma.

  6. Gerekirse güç yönetimi için DO_POWER_INRUSH veya DO_POWER_PAGABLE bayrağını ayarlayın. Sayfalanabilir sürücülerin DO_POWER_PAGABLE bayrağını ayarlamaları gerekir. Cihaz nesne bayrakları genellikle cihaz için PDO'yu oluşturduğunda veri yolu sürücüsü tarafından ayarlanır. Ancak üst düzey sürücülerin, FDO veya do filtresini oluştururken zaman zaman AddDevice yordamlarında bu bayrakların değerlerini değiştirmesi gerekebilir. Ayrıntılar için bkz. Güç Yönetimi için Cihaz Nesne Bayraklarını Ayarlama .

  7. Sürücünün bu cihazı yönetmek için kullandığı olaylar, döndürme kilitleri veya diğer nesneler gibi diğer yazılım kaynaklarını oluşturun ve/veya başlatın. (G/Ç bağlantı noktaları gibi donanım kaynakları daha sonra bir IRP_MN_START_DEVICE isteğine yanıt olarak yapılandırılır.)

    AddDevice rutini IRQL = PASSIVE_LEVEL seviyesindeki bir sistem iş parçacığı bağlamında çalıştığından, sürücü sistem sayfa dosyasını tutan cihazı denetlemediği sürece, yalnızca başlatma sırasında kullanılmak üzere ExAllocatePoolWithTag ile ayrılan tüm bellekler paged pool'dan olabilir. AddDevice kontrolü iade etmeden önce bu tür bir bellek tahsisi ExFreePool ile serbest bırakılmalıdır.

  8. Cihaz nesnesini cihaz yığınına (IoAttachDeviceToDeviceStack) ekleyin.

    TargetDevice parametresinde cihazın PDO'sunun işaretçisini belirtin.

    IoAttachDeviceToDeviceStack tarafından döndürülen işaretçiyi depolayın. Cihazın bir sonraki alt sürücüsünün cihaz nesnesine işaret eden bu işaretçi, IRP'leri cihaz yığınından aşağı geçirirken IoCallDriver ve PoCallDriver için gerekli bir parametredir.

  9. FDO'daki DO_DEVICE_INITIALIZING bayrağını temizleyin veya DO'ya aşağıdaki gibi bir deyimle filtre uygulayın:

    FunctionalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
    
  10. Cihaz için PnP IRP'lerini işlemeye hazır olun ( örneğin, IRP_MN_QUERY_RESOURCE_REQUIREMENTS ve IRP_MN_START_DEVICE).

Sürücü, PnP yöneticisi tarafından cihaza atanan donanım kaynaklarının listesini içeren bir IRP_MN_START_DEVICE alıncaya kadar cihazı denetlemeye başlamamalıdır.