The .if and j commands are used conditionally to execute a command or series of commands.


.if is very similar to if from C and C++:


.if (Condition) { Commands } .elsif (Condition) { Commands } .else { Commands } 


j does the same thing, but uses a very different syntax:


j Expression 'Command1' ; 'Command2' 


Generally, I prefer to use .if because I think it’s more intuitive since it looks like C/C++.




j (@ecx = 7)  '.echo Condition is TRUE' ; '.echo Condition is FALSE'


.if(@ecx = 7){.echo Condition is TRUE}






Let’s suppose we need a breakpoint that performs some action when the breakpoint is hit over 10 times.

We can do that using:


r @$t0 = 0


bp mtgdi!CBallThread::SingleStep "r @$t0 = @$t0 + 1;.if(@$t0 > 0n10){.echo More than 10 times...}.else{ gc }"




Or yet:


r @$t0 = 0


bp mtgdi!CBallThread::SingleStep " r @$t0 = @$t0 + 1; j (@$t0 > 0n10) '.echo More than ten times...'; 'gc'  "






Tip: The examples above are "old school". As Koy Kahane mentions, you can use:


bp mtgdi!CBallThread::SingleStep 10


Here you can see scripts that use j and .if.