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.
PnP yöneticisi, cihazlar arasındaki belirli ilişkileri belirlemek için bu isteği gönderir. Aşağıdaki sürücü türleri bu isteği işler:
Veri yolu sürücülerinin bağdaştırıcıları veya denetleyicileri (veri yolu FDO) için BusRelations isteklerini işlemesi gerekir. Filtre sürücüleri BusRelations isteklerini işleyebilir.
Veri yolu sürücülerinin alt cihazları (alt PPO'lar) için TargetDeviceRelation isteklerini işlemesi gerekir.
İşlev ve filtre sürücüleri RemovalRelations ve PowerRelations isteklerini işleyebilir.
Veri yolu sürücüleri, alt cihazları (alt PPO'lar) için EjectionRelations isteklerini işleyebilir.
Değer
0x07
Ana Kod
Gönderildiğinde
PnP yöneticisi, belirtilen cihazla ilişkisi olan cihazlar hakkında bilgi toplamak için bu IRP'yi gönderir.
PnP yöneticisi, cihaz numaralandırıldığında cihazın BusRelations 'ını (alt cihazlar), diğer zamanlarda ise bir sürücünün bir alt cihazın geldiğini veya çıktığını belirtmek için IoInvalidateDeviceRelations yordamını çağırması gibi durumlarda sorgular.
PnP yöneticisi, bir cihazın sürücülerini kaldırmadan önce cihazın RemovalRelations'ını sorgular. PnP yöneticisi, bir cihazı çıkarmadan önce RemovalRelations ve EjectionRelations sorgular.
Bir sürücü veya kullanıcı modu uygulaması cihazda EventCategoryTargetDeviceChange'in PnP bildirimine kaydolduğunda PnP yöneticisi bir cihazın TargetDeviceRelation değerini sorgular. PnP yöneticisi, belirli bir dosya nesnesiyle ilişkili cihaz için sorgular. IRP_MN_QUERY_DEVICE_RELATIONS , geçerli bir dosya nesnesi parametresi olan tek PnP IRP'dir. Bir sürücü TargetDeviceRelation için bir cihaz yığınını sorgulayabilir. Bir sürücünün TargetDeviceRelation sorgusunu gönderirken bir dosya nesnesi sağlaması gerekmez.
PnP yöneticisi, cihazın sürücüsü IoInvalidateDeviceRelations'ı çağırarak bu cihazın örtük güç yönetimi ilişkisine sahip olduğu cihaz kümesinin değiştiğini gösterdiğinde cihazın PowerRelations'ını sorgular. PowerRelations istekleri Windows 7'den başlayarak desteklenir.
BusRelations, RemovalRelations, RemovalRelations ve PowerRelations istekleri için PnP yöneticisi IRQL = PASSIVE_LEVEL sistem iş parçacığı bağlamında IRP_MN_QUERY_DEVICE_RELATIONS gönderir.
TargetDeviceRelation istekleri için PnP yöneticisi bu IRP'yi IRQL = PASSIVE_LEVEL rastgele bir iş parçacığı bağlamında gönderir.
Giriş Parametreleri
IO_STACK_LOCATION yapısının Parameters.QueryDeviceRelations.Type üyesi sorgulanan ilişkilerin türünü belirtir. Olası değerler Arasında BusRelations, EjectionRelations, RemovalRelations, TargetDeviceRelation ve PowerRelations bulunur.
Geçerli IO_STACK_LOCATION yapısının FileObject üyesi, yalnızca Parameters.QueryDeviceRelations.Typedeğeri TargetDeviceRelation olduğunda geçerli bir dosya nesnesine işaret eder.
Çıkış Parametreleri
G/Ç durum bloğunda döndürülür.
G/Ç Durum Bloğu
Sürücü Irp-IoStatus.Status> değerini STATUS_SUCCESS veya STATUS_INSUFFICIENT_RESOURCES gibi bir hata durumuna ayarlar.
Başarılı olduğunda, sürücü Irp-IoStatus.Information'ı> istenen ilişki bilgilerini gösteren bir PDEVICE_RELATIONS işaretçisine ayarlar. DEVICE_RELATIONS yapısı aşağıdaki gibi tanımlanır:
typedef struct _DEVICE_RELATIONS {
ULONG Count;
PDEVICE_OBJECT Objects[1]; // variable length
} DEVICE_RELATIONS, *PDEVICE_RELATIONS;
Operasyon
Bir sürücü bu IRP_MN_QUERY_DEVICE_RELATIONS yanıt olarak ilişkileri döndürürse, sürücü disk belleği belleğinden bir sayı ve uygun sayıda cihaz nesnesi işaretçisi içeren bir DEVICE_RELATIONS yapısı ayırır. PnP yöneticisi, artık gerekli olmadığında yapıyı serbest bırakın. Bir sürücü başka bir sürücünün ayırmış olduğu DEVICE_RELATIONS yapısının yerini alırsa, sürücünün önceki yapıyı boşaltması gerekir.
Bir sürücü, bu IRP'de (ObReferenceObject) rapor verdiği herhangi bir cihazın PDO'sunda başvurmalıdır. PnP yöneticisi uygun olduğunda başvuruyu kaldırır.
Bir işlev veya filtre sürücüsü, cihaz için AddDevice yordamı tamamlandıktan sonra bir cihaz için bu IRP'yi işlemeye hazır olmalıdır. Veri yolu sürücüleri, bir cihaz numaralandırıldıktan hemen sonra BusRelations sorgusunu işlemeye hazır olmalıdır.
Tak Çalıştır küçük IRP'lerini işleme hakkındaki genel kurallar için bkz. Tak Çalıştır.
Aşağıdaki alt bölümlerde çeşitli sorguları işlemeye yönelik belirli eylemler açıklanmaktadır.
BusRelations İsteği
PnP yöneticisi bir bağdaştırıcının veya denetleyicinin veri yolu ilişkilerini (alt cihazlar) sorguladığında, veri yolu sürücüsünün veri yolu üzerinde fiziksel olarak bulunan tüm cihazların PPO'larına yönelik işaretçilerin listesini döndürmesi gerekir. Veri yolu sürücüsü, başlatılıp başlatılmadıklarına bakılmaksızın tüm cihazları raporlar. Hangi çocukların mevcut olduğunu belirlemek için otobüs sürücüsünün otobüs cihazını açması gerekebilir.
Uyarı Bir cihaz nesnesi, PnP yöneticisi bu nesne için bir cihaz düğümü (devnode) oluşturana kadar bir PDO'yu bağımsız değişken olarak alan hiçbir yordama geçirilemez. (Sürücü bir cihaz nesnesi geçirirse, sistem Hata Denetimi 0xCA: PNP_DETECTED_FATAL_ERROR ile hata denetimi yapar.) PnP yöneticisi , IRP_MN_QUERY_DEVICE_RELATIONS isteğine yanıt olarak devnode oluşturur. Sürücü, bir IRP_MN_QUERY_RESOURCE_REQUIREMENTS isteği aldığında PDO'nun devnode'unun oluşturulduğunu güvenle varsayabilir.
Bu IRP'ye yanıt veren veri yolu sürücüsü, bağdaştırıcının veya denetleyicinin bağlı olduğu veri yolunun üst veri yolu sürücüsü değil, veri yolu bağdaştırıcısının veya denetleyicinin işlev sürücüsüdür. Veri yolu olmayan cihazlar için işlev sürücüleri bu sorguyu işlemez. Bu tür sürücüler IRP'yi bir sonraki alt sürücüye geçirir. (Aşağıdaki şekilde bakın.) Filtre sürücüleri genellikle bu sorguyu işlemez.
Windows Vista ve sonraki işletim sistemlerinde sürücülerin her zaman IRP_MN_QUERY_DEVICE_RELATIONS IRP'yi kaleme alıp daha sonra işlemesini tamamlamalarını öneririz. Bu sıra, sistemin veri yolu ilişkisi sorgularını zaman uyumsuz olarak işlemesini sağlar. (Windows Vista'dan önceki işletim sistemlerinde, sürücüler dağıtım yordamlarından STATUS_PENDING güvenle döndürebilir, ancak PnP yöneticisi veri yolu ilişki sorgusuyla başka hiçbir işlem arasında çakışmaz.)
Aşağıdaki diyagramda sürücülerin veri yolu ilişkileri için bir sorguyu nasıl işlediği gösterilmektedir.
Şekilde gösterilen örnekte, PnP yöneticisi USB hub cihazının sürücülerine BusRelations için bir IRP_MN_QUERY_DEVICE_RELATIONS gönderir. PnP yöneticisi, hub cihazının alt öğelerinin listesini talep ediyor.
Tüm PnP IRP'lerinde olduğu gibi PnP yöneticisi de IRP'yi cihazın cihaz yığınındaki en üst sürücüye gönderir.
İsteğe bağlı bir filtre sürücüsü yığındaki en üstteki sürücü olabilir. Filtre sürücüsü genellikle bu IRP'i işlemez; IRP'yi yığından aşağı geçirir. Bir filtre sürücüsü bu IRP'yi işleyebilir, örneğin sürücü veri yolu üzerinde numaralandırılamayan bir cihaz kullanıma sunarsa.
USB hub veri yolu sürücüsü IRP'yi işler.
USB hub veri yolu sürücüsü:
Henüz sahip olmayan tüm alt cihazlar için bir PDO oluşturur.
PDO'sunu artık veri yolu üzerinde bulunmayan tüm cihazlar için etkin değil olarak işaretler. Veri yolu sürücüsü bu tür PPO'ları silmez.PPO'ların ne zaman silineceği hakkında daha fazla bilgi için bkz. Cihazı Kaldırma.
Otobüste bulunan tüm alt cihazları raporlar.
Her alt cihaz için veri yolu sürücüsü PDO'ya başvurur ve DEVICE_RELATIONS yapısında PDO'ya bir işaretçi yerleştirir.
Bu örnekte biri oyun çubuğu cihazı, diğeri de klavye cihazı için olan iki PPO vardır.
Veri yolu sürücüsü, başka bir sürücünün bu IRP için zaten bir DEVICE_RELATIONS yapısı oluşturup oluşturmadığını denetlemelidir. Bu durumda, veri yolu sürücüsünün mevcut bilgilere eklemesi gerekir.
Otobüste alt cihaz yoksa, sürücü DEVICE_RELATIONS yapısında sayıyı sıfır olarak ayarlar ve başarı döndürür.
G/Ç durum bloğundaki uygun değerleri ayarlar ve IRP'yi sonraki alt sürücüye geçirir. Bağdaştırıcı veya denetleyici için veri yolu sürücüsü IRP'yi tamamlamaz.
İsteğe bağlı bir alt filtre varsa, genellikle bu IRP'yi işlemez. Böyle bir filtre sürücüsü, IRP'yi yığından aşağı geçirir. Alt filtre sürücüsü bu IRP'yi işliyorsa, alt cihazlar listesine PDO'lar ekleyebilir, ancak diğer sürücüler tarafından oluşturulan PDO'ları silmemelidir.
Üst veri yolu sürücüsü, cihaz yığınındaki tek sürücü olmadığı sürece (cihaz ham modda) bu IRP'yi işlemez. Tüm PnP IRP'lerinde olduğu gibi, üst veri yolu sürücüsü IRP'yi IoCompleteRequest ile tamamlar.
Cihaz yığınında bir veya daha fazla veri yolu filtresi sürücüsü varsa, bu sürücüler IRP'yi veri yolu sürücüsüne inerken ve/veya IRP'nin cihaz yığınını yedekleme yolunda ( IoCompletion yordamları varsa) işleyebilir. PnP IRP kurallarına göre, böyle bir sürücü yığından aşağı doğru IRP'ye PPO'lar ekleyebilir ve/veya IRP'nin yığını yedekleme yolundaki ilişki listesini değiştirebilir ( IoCompletion yordamlarında).
EjectionRelations İsteği
Sürücü, belirtilen cihaz çıkarıldığında sistemden fiziksel olarak kaldırılmış olabilecek cihazların PPO'larına yönelik işaretçiler döndürür. Cihazın alt öğelerinin PPO'larını bildirmeyin; PnP yöneticisi her zaman alt cihazların üst cihazlarından önce kaldırılmasını istemektedir.
PnP yöneticisi çıkarılmakta olan bir cihaza IRP_MN_EJECT IRP gönderir. Böyle bir cihazın sürücüsü de kaldırma IRP'sini alır. Cihazın çıkarma ilişkileri bir IRP_MN_REMOVE_DEVICE IRP alır ( IRP_MN_EJECT IRP değil).
Yalnızca bir üst veri yolu sürücüsü alt cihazlarından biri için Bir EjectionRelations sorgusuna yanıt verebilir. İşlev ve filtre sürücüleri bunu cihaz yığınındaki bir sonraki alt sürücüye geçirmelidir. Bir veri yolu sürücüsü bu IRP'yi bağdaştırıcısının veya denetleyicisinin işlev sürücüsü olarak alırsa, veri yolu sürücüsü bir işlev sürücüsünün görevlerini gerçekleştirir ve IRP'yi sonraki alt sürücüye geçirmesi gerekir.
PowerRelations İsteği
Windows 7'den başlayarak , PowerRelations sorgusu bir sürücünün PnP numaralandırmasını destekleyen bir üst veri yolu ile veri yolu üzerindeki numaralandırılmış alt cihaz arasındaki geleneksel ilişki dışında bir güç yönetimi ilişkisi belirtmesini sağlar. Örneğin, bir veri yolu sürücüsü otobüste bir alt cihazı numaralandıramıyorsa veya bir cihaz birden fazla veri yolunun alt öğesiyse, PowerRelations sorgusu alt cihazın otobüs veya otobüslerle güç ilişkilerini açıklayabilir.
PnP yöneticisi, cihazın sürücüsü IoInvalidateDeviceRelations yordamını çağırdığında ve PowerRelations'ın Type parametre değerini belirttiğinde cihaz için bir PowerRelations sorgusu verir.
Bu sorguya yanıt olarak, hedef cihazın sürücüsü (sorgunun hedefi olan cihaz), hedef cihaz açılmadan önce güç yöneticisi tarafından açılması gereken diğer cihazların PPO'larına yönelik işaretçiler içeren bir DEVICE_RELATIONS yapısı sağlar. Buna karşılık, bu diğer cihazların yalnızca hedef cihaz kapatıldıktan sonra kapatılması gerekir. Power Manager, bu cihazların doğru sırada açılıp kapatıldığından emin olmak için sorgudaki bilgileri kullanır.
Bu sipariş garantisi yalnızca S1, S2, S3 (uyku), S4 (hazırda bekleme) ve S5 (kapatma) sistem güç durumlarına geçişleri içeren genel sistem uyku durumu geçişleri için geçerlidir. PowerRelations sipariş garantisi, Yönlendirilmiş Çalışma Zamanı Güç Yönetimi (DFx) geçişleri dışında sistem S0 (çalışıyor) sistem durumunda kalırken Dx cihaz güç durumu geçişleri için geçerli değildir.
Hedef cihaz özel bir dosyanın (disk belleği dosyası, hazırda bekletme dosyası veya kilitlenme bilgi dökümü dosyası gibi) cihaz yolundaysa, InPath'inTRUE olduğu bir IRP_MN_DEVICE_USAGE_NOTIFICATION IRP'yi işlediğinde hedef cihazın sürücüsünün ek bir adım gerçekleştirmesi gerekir. Bu sürücü, PowerRelations sorgusu için PPO'ları sağlanan cihazların özel dosya için cihaz yolunda olmayı da destekleyebildiğinden emin olmalıdır. Bu desteği onaylamak için, hedef cihazın sürücüsünün önce bu cihazların her birine IRP_MN_DEVICE_USAGE_NOTIFICATION IRP'yi göndermesi ve bu IRP'nin hedef cihazla aynı UsageNotification.Type değerini belirtmesi gerekir. Yalnızca bu IRP'yi alan tüm cihazlar IRP'yi başarı durum koduyla tamamlarsa hedef cihazın sürücüsü IRP'IRP_MN_DEVICE_USAGE_NOTIFICATION başarıyla tamamlayabilir. Aksi takdirde, bu sürücü bu IRP'yi bir hata durum koduyla tamamlamalıdır.
Aynı sürücü, InPath'inYANLIŞ olduğu bir IRP_MN_DEVICE_USAGE_NOTIFICATION IRP'sini işlediğinde, sürücünün IRP_MN_DEVICE_USAGE_NOTIFICATIONIRP'sini InPath'inTRUE olduğu durumla aynı bağımlı cihaz kümesine göndermesi gerekir. Ancak, InPathYANLIŞ olduğunda sürücü bu IRP'yi hiçbir zaman hata durum koduyla tamamlamamalıdır.
PowerRelations sorgusuna yanıt veren sürücü, PPO'ları PowerRelations sorgusu için sağlanan tüm cihazlarda hedef cihaz değişikliği bildirimlerine kaydolmalıdır. Bu bildirimlere kaydolmak için sürücü IoRegisterPlugPlayNotification yordamını çağırabilir ve EventCategoryTargetDeviceChangeiçin bir EventCategory parametre değeri belirtebilir.
RemovalRelations İsteği
Bir sürücü, belirtilen cihazın sürücüleri kaldırıldığında sürücüleri kaldırılması gereken tüm cihazların PPO'larına yönelik işaretçiler döndürür. Cihazın alt öğelerinin PPO'larını bildirmeyin; PnP yöneticisi, bir cihazı kaldırmadan önce alt cihazların kaldırılmasını zaten istemektedir.
Kaldırma ilişkilerinin kaldırılma sırası tanımlanmamıştır.
Cihaz yığınındaki herhangi bir sürücü bu tür ilişkiler sorgusunu işleyebilir. bir işlev veya filtre sürücüsü, IRP'yi sonraki alt sürücüye geçirmeden önce işler. Bir veri yolu sürücüsü IRP'yi işler ve ardından tamamlar.
TargetDeviceRelation İsteği
TargetDeviceRelation sorgusu, PnP yöneticisinin donanımı denetleyen PnP cihaz yığınındaki PDO için PnP olmayan bir cihaz yığını sorgulamasını sağlar.
Genel olarak sürücüler, IRP belirli bir cihaz yığınının altına ulaşana kadar IRP_MN_QUERY_DEVICE_RELATIONS IRP'sini yığınlarından aşağı doğru iletir. PnP olmayan bir yığının en altındaki sürücü daha sonra IRP'yi ilgili PnP yığınına iletir veya yeniden yayımlar. Örneğin, PnP yöneticisi dosya sistemi yığınının üst kısmındaki cihaz nesnesine PnP olmayan bir yığın olan targetDeviceRelation sorgusu gönderebilir. Dosya sistemi yığınındaki her cihaz nesnesi, sorgu yığının en altındaki cihaz nesnesine ulaşana kadar sorguyu altındaki cihaz nesnesine geçirir. Yığındaki en düşük cihaz nesnesi TargetDeviceRelation sorgusunu PnP depolama birimi yığınının en üstündeki cihaz nesnesine iletir veya yeniden yayımlar ve ardından sorgu depolama birimi yığınının en altındaki PDO'ya geçirilir.
Aşağıdaki listede, PnP cihaz yığınının alt kısmındaki PDO'ya güvenli bir şekilde işaretçi edinebileceğiniz durumlar özetlemektedir:
PnP'deki cihaz nesnesi
PnP cihaz yığınındaki bir cihaz nesnesi, cihaz için AddDevice yordamı çağrıldığında yığının PDO'sunu öğrenir. İşaretçi kullanımı, kaldırma kilidi yordamları kullanılarak gelen IRP_MN_REMOVE_DEVICE iletileriyle düzgün eşitlenmişse, sürücü işaretçiyi PDO'ya güvenli bir şekilde önbelleğe alabilir.
PnP olmayan bir yığında cihaz nesnesi, yığının en altında değil
PnP olmayan bir yığının altında olmayan bir cihaz nesnesi için, bir sürücü ilgili PnP cihaz yığınının alt kısmındaki PDO'ya yönelik bir işaretçi almak için targetDeviceRelation sorgusu gönderebilir.
Cihaz için dosya nesnesi
Bir sürücü, cihaz için bir dosya nesnesi verilip IoGetRelatedDeviceObject'i çağırarak cihaz nesnesini alabilir ve önceki liste öğesindeki yönergeleri izleyebilir.
Cihaz nesnesi tanıtıcısı
Bir sürücü, cihaz nesnesine yönelik bir tanıtıcı verilip ObReferenceObjectByHandle'ı çağırarak cihazın dosya nesnesini alabilir ve önceki liste öğesindeki yönergeleri izleyebilir.
Üst veri yolu sürücüsünün alt cihazları için TargetDeviceRelation ilişkileri sorgusunu işlemesi gerekir. Veri yolu sürücüsü alt cihazın ObReferenceObject ile PDO'sunu başvurur ve DEVICE_RELATIONS yapısındaki PDO'ya bir işaretçi döndürür. Bu ilişki türü için yapıda yalnızca bir PDO işaretçisi vardır. Sürücü veya uygulama cihazda bildirim için kaydını kaldırdığında PnP yöneticisi PDO başvurusunu kaldırır.
TargetDeviceRelation sorgusuna yalnızca bir üst veri yolu sürücüsü yanıt verir. İşlev ve filtre sürücüleri bunu cihaz yığınındaki bir sonraki alt sürücüye geçirmelidir. Bir veri yolu sürücüsü bu IRP'yi bağdaştırıcısının veya denetleyicisinin işlev sürücüsü olarak alırsa, veri yolu sürücüsü bir işlev sürücüsünün görevlerini gerçekleştirir ve IRP'yi sonraki alt sürücüye geçirmesi gerekir.
Sürücü PDO tabanlı bir yığında değilse, sürücü üzerinde G/Ç gerçekleştirdiği dosya tanıtıcısıyla ilişkili cihaz nesnesine yeni bir hedef cihaz ilişkisi sorgusu IRP'sini gönderir.
Bu IRP Gönderiliyor
Sürücüler BusRelations istemek için IRP_MN_QUERY_DEVICE_RELATIONS göndermemelidir. Sürücülerin bu IRP'yi RemovalRelations veya EjectionRelations için göndermesi kısıtlanmaz, ancak bir sürücünün göndermesi olası değildir.
Sürücüler TargetDeviceRelation için bir cihaz yığınını sorgulayabilir. IRP'leri gönderme hakkında bilgi için bkz. IRP'leri işleme. Aşağıdaki adımlar özellikle bu IRP için geçerlidir:
IRP'nin sonraki G/Ç yığını konumundaki değerleri ayarlayın: MajorFunction değerini IRP_MJ_PNP, MinorFunction değerini IRP_MN_QUERY_DEVICE_RELATIONS, Parameters.QueryDeviceRelations.Type değerini TargetDeviceRelation olarak ayarlayın ve Irp-FileObject> değerini geçerli bir dosya nesnesine ayarlayın.
STATUS_NOT_SUPPORTED için IoStatus.Status dosyasını başlatın.
Bir sürücü, sürücünün aldığı TargetDeviceRelationIRP_MN_QUERY_DEVICE_RELATIONS yanıt olarak PDO'yu raporlamak üzere bu IRP'yi gönderdiyse, sürücü PDO'yu bildirir ve IRP tamamlandığında döndürülen ilişkiler yapısını serbest kalır. Bir sürücü bu IRP'yi başka bir nedenle başlattıysa, IRP tamamlandığında ilişki yapısını serbestleştirir ve artık gerekli olmadığında PDO'ya başvurur.
Gereksinimler
Başlık |
Wdm.h (Wdm.h, Ntddk.h veya Ntifs.h dahil) |
Ayrıca bkz.
IoRegisterPlugPlayNotification
IRP_MN_DEVICE_USAGE_NOTIFICATION