Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ida.final.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6 Mб
Скачать

Long SetMemberType(long id,long member_offset,long flag,long typeid,long nitems);

Функция позволяет изменять тип члена структуры. Он определяется флагом flag следующим образом:

Определение

Значение

Пояснения

FF_BYTE

0x00000000L

Байт

FF_WORD

0x10000000L

Слово

FF_DWRD

0x20000000L

Двойное слово

FF_QWRD

0x30000000L

Четвертное слово

FF_TBYT

0x40000000L

Восьмерное слово

FF_ASCI

0x50000000L

ASCII строка

FF_STRU

0x60000000L

Структура

FF_RESERVED

0x70000000L

Зарезервировано

FF_FLOAT

0x80000000L

Float

FF_DOUBLE

0x90000000L

Double

FF_PACKREAL

0xA0000000L

Packed decimal real

FF_ALIGN

0xB0000000L

Директива выравнения

В зависимости от состояния флага, значение аргумента typeid может трактоваться по-разному.

Состояние flag

Значение typeid

FF_STRU

ID структуры

FF_ASCII

Тип ASCII строки (см. таблицу ниже)

Другое

BADADDR

Обратите внимание, что если новый член структуры не представляет собой ни вложенную структуру, ни ASCII строку, то аргумент typeid должен быть равен BADADDR

Определение

Значение

Пояснения

ASCSTR_C

ASCSTR_TERMCHR

C-style ASCII string

ASCSTR_TERMCHR

0

Character-terminated ASCII string

ASCSTR_PASCAL

1

Pascal-style ASCII string (length byte)

ASCSTR_LEN2

2

Pascal-style, length has 2 bytes

ASCSTR_UNICODE

3

Unicode string

ASCSTR_LEN4

4

Pascal-style, length has 4 bytes

При этом необходимо, что бы для нового члена хватало места. Если его размер превосходит предыдущий, а следующие за ним смещения принадлежат остальным членам, то тип члена не будет изменен

Пример:

0000 MY_STRUC struc ; (sizeof=0x9)

0000 field_0 dw ?

0002 field_2 dw ?

0004 field_4 dw ?

0006 field_6 dw ?

0008 MyGoodMember db ?

0009 MY_STRUC ends

0009

Message("0x%X \n",

SetMemberType(

GetStrucIdByName("MY_STRUC"),

2,

FF_DWRD,

-1,

4));

0000 MY_STRUC struc ; (sizeof=0x9)

0000 field_0 dw ?

0002 field_2 dw ?

0004 field_4 dw ?

0006 field_6 dw ?

0008 MyGoodMember db ?

0009 MY_STRUC ends

0009

0x0

Напротив, если новый член занимает места меньше чем старый, то преобразование происходит без проблем, а «лишние» байты помечаются, как неопределенные.

Например:

0000 MY_STRUC struc ; (sizeof=0x9)

0000 field_0 dw ?

0002 field_2 dw ?

0004 field_4 dw ?

0006 field_6 dw ?

0008 MyGoodMember db ?

0009 MY_STRUC ends

0009

Message("0x%X \n",

SetMemberType(

GetStrucIdByName("MY_STRUC"),

2,

FF_BYTE,

-1,

1))

0000 MY_STRUC struc ; (sizeof=0x9)

0000 field_0 dw ?

0002 field_2 db ?

0003 db ? ; undefined

0004 field_4 dw ?

0006 field_6 dw ?

0008 MyGoodMember db ?

0009 MY_STRUC ends

Операнд

Пояснения

id

Идентификатор (ID) структуры

name

Имя структуры

Offset

==offset

Значение

!=BADADDR

Смещение нового члена структуры

==BADADDR

Добавить новый член в конец

flag

Новый тип члена

typeid

Идентификатор структуры или тип ASCII-строки

Nbytes

Размер нового члена в байтах

Return

==return

Пояснения

==1

Успешное завершение

==0

Ошибка (см коды завершения выше)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]