El punto de interrupción condicional de que las pruebas de múltiples variables de la pila

StackOverflow https://stackoverflow.com/questions/6097157

Pregunta

Estoy depuración de una aplicación en un punto donde se utiliza un cuadro de diálogo para obtener información de el usuario y, a continuación, hace un poco de procesamiento de la información.Por poner un punto de ruptura en USER32!CreateDialogParamW he encontrado la dirección de su procedimiento de diálogo.

Al principio sólo quería interrumpir cuando el procedimiento recibe un mensaje WM_COMMAND, así que he usado el comando siguiente:bp 00cfa1c0 "j (dwo(esp+8) == 0x111) ";'gc'"

Esto, desafortunadamente, no es suficiente, ya que el procedimiento de diálogo, por alguna razón, recibe mensajes WM_COMMAND incluso cuando ALT-Tabulador entre WinDbg y la aplicación.Así que, ahora quiero que se rompa cuando se recibe el mensaje WM_COMMAND con un código de notificación de BN_CLICKED desde el botón ACEPTAR en el cuadro de diálogo.El IDENTIFICADOR del control del botón en el cuadro de diálogo plantilla es de 1, y BN_CLICKED se define como 0 en winuser.h.Esto significa que el WPARAM argumento de que el procedimiento de diálogo debe ser de 1 al hacer clic en el botón ACEPTAR.

He probado el comando siguiente:bp 00cfa1c0 "j (dwo(esp+8) == 0x111 && dwo(esp+12) == 0 x 1) ";'gc'".Este es un principio aceptó, pero cuando el punto de corte que se evalúa se queja:Expresión numérica falta de '& dwo(esp+12) == 0 x 1) ";'gc"

Rodea el 2 de expresiones con ()'s no son de ayuda.Tenía una mirada en el archivo de ayuda, pero la verdad es que me confunde aún más.Soy bastante nuevo en WinDbg y el inglés no es mi lengua nativa.Puede que alguien me apunte en la dirección correcta?

Gracias de antemano.

PS:Esta es una aplicación de 32 bits para la que no tengo el código fuente.

¿Fue útil?

Solución

El uso de una sola & - el valor predeterminado de la sintaxis de las expresiones es MASM. && es parte de la sintaxis de C++.

Las siguientes expresiones para usted:

(dwo(@esp+8) == 0x111 & dwo(@esp+12) == 0x1)

o

@@c++(*(int*)(@esp+8) == 0x111 && *(int*)(@esp+12) == 0x1)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top