Menerbitkan Skema Peristiwa Anda untuk Penyedia Klasik

Penyedia klasik harus menggunakan Managed Object Format (MOF) untuk menerbitkan tata letak data peristiwa mereka. Konsumen kemudian dapat membaca tata letak yang diterbitkan dari WMI saat runtime dan menggunakannya untuk membaca data peristiwa.

Jika Anda menggunakan MOF untuk menerbitkan tata letak data peristiwa Anda di WMI, Anda biasanya membuat tiga jenis kelas MOF berikut di namespace root\wmi:

Kelas MOF penyedia

Jika Anda menerbitkan tata letak data peristiwa, Anda harus membuat kelas MOF yang mengidentifikasi penyedia Anda. Kelas ini harus berasal dari kelas EVENTTrace MOF dan harus kosong (tidak ada properti atau metode). Kelas juga harus menyertakan kualifikasi Guid yang secara unik mengidentifikasi penyedia. Ini adalah GUID yang sama dengan yang Anda gunakan saat memanggil fungsi RegisterTraceGuids untuk mendaftarkan penyedia Anda.

Kelas EVENT MOF

Kelas EVENT MOF mendefinisikan kelas peristiwa yang disediakan penyedia. Kelas ini berasal dari kelas MOF penyedia dan harus kosong (tidak ada properti atau metode). Kelas juga harus menyertakan kualifikasi Guid yang secara unik mengidentifikasi kelas peristiwa yang didefinisikan kelas anaknya. Penyedia menggunakan GUID yang sama ini saat mengatur anggota Guid dari struktur EVENT_TRACE_HEADER .

Kelas MOF jenis peristiwa

Kelas MOF jenis peristiwa menentukan data peristiwa aktual. Kelas ini berasal dari kelas MOF acara induknya. Saat menamai kelas MOF jenis peristiwa, konvensinya adalah menggunakan nama kelas MOF peristiwa di awal nama kelas MOF jenis peristiwa. Misalnya, jika nama kelas MOF peristiwa adalah HWConfig dan kelas MOF jenis peristiwa mewakili informasi CPU, Anda harus memberi nama kelas MOF jenis peristiwa, HWConfig_CPU.

Gunakan kualifikasi EventType pada kelas MOF jenis peristiwa untuk mengidentifikasi jenis peristiwa. Jika beberapa jenis peristiwa menggunakan data peristiwa yang sama, mereka dapat menggunakan kelas MOF yang sama. Penyedia menggunakan nilai jenis peristiwa yang sama untuk mengidentifikasi peristiwa saat mengatur anggota Class.Type dari struktur EVENT_TRACE_HEADER .

Kelas MOF jenis peristiwa berisi properti. Urutan properti ini menentukan tata letak data peristiwa. Tabel berikut mengidentifikasi jenis data dan kualifikasi yang bisa Anda gunakan untuk menentukan properti. Untuk informasi selengkapnya tentang kualifikasi properti dan kelas yang dapat Anda gunakan, lihat Kualifikasi MOF Pelacakan Peristiwa.

Jenis Data Kualifikasi Deskripsi
sint8, uint8 Format Menyatakan bilangan bulat desimal 1-byte. Untuk mendeklarasikan karakter ANSI, gunakan kualifikasi Format dan atur nilainya ke "c".
sint16, uint16 Format Menyatakan bilangan bulat desimal 2-byte. Untuk menunjukkan angka adalah angka heksadesimal, gunakan kualifikasi Format . Misalnya, format("x").
sint32, uint32 Format Menyatakan bilangan bulat desimal 4-byte. Untuk menunjukkan angka adalah angka heksadesimal, gunakan kualifikasi Format dan atur nilainya ke "x".
sint64, uint64 Format Menyatakan bilangan bulat desimal 8-byte. Untuk menunjukkan angka adalah angka heksadesimal, gunakan kualifikasi Format dan atur nilainya ke "x".
boolean Mendeklarasikan nilai Boolean. Konsumen peristiwa harus menginterpretasikan nilai sebagai BOOL (bilangan bulat 4-byte).
char16 Mendeklarasikan karakter lebar. Konsumen peristiwa harus menafsirkan array char16 dalam peristiwa kernel sebagai string karakter lebar. (Gunakan ukuran array untuk menyalin string. Beberapa string mungkin berisi karakter NULL terkemuka.)
objek Ekstensi Mendeklarasikan blob biner. Kualifikasi Ekstensi menunjukkan jenis data dalam blob.
string Format, StringTermination Mendeklarasikan nilai string. Untuk menunjukkan string adalah string karakter lebar, gunakan kualifikasi Format dan atur nilainya ke "w". String dianggap sebagai string ANSI jika Anda tidak menentukan kualifikasi Format . Untuk menunjukkan bagaimana string dihentikan, gunakan kualifikasi StringTermination .

 

Untuk menentukan array, Anda dapat menggunakan kurung siku, []. Kurung siku dapat menyertakan ukuran array. Contohnya:

[WmiDataId(1), read] uint8 MyGuid[16];

Anda juga dapat menggunakan Kualifikasi maks untuk menentukan ukuran array. Contohnya:

[WmiDataId(1), Max(16), read] uint8 MyGuid[];

Jika Anda menyertakan ukuran array dalam kurung siku, pengompilasi MOF menghasilkan kualifikasi Maks untuk Anda.

Penting bagi Anda untuk menggunakan kualifikasi Deskripsi untuk setiap properti. Deskripsi harus berisi nama tampilan yang dapat digunakan konsumen saat menampilkan nilai properti.

Contoh berikut menunjukkan konten file MOF yang menjelaskan kelas MOF penyedia, peristiwa, dan jenis peristiwa.

#pragma namespace("\\\\.\\root\\wmi")

[dynamic: ToInstance, Description("Defines my event provider"),
 Guid("{7C214FB1-9CAC-4b8d-BAED-7BF48BF63BB3}")]
class MyProvider : EventTrace
{
};

[dynamic: ToInstance, Description("Defines a category of events that my provider logs."): Amended,
 Guid("{B49D5931-AD85-4070-B1B1-3F81F1532875}")]
class MyCategory : MyProvider
{
};

[dynamic: ToInstance, Description("Defines an event within the category of events that my provider logs."): Amended,
 EventType(1)]
class MyCategory_MyEvent : MyCategory
{
    [WmiDataId(1), Description("Cost factor"): Amended, read] sint32 Cost;
    [WmiDataId(2), Description("Index values"): Amended, read] uint32 Indices[3];
    [WmiDataId(3), Description("Signature"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Signature;
    [WmiDataId(4), Description("Is complete copy"): Amended, read] boolean IsComplete;
    [WmiDataId(5), Description("Class identifier"): Amended, read, Extension("Guid")] object ID;
};

Perhatikan bahwa nama kelas MOF penyedia, peristiwa, dan jenis peristiwa harus unik dalam seluruh namespace layanan. Untuk menghindari konflik penamaan, Anda harus menggunakan nama unik dan deskriptif untuk semua nama kelas. Properti kelas juga harus deskriptif dan unik dalam hierarki kelasnya—kelas anak yang berisi nama properti yang sama dengan kelas induk menimpa properti kelas induk.

Setelah menentukan kelas MOF Anda, gunakan pengkompilasi MOF untuk menghasilkan skema peristiwa Anda dan menambahkannya ke repositori CIM. Konsumen kemudian dapat membaca skema dari repositori dan membaca data peristiwa secara terprogram. Untuk deskripsi lengkap sintaks MOF dan menggunakan pengkompilasi MOF (Mofcomp.exe) untuk menambahkan kelas MOF Anda ke repositori CIM, lihat Format Objek Terkelola. Untuk informasi tentang menggunakan Wbemtest.exe untuk mengakses repositori CIM, lihat Instrumentasi Manajemen Windows (WMI).

Membuat versi kelas MOF

Jika Anda menambahkan atau mengubah kelas MOF jenis peristiwa, konvensinya adalah untuk membuat versi kelas MOF peristiwa dan kelas MOF jenis peristiwa anaknya. Untuk membuat versi kelas MOF peristiwa saat ini, tambahkan _Vn ke nama kelas, di mana n adalah angka bertahap mulai dari 0. Jika ini adalah revisi pertama ke kelas , tambahkan _V0 ke nama kelas. Anda juga harus menambahkan kualifikasi EventVersion ke kelas . Gunakan nomor versi yang sama dengan yang Anda gunakan di nama kelas untuk nilai kualifikasi EventVersion .

Versi baru kelas MOF peristiwa harus menggunakan nama yang sama dan kualifikasi Guid sebagai kelas asli. Kelas baru dapat secara opsional menambahkan kualifikasi EventVersion . Kelas MOF peristiwa yang tidak berisi kualifikasi EventVersion dianggap sebagai versi terbaru, atau jika semua versi kelas berisi kualifikasi EventVersion , maka kelas dengan nomor versi tertinggi dianggap sebagai versi terbaru. Penyedia menggunakan anggota Class.Version dari struktur EVENT_TRACE_HEADER untuk mengidentifikasi versi peristiwa yang disertakan dalam jejak.

Contoh berikut menunjukkan cara membuat versi kelas MOF peristiwa.

#pragma namespace("\\\\.\\root\\wmi")
#pragma classflags("forceupdate")

[dynamic: ToInstance, Description("Defines my event provider"),
 Guid("{7C214FB1-9CAC-4b8d-BAED-7BF48BF63BB3}")]
class MyProvider : EventTrace
{
};

[dynamic: ToInstance, Description("Defines a category of events that my provider logs."),
 Guid("{B49D5931-AD85-4070-B1B1-3F81F1532875}"),
 EventVersion(1)]
class MyCategory : MyProvider
{
};

[dynamic: ToInstance, Description("Defines an event within the category of events that my provider logs."): Amended,
 EventType(1),
 EventName("MyEvent")]
class MyCategory_MyEvent : MyCategory
{
    [WmiDataId(1), Description("Cost factor"): Amended, read] sint32 Cost;
    [WmiDataId(2), Description("Index values"): Amended, read] uint32 Indices[3];
    [WmiDataId(3), Description("Signature"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Signature;
    [WmiDataId(4), Description("Is complete copy"): Amended, read] boolean IsComplete;
    [WmiDataId(5), Description("Identifier"): Amended, read, Extension("Guid")] object ID;
    [WmiDataId(6), Description("Buffer Size"): Amended, read] uint32 Size;
};

[dynamic: ToInstance, Description("Defines a category of events that my provider logs."): Amended,
 Guid("{B49D5931-AD85-4070-B1B1-3F81F1532875}"),
 EventVersion(0)]
class MyCategory_V0 : MyProvider
{
};

[dynamic: ToInstance, Description("Defines an event within the category of events that my provider logs."): Amended,
 EventType(1)]
class MyCategory_V0_MyEvent : MyCategory_V0
{
    [WmiDataId(1), Description("Cost factor"): Amended, read] sint32 Cost;
    [WmiDataId(2), Description("Index values"): Amended, read] uint32 Indices[3];
    [WmiDataId(3), Description("Signature"): Amended, read, StringTermination("NullTerminated"), Format("w")] string Signature;
    [WmiDataId(4), Description("Is complete copy"): Amended, read] boolean IsComplete;
    [WmiDataId(5), Description("Identifier"): Amended, read, Extension("Guid")] object ID;
};