2009-08-21 22 views
8

estoy depurar una aplicación C++ Win32 y me gustaría llamar a una API de Win32 arbitraria del contexto de ese proceso, como si el programa se ejecute esta línea de código:¿Puedo invocar una API de Win32 desde la ventana Inmediato de Visual Studio?

DestroyWindow(0x00021c0e); 

Pero entrar en ese la ventana Inmediato da:

CXX0017: Error: symbol "DestroyWindow" not found 

Editar: Usando el nombre completo de la función, {,,user32.dll}[email protected], puedo conseguir la ventana Inmediato para comprender qué función que quiero decir y mostrar la dirección de la función:

{,,user32.dll}[email protected] 
0x76600454 [email protected] 

pero cuando intento llamarlo, esto sucede:

{,,user32.dll}[email protected](0x00021c0e); 
CXX0004: Error: syntax error 

¿Es posible llamar a una función C de la ventana Inmediato como este, o estoy ladrando al árbol equivocado?

Respuesta

4

Una vez que tenga la dirección de la función (como se ha hecho en la pregunta actualizada), puede intentar lanzarlo a un puntero de función y decir que es:

(*(BOOL (*)(HWND))0x76600454)((HWND)0x00021c0e) 

La primera parte de la dirección que proyecta a BOOL (*)(HWND), que es un puntero a una función que toma un parámetro HWND y devuelve BOOL. Luego, el puntero a la función se desreferencia y se llama. Asegúrese de corregir los parámetros, de lo contrario, sucederán cosas malas. En los sistemas de 64 bits, y HWND pueden ser 64 bits, por lo que es posible que no pueda salirse con la suya pasando el parámetro como int.

Editar: Ver los comentarios para la historia completa.

+1

Gracias por la idea, pero ... Eso me da 'CXX0004: Error: error de sintaxis'. Reemplazar los tipos de Windows ('BOOL' y' HWND') con tipos primitivos ('int' en ambos casos) mejora las cosas, pero luego obtengo' CXX0014: Error: missing operand'. (Estoy en un proceso de 32 bits, por cierto.) – RichieHindle

+1

El depurador VS es realmente malo en los tipos de punteros de función de análisis, aparentemente. Intenta crear un typedef para ello. Coloque 'typedef BOOL (* DESTROYWINDOW) (HWND);' en su código, luego escriba '(* (DESTROYWINDOW) 0x76600454) ((void *) 0x00021c0e)' en el depurador. –

+0

@ Adam: ¡Sí! (pero calificado) Al agregar su 'typedef' a mi código, * y * en realidad usando' typedef' en el código para que el compilador no descarte la definición, * y * interrumpa la ejecución del proceso dentro de la unidad de compilación donde utilicé el 'typedef', ahora puedo llamar a DestroyWindow desde la ventana inmediata. ¡Gracias! Es una pena tener que pasar por estos aros para hacerlo, pero al menos es posible. – RichieHindle

2

Creo que el problema es que C++ EE tiene problemas para resolver el contexto de DestroyWindow. Pruebe lo siguiente

{,,user32}DestroyWindow(0x00021c0e); 

No estoy seguro de si la sintaxis de invocación de método es compatible con este tipo de calificación (sólo lo utilizaron para la fundición en el pasado). Pero vale la pena intentarlo.

EDIT ¡Puede o no necesitar agregar un! después del cierre}. Ha pasado un tiempo desde que utilicé esta sintaxis y con frecuencia la confundo con la del viento equivalente.

+0

Gracias por la sugerencia, pero ya lo he intentado y no funciona. Y he intentado decorarlo como '_DestroyWindow @ 4', etc., hasta llegar al totalmente calificado' {,, user32.dll} _DestroyWindow @ 4', sin alegría. – RichieHindle

+0

@RichieHindle, disapointing :( – JaredPar

+0

@JaredPar: +1 para ayudar a mejorar la situación - vea mi pregunta editada. Ahora puedo entender qué función quiero decir, pero todavía no puedo hacer que la llame. – RichieHindle

1

Descubrí una solución alternativa, pero preferiría que la ventana Inmediato funcione.

La solución es:

  • obtener la dirección de la función, como se muestra en la cuestión
  • utilizar la ventana de desmontaje para ir a esa dirección, y poner un punto de interrupción no
  • hacer algo para la aplicación para que sea llamada DestroyWindow
  • paso atrás hasta la pila de llamadas a la persona que llama de DestroyWindow, que se ve así:

    6D096A9D empuje ECx
    6D096A9E llamada DWORD PTR DS: [6D0BB4B8h]

  • poner un punto de interrupción en la instrucción push ecx, y claro el de DestroyWindow

  • afectadas siguen, y otra vez hacer algo para la aplicación de hacen llamar a ese código
  • nota bajo el valor del ecx
  • el cambio del valor de ecx en el depurador al valor deseado y pasar por encima de la push/call
  • restaurar el valor de ecx y utilizar Establecer instrucción siguiente para volver a la push, y luego continuar

Se prolijo, pero funciona. Supone que puede hacer que la aplicación llame a la API adecuada a voluntad.

Cuestiones relacionadas