Форум: "WinAPI";
Текущий архив: 2004.03.09;
Скачать: [xml.tar.bz2];
ВнизDebug API в XP Найти похожие ветки
← →
Igit (2004-01-03 22:08) [0]В 98 все работает, а в XP никак(вернее выполняет только первый шаг и все)
var sti:tstartupinfo;
lpPi:tprocessinformation;
DE:_Debug_event;
Cont:_Context;
begin
if not OpenDialog1.Execute then exit;
label1.Caption := "Please wait ~10 min...";
// обнуляем структуру lpPi
with lpPi do
begin
hProcess:=0;
hThread:=0;
dwProcessId:=0;
dwThreadId:=0;
end;
// обнуляем структуру sti
with sti do
begin
cb:=0;
lpReserved:=0;
lpDesktop:=0;
lpTitle:=0;
dwX:=0;
dwY:=0;
dwXSize:=0;
dwYSize:=0;
dwXCountChars:=0;
dwYCountChars:=0;
dwFillAttribute:=0;
dwFlags:=0;
wShowWindow:=0;
cbReserved2:=0;
lpReserved2:=0;
hStdInput:=0;
hStdOutput:=0;
hStdError:=0;
end;
CreateProcess(nil,PChar(OpenDialog1.FileName;),nil,nil,false,DEBUG_PROCESS
or DEBUG_ONLY_THIS_PROCESS,nil,nil,StI,lpPI);
//Создается процесс с параметрами DEBUG_PROCESS и DEBUG_ONLY_THIS_PROCESS.
//DEBUG_ONLY_THIS_PROCESS - нужно для того чтобы перехватывать сообщения
//только от процесса, который создадим, а не все подряд. После этого
//создастся процесс который будет отсылать дебаговые сообщения.
While true do
//Делаем бесконечный цикл с WaitForDebugEvent, чтобы отлавливать дебаговые
//сообщения которые будет отсылать процесс.
Begin
WaitForDebugEvent(de,INFINITE);
application.ProcessMessages;
//В этом цикле нам нужно будет обработать событие EXCEPTION_DEBUG_EVENT.
if de.dwDebugEventCode=EXCEPTION_DEBUG_EVENT then
//Для этого события нам нужно будет обрабатывать 2 Exception кода:
//EXCEPTION_BREAKPOINT Код остановки
if DE.Exception.ExceptionRecord.ExceptionCode=EXCEPTION_BREAKPOINT
then
Begin
cont.ContextFlags:=CONTEXT_CONTROL;
//Получить данные о состоянии регистров выполняемого
//процесса можно через GetThreadContext, а установить
//их через SetThreadContext. GetThreadContext возвращает
//структуру _CONTEXT которая содержит данные о всех
//регистрах(в ключая EIP) и флагах выполняемого процесса.
//Но перед тем как читать данные о регистрах в эту структуру,
//нужно задать свойство ContextFlags=CONTEXT_CONTROL.
//Иначе будут возвращатся тока ноли.
GetThreadContext(lppi.hThread,cont);
//При обработке кодов EXCEPTION_BREAKPOINT и EXCEPTION_SINGLE_STEP
//нужно постоянно включать флаг трассировки через свойство
//EFlags структуры _CONTEXT (cont.EFlags:=cont.EFlags or $100;)
cont.EFlags:=cont.EFlags or $100;
setThreadContext(lppi.hThread,cont);
ContinueDebugEvent(lppi.dwProcessId, lppi.dwThreadid,DBG_CONTINUE);
end
Else
//и EXCEPTION_SINGLE_STEP код одиночного шага(выполнение одной команды).
if DE.Exception.ExceptionRecord.ExceptionCode=EXCEPTION_SINGLE_STEP
//Ну и наконец в обработке EXCEPTION_SINGLE_STEP я читаю текущий eip
//процесса, чтобы найти EP. Так как в реале, процесс начинает
//выполнятся не с Entry point а с загрузки всяких DLL и т.д.
then
Begin
//Получить данные о состоянии регистров выполняемого
//процесса можно через GetThreadContext, а установить
//их через SetThreadContext. GetThreadContext возвращает
//структуру _CONTEXT которая содержит данные о всех
//регистрах(в ключая EIP) и флагах выполняемого процесса.
//Но перед тем как читать данные о регистрах в эту структуру,
//нужно задать свойство ContextFlags=CONTEXT_CONTROL.
//Иначе будут возвращатся тока ноли.
GetThreadContext(lppi.hThread,cont);
//При обработке кодов EXCEPTION_BREAKPOINT и EXCEPTION_SINGLE_STEP
//нужно постоянно включать флаг трассировки через свойство
//EFlags структуры _CONTEXT (cont.EFlags:=cont.EFlags or $100;)
cont.EFlags:=cont.EFlags or $100;
cont.ContextFlags := CONTEXT_CONTROL or CONTEXT_INTEGER;
setThreadContext(lppi.hThread,cont);
label1.Caption := inttohex(cont.eip, 8);
if (cont.eip=$4177DE) then
halt;
ContinueDebugEvent(lppi.dwProcessId, lppi.dwThreadid,DBG_CONTINUE);
end;
//После обработки каждого сообщения нужно разрешить программе выполняться
//дальше. Делается это через ContinueDebugEvent.
ContinueDebugEvent(lppi.dwProcessId, lppi.dwThreadid,DBG_CONTINUE);
end;
end;
← →
Igit (2004-01-04 11:35) [1]Задам вопрос более корректно. В WinXP EXCEPTION_SINGLE_STEP только один раз, все остальное работает нормально (создание, уничтожение потоков и т.п.)
Постоянно срабатывает STATUS_ACCESS_VIOLATION
(кстати отладчик Olly Debugger в XP при автоматической трассировке тоже самое ничего не может, а в 9x все пучком)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.03.09;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c