Pergunta

Eu sou a depuração de um aplicativo em um ponto onde ele usa uma caixa de diálogo para obter algumas informações do usuário e, em seguida, faz algum processamento sobre essas informações.Ao definir um ponto de interrupção na USER32!CreateDialogParamW eu encontrei o endereço do seu procedimento de diálogo.

No começo eu só queria quebrar quando o procedimento recebe uma mensagem WM_COMMAND, então eu usei o seguinte comando:bp 00cfa1c0 "j (dwo(esp+8) == 0x111) ";'gc'"

Este é, infelizmente, não o suficiente como o procedimento de diálogo, por algum motivo, recebe mensagens WM_COMMAND, mesmo quando o ALT-Tabulações entre o WinDbg e a aplicação.Então, agora eu quero que ele quebre quando ele recebe WM_COMMAND com um código de notificação de BN_CLICKED do botão OK na caixa de diálogo.O ID de controlo de botão no modelo de diálogo é 1, e BN_CLICKED é definido como 0 em winuser.h.Isso significa que o argumento de WPARAM do procedimento de diálogo deve ser 1 quando clicar no botão OK.

Eu tentei o seguinte comando:bp 00cfa1c0 "j (dwo(esp+8) == 0x111 && dwo(esp+12) == 0 x 1) ";'gc'".Inicialmente, isto é aceito, mas quando o ponto de interrupção é avaliada ele reclama:Expressão numérica falta do '& dwo(esp+12) == 0 x 1) ";"cg"

Torno a 2 expressões com ()'s não ajuda.Eu tinha uma olhada no arquivo de ajuda, mas para ser honesto, que me confunde ainda mais.Eu sou muito novo para o WinDbg e o inglês não é minha língua nativa.Alguém pode me apontar na direção certa?

Obrigado antecipadamente.

PS:Este é um aplicativo de 32 bits para o qual eu não tenho o código fonte.

Foi útil?

Solução

Usar um único & - o padrão de sintaxe para expressões é MASM. && é parte da sintaxe de C++.

As expressões a seguir iria trabalhar para você:

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

ou

@@c++(*(int*)(@esp+8) == 0x111 && *(int*)(@esp+12) == 0x1)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top