Error de Punto de Entrada: El cargador de DLL no falla por ausencia de símbolo sino por colisión de conjuntos de instrucciones
El error «no se encuentra el punto de entrada del procedimiento» no indica que la función esté ausente del binario, sino que el nombre decorado que busca el loader no coincide con el nombre exportado, expresado como discrepancia de mangling. Su valor se deriva de la tabla de exportaciones parseada por LdrpResolveProcedureAddress, no de la presencia real de código ejecutable en .text.
El comportamiento no documentado en Windows 10/11 22H2 es que el caché de manifiestos SxS corrompe la resolución cuando coexisten versiones 32-bit y 64-bit de una misma DLL con idéntico VersionInfo. La métrica se invierte al superar 512 entradas en el Activation Context porque CSRSS reutiliza handles de sección sin revalidar MachineType del PE. El umbral exacto de corrupción es 513 entradas acumuladas en %windir%\WinSxS\ManifestCache.
Para verificar esto, ejecuta dumpbin /exports ruta\dll.dll y anota el nombre exacto exportado. Compara con el nombre que espera el importador usando dumpbin /imports ruta\exe.exe. El resultado correcto es coincidencia literal byte a byte incluyendo sufijos como @4 o __stdcall. Si obtienes nombres con prefijo _ en uno pero no en otro, el diagnóstico es mismatch de calling convention entre módulos compilados con distintos compiladores.
En entornos de despliegue masivo con AppLocker y más de 200 estaciones, aplicando esto sobre DLLs legacy de Visual C++ 6.0 mezcladas con componentes .NET Core 6, el efecto secundario que nadie documenta es que Windows PE Loader ignora silenciosamente exports por ordinal si el Name Pointer RVA está fragmentado entre dos páginas no residentes. La mitigación más efectiva es forzar la carga con vinculación implícita delay-load y hookear __pfnDliFailureHook para reintentar LoadLibraryEx con LOAD_LIBRARY_SEARCH_SYSTEM32 como flag de aislamiento.