Вот вызываю функции ExitProcess,0 или MessageBox,0,0,0,0 в пользовательском режите, а мастдай говорит - ошибка. Ошибка происходит где-в коде этих функций. То говорит - int 3, то говорит EXCEPION_ACCESSDENIED. Но до этого я использую NativeAPI - NtQuerySystemInformation и NtQueryObject и NtQueryInformationThread. Регистры восстанавливаю. ESP выровнен на 4. Kernel32.dll и user32.dll загружены в АП процесса. В чем может быть трабл?
если бы дело касалось только ExitProcess, то можно было б забить на ошибку и просто завершить код программы ret (C3), Винда бы сама вызвала ExitProcess. но вот зачем вызывать MessageBox с нулевыми параметрами, мне не ясно... или это пример такой, а в реале вызывается с нормальными параметрами?
Jupiter Ну бывает необходимость проверить визуально выполнение определенного участка кода я иногда так делаю и на моей системе WinXP SP1 этот код работает : push 0 push 0 push 0 push 0 call MessageBoxA
Jupiter Винда вызовет ExitThread, а не ExitProcess. Поэтому, если приложение многопоточное, ret может не вызвать завершения процесса.
Quantum ну да, сначала Код (Text): 50 push eax E8 40D7FFFF call ExitThread собственно ExitThread выполняет ntdll.ZwQueryInformationThread, потом NTDLL.LdrShutdownThread (если многопоточн.) а потом всё равно Код (Text): FF75 08 push dword ptr ss:[ebp+8] E8 7624FDFF call ExitProcess
Jupiter Код запросто может зациклиться и никогда не дойти до ExitProcess. Поэтому вызывать ExitProcess нужно ОБЯЗАТЕЛЬНО. Попробуйте вызвать, к примеру, GetOpenFileName, а потом ret из основного потока - процесс намертво повиснет (XP SP2).
Quantum разумеется, что я с этим и не спорю упомянутый мною ret вместо полноценного ExitProcess возможен лишь в простых прогах с примитивной структурой Код (Text): .386 .model flat, stdcall option casemap:none title SysRet .code Start: xor eax, eax inc eax ret ; До сюда выполнение не дойдёт int 3 End Start это вар-т без импорта, на Win2k работать не будет
Дело тут не в том какая процедуры вызывается и зачем, а почему вызов MessageBox и ExitProcess не возвращается нормально, а выкидывает exception? Вместо MessageBox можно взять какую-нибудь другую user32.dll функция, но в этом и проблемы вызов почти любой API не завершается без exception'а! Может Native API портит какие-нибудь системные струкиуры данных которые находяться в АП процесс ниже 2 Гб?