Compartilhar via


Obtendo o caminho de origem original de um arquivo INF instalado

Este tópico descreve como você pode recuperar o caminho de origem original de um arquivo INF instalado no diretório INF do sistema. Embora não haja nenhuma função SetupAPI para executar essa recuperação diretamente, você pode executar a recuperação indiretamente incluindo entradas em um arquivo INF para que as funções SetupAPI que acessam entradas de arquivo INF possam ser usadas para recuperar as informações de caminho de origem originais de um arquivo INF instalado.

Esse método funciona apenas para arquivos INF instalados no diretório de arquivos INF do sistema. Você não pode usar esse método para arquivos INF presentes no repositório de driver.

O co-instalador fornecido com o exemplo de torradeira no WDK (Kit de Driver do Windows) usa esse método e este tópico inclui trechos do exemplo de torradeira que mostram esse método. Para obter mais informações sobre o exemplo de torradeira, consulte toasterpkg.htm, que é fornecido no diretório src\general\toaster do WDK.

Para usar esse método para recuperar o caminho de origem original de um arquivo INF instalado, faça o seguinte:

  1. Inclua no arquivo INF uma seção que inclui uma entrada cujo primeiro campo é o token de chave de cadeia de caracteres %1%. Por padrão, o token de chave de cadeia de caracteres %1% representa o caminho de origem original do arquivo INF. Quando o Windows instala esse arquivo INF, ele salva a cadeia de caracteres de caminho de origem original com a versão instalada do arquivo INF. Lembre-se de que esse método só funcionará se %1% for usado conforme mostrado neste exemplo. Em geral, o que %1% resolve é dependente de contexto. Por exemplo, um campo %1% em uma entrada de seção do add-registry não resolve ao caminho de origem original; em vez disso, %1% nesse contexto resolve para o caminho do arquivo INF correspondente no repositório de driver.

  2. Use SetupOpenInfFile, SetupFindFirstLine e SetupGetStringField para recuperar o caminho de origem original da entrada que inclui o token de chave de cadeia de caracteres %1%.

Por exemplo, toasterpkg.inf inclui a seguinte seção [ToasterCoInfo] com uma entrada OriginalInfSourcePath personalizada cujo primeiro campo é o token de chave de cadeia de caracteres %1%.

[ToastCoInfo]
; Used by the toaster co-installer to figure out where the original media is
; located (so it can start value-added setup programs).
OriginalInfSourcePath = %1%

Se um INF estiver configurado conforme ilustrado pelo exemplo da torradeira, você poderá recuperar o caminho de origem original depois de instalar o arquivo INF no diretório INF do sistema. Para recuperar o caminho de origem original, primeiro chame SetupOpenInfFile para abrir o arquivo INF instalado. Por exemplo, o exemplo de código a seguir de toastco.c abre o arquivo toasterpkg.inf instalado.

// Since the INF is already in %SystemRoot%\Inf, we need to find out where it
// originally came from.  There is no direct way to ascertain an INF's
// path of origin, but we can indirectly determine it by retrieving a field
// from our INF that uses a string substitution of %1% (DIRID_SRCPATH).
//
hInf = SetupOpenInfFile(DriverInfoDetailData->InfFileName,
                        NULL,
                        INF_STYLE_WIN4,
                        NULL
                        );

Depois de abrir o arquivo INF instalado, chame SetupFindFirstLine para recuperar a primeira linha da seção que contém a entrada cujo primeiro campo é o token de chave de cadeia de caracteres %1%. Em seguida, chame SetupGetStringField para recuperar o primeiro campo dessa entrada e recuperar o caminho de origem original do arquivo INF. Por exemplo, o exemplo de código a seguir de toastco.c recupera a linha que contém a entrada OriginalInfSourcePath personalizada e recupera o primeiro campo dessa entrada. Como o primeiro campo no INF original é o token de chave de cadeia de caracteres %1%, SetupGetStringField retorna o caminho de origem original do arquivo INF.

// Contained within our INF should be a [ToastCoInfo] section with the
// following entry:
//
//     OriginalInfSourcePath = %1%
//
// If we retrieve the value (i.e., field 1) of this line, we'll get the
// full path where the INF originally came from.
//
if(!SetupFindFirstLine(hInf, L"ToastCoInfo", L"OriginalInfSourcePath", &InfContext)) {
   goto clean0;
}
if(!SetupGetStringField(&InfContext, 1, *MediaRootDirectory, MAX_PATH, &PathLength) ||
  (PathLength <= 1)) {
  goto clean0;