Orden de búsqueda de la biblioteca de vínculos dinámicos

Es habitual que varias versiones de la misma biblioteca de vínculos dinámicos (DLL) existan en diferentes ubicaciones del sistema de archivos dentro de un sistema operativo (SO). Puede controlar la ubicación específica desde la que se carga cualquier dll determinada especificando una ruta de acceso completa. Pero si no usa ese método, el sistema busca el archivo DLL en tiempo de carga, tal como se describe en este tema. El cargador de DLL es la parte del sistema operativo (SO) que carga archivos DLL o resuelve referencias a archivos DLL.

Sugerencia

Para obtener definiciones de aplicaciones empaquetadas y no empaquetadas , consulta Ventajas y desventajas del empaquetado de la aplicación.

Factores que afectan a la búsqueda

Estos son algunos factores de búsqueda especiales que se describen en este tema; puede considerar que forman parte del orden de búsqueda dll. En las secciones posteriores de este tema se enumeran estos factores en el orden de búsqueda adecuado para determinados tipos de aplicaciones, junto con otras ubicaciones de búsqueda. Esta sección es solo para introducir los conceptos y asignarles nombres que usaremos para hacer referencia a ellos más adelante en el tema.

  • Redirección de DLL. Para obtener más información, consulte Redirección de la biblioteca de vínculos dinámicos.
  • Conjuntos de API. Para obtener más información, consulte Conjuntos de API de Windows.
  • Redireccionamiento de manifiestos en paralelo (SxS): solo aplicaciones de escritorio (no aplicaciones para UWP). Puede redirigir mediante un manifiesto de aplicación (también conocido como manifiesto de aplicación en paralelo o un manifiesto de fusión). Para obtener más información, consulte Manifiestos.
  • Lista de módulos cargados. El sistema puede comprobar si un archivo DLL con el mismo nombre de módulo ya está cargado en la memoria (independientemente de la carpeta desde la que se cargó).
  • Archivos DLL conocidos. Si el archivo DLL se encuentra en la lista de archivos DLL conocidos para la versión de Windows en la que se ejecuta la aplicación, el sistema usa su copia del archivo DLL conocido (y los archivos DLL dependientes del archivo DLL conocido, si los hay). Para obtener una lista de archivos DLL conocidos en el sistema actual, consulte la clave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLsdel Registro .

Si un archivo DLL tiene dependencias, el sistema busca los archivos DLL dependientes como si se cargaran usando solo sus nombres de módulo. Esto es cierto incluso si el primer archivo DLL se cargó especificando una ruta de acceso completa.

Orden de búsqueda de aplicaciones empaquetadas

Cuando una aplicación empaquetada carga un módulo empaquetado (en concreto, un módulo de biblioteca, un .dll archivo) mediante una llamada a la función LoadPackagedLibrary , el archivo DLL debe estar en el gráfico de dependencias del paquete del proceso. Para obtener más información, consulte LoadPackagedLibrary. Cuando una aplicación empaquetada carga un módulo por otros medios y no especifica una ruta de acceso completa, el sistema busca el archivo DLL y sus dependencias en tiempo de carga, como se describe en esta sección.

Cuando el sistema busca un módulo o sus dependencias, siempre usa el orden de búsqueda de las aplicaciones empaquetadas; incluso si una dependencia no está empaquetada en el código de la aplicación.

Orden de búsqueda estándar para aplicaciones empaquetadas

El sistema busca en este orden:

  1. Redirección de DLL.
  2. Conjuntos de API.
  3. Solo aplicaciones de escritorio (no aplicaciones para UWP). Redireccionamiento del manifiesto SxS.
  4. Lista de módulos cargados.
  5. Archivos DLL conocidos.
  6. Gráfico de dependencias del paquete del proceso. Este es el paquete de la aplicación más las dependencias especificadas como <PackageDependency> en la <Dependencies> sección del manifiesto del paquete de la aplicación. Las dependencias se buscan en el orden en que aparecen en el manifiesto.
  7. La carpeta desde la que se cargó el proceso de llamada (la carpeta del ejecutable).
  8. Carpeta del sistema (%SystemRoot%\system32).

Si un archivo DLL tiene dependencias, el sistema busca los archivos DLL dependientes como si se cargaran con solo sus nombres de módulo (incluso si el primer archivo DLL se cargó especificando una ruta de acceso completa).

Orden de búsqueda alternativo para aplicaciones empaquetadas

Si un módulo cambia el orden de búsqueda estándar llamando a la función LoadLibraryEx con LOAD_WITH_ALTERED_SEARCH_PATH, el orden de búsqueda es el mismo que el orden de búsqueda estándar, excepto que en el paso 7, el sistema busca en la carpeta desde la que se cargó el módulo especificado (la carpeta del módulo de carga superior) en lugar de la carpeta del ejecutable.

Orden de búsqueda de aplicaciones sin empaquetar

Cuando una aplicación sin empaquetar carga un módulo y no especifica una ruta de acceso completa, el sistema busca el archivo DLL en tiempo de carga, tal y como se describe en esta sección.

Importante

Si un atacante obtiene el control de uno de los directorios que se busca, puede colocar una copia malintencionada del archivo DLL en esa carpeta. Para obtener formas de ayudar a evitar estos ataques, consulte Seguridad de la biblioteca de vínculos dinámicos.

Orden de búsqueda estándar para aplicaciones no empaquetadas

El orden de búsqueda de DLL estándar usado por el sistema depende de si el modo de búsqueda de DLL seguro está habilitado o no.

El modo de búsqueda de DLL seguro (que está habilitado de forma predeterminada) mueve la carpeta actual del usuario más adelante en el orden de búsqueda. Para deshabilitar el modo de búsqueda de DLL segura, cree el valor del HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode Registro y establézcalo en 0. Llamar a la función SetDllDirectory deshabilita eficazmente el modo de búsqueda de DLL seguro (mientras que la carpeta especificada está en la ruta de búsqueda) y cambia el orden de búsqueda tal y como se describe en este tema.

Si el modo de búsqueda de DLL seguro está habilitado, el orden de búsqueda es el siguiente:

  1. Redirección de DLL.
  2. API sets.
  3. SxS manifest redirection.
  4. Loaded-module list.
  5. Known DLLs.
  6. Windows 11, versión 21H2 (10.0; Compilación 22000) y versiones posteriores. The package dependency graph of the process. This is the application's package plus any dependencies specified as <PackageDependency> in the <Dependencies> section of the application's package manifest. Dependencies are searched in the order they appear in the manifest.
  7. Carpeta desde la que se cargó la aplicación.
  8. Carpeta del sistema. Use la función GetSystemDirectory para recuperar la ruta de acceso de esta carpeta.
  9. Carpeta del sistema de 16 bits. No hay ninguna función que obtenga la ruta de acceso de esta carpeta, pero se busca.
  10. La carpeta Windows. Use la función GetWindowsDirectory para obtener la ruta de acceso de esta carpeta.
  11. Carpeta actual.
  12. Directorios que se enumeran en la variable de PATH entorno. Esto no incluye la ruta de acceso por aplicación especificada por la clave del Registro de rutas de acceso de aplicación. La clave rutas de acceso de la aplicación no se usa al calcular la ruta de acceso de búsqueda dll.

Si el modo de búsqueda dll segura está deshabilitado, el orden de búsqueda es el mismo, salvo que la carpeta actual se mueve de la posición 11 a la posición 8 de la secuencia (inmediatamente después del paso 7. Carpeta desde la que se cargó la aplicación).

Orden de búsqueda alternativo para aplicaciones desempaquetadas

Para cambiar el orden de búsqueda estándar usado por el sistema, puede llamar a la función LoadLibraryEx con LOAD_WITH_ALTERED_SEARCH_PATH. También puede cambiar el orden de búsqueda estándar llamando a la función SetDllDirectory .

Nota

El orden de búsqueda estándar del proceso también se verá afectado llamando a la función SetDllDirectory en el proceso primario antes del inicio del proceso actual.

Si especifica una estrategia de búsqueda alternativa, su comportamiento continúa hasta que se hayan localizado todos los módulos ejecutables asociados. Una vez que el sistema inicia el procesamiento de rutinas de inicialización de DLL, el sistema vuelve a la estrategia de búsqueda estándar.

La función LoadLibraryEx admite un orden de búsqueda alternativo si la llamada especifica LOAD_WITH_ALTERED_SEARCH_PATH y el parámetro lpFileName especifica una ruta de acceso absoluta.

  • La estrategia de búsqueda estándar comienza (después de los pasos iniciales) en la carpeta de la aplicación que llama.
  • La estrategia de búsqueda alternativa especificada por LoadLibraryEx con LOAD_WITH_ALTERED_SEARCH_PATH comienza (después de los pasos iniciales) en la carpeta del módulo ejecutable que loadLibraryEx está cargando.

Esa es la única manera en que difieren.

Si el modo de búsqueda dll segura está habilitado, el orden de búsqueda alternativo es el siguiente:

Los pasos 1 a 6 son los mismos que el orden de búsqueda estándar.

  1. Carpeta especificada por lpFileName.
  2. The system folder. Use the GetSystemDirectory function to retrieve the path of this folder.
  3. The 16-bit system folder. There's no function that obtains the path of this folder, but it is searched.
  4. The Windows folder. Use la función GetWindowsDirectory para obtener la ruta de acceso de esta carpeta.
  5. Carpeta actual.
  6. Directorios que se enumeran en la variable de PATH entorno. Esto no incluye la ruta de acceso por aplicación especificada por la clave del Registro de rutas de acceso de aplicación. La clave rutas de acceso de la aplicación no se usa al calcular la ruta de acceso de búsqueda dll.

Si el modo de búsqueda dll segura está deshabilitado, el orden de búsqueda alternativo es el mismo, salvo que la carpeta actual se mueve de la posición 11 a la posición 8 de la secuencia (inmediatamente después del paso 7. Carpeta especificada por lpFileName).

La función SetDllDirectory admite un orden de búsqueda alternativo si el parámetro lpPathName especifica una ruta de acceso. El orden de búsqueda alternativo es el siguiente:

Los pasos 1 a 6 son los mismos que el orden de búsqueda estándar.

  1. Carpeta desde la que se cargó la aplicación.
  2. Carpeta especificada por el parámetro lpPathName de SetDllDirectory.
  3. Carpeta del sistema.
  4. Carpeta del sistema de 16 bits.
  5. La carpeta Windows.
  6. Directorios enumerados en la variable de PATH entorno.

Si el parámetro lpPathName es una cadena vacía, la llamada quita la carpeta actual del orden de búsqueda.

SetDllDirectory deshabilita eficazmente el modo de búsqueda de DLL seguro mientras la carpeta especificada está en la ruta de búsqueda. Para restaurar el modo de búsqueda de DLL seguro basado en el valor del registro SafeDllSearchMode y restaurar la carpeta actual en el orden de búsqueda, llame a SetDllDirectory con lpPathName como NULL.

Orden de búsqueda mediante marcas de LOAD_LIBRARY_SEARCH

Puede especificar un orden de búsqueda mediante una o varias marcas de LOAD_LIBRARY_SEARCH con la función LoadLibraryEx . También puede usar marcas de LOAD_LIBRARY_SEARCH con la función SetDefaultDllDirectories para establecer un orden de búsqueda dll para un proceso. Puede especificar directorios adicionales para el orden de búsqueda del archivo DLL del proceso mediante las funciones AddDllDirectory o SetDllDirectory .

Los directorios que se buscan dependen de las marcas especificadas con SetDefaultDllDirectories o LoadLibraryEx. Si usa más de una marca, los directorios correspondientes se buscarán en este orden:

  1. LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR. Se busca en la carpeta que contiene el archivo DLL. Esta carpeta solo se busca en las dependencias del archivo DLL que se van a cargar.
  2. LOAD_LIBRARY_SEARCH_APPLICATION_DIR. Se busca en la carpeta de la aplicación.
  3. LOAD_LIBRARY_SEARCH_USER_DIRS. Se buscan las rutas de acceso agregadas explícitamente con la función AddDllDirectory o la función SetDllDirectory . Si agrega más de una ruta de acceso, no se especifica el orden en que se buscan las rutas de acceso.
  4. LOAD_LIBRARY_SEARCH_SYSTEM32. Se busca en la carpeta System.

Si llama a LoadLibraryEx sin marcas de LOAD_LIBRARY_SEARCH , o establece un orden de búsqueda dll para el proceso, el sistema busca archivos DLL mediante el orden de búsqueda estándar o el orden de búsqueda alternativo.