1120 Alameda Orquidea, Atibaia, SP,  BRA

fernando@driverentry.com.br

Personal Gina Tabajara

Em conseqüência à volta às aulas na faculdade, meu tempo para escrever posts já diminuiu, e mais uma vez, vocês vão ter que tolerar um post que não fala nada sobre drivers. Na verdade, foi enquanto eu escrevia um post sobre drivers que escrevi esta Gina de exemplo. Mas depois de ouvir meus amigos, Lesma e Thiago, falarem que eu deveria deixar esse tal post de forma pudesse ser aplicado ao Windows Vista. Sabendo que ginas não são mais suportadas pelo Windows Vista, então a gina acabou ficando de lado. Tadinha… Enfim, como achei que o resultado ficou no mínimo divertido, vou deixar aqui esta Gina Stub (incluindo os fontes) que permite que mudemos o título dos diálogos apresentados.

O que é uma Gina Stub?

Seria melhor ainda dizer o que é Gina. Já escrevi algumas poucas coisas a respeito de Ginas no post que fala como utilizar o SoftIce, mas de forma resumida, Gina é o compomente do sistema que implementa a interface gráfica para a autenticação dos usuários em uma estação. Quer mais resumido ainda? É a telinha de logon do sistema. A gina é responsável por receber os dados que identificam o usuário e os repassam para os componentes que podem validar a senha e gerar o token com as credenciais deste usuário. É a partir deste token que é criada a sessão onde o usuário está se logando e onde será criado seu desktop. A gina também implementa a interface que faz a troca de senha, bloqueio e o shutdown da estação. Não vou detalhar todos estes passos aqui, tudo está explicado na documentação do Platform SDK.

A gina original do Windows está implementada em na DLL de nome MsGina.dll que está no diretório System32 do Windows. Para implementar uma nova gina, você precisa criar uma nova DLL e informar ao sistema que esta DLL será a nova gina através de uma chave no registro. Mas criar uma gina não é algo tão simples assim. Já desenvolvi algumas e digamos que a documentação deixou um pouco a desejar. Pelo menos foi assim naquela época. A gina tem muitas responsabilidades e se você quer apenas complementar ou alterar algum comportamento da gina original, você poderia simplesmente criar uma gina stub. Gina Stub é uma DLL que exporta todas funções que uma gina deveria exportar, mas esta repassa as chamadas para a gina original do sistema, dando assim a opção que alterar apenas as funcionalidades desejadas.

Isso não é um tutorial

Se você quer saber como desenvolver uma gina stub e precisa de um ponto de partida, então vá até à pasta de exemplos do Platform SDK e utilize o exemplo da pasta C:\MSSDK\Samples\Security\GINA\GinaStub. O projeto que estou deixando aqui realiza alguns malabarismos para evitar código muito repetitivo e também não utiliza a C/C++ Run Time para poder ser compilada em Visual Studio 2005 e ainda assim poder rodar em Windows NT 4.0.

Instalando a Gina

Para cadastrar uma gina, você deve criar um valor chamado GinaDLL na chave Winlogon do registro, conforme mostra a figura abaixo. Esse valor é consultado pelo Winlogon.exe e caso este valor não exista, a gina padrão é carregada. O valor GinaTitle deve conter a mensagem que será exibida no título dos diálogos. Este valor não tem nada a ver com o Windows, é a nossa gina stub quem lê este valor. Junto dos arquivos fontes disponíveis para download no final deste post, existe um arquivo de script do registro que configura estas chaves para facilitar a sua vida.


Copie o arquivo Gina.dll para o diretório System32 do Windows. Certifique-se que de tudo está certo antes de reiniciar a máquina e fazer com que estas alterações tenham efeito. Caso algo esteja errado e o Winlogon.exe não consiga carregar a gina, a janela abaixo é exibida antes de qualquer coisa.


Até que o design deste MessageBox melhorou bastante a partir do Windows 2000. Se o mesmo problema acontecesse com o Windows NT 4.0, a seguinte mensagem seria exibida.

Duas dicas úteis para gina coders

Escrever ginas é a oportunidade que programadores User-Mode têm de gerar suas próprias telas azuis. Sua DLL é carregada pelo Winlogon.exe, e assim, é executada no address space deste processo. Isso significa que se você tiver uma excessão não tratada, isso vai derrubar este processo. O Winlogon é um processo crítico e não pode ser derrubado. Resumindo, tela azul.

A próxima dica é meio café com leite, mas vale a pena ser comentada. Durante o processo de desenvolvimento da gina, é natural ter vários builds e a necessidade se substituir a gina que está sendo utilizada no momento sempre aparece. Você já deve ter tentado sobrescrevê-la, mas como o Winlogon.exe está sempre com ela carregada, você não consegue apagar a gina atual. Como qualquer DLL nestas condições, você pode renomeá-la mesmo enquanto está sendo utilizada pelo Winlogon. Isso permite colocar uma nova versão da gina no diretório System32 sem ter que apagar a versão que está sendo executada no momento. Quando o sistema reiniciar, o Winlogon vai pegar a gina nova e largar a velha.

Espero que tenham gostado do brinquedinho. Agora preciso continuar aquele post.
Have fun!

TitleGina.zip

Leave a Reply

Your email address will not be published.