¿Podría alguien explicarme cómo conocer la convención de llamadas de un dll sin obtener y procesar nombres de métodos? Digamos que nuestra aplicación está cargando un dll de un tercero y para manejarlo, ¿hay formas efectivas de conocer la convención de llamadas de un dll? (__stdcall, __cdecl, __fastcall)¿Cómo encontrar la convención de llamadas de un tercero dll?
Respuesta
Si el símbolo comienza con _
pero no tiene @
, entonces es __cdecl
. Si comienza con _
y tiene un @
, es __stdcall
. Si comienza con @
y tiene otro @
, es __fastcall
.
Al tratar de averiguar por qué me estaba símbolos sin resolver cuando se enlaza contra una DLL de terceros me topé con una solución de programación (más o menos).
me escribió un pequeño programa en contra de la API de Windows usando UnDecorateSymbolName
de Dbghelp.h
para decodificar el esquema mangling:
#include "Windows.h"
#include "Dbghelp.h"
#include "tchar.h"
int _tmain(int argc, _TCHAR* argv[])
{
CHAR out[512];
UnDecorateSymbolName(
// Mangled symbol
"[email protected]@[email protected]@[email protected]@XZ",
out,
// Length of symbol
46,
UNDNAME_32_BIT_DECODE);
}
hay maneras definitivamente más bonitas de hacerlo. Simplemente lo ejecuto en un depurador y miro el contenido de afuera.
También digno de mención, en contra de la respuesta de Ignacio, la diferencia entre los nombres alterados para los cdecl
métodos en el DLL y los métodos stdcall
siendo buscado era YAAAV
vs YGAAV
.
- 1. ¿Puedo deducir programáticamente la convención de llamadas utilizada por un dll de C++?
- 2. Depurar un error de convención de llamada a DLL incorrecto
- 3. Puntero de función y convención de llamadas
- 4. Convención de llamadas OCaml: ¿es este un resumen preciso?
- 5. Monitoreo de llamadas de aplicaciones a DLL
- 6. ¿Cómo encontrar una DLL dado un CLSID?
- 7. Cómo interceptar las llamadas al método dll?
- 8. Comprobar convención de llamadas del tipo de puntero a función
- 9. ¿Cómo afirmar que el puntero del método dado utiliza la convención de llamadas stdcall?
- 10. Cómo suprimir una advertencia de un tercero usando warnings.filterwarnings
- 11. Encontrar la ruta física de un dll ISAPI
- 12. ¿Cómo puedo encontrar la versión de ensamblaje del programa de llamadas?
- 13. ¿Por qué la persona que llama debe borrar la pila en la convención de llamadas cdecl?
- 14. ¿Cómo puedo encontrar llamadas a procedimientos almacenados?
- 15. ¿Qué llamadas REST PUT/POST/DELETE deben devolver por convención?
- 16. ¿Cómo funciona la convención de nomenclatura cakePHP?
- 17. ¿Cómo resuelvo la excepción .NET CF "No se puede encontrar la DLL de Invoke"?
- 18. ¿Cómo redirecciono las llamadas a ole32.dll a mi propia DLL proxy?
- 19. Esperar a que se cargue la ventana de la aplicación de un tercero
- 20. Tercero predominante JS
- 21. Encontrar un ensamblado de SQL DLL con solo la base de datos en SQL Server
- 22. Cómo forzar la convención de llamadas cdecl para las funciones declaradas en el archivo de encabezado específico
- 23. Cómo autorizar aplicaciones móviles con un tercero por oauth PERO conectar a mi servicio, no el tercero
- 24. ¿Cómo vincular un .DLL estáticamente?
- 25. PHP 5.3.2, ¿Dónde puedo encontrar php5apache2_2.dll?
- 26. Depuración de un minidump en Visual Studio, donde la pila de llamadas es nulo
- 27. Convención de llamada COM en x64
- 28. Establecer CSS para iframe desde el sitio de un tercero
- 29. Marcar como clase obsoleta de tercero
- 30. ¿Cómo agrego un proyecto de Framework to iPhone de un tercero?
Muchas gracias Ignacio Vazquez-Abrams. ¿Hay alguna otra manera efectiva de descubrirlo? ¿Hay alguna función de biblioteca para obtener la convención de llamadas? – RoboAlex
Esto, por supuesto, asume que MSVC compila el DLL, como dice el artículo vinculado en la introducción. También asume que no hay un archivo DEF utilizado. Intente encontrar la convención de llamada utilizada por USER32.DLL con este método: no funciona. – MSalters