Glad to hear.
If you find any that don't:
- test higher limits.
- step out to that frame and single step the asm, until you get to a statement after which it works.
- however, there may not be a visible change in the frame, if something fails in asm-unwind, but is resolved as fallback by RBP-unwind.
So that needs to be disabled for those tests / or monitored.
Then it can be checked if that statement could be handled by the parser.
If it is a jump (conditional or not), then there are limits.
1) the amount of branches kept for following later.
2) going back only keeps one point
3) going far forward only keeps one
The last two would be a lot of work to change.
Background:
jnz + 10
Will keep RIP+10 as potential alternative (but keep continue at the next statement).
If there is no "jmp -100" in the code, then it will joint the "+10" and the branch can be removed. So that limits complexity
ONE jump back will be stored, and it will be the one furthest back. In the hope that all other back jumps (that go a lesser amount back) will then be reachable from that furthest point. That may not always be the case, but again complexity. (Keeping track of blocks already done).
Going forward really far, is the latest addition, and solved some of the issues. Not sure if a 2nd storage slot will help much here...
------------
* I have seen
jmp [rax]
That is not handled.
Registers are sometimes know. But that knowledge is of variable quality. So following this seems too risky.
* Similar reading from memory (to get RSP / RPB / RIP and other)
- only done from stack
- only from areas of stack that weren't "pushed" to. (at least for rsp / rpb)
- for jumps done for [rip+123] because that usually is in the code section, i.e. constant data.
* On Windows there is a function in exception handling (OS kernel) that goes to the calling stack, by executing "call ...". So the subroutine somehow unrolls to the outer stack. That is impossible to follow, since stepping in isn't part of the game.
-----
The code can probably be speed up a tiny bit, by optimizing calls to "ReadData" but that is a different story.