Bagikan melalui


IRP_MN_QUERY_ALL_DATA

Semua driver yang mendukung WMI harus menangani IRP ini. Driver dapat menangani RUN WMI baik dengan memanggil WmiSystemControl atau dengan menangani IRP itu sendiri, seperti yang dijelaskan dalam Menangani Permintaan WMI.

Jika driver memanggil WmiSystemControl untuk menangani permintaan IRP_MN_QUERY_ALL_DATA, WMI pada gilirannya memanggil rutinitas DpWmiQueryDataBlock driver tersebut.

Kode Utama

IRP_MJ_SYSTEM_CONTROL

Ketika Dikirim

WMI mengirimkan IRP ini untuk mengkueri semua instans blok data tertentu.

WMI mengirimkan IRP ini di IRQL = PASSIVE_LEVEL dalam konteks utas sewenang-wenang.

Parameter Input

Parameters.WMI.ProviderId di lokasi tumpukan I/O driver di titik IRP ke objek perangkat driver yang harus merespons permintaan.

Parameters.WMI.DataPath menunjuk ke GUID yang mengidentifikasi blok data.

Parameters.WMI.BufferSize menunjukkan ukuran maksimum buffer yang tidak di-parameters.WMI.Buffer, yang menerima data output dari permintaan. Ukuran buffer harus lebih besar dari atau sama dengan sizeof(WNODE_ALL_DATA) ditambah ukuran nama instans dan data untuk semua instans yang akan dikembalikan.

Parameter Output

Jika driver menangani RUN WMI dengan memanggil WmiSystemControl, WMI mengisi WNODE_ALL_DATA dengan memanggil rutinitas DpWmiQueryDataBlock driver sekali untuk setiap blok yang didaftarkan oleh driver.

Jika tidak, driver mengisi struktur WNODE_ALL_DATA di Parameters.WMI.Buffer sebagai berikut:

  • Mengatur WnodeHeader.BufferSize ke jumlah byte dari seluruh WNODE_ALL_DATA yang akan dikembalikan, mengatur WnodeHeader.Timestamp ke nilai yang dikembalikan oleh KeQuerySystemTime, dan mengatur WnodeHeader.Flags yang sesuai untuk data yang akan dikembalikan.

  • Mengatur InstanceCount ke jumlah instans yang akan dikembalikan.

  • Jika blok menggunakan nama instans dinamis, atur OffsetInstanceNameOffsets ke offset dalam byte dari awal WNODE_ALL_DATA ke tempat array offset ULONG dimulai. Setiap elemen dalam array ini adalah offset dari WNODE_ALL_DATA ke tempat setiap nama instans dinamis disimpan. Setiap nama instans dinamis disimpan sebagai string Unicode yang dihitung di mana hitungannya adalah USHORT diikuti oleh string Unicode. Jumlah tidak termasuk karakter null yang mengakhiri yang mungkin menjadi bagian dari string Unicode. Jika string Unicode menyertakan karakter null yang mengakhiri, karakter null ini masih harus pas dalam ukuran yang ditetapkan di WNodeHeader.BufferSize.

  • Jika semua instans berukuran sama:

    • Mengatur WNODE_FLAG_FIXED_INSTANCE_SIZE di WnodeHeader.Flags dan mengatur FixedInstanceSize ke ukuran tersebut, dalam byte.
    • Menulis data instans mulai dari DataBlockOffset, dengan padding sehingga setiap instans selaras dengan batas 8 byte. Misalnya, jika FixedInstanceSize adalah 6, driver menambahkan 2 byte padding antar instans.
  • Jika instans bervariasi dalam ukuran:

    • Menghapus WNODE_FLAG_FIXED_INSTANCE_SIZE di WnodeHeader.Flags dan menulis array struktur InstanceCount OFFSETINSTANCEDATAANDLENGTH mulai dari OffsetInstanceDataAndLength. Setiap struktur OFFSETINSTANCEDATAANDLENGTH menentukan offset dalam byte dari awal struktur WNODE_ALL_DATA hingga awal data untuk setiap instans, dan panjang data. DataBlockOffset tidak digunakan.

    • Menulis data instans mengikuti elemen terakhir dari array OffsetInstanceDataAndLength , ditambah padding sehingga setiap instans selaras dengan batas 8 byte.

Jika buffer di Parameters.WMI.Buffer terlalu kecil untuk menerima semua data, driver mengisi ukuran yang diperlukan dalam struktur WNODE_TOO_SMALL di Parameters.WMI.Buffer. Jika buffer lebih kecil dari sizeof(WNODE_TOO_SMALL), driver gagal IRP dan mengembalikan STATUS_BUFFER_TOO_SMALL.

Blok Status I/O

Jika driver menangani IRP dengan memanggil WmiSystemControl, WMI mengatur Irp-IoStatus.Status> dan Irp-IoStatus.Information> di blok status I/O.

Jika tidak, driver mengatur Irp-IoStatus.Status> ke STATUS_SUCCESS atau ke status kesalahan yang sesuai seperti berikut ini:

STATUS_BUFFER_TOO_SMALL

STATUS_WMI_GUID_NOT_FOUND

Setelah berhasil, driver menetapkan Irp-IoStatus.Information> ke jumlah byte yang ditulis ke buffer di Parameters.WMI.Buffer.

Operasi

Driver dapat menangani RUN WMI baik dengan memanggil WmiSystemControl atau dengan menangani IRP itu sendiri, seperti yang dijelaskan dalam Menangani Permintaan WMI.

Jika driver menangani RUN WMI dengan memanggil WmiSystemControl, yang rutin memanggil rutinitas DpWmiQueryDataBlock driver.

Jika driver menangani permintaan IRP_MN_QUERY_ALL_DATA, driver harus melakukannya hanya jika Parameters.WMI.ProviderId menunjuk ke objek perangkat yang sama dengan yang diteruskan driver ke IoWMIRegistrationControl. Jika tidak, driver harus meneruskan permintaan ke driver berikutnya yang lebih rendah.

Sebelum menangani permintaan, driver harus menentukan apakah Parameters.WMI.DataPath menunjuk ke GUID yang didukung driver. Jika tidak, driver harus gagal IRP dan mengembalikan STATUS_WMI_GUID_NOT_FOUND.

Jika driver mendukung blok data, driver harus melakukan hal berikut:

  • Verifikasi bahwa Parameters.WMI.BufferSize menentukan buffer yang cukup besar untuk menerima semua data yang akan dikembalikan driver.

  • Isi struktur WNODE_ALL_DATA di Parameters.WMI.Buffer dengan data untuk semua instans blok data tersebut.

Persyaratan

Header

Wdm.h (termasuk Wdm.h, Ntddk.h, atau Ntifs.h)

Lihat juga

DpWmiQueryDataBlock

IoWMIRegistrationControl

KeQuerySystemTime

WMILIB_CONTEXT

WmiSystemControl

WNODE_ALL_DATA