Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.11.07;
Скачать: CL | DM;

Вниз

Неясности в формате файла   Найти похожие ветки 

 
Sha ©   (2010-07-21 11:33) [240]

> Виталий ©   (21.07.10 09:09) [236]
> Я именно в материале по первой ссылке и прочел описание каталоговой записи

Там же описан способ хранения длинных имен.
Т.е. сектор каталога может содержать записи двух типов.
Чтобы выполнить задание [234] надо просто добавить к коду
недостающее описание и переписать GetUniLFN.

> Виталий ©   (21.07.10 11:12) [239]
> Но как из описания полей можно понять,
> что за хитрые вещи проводятся с их содержимым и для чего?

Никак.
Потому что у автора нет описания этих полей для случая
хранения на тех же местах частей длинного имени.


 
Sha ©   (2010-07-21 11:44) [241]

> Sha ©   (21.07.10 11:33) [240]
> Никак.

Ну, или знать,
что в IA-32 целые типы хранятся в Little Endian (меньшим концом вперед) представлении,
что Chr(i) эквивалентно Chr(Byte(i)) или Chr(i and 255),
что после Shr 8 первый байт становится нулевым, второй - первым и т.д.,
что после Shr 16 .........


 
Anatoly Podgoretsky ©   (2010-07-21 11:51) [242]

> Виталий  (21.07.2010 11:12:59)  [239]

Мы уже говорили про WinApi, а здесь надо знать DOSApi, что проще, но уже все
забыли.
Ты не в ту степь полез.


 
Anatoly Podgoretsky ©   (2010-07-21 11:52) [243]

> Sha  (21.07.2010 11:33:00)  [240]

Автор честно признается, что он не пользовалься документированой
информацией, а делал хакерский анализ и не несет ответственности за
достоверность данной информации.


 
Sha ©   (2010-07-21 11:59) [244]

> Anatoly Podgoretsky ©   (21.07.10 11:51) [242]
> а здесь надо знать DOSApi,

Да там ваще никакой апи не нужен.
Обычная функция преобразования данных.

Достаточно уметь работать с массивами и со структурами данных.
Объявить record как надо и пройтись по массиву record"ов,
сцепляя данные в одно длинное имя.


 
Anatoly Podgoretsky ©   (2010-07-21 12:11) [245]

> Sha  (21.07.2010 11:59:04)  [244]

Ты разве не видел там int 21/25 АПИ в ДОС реализовывалось через вызов
прерывания.


 
Sha ©   (2010-07-21 12:21) [246]

> Anatoly Podgoretsky ©   (21.07.10 12:11) [245]

Мы ща говорим конкретно о функции GetUniLFN


 
Anatoly Podgoretsky ©   (2010-07-21 12:26) [247]

> Sha  (21.07.2010 12:21:06)  [246]

Внутри которой непонятные функции и операции.


 
Sha ©   (2010-07-21 12:28) [248]

> Anatoly Podgoretsky ©   (21.07.10 12:26) [247]

Ждем. Виталий разъяснить должен.


 
Alien1769 ©   (2010-07-21 12:58) [249]


> Alien1769, вы привели то, какие значения может принимать
> поле атрибута. Но в коде оно вообще не используется.


Ошибочное мнение. Как же функция узнает про каталог ?? :)


 
Виталий ©   (2010-07-21 13:49) [250]


> что в IA-32 целые типы хранятся в Little Endian

Это читал в википедии.

> что Chr(i) эквивалентно Chr(Byte(i)) или Chr(i and 255),

Догадываюсь. В третьем случае поразрядное AND, а 255 - это 11111111, то есть число в итоге даст опять же i

> что после Shr 8 первый байт становится нулевым, второй -
>  первым и т.д.,
> что после Shr 16 .........

- вероятно, третий - вторым, 4-й - третьим, ведь сдвиг вправо на 8 разрядов - это заполнение их (старших на х86) нулями, а то, что было младшими 8 разрядами, исчезнет.
-----------------------------------
Но в мою голову никак не приходит, как эти полезные знания использовать. А способ хранения длинных имен мне неясен. Откуда там эти 12 байт (6 юникод-символов)?


 
Виталий ©   (2010-07-21 13:50) [251]


> Ошибочное мнение. Как же функция узнает про каталог ?? :
> )

Я имею ввиду про только эту рассматриваемую функцию.


 
Виталий ©   (2010-07-21 13:53) [252]

Ой, простите, не понял вас. Но там if Dir[I].Attr<>15, а 15 - это вообще что? $10 - это 16dec


 
Anatoly Podgoretsky ©   (2010-07-21 13:54) [253]

> Виталий  (21.07.2010 13:49:10)  [250]

Не совсем

Chr(256) и Chr(256 and 255) дадут разные результаты. Chr(I and 255) нужно
для выделения младшего байта, а Chr поддерживает и Юникод.


 
Виталий ©   (2010-07-21 13:55) [254]


> Откуда там эти 12 байт

Подразумеваю, что в статье сказано о "дополнительной" каталоговой записи. Но в коде автор, по-моему, работает совсем не с ней.


 
Виталий ©   (2010-07-21 13:58) [255]


> Chr(I and 255) нужно
> для выделения младшего байта, а Chr поддерживает и Юникод.
>

Понял вас, спасибо (проверил в калькуляторе и на бумаге работу).


 
Sha ©   (2010-07-21 14:00) [256]

> Виталий ©   (21.07.10 13:55) [254]
> Подразумеваю, что в статье сказано о "дополнительной" каталоговой записи.
> Но в коде автор, по-моему, работает совсем не с ней.

Да.
Не пытайся понять, что делает автор.
Выполни задание [234].
А там, глядишь, и поймешь.


 
Виталий ©   (2010-07-21 14:03) [257]

Как же я перепишу эту функцию, если мне неясен принцип ее работы?


 
Sha ©   (2010-07-21 14:09) [258]

> Виталий ©  
> а 255 - это 11111111, то есть число в итоге даст опять же i

Нет. -1<>255, но chr(-1)=chr(255)

> Anatoly Podgoretsky ©   (21.07.10 13:54) [253]
> Chr поддерживает и Юникод.

В код функции написан задолго до юникодовой Chr,
там везде имеется в виду AnsiChr


 
Виталий ©   (2010-07-21 14:11) [259]


>
> Нет. -1<>255, но chr(-1)=chr(255)

А вот это откуда узнать и так ли важна работа с отрицательными числами?


 
Sha ©   (2010-07-21 14:14) [260]

> Виталий ©   (21.07.10 14:03) [257]
> Как же я перепишу эту функцию, если мне неясен принцип ее работы?

Есть описание способа хранения длинного имени
http://www.ipm.kstu.ru/os/lec/13.php
этого достаточно, чтобы, (почти) не заглядывая в код чужой функции, написать свою.

Ведь ты же можешь написать код вычисления факториала,
не глядя на то, как это делают другие?


 
Anatoly Podgoretsky ©   (2010-07-21 14:14) [261]

> Виталий  (21.07.2010 13:53:12)  [252]

Dir[I].Attr<>15 это грубо, надо использовать именованые константы, а так это
набор флагов.
Смотри справку по FindFirst, а значение констант в файле windows.pas


 
Sha ©   (2010-07-21 14:17) [262]

> Виталий ©   (21.07.10 14:11) [259]
> А вот это откуда узнать и так ли важна работа с отрицательными числами?

А зачем тебе узнавать это?
Вот положительные
МахInt<>255, но chr(MaxInt)=chr(255)
511<>255, но chr(511)=chr(255)


 
Anatoly Podgoretsky ©   (2010-07-21 14:18) [263]

> Виталий  (21.07.2010 14:03:17)  [257]

Зачем тебе ее переписывать?
На чем ее переписывать, укажи точное название компилятора.
Принцип будет ясен, если изучить формат хранения длинных имен, за этим в
MSDN.


 
Виталий ©   (2010-07-21 14:19) [264]


> этого достаточно, чтобы, (почти) не заглядывая в код чужой
> функции, написать свою.

Мне, к сожалению, недостаточно. Факториал написать проще. А тут, даже если я опишу эту "дополнительную" каталоговую запись, то у меня явно возникнет еще куча вопросов, и, что самое сложное, нужно еще будет написать немаленьку обертку типа той, что описана автором и в которой я совершенно ничего не понимаю.


 
Виталий ©   (2010-07-21 14:21) [265]


> Зачем тебе ее переписывать?

дали же задание "удобочитаемо" ее переписать.

> На чем ее переписывать, укажи точное название компилятора.

У меня RAD Studio 2010. Вопрос лицензионности, прошу вас, отложите.

> Принцип будет ясен, если изучить формат хранения длинных
> имен, за этим в
> MSDN.

Есть подозрение, что он отличен от того хака, который сделан автором кода.


 
Anatoly Podgoretsky ©   (2010-07-21 14:22) [266]

> Sha  (21.07.2010 14:09:18)  [258]

Это так, но ты попробуй это на Д2010
А то что функция написана неверна, то это не является заслугой автора. Он
мог бы ее и правильно написать, хотя бы как предложено Chr(Byte(i)) или
Chr(i and 255)


 
Виталий ©   (2010-07-21 14:22) [267]


> 511<>255, но chr(511)=chr(255)

все, что за пределами типа 0..255, становится равным тому, что вернется по коду 255?


 
Anatoly Podgoretsky ©   (2010-07-21 14:23) [268]

> Виталий  (21.07.2010 14:11:19)  [259]

А что ты тогда будешь делать если встретишь в чужом коде отричательные
числа, да в том же MSDN можно встретить и то и другое.


 
Sha ©   (2010-07-21 14:25) [269]

> А тут, даже если я опишу эту "дополнительную" каталоговую запись,

А ты попробуй.


> то у меня явно возникнет еще куча вопросов

Эти вопросы будут только по букварю.

> немаленьку обертку типа той, что описана автором

С чего взял? У автора немаленькая из-за его стремления экономить на описаниях.
А у тебя должно быть просто сцепление кусков.

> и в которой я совершенно ничего не понимаю.

А нафиг тебе это понимать до написания своего кода?


 
Sha ©   (2010-07-21 14:26) [270]

> все, что за пределами типа 0..255, становится равным тому, что вернется по коду 255?

chr(256)=chr(0)


 
Виталий ©   (2010-07-21 14:28) [271]


> А что ты тогда будешь делать если встретишь в чужом коде
> отричательные
> числа, да в том же MSDN можно встретить и то и другое.

Тогда приду домой и попробую в книгах, которые мне порекомендовали здесь, найти поведение Chr, поскольку гугление ничего не дало.

> А ты попробуй.

Это я тоже попробую
Только затык с:

> С чего взял? У автора немаленькая из-за его стремления экономить
> на описаниях.
> А у тебя должно быть просто сцепление кусков.

Я имею ввиду все эти ассемблерные вставки и прочее.


 
Anatoly Podgoretsky ©   (2010-07-21 14:30) [272]

> Виталий  (21.07.2010 14:21:25)  [265]

Смею тебя огорчить, RAD не пишет программы под ДОС, а указаная программа
исключительно только под ДОС, на Виндоус она не нужна, да и замучаешься
использовать прерывания.


 
Anatoly Podgoretsky ©   (2010-07-21 14:31) [273]

> Виталий  (21.07.2010 14:22:27)  [267]

Нет CHR(Byte(256))


 
Виталий ©   (2010-07-21 14:32) [274]


> chr(256)=chr(0)

Понял. Чтобы получить равенство, нужно проводить AND с 255. Получая младшие биты, имеем равенство. Наверное, c unicode-символами и большими кодами будет как-то иначе, поскольку там может получаться 2 и более младших бит.


 
Anatoly Podgoretsky ©   (2010-07-21 14:33) [275]

> Виталий  (21.07.2010 14:28:31)  [271]

Хорошо, тогда почему ты так не поступил, да хотя бы справку посмотрел бы,
при том для старой Дельфи и для Дельфи 2009+


 
Виталий ©   (2010-07-21 14:34) [276]


> Смею тебя огорчить, RAD не пишет программы под ДОС

я догадался, но думаю, что какой-то способ написать подобное, считывая данные на низком уровне, должен быть и под Windows?


 
Sha ©   (2010-07-21 14:35) [277]

> Виталий ©   (21.07.10 14:21) [265]
> У меня RAD Studio 2010.

Тогда в этом коде используй
AnsiChr вместо Chr,
AnsiString вместо String.

> Я имею ввиду все эти ассемблерные вставки и прочее.

В функции GetUniLFN нету всех этих ассемблерные вставок и прочего.
Не хочешь писать - не морочь нам голову.
Но букварь все же лучше выучить наизусть.


 
Виталий ©   (2010-07-21 14:38) [278]


> Хорошо, тогда почему ты так не поступил, да хотя бы справку
> посмотрел бы

Нету сейчас под рукой. А гугль молчит.


 
Виталий ©   (2010-07-21 14:39) [279]


> Не хочешь писать - не морочь нам голову.

Если бы я не хотел писать и понимать, я бы не спрашивал все это. Я вижу, что в функции нету ассемблерных вставок. Но она - не вещь в себе. И ее надо будет откуда-то вызвать. А вызывается она у автора именно после всех подобных свистоплясок.


 
Sha ©   (2010-07-21 14:44) [280]

> И ее надо будет откуда-то вызвать.

Это просто учебный пример.
Напишешь подыгрывающую программу.



Страницы: 1 2 3 4 5 6 7 8 9 
10 11 12 вся ветка

Текущий архив: 2010.11.07;
Скачать: CL | DM;

Наверх




Память: 1.08 MB
Время: 0.074 c
15-1279771521
Spot
2010-07-22 08:05
2010.11.07
Не работают точки останова


2-1281510311
Fr
2010-08-11 11:05
2010.11.07
Вывод московского времени


2-1281389736
Rembo2010
2010-08-10 01:35
2010.11.07
Как считать звук с микрофона?


4-1240991885
Zalum
2009-04-29 11:58
2010.11.07
Передать работающему приложению параметры


2-1281731884
Andrey K
2010-08-14 00:38
2010.11.07
Как через родителя обратится к компоненту.