Страница: 1 |
Страница: 1 |
Вопрос: CreateProcess & параметры
Добавлено: 05.11.05 09:18
Автор вопроса: BUG(O)R | Web-сайт:
Работаю с технологией DebugAPI, создаю процесс с параметрами DEBUG_PROCESS, и вроде бы всё ничего, процесс создаётся, о чём свидетельствует событие CREATE_PROCESS_DEBUG_EVENT, но не запускается!!! Если убрать параметр DEBUG_PROCESS всё отлично работает... Может я указал недостаточно параметров?
Вот пример:
MsgBox "Процесс не может быть запущен!", vbCritical
Exit Sub
End If
Call WaitForDebugEvent(DBEvent, -1)
Select Case DBEvent.dwDebugEventCode
Case EXCEPTION_DEBUG_EVENT
Case CREATE_THREAD_DEBUG_EVENT
Case CREATE_PROCESS_DEBUG_EVENT
MsgBox "Процесс создан!"
Case EXCEPTION_DEBUG_EVENT
MsgBox "int3"
If DBEvent.u.Exception.ExceptionRecord.ExceptionCode = STATUS_BREAKPOINT Then
Call ContinueDebugEvent(DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINUE)
End If
Case EXIT_PROCESS_DEBUG_EVENT
MsgBox "End"
End Select
Пишу тоже самое на ассемблере и всё работает безотказно!
Может я что-то в структурах напутал?
Ответы
Всего ответов: 8
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 05.11.05 11:46
Что-то мне подсказывает, что NULL и указатель на символ \0x00 - разные вещи. Попробуй объявить первый аргумент CreateProcess как ByVal pAppName as Long и передать 0&
Номер ответа: 2
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #2
Добавлено: 05.11.05 18:46
C этой проблемой разобрался, вопрос теперь в другом!
Нужен ВЕЧНЫЙ цикл, в котором и будут ожидаться и обрабатываться события, при этом программа не должна говорить "не отвечает", структура цикла такова, что DoEvents не помогает, процесс создаваемый CreateProcess работает, а сама программа виснетв хлам, хоть ты там десять DoEvents впиши. Опять же на ассемблере такой код работает нормально
Номер ответа: 3
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #3
Добавлено: 05.11.05 19:55
Какие события?
Номер ответа: 4
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #4
Добавлено: 05.11.05 20:52
Do While True
DoEvents
'ждём отладочного события
Call WaitForDebugEvent(DBEvent, -1)
'Дождались? Обрабатываем его!
Select Case DBEvent.dwDebugEventCode
Case CREATE_THREAD_DEBUG_EVENT
Case CREATE_PROCESS_DEBUG_EVENT
'Процесс создан, но не запущен
Case EXCEPTION_DEBUG_EVENT
'произошло исключение
If a = 0 Then ' если оно произошло первый раз, это аппаратное исключение,
'должны его пропустить с флагом DBG_CONTINUE
Call ContinueDebugEvent(DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINUE)
GoTo point
a = 1
End If
Case EXIT_PROCESS_DEBUG_EVENT
'хана процессу
Exit Do
Case LOAD_DLL_DEBUG_EVENT
'процесс загрузил длл
End Select
'продожаем выполнение процесса
Call ContinueDebugEvent(DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_EXCEPTION_NOT_HANDLED)
Loop
Отладочные события! Я немного раскоментировал код, для того, чтобы легче вникнуть было.
Вообщем вопрос в том как создать некий вечный цикл без подвисания программы. Способ с DoEvents не подходит.
Номер ответа: 5
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #5
Добавлено: 05.11.05 21:08
Очень интересно, каким образом "на ассемблере такой код работает нормально". Потому что функция не возвращается, пока не возникнет событие. И её нельзя вызвать в другом потоке, потому что можно вызывать только из потока, создавшего процесс.
Номер ответа: 6
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #6
Добавлено: 05.11.05 21:15
Ну почему мне никто наслово не верит
.while TRUE
invoke WaitForDebugEvent, addr DBEvent, INFINITE
.if DBEvent.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT
invoke MessageBox, 0, addr ExitProc, addr AppName, MB_OK+MB_ICONINFORMATION
.break
.elseif DBEvent.dwDebugEventCode==CREATE_PROCESS_DEBUG_EVENT
.elseif DBEvent.dwDebugEventCode==EXCEPTION_DEBUG_EVENT
.if DBEvent.u.Exception.pExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT
invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_CONTINUE
.continue
.endif
.elseif DBEvent.dwDebugEventCode==CREATE_THREAD_DEBUG_EVENT
invoke MessageBox,0, addr NewThread, addr AppName, MB_OK+MB_ICONINFORMATION
.elseif DBEvent.dwDebugEventCode==EXIT_THREAD_DEBUG_EVENT
invoke MessageBox,0, addr EndThread, addr AppName, MB_OK+MB_ICONINFORMATION
.endif
invoke ContinueDebugEvent, DBEvent.dwProcessId, DBEvent.dwThreadId, DBG_EXCEPTION_NOT_HANDLED
.endw
Номер ответа: 7
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #7
Добавлено: 05.11.05 21:28
Мне кажется здесь проблема в самой архитектуре толи компилятора, толи ещё чего, VB... Хотелось бы надеется на то, что это всё-таки мои руки такие "прямые", а не ВБ такой кривой...
Номер ответа: 8
Автор ответа:
BUG(O)R
ICQ: 827887
Вопросов: 13
Ответов: 142
Web-сайт:
Профиль | | #8
Добавлено: 06.11.05 08:57
Вообщем, всем спасибо за внимание, проблему решил, понял, что копать нужно в сторону CreateThread.