Compartir a través de


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 puede controlar la ubicación específica desde la que se carga cualquier ARCHIVO DLL determinado 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 dll de es la parte del sistema operativo (SO) que carga archivos DLL o resuelve las referencias a archivos DLL.

Propina

Para obtener definiciones de empaquetadas y aplicaciones sin empaquetar, 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 de 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 simplemente 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.
  • API establece. Para obtener más información, consulte conjuntos de API de Windows.
  • redirección 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 está 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 del Registro HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs.

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 archivo .dll) llamando 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, vea 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 para 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. aplicaciones de escritorio solo (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 sección <Dependencies> 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 desempaquetada carga un módulo y no especifica una ruta de acceso completa, el sistema busca el archivo DLL en tiempo de carga, tal 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 sin empaquetar

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

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 segura de DLL, cree el valor del registro HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode 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. Conjuntos de API.
  3. Redireccionamiento del manifiesto SxS.
  4. Lista de módulos cargados.
  5. Archivos DLL conocidos.
  6. Windows 11, versión 21H2 (10.0; Compilación 22000) y versiones posteriores. 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 sección <Dependencies> del manifiesto del paquete de la aplicación. Las dependencias se buscan en el orden en que aparecen en el manifiesto.
  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. Carpeta Windows. Use la funciónGetWindowsDirectory para obtener la ruta de acceso de esta carpeta.
  11. Carpeta actual.
  12. Directorios que aparecen en la variable de entorno PATH. Esto no incluye la ruta de acceso por aplicación especificada por las rutas de acceso de aplicación clave del Registro. La ruta de acceso de la aplicación clave 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, excepto 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 la aplicación cargó).

Orden de búsqueda alternativo para aplicaciones sin empaquetar

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

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ónLoadLibraryExadmite un orden de búsqueda alternativo si la llamada especifica LOAD_WITH_ALTERED_SEARCH_PATHy 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 la que difieren.

Si el modo de búsqueda de DLL seguro 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. Carpeta del sistema. Use la función GetSystemDirectory para recuperar la ruta de acceso de esta carpeta.
  3. Carpeta del sistema de 16 bits. No hay ninguna función que obtenga la ruta de acceso de esta carpeta, pero se busca.
  4. Carpeta Windows. Use la funciónGetWindowsDirectory para obtener la ruta de acceso de esta carpeta.
  5. Carpeta actual.
  6. Directorios que aparecen en la variable de entorno PATH. Esto no incluye la ruta de acceso por aplicación especificada por las rutas de acceso de aplicación clave del Registro. La ruta de acceso de la aplicación clave 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, excepto 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. La carpeta especificada por el parámetro lpPathName de SetDllDirectory.
  3. Carpeta del sistema.
  4. Carpeta del sistema de 16 bits.
  5. Carpeta Windows.
  6. Directorios enumerados en la variable de entorno PATH.

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 de SafeDllSearch Mode 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ónloadLibraryEx. 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 de 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, se buscarán los directorios correspondientes 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 rutas de acceso agregadas explícitamente con la funciónAddDllDirectory o la funciónsetDllDirectory. 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.