Анимация
JavaScript
|
Главная Библионтека Message("0x%X \n", RfirstB(0x1014F) 0x1014A Как получить действительно первый элемент источника списка можно прочитать в описании функции RnextB
long RnextB (long To,long current); Функция возвращает адрес следующего источника в списке перекрестных ссылок, расположенного по указанному приемнику. Для более глубокого понимания принципов работы рекомендуется ознакомиться с описанием функций AddCodeXref, DelCodeXref, Rnext, RfirstB. Очевидно, что по одному и тому же линейному адресу может существовать более одного приемника перекрестных ссылок. Например:
Реализация этой функции повторяет особенность реализации Rnext. Не смотря на то, что в idc.idc утверждается будто бы эта функция «видит» тип перекрестных ссылок, указывающих на следующую команду, в действительности этого не происходит. И выделенный красным цветом адрес источника функция не вернет никогда. {0x1013B, 0x10146, 0x1014A, 0x1014C}. Поскольку RnextB хранит текущий адрес не во внутренней переменной, а в передаваемом параметре, то существует возможность, модифицируя его, управлять работой функции. Так, например, RnextB(ScreenEA(), 0) гарантированно вернет следующий за ним адрес, то есть 0x1013B, а пройти весь список (за исключением ссылок на следующую инструкцию) можно с помощью следующего кода: auto a; a=0; for (;;) a=RnextB(ScreenEA(),a); if (a==-1) break; Message("0x%X \n",a); } 0x1013B 0x10146 0x1014C Немного модернизировав код можно добиться того, что бы на экран выдавался действительно весь список источников, включая и ссылки на следующую команду. auto a; a=0; for (;;) a=RnextB(ScreenEA(),a); if (a==-1) break; if (a>RfirstB(ScreenEA()) Message("0x%X \n", RfirstB(ScreenEA() Message("0x%X \n",a); 0x1013B 0x10146 0x1014A 0x1014C Функция возвращает ошибку BADADDR, если список исчерпан, (то есть текущий адрес наибольший в списке) или не существует.
long RfirstO (long From); Функция возвращает линейный адрес приемника перекрестной ссылки для заданного источника. Практически идентична Rfirst, за тем исключением, что не имеет доступа к ссылкам на следующую инструкцию, поэтому возвращает действительно первый элемент списка линейный адресов приемников. Поэтому ее рекомендуется использовать в паре с функцией Rnext, впрочем, Rnext(xxx, 0) возвращает идентичный результат и хотя работает ничуть не быстрее, но немного экономит на компактности кода. Для понимания этого рекомендуется ознакомиться с описанием функций AddCodeXref, DelCodeXref, Rfrst, Rnext Если указан неверный источник, (то есть линейный адрес, не содержащий перекрестных ссылок) или источник перекрестной ссылки данных, то функция возвратит ошибку BADADDR Примеры использования: seg000:28C6 seg000:28C7 pop pop источник приемник Message("0x%X \n Rfirst0(0x128C6) 0xFFFFFFFF seg000:28CB seg000:28CB sub 0 2847 retn endp Message("0x%X \n Rfirst0(0x128CB) 0xFFFFFFFF seg000:2870 источник seg000:2870 nop loc 0 2 8 92 ; seg000:2892 loc 0 2892 XREF: seg000:2870j seg000:2892 приемник seg000:2892 ; CODE ; byte ptr [si], 22h ; Message("0x%X \n", Rfirst0(0x12870) 0x12892 Операнд Пояснения From Линейный адрес источника перекрестной ссылки 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 |