Форум: "Начинающим";
Текущий архив: 2014.02.09;
Скачать: [xml.tar.bz2];
Внизобращение к секторам диска Найти похожие ветки
← →
SKIPtr © (2013-04-09 20:07) [0]вот искал как читать сектора на диске
поисковик в основном выводит один пример распечатаный на многих сайтах
и вот этот пример вкраце
сперва делают геометрию дискаconst
IOCTL_DISK_GET_DRIVE_GEOMETRY = $70000;
type
TDiskGeometry = packed record
Cylinders: Int64; // количество цилиндров
MediaType: DWORD; // тип носителя
TracksPerCylinder: DWORD; // дорожек на цилиндре
SectorsPerTrack: DWORD; // секторов на дорожке
BytesPerSector: DWORD; // байт в секторе
end;
Result := DeviceIoControl(hFile,IOCTL_DISK_GET_DRIVE_GEOMETRY,nil,0,
@DiskGeometry,SizeOf(TDiskGeometry),junk,nil) and (junk = SizeOf(TDiskGeometry));
потом чтение сектораfunction __Mul(a,b: DWORD; var HiDWORD: DWORD): DWORD; // Result = LoDWORD
asm
mul edx
mov [ecx],edx
end;
function ReadSectors(DriveNumber: Byte; StartingSector, SectorCount: DWORD;
Buffer: Pointer; BytesPerSector: DWORD = 512): DWORD;
var
hFile: THandle;
br,TmpLo,TmpHi: DWORD;
begin
Result := 0;
hFile := CreateFile(PChar("\\.\PhysicalDrive"+IntToStr(DriveNumber)),
GENERIC_READ,FILE_SHARE_READ,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;
ну и разбор дискаconst
PartitionTableOffset = $1be;
ExtendedPartitions = [5,$f];
var
MainExPartOffset: DWORD = 0;
function GetDriveInfo(DriveNumber: Byte; DriveInfo: PDriveInfo;
StartingSector: DWORD; BytesPerSector: DWORD = 512): Boolean;
var
buf: array of Byte;
CurExPartOffset: DWORD;
i: Integer;
begin
SetLength(buf,BytesPerSector);
// читаем сектор в буфер
if ReadSectors(DriveNumber,MainExPartOffset+StartingSector,1,@buf[0]) = 0 then
begin
Result := False;
Exit;
end;
// заполняем структуру DriveInfo.PartitionTable
Move(buf[PartitionTableOffset],DriveInfo.PartitionTable,SizeOf(TPartitionTable)) ;
Finalize(buf); // буфер больше не нужен
Result := True;
for i := 0 to 3 do // для каждой записи в Partition Table
if DriveInfo.PartitionTable[i].SystemIndicator in ExtendedPartitions then
begin
New(DriveInfo.LogicalDrives[I]);
if MainExPartOffset = 0 then
begin
MainExPartOffset := DriveInfo.PartitionTable[I].StartingSector;
CurExPartOffset := 0;
end else CurExPartOffset := DriveInfo.PartitionTable[I].StartingSector;
Result := Result and GetDriveInfo(DriveNumber,DriveInfo.LogicalDrives[I],
CurExPartOffset);
end else DriveInfo.LogicalDrives[I] := nil;
end;
так вот не понятно зачем и как получают геометрию диска
при получении геометрии есть переменая Result это значит есть фунция
так какие параметры входа и выхода в эту функцию
и дальше в тексте это не используеться
так зачем нужна геометрия
← →
Jeer © (2013-04-09 20:31) [1]>так зачем нужна геометрия
Изучать свойства геометрических фигур и находить взаимоотношения между ними и фундаментальными константами, инвариантно к оговоренной группе преобразований.
← →
Rouse_ © (2013-04-09 20:33) [2]Хм, ну тебе же нужно читать сектора с диска, а как ты их найдешь и определишь их размер, не зная геометрию диска? :)
← →
Inovet © (2013-04-09 20:38) [3]> [0] SKIPtr © (09.04.13 20:07)
> так зачем нужна геометрия
Вот ты хочешь разобрать диск. Для этого надо хотя бы знать какая форма отвётки понядобится для конкретных болтов. Можно, конечно, взять молоток и разобрать с его помощью, но назад уже не соберёшь так, как было.
← →
SKIPtr © (2013-04-09 20:54) [4]
> ну тебе же нужно читать сектора с диска, а как ты их найдешь
> и определишь их размер
а так это нужна чтоб определить длину сктора
← →
Rouse_ © (2013-04-09 21:16) [5]
> SKIPtr © (09.04.13 20:54) [4]
> а так это нужна чтоб определить длину сктора
В том числе и длину...
← →
SKIPtr © (2013-04-10 07:57) [6]да в дальнейших запросах есть переменая BytesPerSector которая отвечает за длину сектора
а что еще используеться из полученого в геометрии диска
и я думал что длина сектора фиксирована всегда 512
← →
Anatoly Podgoretsky © (2013-04-10 21:10) [7]Неправильно думал.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2014.02.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c