Tengo un programa al que agrego efectos de posprocesamiento a pantalla completa. No tengo la fuente del programa (es propiedad, aunque un desarrollador me envió una copia de los símbolos de depuración, formato .map). Tengo el código para los efectos escritos y en funcionamiento, sin problemas.Evitar desbordamientos de pila en DLL contenedoras
Mi problema ahora es vincular los dos.
He intentado dos métodos hasta ahora:
utilizar desvíos para modificar la tabla de importación del programa original. Esto funciona muy bien y se garantiza que sea estable, pero los usuarios con los que he hablado no se sienten cómodos, requiere instalación (más allá de extraer un archivo), y hay algunas dudas si el parcheo del programa con Detours es válido bajo los términos del EULA. Entonces, esa opción está fuera.
La otra opción es la tradicional sustitución de DLL. Envolví OpenGL (opengl32.dll) y necesito que el programa cargue mi DLL en lugar de la copia del sistema (simplemente colóquelo en la carpeta del programa con el nombre correcto, eso es fácil).
Necesito mi DLL para cargar el marco de trabajo Cg y el tiempo de ejecución (que se basa en OpenGL) y algunas otras cosas más. Cuando carga Cg, llama a algunas de mis funciones, que llaman funciones Cg, y tiendo a obtener desbordamientos de pila e infinitos bucles. Necesito poder incluir las DLL de Cg en un subdirectorio y seguir usando sus funciones (no estoy seguro de si es posible hacer que mi DLL importe un punto de tabla a una DLL en un subdirectorio) o necesito vincularlos dinámicamente (lo cual más bien, no hacer, solo para simplificar el proceso de compilación), algo para obligarlos a consultar el archivo del sistema (no mi reemplazo personalizado).
Toda la cadena es: El programa carga DLL A (denominado opengl32.dll). DLL A carga Cg.dll y vincula dinámicamente (GetProcAddress) a sysdir/opengl32.dll. Ahora necesito Cg.dll para referirse también a sysdir/opengl32.dll, no DLL A.
¿Cómo se haría esto? Editar: ¿Cómo se haría esto fácilmente sin usar GetProcAddress? Si nada funciona, estoy dispuesto a recurrir a eso, pero prefiero no hacerlo si es posible.
Edit2: Acabo de toparme con la función SetDllDirectory en los documentos de MSDN (en una búsqueda totalmente no relacionada). A primera vista, parece lo que necesito. ¿Es correcto o estoy juzgando mal? (apagado para probarlo ahora)
Edit3: He resuelto este problema haciendo las cosas un poco diferente. En lugar de descartar un OpenGL32.dll, he cambiado el nombre de mi DLL a DInput.dll. No solo tiene la ventaja de tener que exportar una función en lugar de más de 120 (para el programa, Cg y GLEW), no tengo que preocuparme por las funciones que se ejecutan de nuevo (puedo vincularme a OpenGL como siempre) . Para entrar en las llamadas que necesito interceptar, estoy usando Detours. En general, funciona mucho mejor. Esta pregunta, sin embargo, sigue siendo un problema interesante (y con suerte será útil para cualquier otra persona que intente hacer cosas locas en el futuro). Ambas respuestas son buenas, por lo que no estoy seguro todavía de elegir ...
Para cualquier persona que se encuentre con esta pregunta en el futuro, las mejores opciones (que terminé usando más adelante) es ** no use Desvíos **. Tiene errores, especialmente en WoW64, y le faltan funciones básicas como la prevención de recursión. [EasyHook] (http://easyhook.codeplex.com/) es muy superior en funciones, estabilidad/rendimiento y manejo general. – ssube