Domanda

Sono un debug di un'applicazione in un punto in cui utilizza una finestra di dialogo per ottenere alcune informazioni dall'utente, e quindi effettua un po 'di elaborazione su tali informazioni. Impostando un punto di interruzione su User32! CreatoLogParamW Ho trovato l'indirizzo della sua procedura di dialogo.

All'inizio volevo solo rompere quando la procedura riceve un messaggio WM_Command, quindi ho usato il seguente comando: BP 00CFA1C0 "J (DWO (ESP + 8)== 0x111) ''; 'GC'" Questo sfortunatamente non è sufficiente poiché la procedura di dialogo per qualche motivo riceve messaggi WM_Command anche quando Alt-Tabbing tra Windbg e l'applicazione. Quindi, ora voglio che si rompe quando riceve WM_Command con un codice di notifica di BN_CLICKED dal pulsante OK sulla finestra di dialogo. L'ID di controllo del pulsante nel modello di dialogo è 1 e BN_CLICKED è definito come 0 in WinUser.h. Ciò significa che l'argomento WPARAM della procedura di dialogo dovrebbe essere 1 quando si fa clic sul pulsante OK.

Ho provato il seguente comando: BP 00CFA1C0 "J (DWO (ESP + 8)== 0x111 && DWO (ESP + 12)== 0x1) ''; 'GC'". Questo è inizialmente accettato, ma quando il punto di interruzione viene valutato si lamenta: espressione numerica mancante da '& dwo (ESP + 12)== 0x1)' '; 'GC' '

che circondano le 2 espressioni con () non ha aiutato. Ho dato un'occhiata al file dell'aiuto, ma ad essere onesto che mi confonde ancora di più. Sono abbastanza nuovo a Windbg e l'inglese non è la mia lingua madre. Qualcuno può indicarmi nella giusta direzione?

Grazie in anticipo.

PS: questa è un'applicazione a 32 bit per cui non ho il codice sorgente.

È stato utile?

Soluzione

Utilizzare un singolo &: la sintassi predefinita per le espressioni è MASM.&& è parte della sintassi C ++.

Le seguenti espressioni funzionerebbero per te:

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

o

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top