Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.02.09;
Скачать: CL | DM;

Вниз

обращение к секторам диска   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.006 c
3-1295188339
NightVamp
2011-01-16 17:32
2014.02.09
Использование COUNT в отчёте QReports


15-1377428204
ProgRAMmer Dimonych
2013-08-25 14:56
2014.02.09
Коэффициент грузовика или как-то иначе?


15-1377405567
Кирюха
2013-08-25 08:39
2014.02.09
Тяжело запилить свою БД?


11-1249636129
Dy1
2009-08-07 13:08
2014.02.09
OnPaint


11-1249461142
Jon
2009-08-05 12:32
2014.02.09
OnClick Perform Message