Неясность при обращении к структуре, masm

Тема в разделе "WASM.BEGINNERS", создана пользователем gh05t, 28 дек 2008.

  1. gh05t

    gh05t New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2008
    Сообщения:
    34
    Имеется структура IMAGE_SECTION_HEADER STRUCT:

    Код (Text):
    1. IMAGE_SECTION_HEADER STRUCT
    2.     Name1 db IMAGE_SIZEOF_SHORT_NAME dup(?)
    3.     union Misc
    4.         PhysicalAddress dd  ?
    5.         VirtualSize dd      ?
    6.     ends
    7.     VirtualAddress dd       ?
    8.     SizeOfRawData dd        ?
    9.     PointerToRawData dd     ?
    10.     PointerToRelocations dd ?
    11.     PointerToLinenumbers dd ?
    12.     NumberOfRelocations dw  ?
    13.     NumberOfLinenumbers dw  ?
    14.     Characteristics dd      ?
    15. IMAGE_SECTION_HEADER ENDS
    Указатель на нее хранится в esi (assume esi: ptr IMAGE_SECTION_HEADER). При обращении к полю VirtualAddress
    (invoke dw2hex, [esi].VirtualAddress, offset tmp)
    генерируется следующее:

    Код (Text):
    1. PUSH DWORD PTR DS:[ESI+C]
    Хотя смещение поля VirtualAddress относительно начала структуры - 10h. Подскажите, пожалуйста, в чем дело?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Компилятор прав.
     
  3. gh05t

    gh05t New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2008
    Сообщения:
    34
    То есть

    Код (Text):
    1. union Misc
    2.         PhysicalAddress dd  ?
    3.         VirtualSize dd      ?
    4.     ends
    занимает всего 4 байта?
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    gh05t
    По твоему да .D
     
  5. _Aspire

    _Aspire New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    62
    gh05t
    Почему union Misc?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    _Aspire
    Потомучто в wrk так определено, но хидер ведь там на си, а товарищ асм юзоет.
    Код (Text):
    1. // Section header format.
    2. //
    3.  
    4. #define IMAGE_SIZEOF_SHORT_NAME              8
    5.  
    6. typedef struct _IMAGE_SECTION_HEADER {
    7.     UCHAR   Name[IMAGE_SIZEOF_SHORT_NAME];
    8.     union {
    9.             ULONG   PhysicalAddress;
    10.             ULONG   VirtualSize;
    11.     } Misc;
    12.     ULONG   VirtualAddress;
    13.     ULONG   SizeOfRawData;
    14.     ULONG   PointerToRawData;
    15.     ULONG   PointerToRelocations;
    16.     ULONG   PointerToLinenumbers;
    17.     USHORT  NumberOfRelocations;
    18.     USHORT  NumberOfLinenumbers;
    19.     ULONG   Characteristics;
    20. } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
    У меня в хидере определена так:
    Код (Text):
    1. ;Section header format.
    2. IMAGE_SIZEOF_SHORT_NAME equ 8
    3.  
    4. IMAGE_SECTION_HEADER STRUCT
    5.     _Name           UCHAR IMAGE_SIZEOF_SHORT_NAME dup(?)
    6.     VirtualSize         ULONG ? ;Для EXE-файлов содержит виртуальный размер секции. Т.е. это размер, выровненный на SectionAlignment
    7.     VirtualAddress      ULONG ? ;RVA секции
    8.     SizeOfRawData       ULONG ? ;Размеp секции, выpавненный согласно установкам в PE-заголовке(выровненный на ближайшую верхнюю границу размера файла)
    9.     PointerToRawData        ULONG ? ;Файловое смещение на начало секции
    10.     PointerToRelocations    ULONG ? ;Не используется в исполняемых файлах
    11.     PointerToLineNumbers    ULONG ? ;Файловое смещение таблицы номеров строк. В данный момент не используется в исполняемых файлах
    12.     NumberOfRelocations     USHORT ? ;Количество перемещений в таблице базовых поправок для данной секции. Т.к. значение указателя на таблицу базовых поправок храниться в массиве DataDirectory, то это поле тоже может быть любым
    13.     NumberOfLineNumbers     USHORT ? ;Количество номеров строк для данной секции. Т.к. поле PointerToLinenumbersне используется, то может принимать любые значения
    14.     Characteristics     ULONG ? ;Содеpжит флаги, такие как содеpжит ли эта секция исполняемый код, инициализиpованные данные, неинициализиpованные данные, можно читать и писать в секцию
    15. IMAGE_SECTION_HEADER ENDS
    16. PIMAGE_SECTION_HEADER typedef PTR IMAGE_SECTION_HEADER