- •2.1. Используя данные п. 1.2 и 1.3, разработать приложение Windows для чтения произвольного сектора заданного логического диска.
- •Текст программы:
- •2.2. С помощью разработанного приложения прочитать системные структуры данных br, резервную копию br, bf_bpb, fsInfo для логического диска j: (usb-флеш-накопитель).
- •2.3. Модифицировать приложение для чтения информации о типе, расположении на диске и содержимом fat, а также содержимом секторов задаваемого кластера диска.
- •Корневой каталог и каталог s1
- •Содержимое кластера 3, каталог s2
2.1. Используя данные п. 1.2 и 1.3, разработать приложение Windows для чтения произвольного сектора заданного логического диска.
Текст программы:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids,Unit2, FileCtrl,unit3; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; StringGrid1: TStringGrid; Edit1: TEdit; Label1: TLabel; DriveComboBox1: TDriveComboBox; Button3: TButton; Button4: TButton; StringGrid2: TStringGrid; Button5: TButton; Button6: TButton; Label2: TLabel; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure FormActivate(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Edit1KeyPress(Sender: TObject; var Key: Char); procedure StringGrid1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TString8 = string[8]; TInfFat = packed record countTables:byte; // число таблиц OneFat:DWORD; // количество секторов, занимаемый одной FAT NumRoot:DWORD; // номер кластера для первого кластера корневого каталога ReservSec:word; // число резервных секторов в резервной области раздеа ActiveFAT:word; // активная FAT end; TBuf = array of byte; TBufFAT = array of DWORD; PBuf = ^TBuf; var Form1: TForm1; buf:TBuf; bufFAT: TBufFat; infFAT:TInfFat; procedure GetInformationAboutFat; implementation {$R *.dfm} function ReverseValue(val:TString8):TString8; var buf1:string[2]; i:byte; st:string[8]; begin result:=''; while length(val)<>8 do val:='0'+val; result:=val; end; function __Mul(a,b:DWORD;var HidWord:DWORD):DWORD; // REsult=LoDWORD asm mul edx mov [ecx],edx end; function ReadSectors(StartingSector,SectorCount:DWORD; buffer:Pointer;BytesPerSector:DWORD=512):DWORD; var hFile:THandle; br,TmpLo,TmpHi:DWord; begin result:=0; // hFile:=CreateFile(PChar('\\.\'+copy(form1.DriveComboBox1.Text,1,2)), GENERIC_READ, FILE_SHARE_Write,NIL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if hFile = INVALID_HANDLE_VALUE then Exit; TMpLo:=__Mul(StartingSector,BytesPerSector,TmpHi);
if SetFilePointer(hFile,TmpLo,@TmpHi,File_Begin)=TmpLo then begin SectorCount:=SectorCount*BytesPerSector; if ReadFile(hFile,Buffer^,SectorCount,br,nil) then Result:=br; end; CloseHandle(hFile); end; function GetDriveInfo(StartingSector:DWORD;countSectors:byte;BytesPerSector:DWORD=512):boolean; begin SetLength(buf,BytesPerSector); // читаем секторы в буфер if REadSectors(StartingSector,countSectors,buf)=0 then begin Result:=false; finalize(buf); exit; end; result:=true; end; function GetDriveFATInfo(StartingSector:DWORD;countSectors:byte;BytesPerSector:DWORD=512):boolean; begin SetLength(bufFat,BytesPerSector); // читаем секторы в буфер if REadSectors(StartingSector,countSectors,@bufFat[0])=0 then begin Result:=false; Finalize(bufFat); exit; end; result:=true; end; procedure TForm1.Button1Click(Sender: TObject); var i,j:integer; lx,ly:byte; begin if not GetDriveinfo(strtoint(edit1.Text),1) then begin Showmessage('Ошибка доступа к диску! Выберите другой диск.');exit;end; lx:=32; ly:=(high(buf) div 32)+1; // выводим их for i:= 1 to lx do for j:=1 to ly do begin if length(inttohex(buf[(j-1)*32+i-1],0))<>1 then form1.StringGrid1.Cells[i,j]:=inttohex(buf[(j-1)*32+i-1],0)else form1.StringGrid1.Cells[i,j]:='0'+inttohex(buf[(j-1)*32+i-1],0);
form1.StringGrid2.Cells[i-1,j-1]:=chr(buf[(j-1)*32+i-1]) end; end; procedure TForm1.FormActivate(Sender: TObject); var i:byte; begin for i:=1 to 32 do form1.StringGrid1.Cells[i,0]:=inttohex(i-1,0); for i:=1 to 16 do form1.StringGrid1.Cells[0,i]:=inttohex((i-1)*32,0); end; procedure GetInformationAboutFat; begin form2.ValueListEditor1.Strings.Clear; if not GetDriveinfo(0,1) then Showmessage('Ошибка доступа к диску! Выберите другой диск.'); // Выделяем нужную нам информацию и записываем на модальнй форме Move(buf[$10],infFAT.countTables,1); form2.ValueListEditor1.InsertRow('Число таблиц(копий) FAT(10h)',inttostr(infFAT.countTables),true); Move(buf[$24],infFAT.OneFat,4); form2.ValueListEditor1.InsertRow('Число секторов, занимаемых одной копией FAT (24h)',inttostr(infFAT.OneFat),true); Move(buf[$2c],infFAT.NumRoot,4); form2.ValueListEditor1.InsertRow('Номер кластера для первого кластера корневого каталога(2Сh)',inttostr(infFAT.NumRoot),true); Move(buf[$0E],infFAT.ReservSec,2); form2.ValueListEditor1.InsertRow('Число резервных секторов в резервной области раздела(ОЕh)',inttostr(infFAT.ReservSec),true); form2.ValueListEditor1.InsertRow('Тип FAT','FAT32',true); form2.ValueListEditor1.InsertRow('Начальный сектор FAT(1 копия)',inttostr(infFAT.ReservSec),true); form2.ValueListEditor1.InsertRow('Начальный сектор FAT(2 копия)',inttostr(infFAT.ReservSec+infFAT.OneFat),true); form2.ValueListEditor1.InsertRow('Первый сектор области данных',inttostr(infFAT.ReservSec+2*infFAT.OneFat),true); end; procedure TForm1.Button2Click(Sender: TObject); begin form1.Close; end; procedure TForm1.Button5Click(Sender: TObject); begin form1.Width:=1175; end; procedure TForm1.Button6Click(Sender: TObject); begin form1.Width:= 807; end; procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if key=#13 then form1.Button1.Click; end; procedure TForm1.StringGrid1Click(Sender: TObject); begin end; end. |