Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Ovladač, který zpracovává rozhraní WMI IRPs v rutině DispatchSystemControl , musí zpracovat takový IRP pouze v případě, že ukazatel objektu zařízení v Parameters.WMI.ProviderId odpovídá ukazateli předanému ovladačem v jeho volání IoWMIRegistrationControl. Jinak musí ovladač předat IRP dalšímu nižšímu ovladači.
Pokud ovladač žádost zpracuje, musí:
Zkontrolujte identifikátor GUID v Parameters.WMI.DataPath, abyste zjistili, zda představuje datový blok podporovaný ovladačem. Pokud ne, odmítněte IRP se stavem STATUS_WMI_GUID_NOT_FOUND.
Ovladač by měl při zpracování některého z následujících požadavků zkontrolovat vstupní strukturu WNODE_XXX v poli Parameters.WMI.Buffer pro název instance:
IRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_INSTANCEIRP_MN_CHANGE_SINGLE_ITEMIRP_MN_EXECUTE_METHOD ovladač by měl zkontrolovat název instance následujícím způsobem:
Pokud je WNODE_FLAG_STATIC_INSTANCE_NAMES nastaven v WnodeHeader.Flags, použijte instanceIndex jako index do seznamu statických názvů instancí ovladače pro tento blok.
Pokud je WNODE_FLAG_STATIC_INSTANCE_NAMES vymazán ve WnodeHeader.Flags, použijte OffsetInstanceName jako posun k řetězci názvu instance ve struktuře WNODE_XXX. OffsetInstanceName je offset v bajtech od začátku struktury k USHORTu, který udává délku řetězce názvu instance v bajtech (nikoli ve znacích), včetně terminátoru NUL, je-li přítomen, následovaného samotným řetězcem v Unicode.
Pokud ovladač nemůže najít instanci určenou instanceIndex nebo OffsetInstanceName, musí selhat IRP s STATUS_WMI_INSTANCE_NOT_FOUND.
V případě požadavku IRP_MN_EXECUTE_METHOD zkontrolujte ID metody ve vstupním WNODE_METHOD_ITEM a pokud metoda není pro tento datový blok platná, selžou IRP s STATUS_WMI_ITEMID_NOT_FOUND.
Pokud požadavek vygeneruje výstup, ovladač by měl při zpracování některého z následujících požadavků zkontrolovat velikost vyrovnávací paměti na adrese Parameters.WMI.BufferSize :
IRP_MN_QUERY_ALL_DATAIRP_MN_QUERY_SINGLE_INSTANCEIRP_MN_EXECUTE_METHOD Pokud je vyrovnávací paměť pro příjem výstupu příliš malá, ale alespoň sizeof(WNODE_TOO_SMALL), ovladač by měl úspěšně provést IRP a zapsat WNODE_TOO_SMALL strukturu do vyrovnávací paměti v Parameters.WMI.Buffer. Pokud je vyrovnávací paměť menší než sizeof(WNODE_TOO_SMALL), ovladač selže IRP s kódem NTSTATUS STATUS_BUFFER_TOO_SMALL.
Pokud požadavek vygeneruje výstup a velikost vyrovnávací paměti je adekvátní, zapište následující výstup do vyrovnávací paměti v Parameters.WMI.Buffer:
- U požadavku IRP_MN_QUERY_ALL_DATA zapíše ovladač strukturu WNODE_ALL_DATA , která obsahuje data pro všechny instance zadaného datového bloku.
- Pro požadavek IRP_MN_QUERY_SINGLE_INSTANCE zapíše ovladač strukturu WNODE_SINGLE_INSTANCE , která obsahuje data pro zadanou instanci datového bloku.
- Pro IRP_MN_EXECUTE_METHOD, pokud metoda generuje výstup, ovladač zapíše výstup metody ve formátu určeném ovladačem za vstupní WNODE_METHOD_ITEM ve vyrovnávací paměti (přepisuje vstupní data, pokud nějaká existují).
Nastavte Irp-IoStatus.Information> na počet bajtů zapsaných do vyrovnávací paměti v Parameters.WMI.Buffer a Irp-IoStatus.Status> na STATUS_SUCCESS.
Zavolejte funkci IoCompleteRequest, abyste dokončili IRP.
Další informace naleznete v tématu WMI WNODE_XXX Struktury.