Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: CreateProcess & параметры Добавлено: 05.11.05 09:18  

Автор вопроса:  BUG(O)R | Web-сайт: hunger.ru | ICQ: 827887 
Работаю с технологией DebugAPI, создаю процесс с параметрами DEBUG_PROCESS, и вроде бы всё ничего, процесс создаётся, о чём свидетельствует событие CREATE_PROCESS_DEBUG_EVENT, но не запускается!!! Если убрать параметр DEBUG_PROCESS всё отлично работает... Может я указал недостаточно параметров?
Вот пример:

If CreateProcess(vbNullString, TxtFile.Text, 0, 0, False, DEBUG_PROCESS, 0, 0, si, pi) = 0 Then
       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-сайт: sharpc.livejournal.com
 Профиль | | #1
Добавлено: 05.11.05 11:46
CreateProcess(vbNullString

Что-то мне подсказывает, что NULL и указатель на символ \0x00 - разные вещи. Попробуй объявить первый аргумент CreateProcess как ByVal pAppName as Long и передать 0&

Ответить

Номер ответа: 2
Автор ответа:
 BUG(O)R



ICQ: 827887 

Вопросов: 13
Ответов: 142
 Web-сайт: hunger.ru
 Профиль | | #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-сайт: hunger.ru
 Профиль | | #4
Добавлено: 05.11.05 20:52
point:
    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-сайт: hunger.ru
 Профиль | | #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-сайт: hunger.ru
 Профиль | | #7
Добавлено: 05.11.05 21:28

Мне кажется здесь проблема в самой архитектуре толи компилятора, толи ещё чего, VB... Хотелось бы надеется на то, что это всё-таки мои руки такие "прямые", а не ВБ такой кривой... :)

Ответить

Номер ответа: 8
Автор ответа:
 BUG(O)R



ICQ: 827887 

Вопросов: 13
Ответов: 142
 Web-сайт: hunger.ru
 Профиль | | #8
Добавлено: 06.11.05 08:57
Вообщем, всем спасибо за внимание, проблему решил, понял, что копать нужно в сторону CreateThread.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам