Llamadas a funciones de DLL desde C+ASM

20/04/2004 - 16:26 por Seth | Informe spam
Hola,

Tengo un problemilla, he de hacer una librería puente para llamar a una API
sobre la que no tengo control. A priori (en tiempo de diseño) no conozco el
número de argumentos ni el nombre de la función ni nada de nada...
únicamente algunos datos como que siempre devuelve un long y los tipos
estándar que acepta como entrada. En tiempo de ejecución me van a pasar un
string que tendré que parsear y con él obtendré el nombre de función y los
argumentos.

Visto lo visto, no puedo usar el típico GetProcAddress y hacer un cast con
el prototipo por lo que supongo que voy a tener que recurrir a assembler
dentro de una librería en C/C++ (uso Visual C++) para el paso y recogida por
la pila. Lo malo es que no lo he hecho nunca y, aunque se que se puede, no
se como... tampoco se si es posible verificar el número de argumentos para
que no me hagan ningun estropicio (me imagino que esto es imposible).
¿Alguien me puede hechar una mano o algun ejemplo?


Unos datos más: las funciones exportadas por la API son con el modelo
c_decl, siempre devuelven un long y por lo que me han comentado hasta ahora,
los argumentos de todas las funciones son punteros a tipos de datos
conocidos.


Saludos y muchas gracias,
Carlos
 

Leer las respuestas

#1 Cholo Lennon
20/04/2004 - 17:16 | Informe spam
LoadLibrary/GetProcAddress lo vas a tener que usar seguro!. Es la única
forma de obtener un puntero el punto de entrada de la función. La cuestión
es que argumentos colocas en la pila y donde la función retorna un resultado
(Esto, por lo general, para tipos enteros es en el registro EAX).
Como ayuda, puedes usar algun desensamblador para ver la forma de la función
en la DLL. Te recomiendo IDA Pro, es el mejor para este tipo de casos. Con
el podrás entre otras cosas identificar que valores puestos en la pila son
parámetros y cuales son variables locales.
Si tienes más información para ayudarte, será bienvenida (por ejemplo la DLL
misma).

Saludos
Cholo Lennon
Salta, ARG

Preguntas similares