Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [ 20 ] 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140

success SegBounds(long ea,long startea,long endea,long disable)

Функция позволяет изменять адреса начала и конца сегмента, при необходимости уничтожая освободившуюся при уменьшении сегмента виртуальную память. Базовый адрес она изменить не в состоянии и при возникновении необходимости его модификации следует воспользоваться функцией SegCreate.

Перед увеличением границ сегмента необходимо убедиться что для расширения сегмента имеется достаточное количество свободного места, в противном случае требуется предварительно укоротить соседние сегменты на соответственную величину.

Адрес начала сегмента должен быть не меньше базового адреса сегмента, умноженного на шестнадцать, в противном случае первые байты сегмента будет иметь отрицательное смещение. Изменить базовый адрес можно вызовом SegCreate или SetSelector (если базовый адрес задан селектором).

Адрес конца сегмента должен на единицу превышать наибольший адрес, принадлежащий сегменту. Подробнее об этом рассказывается в описании функции SegCreate.

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

??? #Верстальщику - change table

аргумент

пояснения

линейный адрес, принадлежащий сегменту

startea

32-разрядный линейный адрес нового начала сегмента

endea

величина на единицу большая последнего принадлежащего сегменту адреса

disable

уничтожать освободившиеся адреса

return

=return

пояснения

успешное завершение операции

ошибка

Родственные функции: SegCreate

Интерактивный аналог: <Alt-S>; "~View\Segments", <Ctrl-E>

long SegStart(long ea)

Функция принимает любой линейный адрес, принадлежащий сегменту, и возвращает линейный адрес начала данного сегмента.

Если переданный адрес не принадлежит ни одному сегменту, функция возвратит BADADDR, сигнализируя об ошибке.

Пример использования:

SegCreate(0x10000,0x20000,0x1000,0,0,0);

a) создаем сегмент с адресом начала 0x10000 и адресом конца 0x20000

0. Creating a new segment

b) сегмент успешно создан

(00010000-00020000)

Message(">%X\n",SegStart(0x10100));

c) вызываем функцию SegStart, передавая ей один из адресов, принадлежащих сегменту



>10000

d) результат - функция вернула адрес начала сегмента ??? #верстальщику - change table

аргумент

пояснения

линейный адрес принадлежащий сегменту

return

=return

пояснение

!=BADADDR

линейный адрес начала сегмента

==BADADDR

ошибка

Родственные функции: SegEnd Интерактивный аналог: "~View\Segments"

аес начала сегмеа

[ ]

Program Segmentation

Name Start

seg000 00000000

End Align Base Type Cls 32es ss ds fs gs 010000 at 1000 pri N FFFF FFFF FFFF FFFF FFFF

=3=[т] т

00020000

long SegEnd(long ea)

Функция принимает любой линейный адрес, принадлежащий сегменту, и возвращает линейный адрес конца данного сегмента.

Если указанный адрес не принадлежит ни одному сегменту, функция возвратит значение BADADDR, сигнализируя об ошибке.

Линейный адрес конца сегмента на единицу больше наибольшего адреса, принадлежащего сегменту. Подробнее об этом рассказывается в описании функции SegCreate.

Пример использования:

SegCreate(0x1000,0x2000,0x100,0,0,0); SegCreate(0x2000,0x3000,0x200,0,0,0);

a) создаем два смежный сегмента с адресами начала и конца 0x1000; 0x2000 и 0x2000; 0x3000 соответственно

0. Creating a new segment

1. Creating a new segment

b) сегменты успешно созданы

00001000-00002000) 00002000-00003000)

OK OK

Message(">%X\n",SegEnd(0x1100));

c) вызываем функцию SegEnd, передавая ей один из адресов, принадлежащих первому сегменту

>2000

d) результат - адрес конца первого сегмента

Message(">%X\n",SegStart(0x2 000));

e) вызываем функцию SegStart, передавая ей адрес конца первого сегмента

>2000

f) результат - адрес начала второго сегмента. Таким образом, наглядно



продемонстрировано - адрес конца сегмента не принадлежит самому сегменту. ??? #верстальщику - change table

аргумент

пояснения

любой 32-разрядный линейный адрес, принадлежащий сегменту

return

=return

пояснения

!=BADADDR

линейный адрес конца сегмента

==BADADDR

ошибка

Родственные функции: SegStart Интерактивный аналог: "~View\Segments"

]

Program Segmentation

Name Start End Align Base Type Cls 32es ss ds fs gs ▼

seg000 00000000 00010000 at 1000 pri N FFFF FFFF FFFF FFFF FFFF 00010000 00020000

=3=[t] =] ▲

long SegByName(char segname)

Функция по имени сегмента (с учетом регистра) определяет его базовый адрес.

Если базовый адрес представляет собой селектор, то функция автоматически возвратит его значение.

Если сегмента с указанным именем не существует, функция возвратит значение BADADDR, сигнализируя об ошибке.

Детали:

a) вызов SegByName - единственный способ определения базового адреса сегмента. Чтобы определить базовый адрес сегмента, по некому линейному адресу, принадлежащему сегменту, необходимо воспользоваться конструкцией BASE = SegByName(SegName(ea)).

b) Поскольку, IDA допускает совместное существование двух и более одноименных сегментов, определение базового адреса сегмента по ему имени позволяет определишь базовый адрес лишь одного из них.

Но никакого другого (во всяком случае документированного) способа определения базового адреса не существует и выходом из такой ситуации становится отказ от использования одноименных сегментов.

Пример использования:

SegCreate(0x1000,0x2000,0x100,0,0,0);

SegRename(0x1000,"MySeg");

a) создаем новый сегмент с базовым адресом 0x1000 и тут же переименовываем его в "MySeg"

Message(">%X\n",SegByName("MySeg"));

b) вызываем функцию SegByName передавая ей имя только что созданного сегмента



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [ 20 ] 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140