Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.01.09;
Скачать: [xml.tar.bz2];

Вниз

Как работать c FAT   Найти похожие ветки 

 
AddMean   (2002-09-14 00:20) [0]

Как по имени файла получить номера кластеров, занимаемых этим файлом. Хотя бы номер первого кластера и его значение. Алгоритм вычисления следующего кластера известен.


 
Сергей Медяник   (2002-09-14 10:16) [1]

Прийдется основательно изучить структуру FAT на низком уровне и самостоятельно через низкоуровневый доступ к диску организовать поиск твоего файла. Стандартного API, по-моему, для такого нет.


 
Nick N A   (2002-10-26 07:45) [2]

Структура FAT очень простая.

Начинается файл с стартового кластера.
текущий№ячейки=№стартового кластера.
@1 Если Файл весь поместился, ставится EOF в (текущий№ячейки)^
иначе записываем в ячейку (текущий№ячейки)^ следуючий номер
кластера, в котором записано продолжение FAT
присваеваем текущий№ячейки:=(текущий№ячейки)^
переходим на @1

BAD-кластер плохой
^-ссылка на значение, хранимое в таблице под данным номером
кластера 0,1 всегда заняты под FAT-id и являются константой,
различаются только для разных размеров фат(12[флоп],16,32)

для 16 таблица-массив Word, 32-LongWord,
a 12 - в каждых 3-х байтах две ячейки.

Увидеть это можно с помощью DiskEdit.exe или de.exe
(пакет Norton Utilities)
A прочесть програмно средствами Винды - на форуме много лудей ломают голову над этим вопросом.
P.S. В самом начале PartitionalTable.Раздел => BootRecord
@Fat1=PartitionalTable.Раздел+BootRecord.ReservedSectorsAtBegining
@Fat2=@Fat1+BootRecord.(Big)SectorsPerFat
@Cluster2=@Fat2+BootRecord.(Big)SectorsPerFat
@Cluster3=(BootRecord.BytesPerSector/512)+@Cluster2









 
Nick N A   (2002-10-30 03:37) [3]

Спрашивали как работать с железом, отвечаю:
{$A+,B-,D+,E+,F-,G+,I+,L+,N-,O-,P-,Q-,R-,S+,T-,V+,X+}
{$M 16384,0,655360}
Type t=array[0..511]of char;
Var xf0,xf7:word;

i,j:integer;
buff:t;
f:file of t;



Procedure TransferToBuffer;assembler;asm
mov di,offset buff;
push ds; pop es;
mov cx,256;
mov dx,$1f0;
cld;
@1:
insw;{es:di прием слов(2-байта), insb-1-байт}
loop @1;{}
end;



Procedure iohdd(Sec:byte;Track:word;Head,Total,Command:byte);
Var i:word;
Begin
port[$1f2]:=total; {1f2H Sector count. Read/Write count of sectors for operation}
port[$1f3]:=sec+1; {1f3H Sector number. Read/Write current/starting logical sector number}
port[$1f4]:=hi(track); {1f4H Cylinder high (bits 0-1 are bits 8-9 of 10-bit cylinder number)}
port[$1f5]:=lo(track); {1f5H Cylinder low (bits 0-7 of 10-bit cylinder number)}
port[$1f6]:=head; {1f6H Drive & Head. Read/Write: bits indicate head, drive for operation}
{20-read 30-write}{1f7H Write: command register (Summary: see Tech Ref for full details)}
port[$1f7]:=$70;{seek}
while (i and 16<>16)or(i>127)do i:=port[$1f7];{pause}
i:=port[$1f1];
if i<>0 then write("<<<Err:",i,">>>");
port[$1f7]:=command;
i:=0;
while i>127 do i:=port[$1f7];{pause}
i:=port[$1f1];
if i<>0 then write("<<<Err:",i,">>>");
{for i:=0 to 511 do buff[i]:=char(port[$1f0]);{}
TransferToBuffer;
end;

Begin
{port[$1f7]:=$90;{}

{ assign(f,"d:\hdd.txt");
rewrite(f);
close(f);{}
writeln;
writeln("----------------------");
i:=1;
port[$1f7]:=0;
port[$1f6]:=16;
while port[$1f7]>127 do asm hlt end;{wait }{}




port[$1f7]:=$95;
while port[$1f7]>127 do;{wait }
TransferToBuffer;
{ for j:=0 to 511 do write(buff[j]);{}
end.
{
AT Hard disk controller #1 decodes ports 1f0H through 1f7H
AT Hard disk controller #2 decodes ports 170H through 177H

Port Description
---- -----------------------------------------------------------------------
1f0H Data register. Read/write data from/to controller sector buffer
1f1H Write: Write Precompensation register. Turn on write precompensation.
Read: Error register. Contains bits for last error.
г7T6T5T4T3T2T1T0¬
¦ ¦ ¦0¦ ¦0¦ ¦ ¦ ¦
LT+T+-+T+-+T+T+T- bit
¦ ¦ ¦ ¦ ¦ L= 0: Data Address Mark not found
¦ ¦ ¦ ¦ L=== 1: Track 0 Error
¦ ¦ ¦ L===== 2: Command was aborted
¦ ¦ L========= 4: Sector ID not found
¦ L============= 6: ECC Error: Uncorrectable data error
L=============== 7: Bad block

1f2H Sector count. Read/Write count of sectors for operation
1f3H Sector number. Read/Write current/starting logical sector number
1f4H Cylinder high (bits 0-1 are bits 8-9 of 10-bit cylinder number)
1f5H Cylinder low (bits 0-7 of 10-bit cylinder number)
1f6H Drive & Head. Read/Write: bits indicate head, drive for operation
г7T6T5T4T3T2T1T0¬
¦ ¦ ¦ ¦ ¦headers¦
LT+T+T+T+T+T+T+T- bit
¦ ¦ 0..16
¦ ¦
¦ L========= 4: master/slave
L============= 6:CHS/LBA

LBAadress=heads*(2^24)+Cylinder_low*(2^16)+Cylinder_high*(2^8)+Sector_number;
LBAMax=(2^28)sectors *512bytes/sector =2^28*512 bytes = 2^18*512 kb =
=2^8*512 MB = 256*128 = 1024*32 = 32 Gbytes



1f7H Write: command register (Summary: see Tech Ref for full details)


1xH = Restore to cylinder 0 (low nibble is step rate)
7xH = Seek to cylinder (low nibble is step rate)
2xH = Read sector (low nibble indicates retry and ECC-read)
3xH = Write sector (low nibble indicates retry and ECC-read)
4xH = verify read (low nibble indicates retry)
50H = Format track

90H = diagnose
91H = set parameters (max heads,sectors) for selected drive
94H = sleep
A1H = Get string name

E0H = close
E7H = info
ECH = indentify drive (256 bytes)


1f7H Read: status register
г7T6T5T4T3T2T1T0¬
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
LT+T+T+T+T+T+T+T- bit
¦ ¦ ¦ ¦ ¦ ¦ ¦ L= 0: 1=previous command ended in an error.
¦ ¦ ¦ ¦ ¦ ¦ L=== 1: Index: set to 1 while index hole is detected
¦ ¦ ¦ ¦ ¦ L===== 2: Corrected data. Error found, but ECC fixed it.
¦ ¦ ¦ ¦ L======= 3: Data Request. Buffer is waiting for data (busy)
¦ ¦ ¦ L========= 4: Seek completed
¦ ¦ L=========== 5: Write fault
¦ L============= 6: Drive ready for read/write/seek (unless bit 4=0)
L=============== 7: Busy. 1=executing command (other bits are invalid


Источник-TeachHelp by Dan Rollins
Удачи


 
kofman   (2002-10-30 22:49) [4]

А под NT прокатит?



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2003.01.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.007 c
4-25154
__q1
2002-11-21 13:36
2003.01.09
Адресс вызвавшей функции


1-24877
dimonf
2002-12-28 11:41
2003.01.09
Как програмно вызвать OnKeyDown?


7-25108
AddMean
2002-09-14 00:20
2003.01.09
Как работать c FAT


1-24831
shane54
2002-12-26 20:48
2003.01.09
Вопрос по StringGrid


1-24856
Vlad
2002-12-27 21:07
2003.01.09
Как можно





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский