Исключения. Язык Си и Winapi - Черновик

May 10, 2020 15:36


В отличие от веба, в низкоуровневых языках все немного сложнее. Язык Си (про плюсы я тут ничего не пишу, для C++ есть другие книги, справки и т.д.) доступны 2 вида исключений - собственно, расширения языка Си (CRT) и Windows SEH. Если уж разбираться до конца, то исключения Си базируются на SEH, но в тоже время, не работают без CRT (зачем это надо и как это обойти - напишу дальше).

Исключения языка Си
Ключевые слова: __try,__except,__finally,__leave

Если в вебе мы можем писать как угодно, то здесь нельзя миксовать операторы, на один блок __try должен быть один блок, или __except или __finally. Если нужно и то и то, то придется писать вложенные блоки. В блоке можно либо  указать функцию-обработчик, либо указать, какой тип исключений будет обрабатываться:
__except (filter(GetExceptionCode(), GetExceptionInformation())) или __except (EXCEPTION_EXECUTE_HANDLER)
Пример с MSDN
include excpt.h

int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep)
{
puts("in filter.");
if (code == EXCEPTION_ACCESS_VIOLATION)
  {
  puts("caught AV as expected.");
  return EXCEPTION_EXECUTE_HANDLER;
  }
else
  {
  puts("didn't catch AV, unexpected.");
  return EXCEPTION_CONTINUE_SEARCH;
  };
}

В редких случаях, когда в обработчике действительно можно пофиксить проблему, можно вернуть EXCEPTION_CONTINUE_EXECUTION . Допустим , если память не выделена, выделить или там поделили на ноль, и можем заменить число..


Рихтер говорит, что VEH не может возвращать execute
@TRY_BEGIN MACRO Handler
    pushad                          ;;Save Current State
    mov esi, offset Handler         ;;Address of New Exception Handler
    push esi                        ;;Save Old Exception Handler
    push dword ptr fs:[0]           ;;Install New Handler
    mov dword ptr fs:[0], esp
ENDM
@TRY_EXCEPT MACRO Handler
    jmp NoException&Handler         ;;No Exception Occured, so jump over
Handler:
    mov esp, [esp + 8]              ;;Exception Occured, Get old ESP
    pop dword ptr fs:[0]            ;;Restore Old Exception Handler
    add esp, 4                      ;;ESP value before SEH was set
    popad                           ;;Restore Old State
ENDM
@TRY_END MACRO Handler
    jmp ExceptionHandled&Handler    ;;Exception was handled by @TRY_EXCEPT
NoException&Handler:                ;;No Exception Occured
    pop dword ptr fs:[0]            ;;Restore Old Exception Handler
    add esp, 32 + 4                 ;;ESP value before SEH was set. 32 for pushad and ...
ExceptionHandled&Handler:           ;;...4 for push offset Handler. (No Restore State)
                                    ;;Exception has been handled, or no exception occured
ENDM

https://www.codeproject.com/Articles/1212332/bit-Structured-Exception-Handling-SEH-in-ASM
http://qxov.narod.ru/articles/seh/seh.html
http://www.rohitab.com/structured-exception-handling-in-assembly-language

asm, winapi, noob, исключения, windows, c

Previous post Next post
Up