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

Preguntas similare

Leer las respuestas

#6 Seth
21/04/2004 - 10:53 | Informe spam
Ok, eso es realmente sencillo, entonces ¿lo que C pone en la pila cuando se
llama a una función de argumentos variables es directamente los parámetros
que se le pasan? o se trata de una estructura de datos? he estado revisando
el K&R pero no lo especifica claramente.

En cualquier caso, ya a nivel de curiosidad, sí que me interesaría saber
como pasar datos entre variables de C y ASM.

Gracias de nuevo,
Carlos
Respuesta Responder a este mensaje
#7 Cholo Lennon
21/04/2004 - 17:41 | Informe spam
Si no sabes asm, entre otras cosas, lo que puedes hacer para aprender es
mirar el código generado por VC++ para construcciones típicas. Para ello,
puedes optar por un desensamblador externo o usar el que trae VC++. Para
este último caso pon un punto de ruptura donde desees ver el código en asm y
ejecuta el programa. Una vez detenido en el lugar, activa la ventana de
desensamblado (menú View/Debug Windows/Disassembly).

Por ejemplo, para el caso en que deseas ver como se pasan parámetros por
valor y referencia en funciones C y suponiendo que estas compilando como
C++:

extern "C" {
void Valor(int p1)
{
// ...
}

void Referencia(int* pResultado)
{
}
}

int main(int, char**)
{
int var = 10;

Valor(var);

Referencia(&var);

return 0;
}

El código que puedes ver con el desensamblador de VC++ es el siguiente:

29: int var = 10;
004010D8 mov dword ptr [ebp-4],0Ah ; asigna 10 a la variable var
30:
31: Valor(var);
004010DF mov eax,dword ptr [ebp-4] ; mueve var a un registro
004010E2 push eax ; coloca el
parametro en la pila
004010E3 call @ILT+0(_Valor) (00401005) ; llama a la función Valor
004010E8 add esp,4 ; reajusta la pila
32:
33: Referencia(&var);
004010EB lea ecx,[ebp-4] ; carga la dirección de la variable en
ecx
004010EE push ecx ; coloca la dirección como
parámetro
004010EF call @ILT+5(_Referencia) (0040100a) ; llama a la función
Referencia
004010F4 add esp,4 ; reajusta la pila


De igual manera puedes experimentar con variables más complejas como de tipo
estructura.


Saludos
Cholo Lennon
Salta, ARG
Respuesta Responder a este mensaje
#8 Seth
23/04/2004 - 10:09 | Informe spam
Gracias por la respuesta,
Carlos
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida