Анимация
JavaScript
|
Главная Библионтека запись устройство "PRN" и направить в него необходимые данные. Например: writestr(fopen("PRN","wt"),"Hello,Printer!"); Необходимо лишь учитывать, что эта печать идет в обход менеджера печати и, кроме того, так нельзя получить доступ к сетевому принтеру. Но в большинстве случаев и этих возможностей окажется достаточно. Точно так же можно читать данные с консоли или выводить их на нее. Конечно, при первой же перерисовке окна сообщений они будут стерты, но это наоборот, скорее достоинство, чем недостаток. Действительно, зачем загромождать окно сообщений?
Закрытие всех открытых файлов гарантируется только при корректном выходе из IDA. И хотя, несмотря, на то, что операционная система гарантированно закроет все файлы, порожденные любым процессом (в том числе и IDA) при его завершении, может потеряться часть данных, которая в этом момент находилась во внутренних буферах IDA и еще не была записана на диск. void fclose (long handle); Функция закрывает файлы, открытые с помощью fopen. В момент закрытия файла в него записываются все данные, находящиеся в этот момент во внутренних буферах, а файловый объект (то есть то, на что ссылается дескриптор) уничтожается, предотвращая утечку ресурсов. Файлы автоматически закрываются в момент завершения работы породившего их скрипта (при условии, что обладающая дескриптором процедура не описана как static), а так же при корректном завершении работы IDA. В противном же случае операционная система все равно освободит все ресурсы, принадлежащие процессу, но при этом не будут записаны данные, оставшиеся во внутренних буферах. Функция не возвращает результата успешности операции. Операнд Пояснения handle Дескриптор открытого файла Пример использования: Auto a; A=fopen("PRN","wt"); If (a!=-1) writestr(a,"Hello,Printer!"); fclose(a); Обратите внимание, что в приведенном примере fclose выполняется даже тогда, когда файл не был успешно открыт. Это не ошибка, поскольку fclose(0) не приводит ни к каким побочным последствиям. long filelength (long handle); Функция возвращает логическую длину открытого файла. То есть длину с учетом не записанных внутренних буферов, которая может не совпадать с физическим размером файла на диске в данный момент. Длина символьных устройств (таких, как PRN, например) всегда равна нулю. Например: Message( 0x%X \n",filelngth(fopen("PRN", "wt")); Операнд Пояснения handle Дескриптор открытого файла" long fseek (long handle,long offset,long origin); Функция позиционирует указатель в открытом файле. Флаг origin, задающий необходимое позиционирование может принимать следующие значения, перечисленные ниже в таблице:
Правда вплоть до версии 4.0 эта функция реализована с ошибкой, приводящей к тому, что флаг 1 трактуется точно так, как и 0 - то есть относительно начла файла. Это видно на следующем примере: auto a; a=Fopen("myfile","wt"); fseek(a,0x10,0); Message("0x%X \n",ftell(a)); fseek(a,0x0,1); Message("0x%X \n",ftell(a)); fclose(a); 0x10 0x0 Так же не поддерживается отрицательная адресация относительно начала файла. Относительно конца файла можно свободно позиционироваться в двух направлениях. auto a; a=Fopen("myfile","wt"); fseek(a,0x0,2); Message("0x%X \n",ftell(a)); fseek(a,0x5,2); Message("0x%X \n",ftell(a)); fseek(a,-0x5,2); Message("0x%X \n",ftell(a)); fclose(a); 0x100 0x105 0x100 Напомним, что ранние версии DOS содержали ошибку, приводящую к тому, что наращивании размера файла с помощью функции позиционирования сверх определенного размера (зависящего от многих обстоятельств) нарушалась целостность FAT16. Та же ошибка повторена в первых реализациях FAT32 (WindoWs 95 OSP0, в народе прозванная «Лебединая редакция») При перемещении указателя за конец файла в него подает, информация, расположенная в выделяемых ему дисковой подсистемой кластерах. При этом файл не должен быть открыт на запись, иначе игнорируя флаг, функция будет вычислять смещение относительно файла и его содержание окажется утерянным! Так же оно окажется утерянным, если указать неверное отрицательное смещение или origin > 2.
long ftell (long handle); Функция возвращает текущую позицию указателя в открытом файле относительно его начала.
success loadfile (long handle,long pos,long ea,long size); Функция позволяет загружать бинарный файл (или его часть) в произвольный регион виртуальной памяти IDA. Это позволяет писать свои динамические загрузчики, но и эмулировать работу оверлеев, а так же многое другое. Перед началом операции искомый файл необходимо открыть в бинарном режиме функцией fopen с правами только на чтение. Если открыть на запись, то его содержимое окажется необратимо уничтожено! 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 |