//-----------выводметки -----------
s:='';
for i:=29 to 40 do
s:=s+chr(buffer[$F+i]);
bpbList.Cells[1,19]:= s;
s:='';
//----------------------------------
//-- чтение ID ОС-------------
for i:= 55 to 62 do
s:=s+ chr(buffer[i]);
bpbList.Cells[1,20]:= s;
s:='';
//----------------------------
end
else
ShowMessage('Не удалось считать блок параметров Bios');
end;
// чтение данных из структуры DriveInfo
procedure TForm3.Button3Click(Sender: TObject);
var
i,j,k:integer;
read:Cardinal;
s:string;
buffer: array[1..131072] of byte;
begin
Memo2.Clear;
if ReadSectors(hMBRDrive,0,1,@buffer,DiscGeometry.BytesPerSector) = DiscGeometry.BytesPerSector then
begin
for i:= 1 to 16 do
Grid2.Cells[i,0]:=intToHex((i-1),1);
i:=1; j:=1; k:=1;
while k<=DiscGeometry.BytesPerSector do
begin
if i=1 then Grid2.Cells[0,j]:=IntToHex(((j-1)*16+(i-1)),3);
Grid2.Cells[i,j]:=IntToHex(Buffer[k],2);
inc(k);
inc(i);
if i>16 then
begin
i:=1;
j:=j+1;
Grid2.RowCount:= Grid2.RowCount+1;
end;
end;
// Расшифровка PartitionTable
// перваячасть
Memo2.Text:=Memo2.Text+'Первый элемент таблицы разделов системного диска: '+#13#10;
Memo2.Text:=Memo2.Text+'Признакзагрузки: '+intToHex(buffer[$1bf],2)+#13#10;
Memo2.Text:=Memo2.Text+'Начало раздела диска{';
Memo2.Text:=Memo2.Text+'Головка: '+intToStr(buffer[448]);
Memo2.Text:=Memo2.Text+' Сектор: '+intToStr(buffer[449]);
Memo2.Text:=Memo2.Text+' Цилиндр: '+intToStr(buffer[450]);
Memo2.Text:=Memo2.Text+' }'+#13#10;
Memo2.Text:=Memo2.Text+'Типраздела {';
Memo2.Text:=Memo2.Text+'Ос: '+intToStr(buffer[451]);
Memo2.Text:=Memo2.Text+' }'+#13#10;
Memo2.Text:=Memo2.Text+'Конецразделадиска{';
Memo2.Text:=Memo2.Text+'Головка: '+intToStr(buffer[$1c4]);
Memo2.Text:=Memo2.Text+' Сектор: '+intToStr(buffer[$1c5]);
Memo2.Text:=Memo2.Text+' Цилиндр: '+intToStr(buffer[$1c6]);
Memo2.Text:=Memo2.Text+' }'+#13#10;
Memo2.Text:=Memo2.Text+'НомерСектора {';
Memo2.Text:=Memo2.Text+': '+intToStr(buffer[458]shl 32+buffer[457]+buffer[456]+buffer[455]);
Memo2.Text:=Memo2.Text+' }'+#13#10;
Memo2.Text:=Memo2.Text+'Размерраздела {';
Memo2.Text:=Memo2.Text+': '+intToStr(buffer[462]shl 24 +buffer[461] shl 16 +buffer[460]shl 8+buffer[459]);
Memo2.Text:=Memo2.Text+' }'+#13#10+#13#10+#13#10;
//вторая часть
Memo2.Text:=Memo2.Text+'Второй элемент таблицы разделов системного диска: '+#13#10;
Memo2.Text:=Memo2.Text+'Признакзагрузки: '+intToHex(buffer[$1CF],2)+#13#10;
Memo2.Text:=Memo2.Text+'Начало раздела диска{';
Memo2.Text:=Memo2.Text+'Головка: '+intToStr(buffer[465]);
Memo2.Text:=Memo2.Text+' Сектор: '+intToStr(buffer[466]);
Memo2.Text:=Memo2.Text+' Цилиндр: '+intToStr(buffer[467]);
Memo2.Text:=Memo2.Text+' }'+#13#10;
Memo2.Text:=Memo2.Text+'Типраздела {';
Memo2.Text:=Memo2.Text+'Ос: '+intToStr(buffer[468]);
Memo2.Text:=Memo2.Text+' }'+#13#10;
Memo2.Text:=Memo2.Text+'Конецразделадиска{';
Memo2.Text:=Memo2.Text+'Головка: '+intToStr(buffer[469]);
Memo2.Text:=Memo2.Text+' Сектор: '+intToStr(buffer[470]);
Memo2.Text:=Memo2.Text+' Цилиндр: '+intToStr(buffer[471]);
Memo2.Text:=Memo2.Text+' }'+#13#10;
Memo2.Text:=Memo2.Text+'НомерСектора {';
Memo2.Text:=Memo2.Text+': '+intToStr(buffer[$1D7+3]shl 24+buffer[$1D7+2] shl 16+buffer[$1D7+1]shl 8 +buffer[$1D7]);
Memo2.Text:=Memo2.Text+' }'+#13#10;
Memo2.Text:=Memo2.Text+'Размерраздела {';
Memo2.Text:=Memo2.Text+': '+intToStr(buffer[$1db+3]shl 24 +buffer[$11db+2] shl 16 +buffer[$1db+1]shl 8+buffer[$1db]);
Memo2.Text:=Memo2.Text+' }'+#13#10+#13#10+#13#10;
end
else
ShowMessage('Неудалосьсчитать PartitionTable');
end;
// получение инфо о нужных дисках
procedure TForm3.FormActivate(Sender: TObject);
var
S,SOut : String;
i:Integer;
VolumeName,FileSystemName,NewDiscNumber : String;
MaxComponentLength,FileSystemFlags:LongWord;
// отпеременной VolumeSerialNo : DWord;
begin
S:=GetDisks(DiskHDD); {ПолучаемсписокЖёсткихдисков (Параметр DiskHDD)}
s:=s+GetDisks(DiskFDD);
s:=s+GetDisks(DiskNet);
s:=s+GetDisks(DiskCDROM);
s:=s+GetDisks(DiskRAM);
SOut:='';
For i:=1 to Length(S) do {Получаем информацию о всех дисках и пишем в TLabel на форме}
begin
{Если диск существует/вставлен ...}
if GetHDDInfo(S[I], VolumeName, FileSystemName,NewDiscNumber,
MaxComponentLength, FileSystemFlags) then {... тогдасобираеминформацию}
SOut:=SOut+
'Диск: '+S[I]+#13#10+
'Метка: '+VolumeName+#13#10+
'Файловаясистема: '+FileSystemName+#13+#10+
'Серийныйномер: '+NewDiscNumber+#13+#10+
'Макс. длинаименифайла: '+IntToStr(MaxComponentLength)+#13+#10+
'Flags: '+IntToHex(FileSystemFlags,4)+#13#10+#13#10;
end;
Disks.Caption:=SOut; {Выводим в компонент TLabel полученные данные о дисках}
end;
end.
5) Модуль ThrdRcvr (модуль описывающий работу потока – приёмника сообщений):
unit ThrdRcvr; // принимающийпоток
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,StdCtrls, Buttons, Menus, ComCtrls, ActnMan, ActnColorMaps;
type
TThreadReceiver = class(TThread)
private
PBaseAdress:PChar;
TextString:String;
nlineSize:integer;
protected
procedure Execute; override;
public
end;
implementation
uses
Unit1;
// Считываем соержимое из проекции файла в Memo1
procedure TThreadReceiver.Execute;
begin
while (not terminated) do
begin
WaitForSingleObject(Form1.HEvent, INFINITE);
ResetEvent(Form1.HEvent);
try
// резерв. память в потоке для этотой проекции
PBaseAdress:=MapViewOfFile(Form1.HFileSender, FILE_MAP_READ,0,0,65536);
if (PBaseAdress = nil) then
begin
CloseHandle(Form1.HFileSender);
st:='не удалось отобразить файл на адресное пространство';
Application.MessageBox(st,'Сообщение...',MB_OK);
form1.BitBtn2.Visible:=false;
form1.Button1.Visible:=false;
exit;
end;
nlineSize:=integer(PBaseAdress^);
SetLength(TextString,nlineSize);
CopyMemory(PChar(TextString),Pointer(Integer(PBaseAdress)+4),nlineSize);
Form1.Memo1.Text:=Form1.Memo1.Text+'---------'+#13#10;
Form1.Memo1.Text:=Form1.Memo1.Text+TextString+#13#10;
sendmessage(Form1.memo1.handle, em_linescroll, 0, Form1.memo1.lines.count-1);
UnmapViewOfFile(PBaseAdress);
finally
end;
end;
end;
end.
6) Модуль HDDInfo (модуль получающий информацию о жёстких дисках):
unit HDDInfo;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, FileCtrl, ExtCtrls, Grids, ValEdit;
const {Константыдля TypeOfDisk функции GetDisks}DiskUnknown=0; {Неизвестныедиски}
DiskNone=1; {Отсутствующиедиски}
DiskFDD=DRIVE_REMOVABLE; {Съёмныедиски, дискеты}
DiskHDD=DRIVE_FIXED; {Несъёиныедиски, жёсткиедиски}
DiskNet=DRIVE_REMOTE; {Сетевыедиски}
DiskCDROM=DRIVE_CDROM; {CD ROM}
DiskRAM=DRIVE_RAMDISK; {ДискивОЗУ}
function GetDisks(TypeOfDisk : Word) : String;
function GetHDDInfo(Disk : Char;Var VolumeName, FileSystemName,NewDiscNumber : String;
MaxComponentLength, FileSystemFlags:LongWord) : Boolean;
implementation
//получитьименадоступныхдисков
function GetDisks(TypeOfDisk : Word) : String;{Получитьименанужныхдисков}
var
DriveArray : array[1..26] of Char;
i:integer;
beginDriveArray:='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
for i:= 1 to 26 do
if GetDriveType(PChar(DriveArray[I]+':\')) = TypeOfDisk then
Result := Result+DriveArray[I];
end;
// определениеправильногосерийногономерадиска
function GetReplaceCDNumber(num: String): String;
var
i, len: Integer;
begin
Result:= '';
len:= Length(num);
if len <> 8 then exit;
for i:= 1 to (len div 2) do begin
Dec(len);
Result:= Result + num[len];
Result:= Result + num[len+1];
Dec(len);
end;
end;
// получить инфо о дисках с нужными именами
function GetHDDInfo(Disk : Char;Var VolumeName, FileSystemName,NewDiscNumber : String;
MaxComponentLength, FileSystemFlags:LongWord) : Boolean;
var
_VolumeName,_FileSystemName:array [0..MAX_PATH-1] of Char;
_VolumeSerialNo,_MaxComponentLength,_FileSystemFlags:LongWord;
_NewDiscNumber:string;
begin
if GetVolumeInformation(PChar(Disk+':\'),_VolumeName,MAX_PATH,@_VolumeSerialNo,
_MaxComponentLength,_FileSystemFlags,_FileSystemName,MAX_PATH) then
begin
NewDiscNumber:=IntToHex(integer(_VolumeSerialNo),8);
NewDiscNumber:=GetReplaceCDNumber(NewDiscNumber);
VolumeName:=_VolumeName;
MaxComponentLength:=_MaxComponentLength;
FileSystemFlags:=_FileSystemFlags;
FileSystemName:=_FileSystemName;
Result:=True;
end
else
Result:=False;
end;
end.
1) М. Фленов «Библия Delphi»
2) А. Танцер «Синхронизация процессов при работе с Windows»
3) Сайт CitForum > http://citforum.ru/programming/delphi/disk_editor/ </
4)Cайт Delphi-Faq > http://delphi-faq.zoxt.net/a79.htm <.
5) Cайт DelphiSource.