Aracılığıyla paylaş


WMI WNODE_XXX Yapıları

WMI, kullanıcı modu veri tüketicileri ile sürücüler gibi çekirdek modu veri sağlayıcıları arasında veri geçirmek için xxx WNODE_adlı bir standart veri yapıları kümesi kullanır. Bir sürücü wmi isteklerini WmiSystemControlçağırarak işlerse, sürücünün XXXyapıları WNODE_okuması veya yazması gerekmez. Aksi takdirde, sürücü Parameters.WMI.Buffer konumunda XXX WNODE_girişi yorumlamalı ve/veya xxxbu konuma bir çıkış WNODE_yazmalıdır.

Aşağıdaki tabloda WMI IRP'leri ve karşılık gelen WNODE_XXX yapıları listeledik.

WMI IRP İlgili WNODE_XXX Yapısı

IRP_MN_CHANGE_SINGLE_INSTANCE

WNODE_SINGLE_INSTANCE

IRP_MN_CHANGE_SINGLE_ITEM

WNODE_SINGLE_ITEM

IRP_MN_EXECUTE_METHOD

WNODE_METHOD_ITEM

IRP_MN_QUERY_ALL_DATA

WNODE_ALL_DATA

IRP_MN_QUERY_SINGLE_INSTANCE

WNODE_SINGLE_INSTANCE

Etkin olayların bildirimlerini göndermek için xxxyapıları WNODE_EVENT_ITEM ve WNODE_EVENT_REFERENCEolmak üzere iki ek WNODE_kullanılır. Olay bloklarını kaydeden bir sürücü, bir olay etkinleştirilirse ve olay gerçekleşirse, IoWMIWriteEvent çağırarak ve WNODE_EVENT_XXX yapısı geçirerek WMI'ye olay bildirimi gönderir. WMI olaylarını gönderme hakkında bilgi için bkz. WMI Olaylarını Gönderme.

HER WNODE_XXX yapısı aşağıdakilerden oluşur:

  • Arabelleğin boyutu, veri bloğunu temsil eden GUID ve statik veya dinamik örnek adları kullanıp kullanmadığı WNODE_XXX yapısının türünü gösteren bayraklar dahil olmak üzere tüm WNODE_XXX ortak bilgileri içeren ekli WNODE_HEADER yapısı, ve bloğun diğer özellikleri.

  • Örnek adlarına ve verilere uzaklıklar gibi belirli WNODE_XXX yapısının sabit üyeleri.

IRP arabelleğindeki (Parameters.WMI.Buffer) bir WNODE_XXX yapısı genellikle dinamik örnek adları, statik örnek adı dizeleri, bir yöntem için giriş veya çıkış gibi istekle ilgili değişken veriler ya da bir veri bloğunun bir veya daha fazla örneğine ait veriler izler. Bu nedenle arabelleğin boyutu, ilgili değişken veri miktarına göre boyutunu (WNODE_XXX) aşmalıdır.

WMI'nin bir sürücü tarafından sağlanan değişken verilerinde tür denetimi gerçekleştirmediğini unutmayın. Bir veri tüketicisinin verileri doğru ayrıştırabilmesi için sürücünün çıkış verilerini çıkış arabelleğindeki uygun bir sınıra hizalaması gerekir. Özellikle, her örnek 8 baytlık bir sınırda başlamalıdır ve öğelerinin her biri, daha önce sürücü tarafından kaydedilen veri bloğu şemasına göre doğal bir sınıra hizalanmalıdır. Dinamik örnek adları 2 baytlık bir sınıra hizalanabilir.

Aşağıdaki şekilde, bir sürücünün IRP_MN_QUERY_SINGLE_INSTANCE isteğine yanıt olarak döndürebileceği bir WNODE_SINGLE_INSTANCE yapısı içeren IRP arabelleğinin blok diyagramı gösterilmektedir.

wnode-single-instance içeren bir irp arabelleği gösteren diyagramı.

Önceki şeklin en üstünden başlayarak:

  • WNODE_SINGLE_INSTANCE başındaki WNODE_HEADER yapısı WnodeHeader üyesinde yer alır. WMI, isteği göndermeden önce WNODE_HEADER tüm üyelerini doldurur. WNODE_HEADER:

    • WnodeHeader.Buffersize, yapının sabit üyelerini izleyen veriler de dahil olmak üzere WNODE_SINGLE_INSTANCEboyutunu gösterir. (WnodeHeader.Buffersize değeri genellikle Parameters.WMI.Buffersizedeğerinden küçüktür. Bu değer, WMI tarafından sürücüden çıkış almak için ayrılan arabelleğin boyutunu gösterir.)
    • WnodeHeader.Guid veri bloğunu tanımlayan GUID'yi içerir.
    • Bu örnekte WnodeHeader.Flags bu yapının bir WNODE_SINGLE_INSTANCE olduğunu ve veri bloğunun statik örnek adlarını kullandığını gösterir.
  • Veri bloğu statik örnek adları kullandığından WMI, InstanceIndex'i, bloğu kaydederken sürücü tarafından geçirilen statik örnek adları listesindeki örneğin dizinine ayarlar. OffsetInstanceNames kullanılmaz.

  • WMI, DataBlockOffset'ni, arabelleğin başından örnek verilerinin ilk bayt'ının uzaklığını gösterecek şekilde ayarlar. (Sürücü bu değeri değiştirmemelidir) Veri bloğu statik örnek adlarını kullandığından, bu uzaklık VariableDataile aynı konumu gösterir. Veri bloğu dinamik örnek adları kullandıysa, örnek adları VariableData başlar ve DataBlockOffset arabelleğe daha büyük bir uzaklık belirtir.

  • Sürücü, SizeDataBlock döndürülen örnek verilerinin bayt sayısına ayarlar.

  • VariableData (varsa örnek adı verilerinden sonra), sürücü istenen örnek için örnek verilerini çıkış arabelleğine yazar.

Bir sürücü WNODE_METHOD_ITEM ve WNODE_SINGLE_ITEM yapılarını WNODE_SINGLE_INSTANCEgibi okur ve yazar. Her biri OffsetInstanceName , InstanceIndex, DataBlockOffset, SizeDataBlock (veya WNODE_SINGLE_ITEMWNODE_SINGLE_ITEM, SizeDataItem) ve VariableDatasabit üyelerine sahip olduğundan bu yapılar birbirine benzer. WNODE_METHOD_ITEM bir MethodId ve WNODE_SINGLE_ITEMWNODE_SINGLE_INSTANCE eksik ItemId içerir.

WNODE_ALL_DATA, bir veri bloğunun birden çok örneğini geçirmek için kullanıldığı ve büyük olasılıkla dinamik örnek adları ve büyük olasılıkla farklı boyutlardaki yapılardan farklıdır.

Aşağıdaki şekilde, bir sürücünün IRP_MN_QUERY_ALL_DATA isteğine yanıt olarak döndürebileceği bir WNODE_ALL_DATA içeren IRP arabelleğinin blok diyagramı gösterilmektedir.

wnode-all-data içeren bir irp arabelleği gösteren diyagramı.

Önceki şeklin en üstünden başlayarak:

  • Önceki şekilde açıklandığı gibi, WNODE_ALL_DATA başındaki WNODE_HEADER yapısı WnodeHeader üyesinde yer alır. WnodeHeader.Buffersize ve WnodeHeader.Guid sırasıyla WNODE_ALL_DATA boyutunu ve veri bloğunun GUID'sini gösterir.

    Bu örnekte WMI, bu yapının bir WNODE_ALL_DATA olduğunu ve veri bloğunun dinamik örnek adlarıyla kaydedildiğini (wmi WNODE_FLAG_STATIC_INSTANCE_NAMES ve WNODE_FLAG_PDO_INSTANCE_NAMES temizler) belirtmek için WnodeHeader.Flags ayarlar. Çıkışta, sürücü tüm örneklerin aynı boyutta olduğunu belirtmek için WNODE_FLAG_FIXED_INSTANCE_SIZE ayarlar.

  • WMI, DataBlockOffset'ni, arabelleğin başından örnek verilerinin ilk bayt'ının uzaklığını gösterecek şekilde ayarlar. (Sürücü bu değeri değiştirmemelidir). Bu örnekte örnek verileri, OffsetInstanceNameOffsetskonumundaki örnek adlarını izler.

  • Sürücü, döndürülen örnek sayısını belirtmek için InstanceCount ayarlar.

  • Dinamik örnek adlarını kullanan veri blokları için xxx WNODE_her zaman örnek adı dizelerini içerir. Bu örnek dinamik örnek adlarını kullandığından, OffsetInstanceNameOffsets arabelleğin başından arabellekteki dinamik örnek adlarına uzaklık dizisine uzaklığı gösterir.

  • FixedInstanceSize, sürücü tarafından döndürülen her örnekteki veri bayt sayısını gösterir. Bu veri bloğunun örneklerinin boyutu değişirse, sürücü, WnodeHeader.Flags içindeki WNODE_FLAG_FIXED_INSTANCE_SIZE temizler ve OffsetInstanceDataAndLength offsetINSTANCEDATAANDLENGTH yapılarından oluşan bir diziye ayarlar ve her biri bir örnek için veri uzaklığını ve bu örnekteki bayt sayısını FixedInstanceSizeayarlamak yerine bu örnekteki bayt sayısını belirtir.

xxxyapıları WNODE_hakkında daha fazla bilgi için bkz. Sistem Yapıları.