Função SetupDiRegisterDeviceInfo (setupapi.h)

A função SetupDiRegisterDeviceInfo é o manipulador padrão para a solicitação de DIF_REGISTERDEVICE .

Sintaxe

WINSETUPAPI BOOL SetupDiRegisterDeviceInfo(
  [in]            HDEVINFO           DeviceInfoSet,
  [in, out]       PSP_DEVINFO_DATA   DeviceInfoData,
  [in]            DWORD              Flags,
  [in, optional]  PSP_DETSIG_CMPPROC CompareProc,
  [in, optional]  PVOID              CompareContext,
  [out, optional] PSP_DEVINFO_DATA   DupDeviceInfoData
);

Parâmetros

[in] DeviceInfoSet

Um identificador para um conjunto de informações do dispositivo que contém um elemento de informações do dispositivo que representa o dispositivo a ser registrado. O conjunto de informações do dispositivo não deve conter elementos remotos.

[in, out] DeviceInfoData

Um ponteiro para uma estrutura SP_DEVINFO_DATA que especifica o elemento de informações do dispositivo em DeviceInfoSet. Esse é um parâmetro IN-OUT porque DeviceInfoData.DevInst pode ser atualizado com um novo valor de identificador no retorno.

[in] Flags

Um valor de sinalizador que controla como o dispositivo é registrado, que pode ser zero ou o seguinte valor:

SPRDI_FIND_DUPS

Pesquise uma instância de dispositivo existente anteriormente que corresponda ao dispositivo representado por DeviceInfoData. Se esse sinalizador não for especificado, a instância do dispositivo será registrada independentemente de uma instância de dispositivo já existir para ela.

Se o chamador fornecer CompareProc, o chamador também deverá definir esse sinalizador.

[in, optional] CompareProc

Um ponteiro para uma função de retorno de chamada de comparação a ser usada na detecção duplicada. Esse parâmetro é opcional e pode ser NULL. Se esse parâmetro for especificado, a função de retorno de chamada será chamada para cada instância de dispositivo da mesma classe que a instância do dispositivo que está sendo registrada. O protótipo da função de retorno de chamada é o seguinte:

typedef  DWORD (CALLBACK* PSP_DETSIG_CMPPROC) (
    IN HDEVINFO  DeviceInfoSet,
    IN PSP_DEVINFO_DATA  NewDeviceData,
    IN PSP_DEVINFO_DATA  ExistingDeviceData,
    IN PVOID  CompareContextOPTIONAL
    );

A função compare deverá retornar ERROR_DUPLICATE_FOUND se descobrir que os dois dispositivos são duplicados. Caso contrário, ele deverá retornar NO_ERROR. Se algum outro erro for encontrado, a função de retorno de chamada deverá retornar o código ERROR_* apropriado para indicar a falha.

Se CompareProc não for especificado e a detecção de duplicação for solicitada, um comportamento de comparação padrão será usado. O padrão é comparar a assinatura de detecção do novo dispositivo com a assinatura de detecção de todos os outros dispositivos na classe . A assinatura de detecção está contida no descritor de recursos específico da classe da configuração de log de inicialização do dispositivo.

[in, optional] CompareContext

Um ponteiro para um buffer de contexto fornecido pelo chamador que é passado para a função de retorno de chamada. Esse parâmetro será ignorado se CompareProc não for especificado.

[out, optional] DupDeviceInfoData

Um ponteiro para uma estrutura SP_DEVINFO_DATA para receber informações sobre uma instância de dispositivo duplicada, se houver, descoberta como resultado da tentativa de registrar esse dispositivo. Esse parâmetro é opcional e pode ser NULL. Se esse parâmetro for especificado, o chamador deverá definir DupDeviceInfoData.cbSize to sizeof(SP_DEVINFO_DATA). Isso será preenchido se a função retornar FALSE e GetLastError retornar ERROR_DUPLICATE_FOUND. Esse elemento de informações do dispositivo é adicionado como um membro do DeviceInfoSet especificado, se ainda não for um membro. Se DupDeviceInfoData não for especificado, a duplicata não será adicionada ao conjunto de informações do dispositivo.

Se você chamar essa função ao lidar com uma solicitação DIF_REGISTERDEVICE , o parâmetro DupDeviceInfoData deverá ser NULL.

Retornar valor

A função retornará TRUE se for bem-sucedida. Caso contrário, ele retornará FALSE e o erro registrado poderá ser recuperado com uma chamada para GetLastError.

Comentários

SetupDiRegisterDeviceInfo foi projetado principalmente para registrar um dispositivo não PnP com o gerenciador de Plug and Play (PnP) em um computador local. Embora SetupDiRegisterDeviceInfo não falhe se o conjunto de informações do dispositivo for para um computador remoto, o resultado é de uso limitado porque o conjunto de informações do dispositivo não pode ser usado posteriormente com solicitações de instalação DIF_Xxx ou funções SetupDiXxx que não dão suporte a operações em um computador remoto. Por exemplo, chamar SetupDiCreateDevRegKey para executar uma seção INF para um dispositivo recém-registrado em um computador remoto falhará.

Nota Somente um instalador de classe deve chamar SetupDiRegisterDeviceInfo e somente nessas situações em que o instalador de classe deve executar operações de registro de dispositivo depois que SetupDiRegisterDeviceInfo concluir a operação de registro de dispositivo padrão. Nessas situações, o instalador de classe deve chamar diretamente SetupDiRegisterDeviceInfo quando o instalador processa uma solicitação de DIF_REGISTERDEVICE. Para obter mais informações sobre como chamar o manipulador padrão, consulte Chamando manipuladores de código DIF padrão.
 
Depois de registrar um elemento de informações do dispositivo, o chamador deve atualizar todas as cópias armazenadas do identificador DevInst associado a esse dispositivo. Isso é necessário porque o valor do identificador pode ter sido alterado durante o registro. O chamador não precisa recuperar a estrutura SP_DEVINFO_DATA novamente porque o campo DevInst da estrutura é atualizado para refletir o valor atual do identificador.

Não chame diretamente essa função para instâncias de dispositivo PnP. As instâncias de dispositivo PnP são registradas automaticamente pelo sistema operacional. No entanto, você deve registrar instâncias de dispositivo não PnP de uma das seguintes maneiras:

  1. Se o aplicativo de instalação usar uma solicitação DIF_DETECT para detectar com êxito um dispositivo, ele também deverá usar uma solicitação DIF_REGISTERDEVICE para registrar a instância do dispositivo. A solicitação deve ser tratada da maneira padrão. (Por padrão, SetupDiCallClassInstaller primeiro chama o instalador de classe e os co-instaladores de classe para fazer a detecção duplicada e registrar a instância do dispositivo. Se esses instaladores não registrarem a instância do dispositivo, SetupDiCallClassInstallerchamará SetupDiRegisterDeviceInfo para fazer a detecção duplicada e registrar a instância do dispositivo.)
  2. Se o aplicativo de instalação criar uma instância de dispositivo (por exemplo, chamando SetupDiCreateDeviceInfo), mas não fizer a detecção duplicada, seu aplicativo de instalação deverá usar uma solicitação DIF_REGISTERDEVICE para registrar a instância do dispositivo. A solicitação deve ser tratada da maneira padrão, conforme descrito anteriormente.
  3. Se o aplicativo de instalação criar um novo dispositivo e fizer a detecção duplicada, seu aplicativo de instalação deverá usar uma solicitação DIF_REGISTERDEVICE, mas deve impedir SetupDiCallClassInstaller de chamar SetupDiRegisterDeviceInfo. Para impedir que SetupDiCallClassInstaller chame SetupDiRegisterDeviceInfo, defina o sinalizador DI_NODI_DEFAULTACTION no membro Flags da estrutura SP_DEVINSTALL_PARAMS para a instância do dispositivo.

    Se SetupDiCallClassInstaller retornar TRUE para a solicitação DIF_REGISTERDEVICE, o instalador de classe ou os co-instaladores de classe registraram a instância do dispositivo. Nesse caso, o aplicativo de instalação pode continuar a instalar o dispositivo.

    Se SetupDiCallClassInstaller retornar FALSE para a solicitação DIF_REGISTERDEVICE, o instalador de classe ou os co-instaladores de classe não registraram a instância do dispositivo. Nesse caso, o aplicativo de instalação deve fazer um dos seguintes procedimentos, dependendo do último erro que GetLastError retorna para a solicitação:

    • Se o último erro for ERROR_DI_DO_DEFAULT, o aplicativo de instalação poderá chamar diretamente SetupDiRegisterDeviceInfo e fornecer um CompareProc para fazer a detecção duplicada. Se essa chamada for bem-sucedida e nenhuma duplicata for encontrada, a instalação do dispositivo poderá continuar. Se uma duplicata for encontrada, SetupDiRegisterDeviceInfo retornará FALSE e o aplicativo de instalação deverá encerrar a instalação do dispositivo.
    • Se o último erro não for ERROR_DI_DO_DEFAULT, o aplicativo de instalação deverá encerrar a instalação do dispositivo.
    O chamador de SetupDiRegisterDeviceInfo deve ser membro do grupo Administradores.

Requisitos

Requisito Valor
Cliente mínimo com suporte Disponível no Microsoft Windows 2000 e versões posteriores do Windows.
Plataforma de Destino Área de Trabalho
Cabeçalho setupapi.h (inclua Setupapi.h)
Biblioteca Setupapi.lib
DLL Setupapi.dll

Confira também

DIF_REGISTERDEVICE

SP_DEVINFO_DATA

SP_DEVINSTALL_PARAMS