IRP_MN_REGINFO_EX
WMI mengirimkan IRP ini untuk mengkueri atau memperbarui informasi pendaftaran driver setelah driver memanggil IoWMIRegistrationControl. Driver dapat menangani RUNP 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_REGINFO_EX , WMI pada gilirannya memanggil rutinitas DpWmiQueryReginfo driver tersebut.
Pada Microsoft Windows XP dan sistem operasi yang lebih baru, driver yang mendukung WMI harus menangani IRP ini. Driver yang mendukung Microsoft Windows 98 dan Windows 2000 juga harus menangani IRP_MN_REGINFO.
Kode Utama
Ketika Dikirim
Pada Windows XP dan yang lebih baru, WMI mengirimkan IRP ini untuk mengkueri atau memperbarui informasi pendaftaran driver setelah driver memanggil IoWMIRegistrationControl. Pada Windows 98 dan Windows 2000, WMI mengirimkan permintaan IRP_MN_REGINFO sebagai gantinya.
WMI mengirimkan IRP ini di IRQL = PASSIVE_LEVEL dalam konteks utas sistem.
Parameter Input
Parameters.WMI.ProviderId menunjuk ke objek perangkat driver yang harus merespons permintaan. Pointer ini terletak di lokasi tumpukan I/O driver di IRP.
Parameters.WMI.DataPath diatur ke WMIREGISTER untuk meminta informasi pendaftaran atau WMIUPDATE untuk memperbaruinya.
Parameters.WMI.BufferSize menunjukkan ukuran maksimum buffer yang tidak bertumpuk di Parameters.WMI.Buffer. Ukurannya harus lebih besar dari atau sama dengan total (sizeof(WMIREGINFO) + (GuidCount * sizeof(WMIREGGUID)), di mana GuidCount adalah jumlah blok data dan blok peristiwa yang didaftarkan oleh driver, ditambah ruang untuk nama instans statis, jika ada.
Parameter Output
Jika driver menangani IRP WMI dengan memanggil WmiSystemControl, WMI mendapatkan informasi pendaftaran untuk blok data driver dengan memanggil rutinitas DpWmiQueryReginfo-nya .
Jika tidak, driver mengisi struktur WMIREGINFO di Parameters.WMI.Buffer sebagai berikut:
Mengatur BufferSize ke ukuran dalam byte struktur WMIREGINFO ditambah data pendaftaran terkait.
Jika driver menangani permintaan WMI atas nama driver lain, mengatur NextWmiRegInfo ke offset dalam byte dari awal WMIREGINFO ini ke awal struktur WMIREGINFO lain yang berisi informasi pendaftaran dari driver lain.
Mengatur RegistryPath ke jalur registri yang diteruskan ke rutinitas DriverEntry driver.
Jika Parameters.WMI.Datapath diatur ke WMIREGISTER, mengatur MofResourceName ke offset dari awal WMIREGINFO ini ke string Unicode yang dihitung yang berisi nama sumber daya MOF driver dalam file gambarnya.
Mengatur GuidCount ke jumlah blok data dan blok peristiwa untuk mendaftar atau memperbarui.
Menulis array struktur WMIREGGUID , satu untuk setiap blok data atau blok peristiwa yang diekspos oleh driver, di WmiRegGuid.
Driver mengisi setiap struktur WMIREGGUID sebagai berikut:
Mengatur Guid ke GUID yang mengidentifikasi blok.
Mengatur Bendera untuk memberikan informasi tentang nama instans dan karakteristik blok lainnya. Misalnya, jika blok didaftarkan dengan nama instans statis, driver mengatur Bendera dengan bendera WMIREG_FLAG_INSTANCE_XXX yang sesuai.
Jika blok sedang didaftarkan dengan nama instans statis, driver:
Mengatur InstanceCount ke jumlah instans.
Mengatur salah satu anggota berikut ke offset dalam byte ke data nama instans statis untuk blok:
Jika driver mengatur Bendera dengan WMIREG_FLAG_INSTANCE_LIST, driver mengatur InstanceNameList ke offset ke daftar string nama instans statis. WMI menentukan instans dalam permintaan berikutnya berdasarkan indeks ke dalam daftar ini.
Jika driver mengatur Bendera dengan WMIREG_FLAG_INSTANCE_BASENAME, driver mengatur BaseNameOffset ke offset ke string nama dasar. WMI menggunakan string ini untuk menghasilkan nama instans statis untuk blok tersebut.
Jika driver mengatur Bendera dengan WMIREG_FLAG_INSTANCE_PDO, driver mengatur Pdo ke offset ke penunjuk ke PDO yang diteruskan ke rutinitas AddDevice driver. WMI menggunakan jalur instans perangkat PDO untuk menghasilkan nama instans statis untuk blok tersebut. Driver harus memanggil ObReferenceObject pada objek perangkat fisik yang diteruskan di Pdo. Sistem akan secara otomatis memanggil ObDereferenceObject untuk mendereferensikan objek; driver tidak boleh melakukannya. (Driver yang menggunakan WmiSystemControl untuk menangani RUN tidak perlu memanggil ObReferenceObject. WMI secara otomatis melakukannya sebelum memanggil rutinitas DpWmiQueryReginfo driver.)
Menulis string nama instans, string nama dasar, atau penunjuk ke PDO pada offset yang ditunjukkan oleh InstanceNameList, BaseName, atau Pdo, masing-masing.
Jika driver menangani pendaftaran WMI atas nama driver lain (seperti miniclass atau driver miniport), driver tersebut mengisi struktur WMIREGINFO lain dengan informasi pendaftaran driver lain dan menulisnya di NextWmiRegInfo di struktur sebelumnya.
Jika buffer di Parameters.WMI.Buffer terlalu kecil untuk menerima semua data, driver menulis ukuran yang diperlukan dalam byte sebagai ULONG ke Parameters.WMI.Buffer dan gagal IRP dan mengembalikan STATUS_BUFFER_TOO_SMALL.
Blok Status I/O
Jika driver menangani IRP dengan memanggil WmiSystemControl, WMI menetapkan 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
Setelah berhasil, driver menetapkan Irp-IoStatus.Information> ke jumlah byte yang ditulis ke buffer di Parameters.WMI.Buffer.
Operasi
Jika driver menangani permintaan IRP_MN_REGINFO_EX itu sendiri, driver harus melakukannya hanya jika Parameters.WMI.ProviderId menunjuk ke objek perangkat yang sama dengan pointer yang diteruskan driver ke IoWMIRegistrationControl. Jika tidak, driver harus meneruskan permintaan ke driver berikutnya yang lebih rendah.
Sebelum menangani permintaan, driver harus memeriksa Parameters.WMI.DataPath untuk menentukan apakah WMI meminta informasi pendaftaran (WMIREGISTER) atau meminta pembaruan (WMIUPDATE).
WMI mengirimkan IRP ini dengan WMIREGISTER setelah driver memanggil IoWMIRegistrationControl dengan WMIREG_ACTION_REGISTER atau WMIREG_ACTION_REREGISTER. Sebagai tanggapan, driver harus mengisi buffer di Parameters.WMI.Buffer dengan yang berikut:
Struktur WMIREGINFO yang menunjukkan jalur registri driver, nama sumber daya MOF-nya, dan jumlah blok yang akan didaftarkan.
Satu strukturWMIREGGUID untuk setiap blok untuk mendaftar. Jika blok akan didaftarkan dengan nama instans statis, driver menetapkan bendera WMIREG_FLAG_INSTANCE_XXX yang sesuai dalam struktur WMIREGGUID untuk blok tersebut.
Setiap string WMI perlu menghasilkan nama instans statis.
WMI mengirimkan IRP ini dengan WMIUPDATE setelah driver memanggil IoWmiRegistrationControl dengan WMIREG_ACTION_UPDATE_GUIDS. Sebagai respons, driver harus mengisi buffer di Parameters.WMI.Buffer dengan struktur WMIREGINFO sebagai berikut:
Untuk menghapus blok, driver mengatur WMIREG_FLAG_REMOVE_GUID dalam struktur WMIREGGUID-nya .
Untuk menambahkan atau memperbarui blok (misalnya, untuk mengubah nama instans statisnya), driver menghapus WMIREG_FLAG_REMOVE_GUID dan menyediakan nilai pendaftaran baru atau yang diperbarui untuk blok tersebut.
Untuk mendaftarkan blok baru atau yang sudah ada dengan nama instans statis, driver menetapkan WMIREG_FLAG_INSTANCE_XXX yang sesuai dan menyediakan string apa pun yang diperlukan WMI untuk menghasilkan nama instans statis.
Driver dapat menggunakan struktur WMIREGINFO yang sama untuk menghapus, menambahkan, atau memperbarui blok seperti yang digunakan pada awalnya untuk mendaftarkan semua bloknya, hanya mengubah bendera dan data untuk blok yang akan diperbarui. Jika WMIREGGUID dalam struktur WMIREGINFO seperti itu cocok dengan WMIREGGUID yang diteruskan oleh driver ketika pertama kali mendaftarkan blok itu, WMI melewati pemrosesan yang terlibat dalam memperbarui blok.
WMI tidak mengirim permintaan IRP_MN_REGINFO_EX setelah driver memanggil IoWMIRegistrationControl dengan WMIREG_ACTION_DEREGISTER, karena WMI tidak memerlukan informasi lebih lanjut dari driver. Driver biasanya membatalkan pendaftaran bloknya sebagai respons terhadap permintaan IRP_MN_REMOVE_DEVICE .
Persyaratan
Header |
Wdm.h (termasuk Wdm.h, Ntddk.h, atau Ntifs.h) |