Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет машки.doc
Скачиваний:
15
Добавлен:
15.04.2015
Размер:
499.71 Кб
Скачать

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.