Verarbeiten von WMI-IRPs in einer DispatchSystemControl-Routine
Ein Treiber, der WMI-IRPs in seiner DispatchSystemControl-Routine verarbeitet, muss eine solche IRP nur verarbeiten, wenn der Geräteobjektzeiger bei Parameters.WMI.ProviderId mit dem Zeiger übereinstimmt, der vom Treiber in seinem Aufruf von IoWMIRegistrationControl übergeben wurde. Andernfalls muss der Treiber den IRP an den nächst niedrigeren Treiber weiterleiten.
Wenn der Treiber die Anforderung verarbeitet, muss er:
Überprüfen Sie die GUID unter Parameters.WMI.DataPath , um festzustellen, ob sie einen datenblock darstellt, der vom Treiber unterstützt wird. Andernfalls schlägt die IRP mit STATUS_WMI_GUID_NOT_FOUND fehl.
Ein Treiber sollte die Eingabe WNODE_XXX-Struktur unter Parameters.WMI.Buffer auf den namen des instance überprüfen, wenn eine der folgenden Anforderungen verarbeitet wird:
IRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_ITEMIRP_MN_EXECUTE_METHOD Der Treiber sollte wie folgt nach dem namen des instance suchen:
Wenn WNODE_FLAG_STATIC_INSTANCE_NAMES in WnodeHeader.Flags festgelegt ist, verwenden Sie InstanceIndex als Index in der Liste der statischen instance Namen des Treibers für diesen Block.
Wenn WNODE_FLAG_STATIC_INSTANCE_NAMES in WnodeHeader.Flags klar ist, verwenden Sie OffsetInstanceName als Offset für die instance-Namenszeichenfolge in der Eingabe WNODE_XXX-Struktur. OffsetInstanceName ist der Offset in Bytes vom Anfang der Struktur bis zu einem USHORT, der die Länge der instance Namenszeichenfolge in Bytes (nicht Zeichen) angibt, einschließlich des NUL-Abschlusszeichens, falls vorhanden, gefolgt von der Zeichenfolge selbst in Unicode.
Wenn der Treiber die durch InstanceIndex oder OffsetInstanceName angegebene instance nicht finden kann, muss der IRP mit STATUS_WMI_INSTANCE_NOT_FOUND fehlschlagen.
Überprüfen Sie für eine IRP_MN_EXECUTE_METHOD-Anforderungdie Option MethodID im Eingabe-WNODE_METHOD_ITEM . Wenn die Methode für diesen Datenblock ungültig ist, schlägt die IRP mit STATUS_WMI_ITEMID_NOT_FOUND fehl.
Wenn die Anforderung eine Ausgabe generiert, sollte ein Treiber die Größe des Puffers bei Parameters.WMI.BufferSize überprüfen, wenn eine der folgenden Anforderungen verarbeitet wird:
IRP_MN_QUERY_ALL_DATAIRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_EXECUTE_METHOD Wenn der Puffer zu klein ist, um die Ausgabe zu empfangen, aber mindestens sizeof(WNODE_TOO_SMALL), sollte der Treiber den IRP erfolgreich sein und unter Parameters.WMI.Buffer eine WNODE_TOO_SMALL-Struktur in den Puffer schreiben. Wenn der Puffer kleiner als sizeof(WNODE_TOO_SMALL) ist, schlägt der Treiber den IRP mit dem NTSTATUS-Code STATUS_BUFFER_TOO_SMALL.
Wenn die Anforderung eine Ausgabe generiert und die Puffergröße ausreichend ist, schreiben Sie die folgende Ausgabe in den Puffer unter Parameters.WMI.Buffer:
- Für eine IRP_MN_QUERY_ALL_DATA-Anforderung schreibt der Treiber eine WNODE_ALL_DATA-Struktur , die Daten für alle Instanzen des angegebenen Datenblocks enthält.
- Für eine IRP_MN_QUERY_SINGLE_INSTANCE-Anforderung schreibt der Treiber eine WNODE_SINGLE_INSTANCE-Struktur, die Daten für die angegebene instance eines Datenblocks enthält.
- Bei einer IRP_MN_EXECUTE_METHOD , wenn die Methode eine Ausgabe generiert, schreibt der Treiber die Methodenausgabe im vom Treiber festgelegten Format nach der Eingabe WNODE_METHOD_ITEM im Puffer (ggf. Überschreiben von Eingabedaten).
Legen Sie Irp-IoStatus.Information> auf die Anzahl der Bytes fest, die in den Puffer unter Parameters.WMI.Buffer und Irp-IoStatus.Status> auf STATUS_SUCCESS geschrieben werden.
Rufen Sie IoCompleteRequest auf, um die IRP abzuschließen.
Weitere Informationen finden Sie unter WMI WNODE_XXX-Strukturen.