Помогите пожалуйста. Что не так? Код (Text): #include <windows.h> #include <shellapi.h> #include <windowsx.h> #include <stdio.h> #define WIN32_LEAN_AND_MEAN int Z=0; char Z8; DWORD pt; void TUNEC() { int ip=0; while(ip<=3){ ip++; MessageBox(0,0,0,0); } } EXCEPTION_DISPOSITION __cdecl _except_handler( struct _EXCEPTION_RECORD *ExceptionRecord, void * EstablisherFrame, struct _CONTEXT *ContextRecord, void * DispatcherContext ) { unsigned i; MessageBox(0,"In SEH",0,0); return ExceptionContinueExecution; } int _stdcall WinMain(HINSTANCE ha, HINSTANCE, PTSTR, int) { DWORD handler = (DWORD)_except_handler; __asm { push handler push FS:[0] mov FS:[0],ESP } VirtualProtect((void*)(&TUNEC),1024,PAGE_NOACESS,&pt); TUNEC(); __asm { mov eax,[ESP] mov FS:[0], EAX add esp, 8 } return 0; } Почему при обращение к памяти с атрибутом PAGE_NOACESS я не поподаю в SEH? Что происходит при таком обращении? Убедительная просьба давать дельные советы , хорошобы с примерами. Заранее благодарен. С уважением ко всем откликнувшимся geek.
Все так - что хотел, то и получил Потому, что твой SEH-обработчик находится в той же странице памяти, к которой ты запрещаешь доступ. И кстати вызов TUNEC() тут и не нужен вовсе - исключение возникает (должно возникать) при выходе по ret из VirtualProtect PS: смутно помнится такой вопрос на форуме уже как-то был
Да то не совсем так. VirtualProtect((void*)(&TUNEC),1024,PAGE_NOACESS,&pt); nop nop nop nop nop TUNEC(); Дает тот же результат.
Да то не совсем так. VirtualProtect((void*)(&TUNEC),1024,PAGE_NOACESS,&pt); nop nop nop nop nop TUNEC(); Дает тот же результат, т.е. исключение (ошибка) возникает только при вызове TUNEC
Если тело TUNEC и вызовы VirtualProtect(..) и TUNEC(..) располагаются в разных страницах кода, то ошибка будут возникать при вызове TUNEC(..). Если же в одной странице (как можно предположить из твоего первого поста) - то ошибка возникнет на инструкции ret в VirtualProtect В любом случае нужно убедиться, что адрес обработчика _except_handler не попадает в запрещаемый диапазон адресов