Bagikan melalui


Memproses IRP WMI dalam Rutinitas DispatchSystemControl

Driver yang menangani runtime integrasi WMI dalam rutinitas DispatchSystemControl harus menangani IRP seperti itu hanya jika pointer objek perangkat di Parameters.WMI.ProviderId cocok dengan pointer yang diteruskan oleh driver dalam panggilannya ke IoWMIRegistrationControl. Jika tidak, driver harus meneruskan IRP ke driver bawah berikutnya.

Jika driver menangani permintaan, driver harus:

Periksa GUID di Parameters.WMI.DataPath untuk menentukan apakah itu mewakili blok data yang didukung oleh driver dan, jika tidak, gagalkan IRP dengan STATUS_WMI_GUID_NOT_FOUND.

Driver harus memeriksa struktur input WNODE_XXX di Parameters.WMI.Buffer untuk nama instans saat menangani salah satu permintaan berikut:

IRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_ITEMIRP_MN_EXECUTE_METHOD Driver harus memeriksa nama instans sebagai berikut:

  • Jika WNODE_FLAG_STATIC_INSTANCE_NAMES diatur dalam WnodeHeader.Flags, gunakan InstanceIndex sebagai indeks ke dalam daftar driver nama instans statis untuk blok tersebut.

  • Jika WNODE_FLAG_STATIC_INSTANCE_NAMES jelas dalam WnodeHeader.Flags, gunakan OffsetInstanceName sebagai offset ke string nama instans dalam struktur input WNODE_XXX . OffsetInstanceName adalah offset dalam byte dari awal struktur ke USHORT yang menunjukkan panjang string nama instans dalam byte (bukan karakter), termasuk terminator NUL jika ada, diikuti oleh string itu sendiri di Unicode.

Jika driver tidak dapat menemukan instans yang ditentukan oleh InstanceIndex atau OffsetInstanceName, itu harus gagal IRP dengan STATUS_WMI_INSTANCE_NOT_FOUND.

Untuk permintaan IRP_MN_EXECUTE_METHOD , periksa MethodID di WNODE_METHOD_ITEM input dan, jika metode tidak valid untuk blok data tersebut, gagalkan IRP dengan STATUS_WMI_ITEMID_NOT_FOUND.

Jika permintaan menghasilkan output, driver harus memeriksa ukuran buffer di Parameters.WMI.BufferSize saat menangani salah satu permintaan berikut:

IRP_MN_QUERY_ALL_DATAIRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_EXECUTE_METHOD Jika buffer terlalu kecil untuk menerima output, tetapi setidaknya sizeof(WNODE_TOO_SMALL), driver harus berhasil IRP dan menulis struktur WNODE_TOO_SMALL ke buffer di Parameters.WMI.Buffer. Jika buffer lebih kecil dari sizeof(WNODE_TOO_SMALL), driver gagal IRP dengan kode NTSTATUS STATUS_BUFFER_TOO_SMALL.

Jika permintaan menghasilkan output dan ukuran buffer memadai, tulis output berikut ke buffer di Parameters.WMI.Buffer:

  • Untuk permintaan IRP_MN_QUERY_ALL_DATA , driver menulis struktur WNODE_ALL_DATA yang berisi data untuk semua instans blok data yang ditentukan.
  • Untuk permintaan IRP_MN_QUERY_SINGLE_INSTANCE , driver menulis struktur WNODE_SINGLE_INSTANCE yang berisi data untuk instans blok data yang ditentukan.
  • Untuk IRP_MN_EXECUTE_METHOD jika metode menghasilkan output, driver menulis output metode dalam format yang ditentukan driver mengikuti WNODE_METHOD_ITEM input di buffer (menimpa data input, jika ada).

Atur Irp-IoStatus.Information> ke jumlah byte yang ditulis ke buffer di Parameters.WMI.Buffer dan Irp-IoStatus.Status> ke STATUS_SUCCESS.

Panggil IoCompleteRequest untuk menyelesaikan IRP.

Untuk informasi selengkapnya, lihat Struktur WMI WNODE_XXX.