IRP_MN_REGINFO_EX
O WMI envia esse IRP para consultar ou atualizar as informações de registro de um driver depois que o driver tiver chamado IoWMIRegistrationControl. Um driver pode lidar com IRPs WMI chamando WmiSystemControl ou manipulando o próprio IRP, conforme descrito em Manipulando solicitações WMI.
Se um driver chamar WmiSystemControl para lidar com uma solicitação de IRP_MN_REGINFO_EX , o WMI, por sua vez, chamará a rotina DpWmiQueryReginfo desse driver.
No Microsoft Windows XP e em sistemas operacionais posteriores, os drivers que dão suporte ao WMI devem lidar com esse IRP. Os drivers que dão suporte ao Microsoft Windows 98 e Windows 2000 também devem lidar com IRP_MN_REGINFO.
Código principal
Quando enviado
No Windows XP e posterior, o WMI envia esse IRP para consultar ou atualizar as informações de registro de um driver depois que o driver tiver chamado IoWMIRegistrationControl. No Windows 98 e no Windows 2000, o WMI envia a solicitação IRP_MN_REGINFO .
O WMI envia esse IRP em IRQL = PASSIVE_LEVEL no contexto de um thread do sistema.
Parâmetros de Entrada
Parameters.WMI.ProviderId aponta para o objeto de dispositivo do driver que deve responder à solicitação. Esse ponteiro está localizado no local da pilha de E/S do driver no IRP.
Parameters.WMI.DataPath é definido como WMIREGISTER para consultar informações de registro ou WMIUPDATE para atualizá-lo.
Parameters.WMI.BufferSize indica o tamanho máximo do buffer nãopagado em Parameters.WMI.Buffer. O tamanho deve ser maior ou igual ao total de (sizeof(WMIREGINFO) + (GuidCount * sizeof(WMIREGGUID)), em que GuidCount é o número de blocos de dados e blocos de eventos que estão sendo registrados pelo driver, além de espaço para nomes de instância estática, se houver.
Parâmetros de saída
Se o driver manipular IRPs WMI chamando WmiSystemControl, o WMI obterá informações de registro para blocos de dados de um driver chamando sua rotina DpWmiQueryReginfo .
Caso contrário, o driver preencherá uma estrutura WMIREGINFO em Parameters.WMI.Buffer da seguinte maneira:
Define BufferSize como o tamanho em bytes da estrutura WMIREGINFO mais dados de registro associados.
Se o driver manipular solicitações WMI em nome de outro driver, definirá NextWmiRegInfo como o deslocamento em bytes desde o início desse WMIREGINFO até o início de outra estrutura WMIREGINFO que contém informações de registro do outro driver.
Define RegistryPath como o caminho do Registro que foi passado para a rotina DriverEntry do driver.
Se Parameters.WMI.Datapath for definido como WMIREGISTER, definirá MofResourceName como o deslocamento do início desse WMIREGINFO para uma cadeia de caracteres Unicode contada que contém o nome do recurso MOF do driver em seu arquivo de imagem.
Define GuidCount como o número de blocos de dados e blocos de eventos a serem registrados ou atualizados.
Grava uma matriz de estruturas WMIREGGUID , uma para cada bloco de dados ou bloco de eventos exposto pelo driver, em WmiRegGuid.
O driver preenche cada estrutura WMIREGGUID da seguinte maneira:
Define Guid como o GUID que identifica o bloco.
Define Sinalizadores para fornecer informações sobre nomes de instância e outras características do bloco. Por exemplo, se um bloco estiver sendo registrado com nomes de instância estática, o driver definirá Flags com o sinalizador WMIREG_FLAG_INSTANCE_XXX apropriado.
Se o bloco estiver sendo registrado com nomes de instância estática, o driver:
Define InstanceCount como o número de instâncias.
Define um dos seguintes membros como um deslocamento em bytes para dados de nome de instância estática 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 nessa lista.
Se o driver definir Flags 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 um deslocamento para um ponteiro para 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. Os drivers devem chamar 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. (Os drivers que usam WmiSystemControl para lidar com IRPs não precisam chamar ObReferenceObject. O WMI faz isso automaticamente antes de chamar a rotina DpWmiQueryReginfo do driver.)
Grava as cadeias de caracteres de nome da instância, a cadeia de caracteres de nome base ou um ponteiro para o PDO no deslocamento indicado por InstanceNameList, BaseName ou Pdo, respectivamente.
Se o driver manipular o registro WMI em nome de outro driver (como uma miniclasse ou um driver de miniporta), ele preencherá outra estrutura WMIREGINFO com as informações de registro do outro driver e as gravará em NextWmiRegInfo na estrutura anterior.
Se o buffer em Parameters.WMI.Buffer for muito pequeno para receber todos os dados, um driver gravará o tamanho necessário em bytes como um ULONG em Parameters.WMI.Buffer e falhará no IRP e retornará STATUS_BUFFER_TOO_SMALL.
Bloco de Status de E/S
Se o driver manipular o IRP chamando WmiSystemControl, o WMI definirá Irp-IoStatus.Status> e Irp-IoStatus.Information> no bloco de status de E/S.
Caso contrário, o driver define Irp-IoStatus.Status> como STATUS_SUCCESS ou como um erro apropriado status como o seguinte:
STATUS_BUFFER_TOO_SMALL
Em caso de êxito, um driver define Irp-IoStatus.Information> como o número de bytes gravados no buffer em Parameters.WMI.Buffer.
Operação
Se um driver manipular uma solicitação IRP_MN_REGINFO_EX em si, ele deverá fazê-lo somente se Parameters.WMI.ProviderId apontar para o mesmo objeto de dispositivo que o ponteiro que o driver passou para IoWMIRegistrationControl. Caso contrário, o driver deve encaminhar a solicitação para o driver inferior seguinte.
Antes de lidar com a solicitação, o driver deve marcar Parameters.WMI.DataPath para determinar se o WMI está consultando informações de registro (WMIREGISTER) ou solicitando uma atualização (WMIUPDATE).
O WMI envia esse IRP com WMIREGISTER depois que um driver chama IoWMIRegistrationControl com WMIREG_ACTION_REGISTER ou WMIREG_ACTION_REREGISTER. Em resposta, um driver deve preencher o buffer em Parameters.WMI.Buffer com o seguinte:
Uma estrutura WMIREGINFO que indica o caminho do registro do driver, o nome do recurso MOF e o número de blocos a serem registrados.
Uma estruturaWMIREGGUID para cada bloco a ser registrado. Se um bloco deve ser registrado com nomes de instância estática, o driver define o sinalizador WMIREG_FLAG_INSTANCE_XXX apropriado na estrutura WMIREGGUID para esse bloco.
Qualquer WMI de cadeias de caracteres precisa gerar nomes de instância estática.
O WMI envia esse IRP com WMIUPDATE depois que um driver chama IoWmiRegistrationControl com WMIREG_ACTION_UPDATE_GUIDS. Em resposta, um driver deve preencher o buffer em Parameters.WMI.Buffer com uma estrutura WMIREGINFO da seguinte maneira:
Para remover um bloco, o driver define WMIREG_FLAG_REMOVE_GUID em sua estrutura WMIREGGUID .
Para adicionar ou atualizar um bloco (por exemplo, para alterar seus nomes de instância estática), o driver limpa WMIREG_FLAG_REMOVE_GUID e fornece valores de registro novos ou atualizados para o bloco.
Para registrar um bloco novo ou existente com nomes de instância estática, o driver define o WMIREG_FLAG_INSTANCE_XXX apropriado e fornece todas as cadeias de caracteres que o WMI precisa para gerar nomes de instância estática.
Um driver pode usar as mesmas estruturas WMIREGINFO para remover, adicionar ou atualizar blocos como ele usou inicialmente para registrar todos os blocos, alterando apenas os sinalizadores e dados para os blocos a serem atualizados. Se um WMIREGGUID em uma estrutura WMIREGINFO corresponder exatamente ao WMIREGGUID passado pelo driver quando ele registrou esse bloco pela primeira vez, o WMI ignorará o processamento envolvido na atualização do bloco.
O WMI não envia uma solicitação de IRP_MN_REGINFO_EX depois que um driver chama IoWMIRegistrationControl com WMIREG_ACTION_DEREGISTER, pois o WMI não requer mais informações do driver. Um driver normalmente desregistre seus blocos em resposta a uma solicitação de IRP_MN_REMOVE_DEVICE .
Requisitos
parâmetro |
Wdm.h (inclua Wdm.h, Ntddk.h ou Ntifs.h) |