13 de agosto de 2009

Usando arquivos INF para manutenções no Registry

Outro dia eu vi no site da Info Online uma dica interessante ensinando a incluir o desfragmentador de disco no menu de contexto do Windows Explorer. Com isso, basta clicar com o botão direito do mouse numa unidade de disco e a opção para desfragmentá-lo aparecerá no menu suspenso.

A solução mostrada naquele post é bastante simples: um arquivo com extensão INF especifica a criação de entradas no Registry para configurar o menu suspenso. Foi o uso dos arquivos INF que me chamou a atenção. Eles constituem uma forma prática de dar manutenção no Registry, criando ou removendo chaves e valores específicos. Para executá-lo, basta clicar com o botão direito do mouse no arquivo e escolher Instalar no menu suspenso. Também é possível usar a API do Windows para automatizar essa execução.

Qual a diferença entre usar um arquivo INF ou um REG, já que ambos podem dar manutenção no Registry ? Ambos são arquivos texto e podem ser facilmente executados a partir do Windows Explorer mas os INF são mais flexíveis. Eles permitem criar sequências complexas para instalação de softwares. Permitem também remover valores específicos dentro do Registry, enquanto os REG só admitem a eliminação de chaves inteiras. Outras vantagens: os INF têm sintaxe para interagir com o menu de contexto do Explorer, aceitam a inclusão de comandos para desfazer o que quer que tenha sido feito com o INF e é mais fácil de ler pois sua sintaxe é mais simples.

Veja um exemplo simples, a própria instalação do desfragmentador de disco no menu suspenso do Explorer:
[version]
signature="$CHICAGO$"

[DefaultInstall]
AddReg=AddMe

[AddMe]
HKCR,"Drive\Shell\Desfragmentar\command",,,"DEFRAG.EXE %1"

O conteúdo do arquivo INF é organizado em seções, como nos arquivos INI. Cada seção tem uma função específica e contém uma ou mais instruções.

A seção [version] é obrigatória e deve ser a primeira do arquivo para sinalizar que se trata de um arquivo INF. Esta seção deve conter uma linha obrigatória com a chave signature assumindo o valor "$CHICAGO$" se o arquivo tiver comandos compatívels com versões iguais ou superiores ao Windows 95 ou "$Windows NT$" para o caso dos comandos serem específicos de Windows 32 bits, como o NT e as versões mais recentes.

A seção [DefaultInstall] contém as instruções a serem executadas quando o usuário seleciona a opção Install no menu suspenso do Windows Explorer. No exemplo, a chave AddReg instrui a instalação a acrescentar novas chaves e valores no Registry ou modificá-los, caso tais chaves já existam. Para remover uma chave inteira do Registry ou apenas um valor específico, crie na seção [DefaultInstall] uma chave com valor DelReg. Nos dois casos, o valor que vem depois do nome indica uma outra seção (cujo nome é você quem escolhe) onde estão efetivamente uma ou mais entradas a serem acrescidas (ou deletadas) do Registry. No exemplo, o nome escolhido foi AddMe e na seção com esse nome há apenas uma nova entrada para o Registry, que configura a opção de Desfragmentar um drive (unidade de disco). Para especificar uma entrada no Registry, use a sintaxe:
RAIZ,[chave],[valor],[flags],[dados]

onde:
RAIZ é um valor obrigatório que representa uma das chaves de nível mais alto do Registry, podendo assumir uma das seguintes opções: HKCR (para a raiz ser HKEY_CLASSES_ROOT), HKCU (para HKEY_CURRENT_USER), HKLM (para HKEY_LOCAL_MACHINE) ou HKU (para HKEY_USERS). É recomendável ler a documentação dessas chaves e também dos softwares com os quais pretende interagir para saber o quê e onde gravar valores para não desestabilizar o funcionamento do Windows.

chave é um valor opcional contendo o caminho completo da chave a ser criada/alterada dentro da Raiz informada. No exemplo, foi adicionada a chave Drive\Shell\Desfragmentar\command. A barra (\) indica uma subchave, da mesma forma que uma barra no caminho no Windows Explorer indica uma subpasta.

Valor é o nome de um valor a ser criado dentro da chave especificada. O tipo de dado para esse valor é estipulado pelo campo seguinte, flags, cujos valores mais comuns são 0x00000000 (para textos) e 0x00010001 (para números inteiros).

Em Dados você coloca o valor real associado ao nome de Valor estipulado acima. Se esse dado for um texto, escreva-o entre aspas. No caso de se omitir os parâmetros Valor e Flags (como no exemplo), a informação fornecida em Dados será associada como valor padrão (default) da chave.

Este post mostra apenas tarefas simples - apenas criação e remoção de entradas no Registry - mas as possibilidades permitidas pelos arquivos INF vão muito além disso, dispondo de métodos até mesmo para instalações complexas de softwares e drivers. Volto a falar nesse assunto em outro post, mostrando exemplo de como executar tarefas mais complexas.

2 comentários :

Anônimo disse...

Parabéns pelo artigo.
Você sabe informar qual parâmetro devemos utilizar para sobrescrever o arquivo existente, com o intuito de automatizar todo processo de instalação a partir do .inf?

Gustavo Fabbro disse...

Você pode usar a seção DDInstall para especificar uma diretiva CopyFiles, apontando para uma nova seção com parâmetros para o CopyFiles. Nessa nova seção você pode estipular como (e se) cada um dos arquivos será copiado para seu destino.
Para informações sobre a sintaxe e os valores válidos, acesse os links sobre a diretiva CopyFiles e sobre a seção DDInstall.

Postar um comentário

OBS: Os comentários enviados a este Blog são submetidos a moderação. Por isso, eles serão publicados somente após aprovação.

Observação: somente um membro deste blog pode postar um comentário.