Segredos do WindowsO Equilíbrio do Known DLLs

Raymond Chen

O recurso do Windows chamado informalmente de "Known DLLs" é uma lista de DLLs (Bibliotecas de Vínculos Dinâmicos) que receberam tratamento especial pelo módulo de carregamento do kernel. Quando o carregador percebe um programa com um vínculo dinâmico de tempo de carregamento para uma DLL conhecida, a cópia é usada imediatamente, ignorando o algoritmo de busca que normalmente se aplica ao módulo de carregamento. Algumas pessoas devem considerar que se trata de um recurso de segurança (embora reconhecidamente um muito fraco), mas segurança nunca foi o objetivo desse recurso. O Known DLLs sempre foi voltado para desempenho.

Os mecanismos do recurso Known DLLs mudaram com o tempo. Em algumas versões do Windows®, o kernel usa a lista de DLLs conhecidas como ponto de partida, depois procura em todas as DLLs vinculadas àquelas conhecidas e vai repetindo a procura dessa forma. Esse processo amplia o fechamento transitivo de todas as dependências e considera todas como se fossem conhecidas. Em outras versões do Windows, esse fechamento transitivo não é criado; em vez disso, apenas DLLs listadas explicitamente como conhecidas são tratadas dessa forma. Em algumas versões do Windows, as DLLs conhecidas são pré-carregadas pelo kernel quando se inicializa o sistema; em outras versões, não acontece esse pré-carregamento e o kernel apenas usa a lista para economizar o trabalho de procurar o caminho para uma DLL.

Não é apenas a interpretação da lista de DLLs conhecidas que se altera de versão para versão. O conteúdo da chave de registro do KnownDLLs também pode ser alterado. A equipe de desempenho do Windows altera a lista de DLLs conhecidas e as regras pelas quais a lista é convertida em um conjunto de DLLs baseado na compreensão de como os aplicativos usam o Windows. Como é normal na engenharia, é um jogo de toma lá dá cá. Pré-carregar DLLs conhecidas quando sistema é inicializado permite que os aplicativos que utilizam essas DLLs se inicializem mais rápido, mas isso tem um preço. Demora mais a inicializar o sistema e consome mais memória, na medida em que aquelas DLLs permanecem na memória, estejam ou não sendo usadas. É um jogo onde se melhora o desempenho de alguns componentes ao custo de outros. Alcançar o equilíbrio é uma tarefa difícil e, como você pode ver, está sempre sendo perfeitamente ajustado conforme o modelo de uso se desenvolve.

Uma conseqüência das DLLs conhecidas que podem não ser legíveis é, obviamente, que elas prevalecem sobre as DLLs redirecionadas localmente. (Falamos sobre DLLs redirecionadas localmente na coluna da edição de janeiro de 2007.) Se você raciocinar, vai perceber que, na verdade, esse é o comportamento esperado, em vez de uma inconveniência. Além disso, o propósito da lista de DLLs conhecidas é dispensar o caminho da busca e, assim, acelerar o carregamento de DLL. Se o kernel tivesse que fazer checagem de DLLs redirecionadas, isso iria atrasar mais o processamento. Você pode pensar que adicionar apenas um diretório ao caminho de pesquisa não seria uma boa idéia, mas quando esse diretório é um servidor de rede bem no meio do caminho, adicionar ao menos um diretório pode ser um enorme redutor de desempenho.

Acredite ou não, tenho visto programas que utilizam DLLs conhecidas específicas. Havia apenas um programa que tinha um arquivo chamado Version.dll no diretório de aplicativos. Sob regras normais, essa cópia privada do Version.dll substituiria a que estivesse presente do diretório de sistema, mas no Windows XP, o Version.dll é listado como DLL conhecida. Isso significa que a cópia do diretório de aplicativo é ignorada e a versão no diretório de sistema prevalece.

No Windows Vista®, o Version.dll não é listado como DLL conhecida, provavelmente porque a equipe de desempenho determinou que os aplicativos não o utilizavam o suficiente para justificar o custo. Como resultado, esse programa não atua no Windows Vista porque, na verdade, o aplicativo se apoiava no kernel, ignorando o DLL que o programa havia instalado em seu próprio diretório de aplicativos. O programa estava instalado uma DLL de propósito no caminho de pesquisa e depois se apoiava no Windows e ignorava a DLL. Com certeza, se ele quisesse que o Windows ignorasse o arquivo, um mecanismo muito mais eficiente seria apenas não instalar o arquivo. A desvantagem é que a empresa que escreveu o programa arquivou um bug achando que havia encontrado uma falha de segurança.

Raymond Chen, The Old New Thing, e o livro homônimo (Addison-Wesley, 2007), tratam da história do Windows e da programação Win32. Raymond não tem mais nem idéia do tamanho de camiseta que veste.

© 2008 Microsoft Corporation e CMP Media, LLC. Todos os direitos reservados. A reprodução parcial ou completa sem autorização é proibida..