Люди, подскажите как на чистом асме поставить свой exception handler под драйвером. Юзермодовсий push my_handler mov eax,fs:[00000000] push eax mov fs:[00000000],esp .... не пашет, BSOD всё равно при Page Fault как если /* deleted */ /* deleted */
смотри пример examples\basic\MemoryWorks\seh из KmdKit. А не работать кстати может потому, что идет обращение к неподкачиваемой памяти, а их сехи не ловят.
Код (Text): push offset xHandler push fs:[0] ; address of next ERR structure mov fs:[0], esp DefaultExceptionHandler proc C pExcept:DWORD, pFrame:DWORD, pContext:DWORD, pDispatch:DWORD mov eax, pExcept invoke DbgPrint, $CTA0("Exception: %08X at address: %08X\n"), \ [eax][EXCEPTION_RECORD.ExceptionCode], \ [eax][EXCEPTION_RECORD.ExceptionAddress] lea eax, _seh push (_SEH PTR [eax]).SafeEip push (_SEH PTR [eax]).PrevEsp push (_SEH PTR [eax]).PrevEbp mov eax, pContext pop (CONTEXT PTR [eax]).regEbp pop (CONTEXT PTR [eax]).regEsp pop (CONTEXT PTR [eax]).regEip ; reload context & continue execution xor eax, eax ; return ExceptionContinueExecution ret DefaultExceptionHandler endp Все прокатит, работа с исключениями в драйверах ничем не отличается от юзермода. Бывают конечно случаи, когда простой сех не сработает (например исключения генерируемые всякими функциями вроде ProbeForRead обрабатываються только сишным сехом, с его специфичными структурами). Есть множество типов исключений, которые вобще не обрабатываются сехами (деление на 0, двойное исключение, исключения при обращении к неподкачиваемой памяти и.т.д.).
MP_ART Вспомни как работают ловушки для исключительных ситуаций? А как вспомнишь, вспомни кто должен ловить в привелиригированном уровне