Ordem de pesquisa da biblioteca de vínculo dinâmico
É comum que existam várias versões da mesma biblioteca de vínculo dinâmico (DLL) em diferentes locais do sistema de arquivos dentro de um sistema operacional (SO). Você pode controlar o local específico a partir do qual qualquer DLL é carregada especificando um caminho completo. Mas se você não usar esse método, o sistema procurará a DLL no momento do carregamento, conforme descrito neste tópico. O do carregador de DLL é a parte do sistema operacional (SO) que carrega DLLs e/ou resolve referências a DLLs.
Dica
Para obter definições de empacotados e aplicativos não empacotados, consulte Vantagens e desvantagens de empacotar seu aplicativo.
Fatores que afetam a pesquisa
Aqui estão alguns fatores de pesquisa especiais que são discutidos neste tópico — você pode considerá-los parte da ordem de pesquisa da DLL. As seções posteriores deste tópico listam esses fatores na ordem de pesquisa apropriada para determinados tipos de aplicativos, juntamente com outros locais de pesquisa. Esta seção é apenas para introduzir os conceitos e dar-lhes nomes que usaremos para nos referir a eles mais adiante no tópico.
- redirecionamento de DLL. Para obter detalhes, consulte de redirecionamento de biblioteca de vínculo dinâmico .
- conjuntos de API. Para obter detalhes, consulte conjuntos de API do Windows.
- Redirecionamento de manifesto lado a lado (SxS)— somente aplicativos de área de trabalho (não aplicativos UWP). Você pode redirecionar usando um manifesto do aplicativo (também conhecido como manifesto do aplicativo lado a lado ou manifesto de fusão). Para obter detalhes, consulte Manifestos.
- Lista de módulos carregados. O sistema pode verificar se uma DLL com o mesmo nome de módulo já está carregada na memória (não importa de qual pasta ela foi carregada).
-
DLLs conhecidas. Se a DLL estiver na lista de DLLs conhecidas para a versão do Windows na qual o aplicativo está sendo executado, o sistema usará sua cópia da DLL conhecida (e as DLLs dependentes da DLL conhecida, se houver). Para obter uma lista de DLLs conhecidas no sistema atual, consulte a chave do Registro
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
.
Se uma DLL tiver dependências, o sistema procurará as DLLs dependentes como se elas fossem carregadas usando apenas seus nomes de módulo. Isso é verdade mesmo se a primeira DLL foi carregada especificando um caminho completo.
Ordem de pesquisa para aplicativos empacotados
Quando um aplicativo empacotado carrega um módulo empacotado (especificamente, um módulo de biblioteca — um arquivo .dll
) chamando a funçãoLoadPackagedLibrary, a DLL deve estar no gráfico de dependência do pacote do processo. Para obter mais informações, consulte LoadPackagedLibrary. Quando um aplicativo empacotado carrega um módulo por outros meios e não especifica um caminho completo, o sistema procura a DLL e suas dependências no momento do carregamento, conforme descrito nesta seção.
Quando o sistema procura um módulo ou suas dependências, ele sempre usa a ordem de pesquisa para aplicativos empacotados; mesmo que uma dependência não seja um código de aplicativo empacotado.
Ordem de pesquisa padrão para aplicativos empacotados
O sistema pesquisa nesta ordem:
- Redirecionamento de DLL.
- Conjuntos de APIs.
- Somente aplicativos da área de trabalho (não aplicativos UWP). Redirecionamento de manifesto SxS.
- Lista de módulos carregados.
- DLLs conhecidas.
- O gráfico de dependência do pacote do processo. Este é o pacote do aplicativo mais quaisquer dependências especificadas como
<PackageDependency>
na seção<Dependencies>
do manifesto do pacote do aplicativo. As dependências são pesquisadas na ordem em que aparecem no manifesto. - A pasta a partir da qual o processo de chamada foi carregado (pasta do executável).
- A pasta do sistema (
%SystemRoot%\system32
).
Se uma DLL tiver dependências, o sistema procurará as DLLs dependentes como se elas fossem carregadas apenas com seus nomes de módulo (mesmo que a primeira DLL tenha sido carregada especificando um caminho completo).
Ordem de pesquisa alternativa para aplicativos empacotados
Se um módulo alterar a ordem de pesquisa padrão chamando a funçãoLoadLibraryExcom LOAD_WITH_ALTERED_SEARCH_PATH, a ordem de pesquisa será a mesma que a ordem de pesquisa padrão, exceto que na etapa 7 o sistema pesquisa a pasta da qual o módulo especificado foi carregado (a pasta do módulo de carregamento superior) em vez da pasta do executável.
Ordem de pesquisa para aplicativos não empacotados
Quando um aplicativo não empacotado carrega um módulo e não especifica um caminho completo, o sistema procura a DLL no momento do carregamento, conforme descrito nesta seção.
Importante
Se um invasor ganhar o controle de um dos diretórios pesquisados, ele poderá colocar uma cópia mal-intencionada da DLL nessa pasta. Para saber como ajudar a evitar esses ataques, consulte de segurança da biblioteca de vínculo dinâmico .
Ordem de pesquisa padrão para aplicativos não empacotados
A ordem de pesquisa de DLL padrão usada pelo sistema depende se modo de pesquisa de DLL seguro está habilitado ou não.
O modo de pesquisa DLL segura (que é ativado por padrão) move a pasta atual do usuário posteriormente na ordem de pesquisa. Para desativar o modo de pesquisa segura de DLL, crie o valor HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode
do Registro e defina-o como 0. Chamar a funçãoSetDllDirectoryefetivamente desabilita o modo de pesquisa DLL segura (enquanto a pasta especificada está no caminho de pesquisa) e altera a ordem de pesquisa conforme descrito neste tópico.
Se o modo de pesquisa DLL segura estiver habilitado, a ordem de pesquisa será a seguinte:
- Redirecionamento DLL.
- Conjuntos de APIs.
- Redirecionamento de manifesto SxS.
- Lista de módulos carregados.
- DLLs conhecidas.
-
Windows 11, versão 21H2 (10.0; Build 22000), e mais tarde. O gráfico de dependência do pacote do processo. Este é o pacote do aplicativo mais quaisquer dependências especificadas como
<PackageDependency>
na seção<Dependencies>
do manifesto do pacote do aplicativo. As dependências são pesquisadas na ordem em que aparecem no manifesto. - A pasta a partir da qual o aplicativo foi carregado.
- A pasta do sistema. Use o função GetSystemDirectory para recuperar o caminho dessa pasta.
- A pasta do sistema de 16 bits. Não há nenhuma função que obtenha o caminho desta pasta, mas ela é pesquisada.
- A pasta Windows. Use a função GetWindowsDirectory para obter o caminho dessa pasta.
- A pasta atual.
- Os diretórios listados na variável de ambiente
PATH
. Isso não inclui o caminho por aplicativo especificado pelo Caminhos de Aplicativo chave do Registro. A chave App Paths não é usada ao calcular o caminho de pesquisa da DLL.
Se o modo de pesquisa DLL segura estiver desativado, a ordem de pesquisa é a mesma, exceto que pasta atual se move da posição 11 para a posição 8 na sequência (imediatamente após a etapa 7. A pasta a partir da qual o aplicativo foi carregado).
Ordem de pesquisa alternativa para aplicativos não empacotados
Para alterar a ordem de pesquisa padrão usada pelo sistema, você pode chamar a função LoadLibraryEx com LOAD_WITH_ALTERED_SEARCH_PATH. Você também pode alterar a ordem de pesquisa padrão chamando a funçãoSetDllDirectory.
Observação
A ordem de pesquisa padrão do processo também será afetada chamando a função SetDllDirectory no processo pai antes do início do processo atual.
Se você especificar uma estratégia de pesquisa alternativa, seu comportamento continuará até que todos os módulos executáveis associados tenham sido localizados. Depois que o sistema começa a processar rotinas de inicialização de DLL, o sistema reverte para a estratégia de pesquisa padrão.
A funçãoLoadLibraryEx oferece suporte a uma ordem de pesquisa alternativa se a chamada especificar LOAD_WITH_ALTERED_SEARCH_PATHe o parâmetro lpFileName especificar um caminho absoluto.
- A estratégia de pesquisa padrão começa (após as etapas iniciais) na pasta do aplicativo de chamada.
- A estratégia de pesquisa alternativa especificada pelo LoadLibraryEx com LOAD_WITH_ALTERED_SEARCH_PATH começa (após as etapas iniciais) na pasta do módulo executável que LoadLibraryEx está carregando.
Essa é a única maneira em que eles diferem.
Se o modo de pesquisa DLL segura estiver habilitado, a ordem de pesquisa alternativa será a seguinte:
Os passos 1 a 6 são os mesmos que a ordem de pesquisa padrão.
- A pasta especificada por lpFileName.
- A pasta do sistema. Use o função GetSystemDirectory para recuperar o caminho dessa pasta.
- A pasta do sistema de 16 bits. Não há nenhuma função que obtenha o caminho desta pasta, mas ela é pesquisada.
- A pasta Windows. Use a função GetWindowsDirectory para obter o caminho dessa pasta.
- A pasta atual.
- Os diretórios listados na variável de ambiente
PATH
. Isso não inclui o caminho por aplicativo especificado pelo Caminhos de Aplicativo chave do Registro. A chave App Paths não é usada ao calcular o caminho de pesquisa da DLL.
Se o modo de pesquisa DLL segura estiver desativado, a ordem de pesquisa alternativa é a mesma, exceto que pasta atual se move da posição 11 para a posição 8 na sequência (imediatamente após a etapa 7. A pasta especificada por lpFileName).
A função SetDllDirectory oferece suporte a uma ordem de pesquisa alternativa se o parâmetro lpPathName especificar um caminho. A ordem de pesquisa alternativa é a seguinte:
Os passos 1 a 6 são os mesmos que a ordem de pesquisa padrão.
- A pasta a partir da qual o aplicativo foi carregado.
- A pasta especificada pelo lpPathName parâmetro de SetDllDirectory.
- A pasta do sistema.
- A pasta do sistema de 16 bits.
- A pasta Windows.
- Os diretórios listados na variável de ambiente
PATH
.
Se o parâmetro lpPathName for uma cadeia de caracteres vazia, a chamada removerá a pasta atual da ordem de pesquisa.
SetDllDirectory efetivamente desabilita o modo de pesquisa DLL segura enquanto a pasta especificada está no caminho de pesquisa. Para restaurar o modo de pesquisa DLL seguro com base no valor do Registro SafeDllSearchMode e restaurar a pasta atual para a ordem de pesquisa, chame SetDllDirectory com lpPathName como NULL.
Ordem de pesquisa usando sinalizadores de LOAD_LIBRARY_SEARCH
Você pode especificar uma ordem de pesquisa usando um ou mais sinalizadores de LOAD_LIBRARY_SEARCH com a funçãoLoadLibraryEx. Você também pode usar sinalizadores de LOAD_LIBRARY_SEARCH com a função SetDefaultDllDirectories para estabelecer uma ordem de pesquisa de DLL para um processo. Você pode especificar diretórios adicionais para a ordem de pesquisa de DLL do processo usando o AddDllDirectory ou funções de SetDllDirectory.
Os diretórios pesquisados dependem dos sinalizadores especificados com SetDefaultDllDirectories ou LoadLibraryEx. Se você usar mais de um sinalizador, os diretórios correspondentes serão pesquisados nesta ordem:
- LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR. A pasta que contém a DLL é pesquisada. Esta pasta é pesquisada apenas para dependências da DLL a ser carregada.
- LOAD_LIBRARY_SEARCH_APPLICATION_DIR. A pasta do aplicativo é pesquisada.
- LOAD_LIBRARY_SEARCH_USER_DIRS. Os caminhos explicitamente adicionados com a função AddDllDirectory ou a funçãoSetDllDirectorysão pesquisados. Se você adicionar mais de um caminho, a ordem na qual os caminhos são pesquisados não será especificada.
- LOAD_LIBRARY_SEARCH_SYSTEM32. A pasta System é pesquisada.
Se você chamar LoadLibraryEx sem sinalizadores de LOAD_LIBRARY_SEARCH ou estabelecer uma ordem de pesquisa de DLL para o processo, o sistema procurará DLLs usando a ordem de pesquisa padrão ou a ordem de pesquisa alternativa.
Tópicos relacionados
- Registo de candidatura
- de redirecionamento de biblioteca de vínculo dinâmico
- de segurança da biblioteca de vínculo dinâmico
- Componentes lado a lado
- AddDllDirectory
- LoadLibrary
- LoadLibraryEx
- LoadPackagedLibrary
- SetDefaultDllDirectories
- SetDllDirectory