Условная точка останова, которая проверяет несколько переменных стека - PullRequest
3 голосов
/ 23 мая 2011

Я отлаживаю приложение в точке, где оно использует диалоговое окно для получения некоторой информации от пользователя, а затем выполняет некоторую обработку этой информации.Установив точку останова на USER32! CreateDialogParamW, я нашел адрес ее диалоговой процедуры.

Сначала я просто хотел разорвать, когда процедура получает сообщение WM_COMMAND, поэтому я использовал следующую команду: bp 00cfa1c0 "j(dwo (esp + 8) == 0x111) ''; 'gc' "

К сожалению, этого недостаточно, поскольку по какой-то причине диалоговая процедура получает сообщения WM_COMMAND даже при ALT-TABbing между WinDbg и приложением.Итак, теперь я хочу, чтобы он сломался, когда он получает WM_COMMAND с кодом уведомления BN_CLICKED от кнопки OK в диалоговом окне.Идентификатор элемента управления в шаблоне диалога равен 1, а BN_CLICKED определен как 0 в winuser.h.Это означает, что аргумент WPARAM диалоговой процедуры должен быть равен 1 при нажатии кнопки OK.

Я попробовал следующую команду: bp 00cfa1c0 "j (dwo (esp + 8) == 0x111 && dwo (esp + 12)) == 0x1) ''; 'gc' ".Первоначально это принимается, но когда оценивается точка останова, он жалуется: в '& dwo (esp + 12) == 0x1)' 'отсутствует числовое выражение;'gc' '

Окружение двух выражений с помощью () не помогло.Я посмотрел файл справки, но, честно говоря, это смущает меня еще больше.Я довольно новичок в WinDbg и английский не мой родной язык.Может кто-нибудь указать мне правильное направление?

Заранее спасибо.

PS: Это 32-разрядное приложение, для которого у меня нет исходного кода.

1 Ответ

4 голосов
/ 23 мая 2011

Используйте один & - синтаксис по умолчанию для выражений - MASM.&& является частью синтаксиса C ++.

Вам подойдут следующие выражения:

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

или

@@c++(*(int*)(@esp+8) == 0x111 && *(int*)(@esp+12) == 0x1)
...