Трабл при вызове ExitProcess,0 или MessageBox,0,0,0,0

Тема в разделе "WASM.WIN32", создана пользователем Bill_Prisoner, 18 июл 2005.

  1. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Вот вызываю функции ExitProcess,0 или MessageBox,0,0,0,0 в пользовательском режите, а мастдай говорит - ошибка. Ошибка происходит где-в коде этих функций. То говорит - int 3, то говорит EXCEPION_ACCESSDENIED.



    Но до этого я использую NativeAPI - NtQuerySystemInformation и NtQueryObject и NtQueryInformationThread.



    Регистры восстанавливаю. ESP выровнен на 4. Kernel32.dll и user32.dll загружены в АП процесса. В чем может быть трабл?
     
  2. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    если бы дело касалось только ExitProcess, то можно было б забить на ошибку и просто завершить код программы ret (C3), Винда бы сама вызвала ExitProcess.

    но вот зачем вызывать MessageBox с нулевыми параметрами, мне не ясно... или это пример такой, а в реале вызывается с нормальными параметрами?
     
  3. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Jupiter

    Ну бывает необходимость проверить визуально выполнение определенного участка кода я иногда так делаю и на моей системе WinXP SP1 этот код работает :



    push 0

    push 0

    push 0

    push 0

    call MessageBoxA
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Jupiter



    Винда вызовет ExitThread, а не ExitProcess. Поэтому, если приложение многопоточное, ret может не вызвать завершения процесса.
     
  5. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    Quantum

    ну да, сначала
    Код (Text):
    1.  
    2. 50              push    eax
    3. E8 40D7FFFF     call    ExitThread
    4.  




    собственно ExitThread выполняет ntdll.ZwQueryInformationThread, потом NTDLL.LdrShutdownThread (если многопоточн.)

    а потом всё равно
    Код (Text):
    1.  
    2. FF75 08         push    dword ptr ss:[ebp+8]
    3. E8 7624FDFF     call    ExitProcess
    4.  
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Jupiter

    Код запросто может зациклиться и никогда не дойти до ExitProcess. Поэтому вызывать ExitProcess нужно ОБЯЗАТЕЛЬНО. Попробуйте вызвать, к примеру, GetOpenFileName, а потом ret из основного потока - процесс намертво повиснет (XP SP2).
     
  7. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    Quantum

    разумеется, что


    я с этим и не спорю

    упомянутый мною ret вместо полноценного ExitProcess возможен лишь в простых прогах с примитивной структурой


    Код (Text):
    1.  
    2. .386
    3. .model flat, stdcall
    4. option casemap:none
    5. title SysRet
    6. .code
    7. Start:
    8. xor eax, eax
    9. inc eax
    10. ret
    11. ; До сюда выполнение не дойдёт
    12. int 3
    13. End Start
    14.  


    это вар-т без импорта, на Win2k работать не будет
     
  8. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Регистрация:
    4 май 2005
    Сообщения:
    238
    Дело тут не в том какая процедуры вызывается и зачем, а почему вызов MessageBox и ExitProcess не возвращается нормально, а выкидывает exception?



    Вместо MessageBox можно взять какую-нибудь другую user32.dll функция, но в этом и проблемы вызов почти любой API не завершается без exception'а!



    Может Native API портит какие-нибудь системные струкиуры данных которые находяться в АП процесс ниже 2 Гб?