# AMD LoadLibrary falló con el error 87 después de cambiar de NVIDIA

**Idiomas:** [English](../README.md) · Español

Esta guía documenta un fallo confirmado de instalación de controladores en Windows: un co-instalador huérfano de la clase de pantalla de NVIDIA impidió que se registraran los componentes de software de AMD. El controlador base de pantalla de AMD parecía instalarse correctamente, pero OpenGL y Vulkan quedaban inutilizables.

El error exacto de la aplicación era:

```text
LoadLibrary failed with error 87: El parámetro no es correcto.
```

Búsquedas y síntomas relacionados incluyen **error 87 de OpenGL ChoosePixelFormat en AMD**, **Vulkan no encontró controladores AMD**, **falta OpenGLVendorName**, **falta la DLL nvdispco después de desinstalar NVIDIA** y **AMD regamdcomp.exe no registró OpenGL ni Vulkan**.

> [!CAUTION]
> No elimines un co-instalador de la clase de pantalla de NVIDIA en un sistema que todavía tenga un adaptador de pantalla NVIDIA presente. El script de reparación de este repositorio se niega a continuar en esa configuración. Creá siempre copias de seguridad del registro antes de modificar el registro de controladores.

## Respuesta breve

En el caso confirmado, Windows conservó esta entrada del co-instalador de la clase de pantalla después de que la GPU NVIDIA y su archivo de controlador ya no estuvieran:

```text
HKLM\SYSTEM\CurrentControlSet\Control\CoDeviceInstallers
  {4D36E968-E325-11CE-BFC1-08002BE10318}
    nvdispco6445671.dll,NvDspFixCoInstall
```

El archivo referenciado, `%SystemRoot%\System32\nvdispco6445671.dll`, ya no existía. Una instalación posterior de AMD intentó cargarlo, registró el error Win32 126 (`ERROR_MOD_NOT_FOUND`) y luego no pudo crear los dispositivos de componentes de software de OpenGL, Vulkan, OpenCL y soporte de Windows de AMD. Como esos componentes nunca coincidieron con un dispositivo, no se ejecutó el registro final mediante `regamdcomp.exe`. Los archivos de AMD estaban presentes en DriverStore, pero faltaban sus enlaces de registro para OpenGL y Vulkan.

Restaurar los registros de OpenGL y Vulkan de AMD corrigió el error inmediato. Eliminar únicamente el co-instalador huérfano exacto de NVIDIA corrigió la condición raíz confirmada que podía volver a romper futuras instalaciones de AMD.

Esta es una causa del error 87 respaldada por evidencias, no una explicación universal para todos los casos.

## A quién se aplica esta guía

Usá esta guía cuando se cumplan todas o la mayoría de estas condiciones:

- Una PC con Windows cambió de una GPU NVIDIA a una GPU AMD.
- El controlador de pantalla AMD se instala, pero las aplicaciones OpenGL fallan al iniciar con el error 87.
- `vulkaninfo --summary` informa que no encontró controladores.
- Los archivos de OpenGL y Vulkan de AMD existen, pero faltan sus registros en el sistema.
- SetupAPI registra un intento fallido de cargar un `nvdispco...dll` inexistente desde `%SystemRoot%\System32`.
- La máquina ya no tiene un adaptador de pantalla NVIDIA presente.

Esta guía no diagnostica pantallas negras de la GPU, eventos de detección y recuperación por tiempo de espera, overclocks inestables, fallos de alimentación, cierres específicos de un juego ni una versión de controlador que sea defectuosa de manera independiente.

## Mapa de diagnóstico rápido

| Síntoma o evidencia | Qué sugiere | Cómo confirmarlo |
| --- | --- | --- |
| `LoadLibrary failed with error 87` durante el inicio de OpenGL | Windows no puede completar la carga del ICD de OpenGL de AMD | Comprobar `OpenGLVendorName` y crear un contexto WGL nuevo |
| `vulkaninfo` dice que no encontró controladores | No hay un ICD Vulkan de AMD utilizable registrado | Comprobar ambas ramas `Drivers` de Vulkan de Khronos |
| Faltan `OpenGLVendorName` y `OpenGLVendorNameWow` | El componente OpenGL de AMD no completó su registro | Inspeccionar la clave activa de la clase de pantalla AMD |
| Falta la DLL del co-instalador NVIDIA pero se conserva la entrada de clase | Un co-instalador global obsoleto puede interferir con instalaciones posteriores | Inspeccionar `CoDeviceInstallers` y SetupAPI |
| Los INF de componentes AMD informan que no hay dispositivos coincidentes | No se crearon los dispositivos virtuales de componentes de software AMD | Correlacionar las directivas `AddComponent` del INF de pantalla con SetupAPI |
| Los archivos AMD existen en DriverStore pero las API fallan | La copia terminó, pero no el registro final | Buscar la etapa de registro faltante de `regamdcomp.exe` |

## Cadena de evidencias

La distinción importante está entre una instalación exitosa del controlador base de pantalla y la instalación exitosa de todos sus componentes relacionados.

1. El INF de pantalla AMD contiene directivas `AddComponent` para los componentes OpenGL, Vulkan, OpenCL y de soporte de Windows de AMD.
2. Windows invoca los co-instaladores de la clase de pantalla mientras procesa la instalación del dispositivo.
3. El valor global de la clase de pantalla todavía menciona `nvdispco6445671.dll,NvDspFixCoInstall`.
4. Windows intenta cargar la ruta absoluta bajo `%SystemRoot%\System32`, pero la DLL no existe. SetupAPI registra el error 126.
5. El controlador base AMD igualmente llega a un estado exitoso, mientras que los INF de componentes informan que no encuentran dispositivos de componentes de software coincidentes.
6. Los nodos de dispositivo esperados para los componentes de software AMD están ausentes.
7. El comando de registro del componente no se ejecuta; por eso faltan `OpenGLVendorName`, `OpenGLVendorNameWow` y los valores ICD de Vulkan aunque los archivos se hayan copiado.
8. OpenGL muestra el error 87 cuando `ChoosePixelFormat` activa la carga del ICD; Vulkan informa que no hay controladores porque no tiene un manifiesto registrado utilizable.

Un patrón mínimo de log reconstruido se ve así:

```text
Display-class co-installer: %SystemRoot%\System32\nvdispco6445671.dll
Load failed: ERROR_MOD_NOT_FOUND (126)
AMD software-component INF: Unable to find any matching devices
Base display device installation: completed
```

El ejemplo está reconstruido y anonimizado de manera intencional. No publiques logs crudos de SetupAPI: pueden contener identificadores de instancias de dispositivos y otros datos específicos de la máquina.

## Por qué importan los componentes AMD

Los controladores organizados en componentes de Windows pueden crear componentes de software secundarios mediante una directiva INF `AddComponent`. Cada componente secundario se vincula después con su propio INF y sección de instalación. Microsoft documenta este flujo en [INF AddComponent Directive](https://learn.microsoft.com/en-us/windows-hardware/drivers/install/inf-addcomponent-directive) y [Using a Component INF File](https://learn.microsoft.com/en-us/windows-hardware/drivers/install/using-a-component-inf-file).

Los co-instaladores son callbacks separados en DLL registrados para la configuración de dispositivos. Microsoft actualmente recomienda métodos modernos basados en paquetes en lugar de co-instaladores, pero Windows todavía procesa los co-instaladores registrados para las instalaciones aplicables. Consultá [INF DDInstall.CoInstallers Section](https://learn.microsoft.com/en-us/windows-hardware/drivers/install/inf-ddinstall-coinstallers-section).

En este fallo, no alcanzaba con que los archivos existieran. La ausencia de los nodos de dispositivos de componentes de software impedía que la etapa de registro de AMD conectara esos archivos con los cargadores de OpenGL y Vulkan.

## Diagnóstico de solo lectura

Descargá o cloná este repositorio, abrí Windows PowerShell y ejecutá el [script de diagnóstico de solo lectura](../scripts/diagnose-amd-registration.ps1):

```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\scripts\diagnose-amd-registration.ps1
```

El script informa únicamente booleanos y rutas genéricas del sistema. No imprime nombres de paquetes de DriverStore, identificadores de instancias de hardware ni rutas de usuarios.

Códigos de salida:

| Código | Significado |
| ---: | --- |
| `0` | El registro de OpenGL/Vulkan de AMD está sano y el co-instalador obsoleto exacto está ausente |
| `2` | Se detectó un registro roto u obsoleto que puede repararse |
| `3` | El estado de los adaptadores no es compatible o no es seguro para una reparación automática |

El diagnóstico no realiza ninguna escritura en el registro.

## Reparación automatizada con protecciones

Revisá el [script de reparación](../scripts/repair-amd-registration.ps1) antes de ejecutarlo. Empezá por el modo de vista previa:

```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\scripts\repair-amd-registration.ps1
```

Si pasan todas las comprobaciones de seguridad, ejecutalo desde una sesión elevada de Windows PowerShell:

```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\scripts\repair-amd-registration.ps1 -Apply
```

El script:

- exige un adaptador de pantalla AMD presente y una clave activa de la clase de pantalla AMD;
- se niega a continuar cuando detecta un adaptador de pantalla NVIDIA presente;
- elimina únicamente la entrada exacta `nvdispco6445671.dll,NvDspFixCoInstall`, y sólo cuando su DLL está ausente;
- conserva todas las demás entradas de co-instaladores de la clase;
- resuelve dinámicamente las bibliotecas OpenGL de AMD instaladas y un par completo y actual de manifiestos Vulkan;
- exporta el co-instalador, la clase de pantalla AMD y ambas ramas del registro de Vulkan antes de modificar nada;
- guarda las copias bajo `C:\tmp\amd-registration-backup-<timestamp>`;
- asegura los registros AMD de OpenGL y Vulkan de 64 y 32 bits;
- solicita un escaneo no destructivo de Plug and Play; y
- ejecuta comprobaciones posteriores del registro.

No desinstala, elimina por la fuerza, baja de versión ni reinstala ningún paquete de controlador de pantalla.

## Qué modifica la reparación

El valor exacto del co-instalador de la clase se elimina cuando contiene sólo la entrada huérfana de NVIDIA, o se vuelve a escribir como `REG_MULTI_SZ` conservando todas las entradas que no coincidan.

En la clave activa de la clase de pantalla AMD, el script asegura:

```text
OpenGLVendorName     -> biblioteca OpenGL AMD de 64 bits instalada
OpenGLVendorNameWow  -> biblioteca OpenGL AMD de 32 bits instalada
```

También asegura un valor de manifiesto AMD habilitado (`DWORD 0`) bajo ambas ramas del cargador:

```text
HKLM\SOFTWARE\Khronos\Vulkan\Drivers
HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\Drivers
```

El script descubre dinámicamente la subclave de pantalla y el paquete de DriverStore reales. No copies el número de una subclave `0000` ni el directorio de un paquete DriverStore desde otra PC.

## Referencia de reparación manual

Para diagnóstico avanzado, el orden seguro es:

1. Confirmar que el adaptador AMD está presente y no hay un adaptador NVIDIA presente.
2. Exportar la clave completa `CoDeviceInstallers`, la clave activa de la clase de pantalla AMD y ambas claves `Drivers` de Vulkan.
3. Confirmar que la lista de co-instaladores contiene una coincidencia exacta con `nvdispco6445671.dll,NvDspFixCoInstall`.
4. Confirmar que `%SystemRoot%\System32\nvdispco6445671.dll` está ausente.
5. Eliminar sólo esa entrada de la lista y conservar todas las demás.
6. Resolver las bibliotecas OpenGL de AMD instaladas y los manifiestos Vulkan emparejados actuales de esa máquina.
7. Restaurar los registros de ambas arquitecturas para OpenGL y Vulkan.
8. Volver a escanear los dispositivos y verificar ambas API.

El script automatizado codifica estas comprobaciones y es más seguro que copiar comandos de registro con rutas específicas de otra máquina.

## Reversión

Cada reparación aplicada imprime su directorio de respaldo. Validá una copia con el [script de reversión](../scripts/rollback-amd-registration.ps1) en modo de vista previa:

```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\scripts\rollback-amd-registration.ps1 -BackupDirectory 'C:\tmp\amd-registration-backup-<timestamp>'
```

Sólo si realmente necesitás revertir, ejecutá el mismo comando con permisos elevados y `-Apply`:

```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\scripts\rollback-amd-registration.ps1 -BackupDirectory 'C:\tmp\amd-registration-backup-<timestamp>' -Apply
```

La reversión valida el directorio, el manifiesto, los nombres de archivos, la clave de la clase de pantalla y las rutas de los manifiestos AMD antes de importar nada.

## Verificación

Después de la reparación:

1. Ejecutá otra vez el script de diagnóstico. Debe salir con código `0`.
2. Creá un contexto OpenGL nuevo y confirmá que el proveedor y el renderizador sean AMD, no el renderizador por software de Microsoft.
3. Ejecutá `vulkaninfo --summary` y confirmá que salga con código `0` y muestre un dispositivo físico AMD.
4. Reiniciá una vez y repetí las comprobaciones antes de considerar que la reparación es duradera.
5. En una actualización posterior del controlador AMD, revisá SetupAPI para confirmar que la DLL antigua de NVIDIA ya no se invoca.

El último punto es la confirmación integral más fuerte de que la instalación futura de componentes ya no recorre la ruta rota. Eliminar la entrada obsoleta verificada corrige la condición raíz, pero este repositorio no afirma que un instalador futuro del proveedor ya haya sido probado en todas las máquinas.

## Por qué las herramientas de limpieza pueden no ser suficientes

DDU y AMD Cleanup Utility son útiles para eliminar paquetes del proveedor y residuos específicos de dispositivos. Este caso involucraba un valor global de co-instalador de la clase de pantalla bajo `CoDeviceInstallers`. Una limpieza puede eliminar la DLL o el paquete y dejar ese registro compartido de clase. Eso crea el estado especialmente confuso en el que el archivo del proveedor anterior ya no existe, pero Windows continúa intentando llamarlo durante la instalación de otro proveedor.

La prueba decisiva no es si todavía existe una carpeta NVIDIA. Es si permanece el valor exacto del co-instalador de la clase y si SetupAPI intenta cargar su DLL ausente.

## Otras causas del error 87

No apliques esta reparación sólo porque aparezca el número `87`. Otras causas incluyen:

- una aplicación que pasa un parámetro inválido a otra API de Windows;
- binarios gráficos dañados o incompatibles;
- una ruta incorrecta del cargador de 32 o 64 bits;
- overlays de terceros o DLL inyectadas;
- archivos del sistema corruptos;
- un controlador instalado parcialmente por motivos ajenos a un co-instalador; o
- inestabilidad de hardware antes de completar la inicialización de la API.

Si la entrada obsoleta exacta de NVIDIA está ausente, SetupAPI no muestra la DLL faltante y el registro AMD está sano, la causa raíz confirmada en esta guía no coincide con esa máquina.

## Preguntas frecuentes

### ¿El error 87 siempre se debe a un co-instalador antiguo de NVIDIA?

No. El error 87 es un error general de Windows. Esta guía se aplica únicamente cuando coinciden las evidencias del registro, la DLL ausente, SetupAPI, los dispositivos de componentes y el registro AMD.

### ¿Puedo ejecutar la reparación en un sistema mixto AMD y NVIDIA?

No. La reparación automatizada se niega intencionalmente cuando detecta un adaptador de pantalla NVIDIA presente. Una instalación legítima de NVIDIA todavía puede necesitar su co-instalador.

### ¿Por qué el instalador de AMD informó que terminó correctamente?

El dispositivo base de pantalla y sus componentes de software relacionados son trabajos de instalación separados. El controlador base puede finalizar mientras falla la coincidencia de componentes secundarios o el registro final de las API.

### ¿Por qué las DLL y los JSON de AMD ya estaban en el disco?

La preparación en DriverStore y la copia de archivos pueden completarse antes de crear los dispositivos de componentes y ejecutar el registro final. La presencia de archivos en el disco no demuestra que existan los valores del cargador de OpenGL o Vulkan en el registro.

### ¿La solución es cambiar PATH, TEMP u otra variable de entorno?

No en este caso confirmado. SetupAPI intentó una ruta DLL explícita bajo `%SystemRoot%\System32`. El co-instalador global de clase ausente y el registro AMD omitido explicaban el fallo sin un error de variables de entorno.

### ¿Primero debería reinstalar o bajar de versión el controlador AMD?

No automáticamente. Repetir el instalador mientras permanece el co-instalador obsoleto puede repetir la misma ruta rota de componentes. Diagnosticá y respaldá primero la condición raíz. Las regresiones de una versión de controlador son otra rama de diagnóstico.

## Referencias

- Microsoft Learn: [INF AddComponent Directive](https://learn.microsoft.com/en-us/windows-hardware/drivers/install/inf-addcomponent-directive)
- Microsoft Learn: [Using a Component INF File](https://learn.microsoft.com/en-us/windows-hardware/drivers/install/using-a-component-inf-file)
- Microsoft Learn: [INF DDInstall.CoInstallers Section](https://learn.microsoft.com/en-us/windows-hardware/drivers/install/inf-ddinstall-coinstallers-section)

## Licencia y contribuciones

La guía y los scripts se publican bajo la [Licencia MIT](../LICENSE). Los reportes son bienvenidos, pero eliminá nombres de usuario, identificadores de instancias de dispositivos, hashes de DriverStore, logs crudos y otros identificadores específicos de la máquina antes de abrir un issue.
