Manipulando IRP_MN_REGINFO e IRP_MN_REGINFO_EX para registrar blocos

No Windows 98 e no Windows 2000, o sistema envia a solicitação IRP_MN_REGINFO a um driver para permitir que um driver registre suas classes WMI. No Windows XP e posterior, o sistema envia a solicitação IRP_MN_REGINFO_EX . A maioria dos drivers pode lidar com essas solicitações usando WmiSystemControl para fornecer uma rotina de retorno de chamada. Consulte Usando a biblioteca WMI para registrar blocos para obter detalhes.

Um driver deve lidar com solicitações de IRP_MN_REGINFO ou IRP_MN_REGINFO_EX para registrar blocos que usam nomes de instância dinâmica ou que usam uma lista de nomes de instância estática definidos pelo driver; ele não pode chamar WmiSystemControl para registrar esses blocos. Opcionalmente, um driver pode manipular essa solicitação para registrar blocos que usam nomes de instância estáticos com base no PDO ou em uma cadeia de caracteres de nome base definida pelo driver.

Nesse caso, o driver:

  1. Preenche uma estrutura WMIREGINFO em Parameters.WMI.Buffer que especifica:

    • O número de bytes de todos os dados de registro fornecidos pelo driver, incluindo dados fornecidos em nome de outro driver.

    • O caminho do registro do driver.

    • O nome do recurso MOF do driver.

    • O número de blocos a serem registrados.

    • Uma matriz de estruturas WMIREGGUID , uma para cada bloco.

  2. Para cada bloco, o driver preenche uma estrutura WMIREGGUID que especifica:

    • O GUID que representa o bloco.

    • Sinalizadores que fornecem informações sobre nomes de instância e outras características do bloco, como se o bloco é caro de coletar. Para obter mais informações, consulte Sinalizadores de registro WMI.

    Se o bloco estiver sendo registrado com nomes de instância estática, o driver definirá um dos seguintes membros para especificar dados de nome de instância estático para o bloco:

    • Se o driver definir Sinalizadores com WMIREG_FLAG_INSTANCE_LIST, ele definirá InstanceNameList como um deslocamento para uma lista de cadeias de caracteres de nome de instância estática. O WMI especifica instâncias em solicitações subsequentes por índice nesta lista.

    • Se o driver definir Sinalizadores com WMIREG_FLAG_INSTANCE_BASENAME, ele definirá BaseNameOffset como um deslocamento para uma cadeia de caracteres de nome base. O WMI usa essa cadeia de caracteres para gerar nomes de instância estática para o bloco.

    • Se o driver definir Sinalizadores com WMIREG_FLAG_INSTANCE_PDO, ele definirá Pdo como o PDO passado para a rotina AddDevice do driver. O WMI usa o caminho da instância do dispositivo do PDO para gerar nomes de instância estática para o bloco. Ao lidar com uma solicitação de IRP_MN_REGINFO_EX , os drivers devem chamar a rotina ObReferenceObject no objeto de dispositivo físico passado em Pdo. (O sistema chamará automaticamente ObDereferenceObject para desreferenciar o objeto; o driver não deve fazer isso.)

    O driver grava cadeias de caracteres de nome de instância ou uma cadeia de caracteres de nome base no deslocamento indicado por InstanceNameList ou BaseName, respectivamente.

  3. Se o driver estiver registrando blocos em nome de outro driver (como um driver de classe pode em nome de um driver de miniclasse), o driver preencherá outra estrutura WMIREGINFO e uma lista de estruturas WMIREGGUID com informações de registro para os blocos do outro driver e definirá NextWmiRegInfo no primeiro WMIREGINFO como o deslocamento em bytes desde o início do primeiro WMIREGINFO até o início da segunda estrutura WMIREGINFO .