Код (Text): CreateProcess(NULL, "3.exe", NULL, NULL, FALSE, DEBUG_PROCESS & DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &si, &pi); WaitForDebugEvent(de,INFINITE) Процесс нормально создаеться, но при этом WaitForDebugEvent не выполняеться типо неверный дискриптор. Что может быть причиной?
SPA Может быть он вылетает потому что вы передаёте не указатель ( &de ), или не заполняете (или заполняете но неверно) мемберы структуры de?
DEEP Все разобрался, мой тупой косяк был. Теперь отлаживаемое приложение пишет "ошибка инициализации" причем 2 раза, я писал не вникая или автор статьи лопух, так можно? Код (Text): switch(de.dwDebugEventCode) { case CREATE_THREAD_DEBUG_EVENT: { MessageBox(0,"DEBUG_EVENT","CREATE_THREAD_DEBUG_EVENT",0); ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_NOT_HANDLED); break; } case EXCEPTION_BREAKPOINT: { if(f) { ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE); f=0; } else ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_NOT_HANDLED); break; } default: { ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_NOT_HANDLED); break; }
??? EXCEPTION_BREAKPOINT это не dwDebugEventCode, а код конкретного исключения, которое нужно сначала отловить по dwDebugEventCode == EXCEPTION_DEBUG_EVENT и затем уже проверять код исключения в de.EXCEPTION_DEBUG_INFO
leo а все уже не надо разобрался, забыл отписаться. НУ тупо в статье кусками код приводился, думал думал забил глянул код в гуле все понятно сразу стало. Всеравно спасибо всем.
У меня опять проблемма, чесно говоря я силно опять не в чухивал, просто работа идет паралейно, но посмотрел с первого взгляда тупых косяков нет. Просто не лвиться загрузка либы. Код (Text): case EXCEPTION_DEBUG_EVENT: { // ОБАЮОТКА EXCEPTION_DEBUG_EVENT switch(de.u.Exception.ExceptionRecord.ExceptionCode) { case EXCEPTION_BREAKPOINT: { if(f) { MessageBox(0,"EXCEPTION_BREAKPOINT first","DEBUG_EVENT",0); ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE); f=0; } else ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_NOT_HANDLED); break; } case LOAD_DLL_DEBUG_EVENT: { MessageBox(0,"(LPCSTR)de.u.LoadDll.lpImageName","LOAD_DLL",0); ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_NOT_HANDLED); break; } default: { ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_EXCEPTION_NOT_HANDLED); break; } } break; // конец свича ОБАЮОТКИ EXCEPTION_DEBUG_EVENT } И еще вопрос если я добавлю флаг CREATE_SUSPENDED до ResumeThread можно мне ваще не как не обрабатывать WaitForDebugEvent?
SPA Ну ты блин даешь - то EXCEPTION_BREAKPOINT нет в тот свитч "вчухиваешь", теперь LOAD_DLL_DEBUG_EVENT в свитч по кодам исключений втюрил, УжОс !!!
leo Очень странно тк я его туда намеренно вчухал! т.е. прочитал что так надо и втюхал! Причем дока от билдера справочник по winApi.. Но спасибо конечно.
А понял!! Просто там както странно написанно, епт, неужеле обязательно было так все усложнять )) вот с этим спутал LOAD_DLL_DEBUG_INFO
SPA Не знаю какую траву ты куришь В результате WaitForDebugEvent ты получаешь код отладочного события в de.dwDebugEventCode и соответсвенно организуешь switch по этим кодам XXX_DEBUG_EVENT. Затем в case для каждого кода анализируешь соответсвующую этому коду структуру XXX_DEBUG_INFO и если нужно делаешь доп.switch, например по ExceptionCode для EXCEPTION_DEBUG_EVENT. PS: Не представляю с какого перепоя или затраха на трех работах можно перепутать совершенно разные свичи и коды EXCEPTION_XXX и XXX_DEBUG_EVENT
leo Да ладно ты, есть обьяктивные причины которые позволяют мне так косячить ) И еще надо документацию получше читать. Код (Text): case LOAD_DLL_DEBUG_EVENT: { MessageBoxW(0,(LPCWSTR)de.u.LoadDll.lpImageName,0,0); break; } Нифига не выводит ( хотя пробывал проверять флаг на юникод. Тут вроде и косяку влезть некуда.
Один не должен полагаться на LOAD_DLL_DEBUG_INFO.lpImageName в данном случае. Там либо нуль, либо какой-то адрес. В адресном пространстве отлаживаемого приложения по этому адресу лежит либо нуль, либо указатель на строку с именем. Звучит не очень-то надёжно, да? Можно определить имя файла по LOAD_DLL_DEBUG_INFO.hFile посредством ZwQueryInformationFile(..., FileNameInformation).
Sol_Ksacap 0_0 т.е. его по сути нельзя использовать? Для уверенного получения информации. Жаль. Попробую заюзать ZwQueryInformationFile.