Форум: "Система";
Текущий архив: 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