Поделиться через


структура UNWIND_CODE

Массив кода раскрутки используется для записи последовательности операций в прологе, оказывающих влияние на энергонезависимые регистры и RSP.Каждый элемент кода имеет следующий формат:

UBYTE

Смещение в прологе

UBYTE: 4

Код операции очистки

UBYTE: 4

Сведения об операции

Элементы массива располагаются в убывающем порядке в соответствии с положением в прологе.

  • Смещение в прологе
    Смещение от начала пролога конца инструкции, которая выполняет данную операцию, плюс 1 (это расположение следующей инструкции).

  • Код завершающей операции
    Примечание. В кодах некоторых операций необходимо использовать смещение без учета знака в качестве значения в локальном кадре стека.Это смещение отсчитывается от начала (нижнего адреса) выделенного фиксированного пространства стека.Если поле регистра кадра стека в структуре UNWIND_INFO является пустым, то смещение отсчитывается от RSP.Если поле регистра кадра стека не является пустым, смещение отсчитывается от расположения RSP в момент установки регистра FP.Оно рассчитывается как регистр FP минус смещение регистра FP (16 * масштабированное смещение регистра кадра стека в UNWIND_INFO).При использовании регистра FP любой код раскрутки со смещением должен использоваться только после установки в прологе регистра FP.

    Для всех кодов операций кроме UWOP_SAVE_XMM128 и UWOP_SAVE_XMM128_FAR смещение будет кратным 8, поскольку хранимые в стеке значения выравниваются до 8 байт (сам стек всегда выравнивается до 16 байт).Для кодов операций с коротким смещением (менее 512 Кбайт) завершающий USHORT в узлах кода содержит смещение, разделенное на 8.Для кодов операций с длинным смещением (от 512 Кбайт до 4 Гбайт) два завершающих узла USHORT кода содержат смещение (с прямым порядком следования байтов).

    Для кодов операций UWOP_SAVE_XMM128 и UWOP_SAVE_XMM128_FAR смещение будет кратным 16, поскольку все 128-битные операции XMM должны выполняться в памяти, выровненной до 16 байт.Поэтому для операции UWOP_SAVE_XMM128 используется масштабный коэффициент 16, который позволяет использовать смещение до 1 МБ.

    Кодом завершающей операции может быть:

    узел UWOP_PUSH_NONVOL (0)1

    Отправка энергонезависимого регистра целых чисел с уменьшением значения RSP в 8 раз.Значение в поле сведений об операции является числом регистра.Обратите внимание, что из-за ограничений, накладываемых на эпилог, коды раскрутки UWOP_PUSH_NONVOL должны использоваться первыми в прологе и, соответственно, последними в массиве кодов раскрутки.Этот относительный порядок применяется ко всем другим кодам раскрутки операций, за исключением UWOP_PUSH_MACHFRAME.

    Узлы UWOP_ALLOC_LARGE (1)2 или 3

    Выделение для стека большого объема памяти.Существуют два варианта.Если в поле сведений об операции содержится значение ноль, в соседнюю ячейку записывается размер выделенной памяти, поделенный на 8.Если в поле сведений об операции содержится значение 1, то в следующие две ячейки записывается размер выделенной памяти без масштабирования с прямым порядком следования байтов. Это позволяет выделять до 4 ГБ - 8.

    узел UWOP_ALLOC_SMALL (2)1

    Выделение для стека небольшого объема памяти.Размер выделения рассчитывается как число в поле сведений об операции * 8 + 8, что позволяет выделять от 8 до 128 байт.

    Код раскрутки должен всегда использовать наиболее короткую кодировку для выделения памяти в стеке.

    Размер выделения

    Код раскрутки

    От 8 до 128 байт

    UWOP_ALLOC_SMALL

    От 136 до 512 КБ - 8 байт

    UWOP_ALLOC_LARGE, operation info = 0

    От 512 КБ до 4 ГБ – 8 байт

    UWOP_ALLOC_LARGE, operation info = 1

    узел UWOP_SET_FPREG (3)1

    Установите регистр указателя кадра стека, задав для регистра какое-либо смещение текущего RSP.Это смещение рассчитывается как значение (масштабированное) смещения в поле регистра указателя кадра стека UNWIND_INFO * 16, что разрешает смещение со значением от 0 до 240.Использование смещения позволяет установить указатель кадра стека по центру фиксированного выделения стека, что способствует повышению плотности кода и разрешает использовать большее количество форм коротких инструкций.Обратите внимание, что поле сведений об операции является зарезервированным и не должно использоваться.

    UWOP_SAVE_NONVOL (4)2 узла

    Сохраните энергонезависимый регистр целых чисел в стеке, используя функцию MOV вместо PUSH.Как правило, она применяется для создания изолированного кода, при котором энергонезависимый регистр сохраняется в стеке в том положении, которое было ранее выделено.Значение в поле сведений об операции является числом регистра.Смещение стека (масштабированное по 8) записывается в следующей ячейке кода завершающей операции, как описано выше в примечании.

    Узлы UWOP_SAVE_NONVOL_FAR (5)3

    Сохраните энергонезависимый регистр целых чисел в стеке с длинным смещением, используя функцию MOV вместо PUSH.Как правило, она применяется для создания изолированного кода, при котором энергонезависимый регистр сохраняется в стеке в том положении, которое было ранее выделено.Значение в поле сведений об операции является числом регистра.Смещение стека (немасштабированное) записывается в следующих двух ячейках кода завершающей операции, как описано выше в примечании.

    Узлы UWOP_SAVE_XMM128 (8)2

    Сохраните все 128 байт энергонезависимого регистра XMM в стеке.Значение в поле сведений об операции является числом регистра.Смещение стека (масштабированное на 16) записывается в следующую ячейку.

    Узлы UWOP_SAVE_XMM128_FAR (9)3

    Сохраните все 128 байт энергонезависимого регистра XMM в стеке с длинным смещением.Значение в поле сведений об операции является числом регистра.Смещение стека (немасштабированное) записывается в следующие две ячейки.

    узел UWOP_PUSH_MACHFRAME (10)1

    Передача машинного кадраИспользуется для записи воздействия аппаратного вмешательства или исключения.Существуют два варианта.Если в поле сведений об операции значение ноль, значит в стек были переданы следующие данные:

    RSP+32

    SS

    RSP+24

    Old RSP

    RSP+16

    EFLAGS

    RSP+8

    CS

    RSP

    RIP

    Если в поле сведений об операции значение "1", значит в стек были переданы следующие данные:

    RSP+40

    SS

    RSP+32

    Old RSP

    RSP+24

    EFLAGS

    RSP+16

    CS

    RSP+8

    RIP

    RSP

    Код ошибки.

    Этот код раскрутки должен всегда присутствовать в фиктивном прологе, который никогда не выполняется, но присутствует перед реальной точкой входа подпрограммы прерывания и существует, только чтобы предоставить место для имитации передачи машинного кадра.UWOP_PUSH_MACHFRAME записывает эту имитацию, что означает, что компьютер концептуально выполнил следующее:

    Перемещение обратного адреса RIP с вершины стека в Temp

    Передача SS

    Передача old RSP

    Передача EFLAGS

    Передача CS

    Передача Temp

    Передача кода ошибки (если в поле сведений об операции значение "1")

    Смоделированная операция UWOP_PUSH_MACHFRAME уменьшает RSP на 40 (если в поле сведений об операции значение "0") или 48 (если в поле сведений об операции значение "1")

  • Сведения об операции
    Значение этих 4 байт зависит от кода операции.Чтобы выполнить кодирование регистра (целых чисел) общего назначения, используется следующее сопоставление.

    0

    RAX

    1

    RCX

    2

    RDX

    3

    RBX

    4

    RSP

    5

    RBP

    6

    RSI

    7

    RDI

    От 8 до 15

    Запросы из R8 в R15

См. также

Ссылки

Данные раскрутки для обработки исключений и поддержки отладчика