Implementazione di blocchi WMI personalizzati

Un driver può implementare blocchi personalizzati che espongono strumentazione specifica del dispositivo. Ad esempio, un driver per un'unità disco in grado di segnalare la temperatura potrebbe implementare un blocco di eventi personalizzato che notifica ai client WMI quando la temperatura dell'unità aumenta oltre una soglia sicura.

Per implementare un blocco personalizzato, un driver:

  • Definisce una classe nel file MOF, compila il file MOF in una risorsa e include la risorsa nel driver, come descritto in Pubblicazione di uno schema WMI.

  • Registra il blocco con WMI insieme agli altri blocchi standard e personalizzati supportati dal driver, come descritto in Registrazione come provider di dati WMI.

  • Gestisce tutte le richieste WMI che specificano il puntatore a oggetti dispositivo del driver in Parameters.WMI.ProviderId e il GUID del blocco standard in Parameters.WMI.DataPath, come descritto in Gestione delle richieste WMI.

I driver non possono controllare l'ordine in cui vengono caricati i file MOF binari. L'unica garanzia è che wmicore.mof viene caricato prima di qualsiasi file MOF specifico del driver. Pertanto, le classi WMI personalizzate devono ereditare solo da classi nello stesso file MOF o in wmicore.mof.

Per migliorare le prestazioni e la facilità d'uso dei blocchi di dati WMI personalizzati, considerare le linee guida seguenti:

  • Inserire gli elementi di dati raggruppati in modo operativo nello stesso blocco di dati.

    Ad esempio, un controller di porta i8042 potrebbe mantenere informazioni sullo stato sia sulla tastiera che sulle porte del mouse. Anziché un singolo blocco di dati di grandi dimensioni contenente tutte le informazioni del mouse e della tastiera, un driver potrebbe definire un blocco di dati per la porta del mouse e un altro blocco di dati per la porta della tastiera.

  • Inserire gli elementi di dati usati di frequente in blocchi di dati separati, in particolare se altrimenti verranno raggruppati con elementi usati raramente.

    Ad esempio, un driver potrebbe esporre l'utilizzo della CPU in un blocco di dati con un singolo elemento, in modo che un client WMI possa tenere traccia dell'utilizzo della CPU senza incorrere nell'overhead di recupero di elementi di dati aggiuntivi nel blocco. Un client WMI non può eseguire query per un singolo elemento di dati, quindi per ottenere un elemento deve eseguire una query per un'intera istanza di un blocco di dati.

  • Usare i blocchi eventi per notificare ai client WMI eventi eccezionali, non come alternativa alla registrazione degli errori.

    Solo un numero limitato di eventi può essere accodato contemporaneamente e se la coda è piena di eventi andrà persa. Inoltre, non è possibile garantire l'intervallo di recapito degli eventi ai client WMI.

  • Limitare i blocchi di eventi a una dimensione massima di 1.000 byte.

    Gli elementi evento devono essere definiti come tipi di dati di piccole dimensioni, perché esiste un limite di dimensioni definito dal Registro di sistema (inizialmente, 1K) per l'intera struttura WNODE_EVENT_ITEM che contiene l'evento generato. Per le notifiche di grandi dimensioni, un driver può inviare una struttura di WNODE_EVENT_REFERENCE che specifica una singola istanza di un blocco di dati, che WMI esegue quindi una query per ottenere l'evento effettivo. Tuttavia, questo aumenta il ritardo di tempo tra l'occorrenza dell'evento e la notifica.

  • Posizionare elementi di dati di dimensioni fisse all'inizio di un blocco di dati, seguiti da qualsiasi elemento di dati di dimensioni variabili.

    Ad esempio, un blocco di dati con tre elementi di dati DWORD e una stringa a lunghezza variabile deve inserire prima i tre DWORD, seguiti dalla stringa. L'inserimento di elementi di dati a dimensione fissa all'inizio di un blocco consente ai client WMI di estrarli più facilmente.

  • Considerare i tipi di utenti di sistema a cui si vuole accedere ai blocchi di dati del driver. Il sistema fornisce un descrittore di sicurezza predefinito per tutti i GUID della classe WMI. Se necessario, è possibile fornire descrittori di sicurezza alternativi all'interno del file INF del dispositivo. Per altre informazioni, vedere Creazione di installazioni di dispositivi protetti.

WMI non supporta il controllo delle versioni, pertanto un writer di driver deve definire una nuova classe MOF e generare un nuovo GUID per modificare un blocco personalizzato esistente.