Да, вы можете сделать это.Сначала убедитесь, что у вас есть публичные символы для вашего отладчика.
SetTimer живет в user32, но это как раз то, что он экспортируется.Самый простой способ сделать это с помощью отладчика командной строки, NTSD .Нам нужно его настоящее имя, так что ищите символы в user32, которые соответствуют:
0:000> x user32!*timer*
759992b9 USER32!NtUserValidateTimerCallback = <no type information>
759977d5 USER32!NtUserSetTimer = <no type information>
759e4f13 USER32!NtUserSetSystemTimer = <no type information>
759993bf USER32!NtUserKillTimer = <no type information>
Ах-ха!Его символ отладки - NtUserSetTimer:
0:000> bp user32!NtUserSetTimer
В Visual Studio вы можете выяснить, где живет SetTimer, написав простую программу-скретч, а затем установив точку останова, щелкнув правой кнопкой мыши и выбрав «Перейти к разборке»:
int _tmain(int argc, _TCHAR* argv[]) {
SetTimer(NULL, 0, 0, NULL);
004113BE mov esi,esp
004113C0 push 0
004113C2 push 0
004113C4 push 0
004113C6 push 0
004113C8 call dword ptr [__imp__SetTimer@16 (418338h)]
Если мы перейдем к этому вызову, то попадем сюда:
_NtUserSetTimer@16:
759977D5 mov eax,123Dh
759977DA mov edx,7FFE0300h
759977DF call dword ptr [edx]
759977E1 ret 10h
Таким образом, чтобы установить точку останова в Visual Studio, вы должны использовать оператор контекста в точке останова.Выберите в меню: Отладка -> Новая точка останова -> Перерыв в функции, затем введите:
{,,user32.dll}_NtUserSetTimer@16