Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
7-25957
Japan
2003-12-13 16:03
2004.03.09
При сохранении файла притормаживает


4-25961
Крутыш
2004-01-02 22:33
2004.03.09
Как вызвать системное меню формы???


7-25949
maxXP
2003-12-19 18:21
2004.03.09
Как сделать, чтобы прои нажатии на файл с нужным расширением


11-25727
savva
2003-06-20 14:56
2004.03.09
что неверно с TreeView.TVExpand


1-25744
uUnknown
2004-02-26 19:21
2004.03.09
Чем может быть чреват следующий код?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский