Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1365109635
noname_06
2013-04-05 01:07
2014.02.09
Ищу примеры использования Сhromium Еmbedded Framework


8-1233922362
DesWind
2009-02-06 15:12
2014.02.09
Выделение полезного сигнала


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


2-1364804378
dmitry87
2013-04-01 12:19
2014.02.09
работа с sqlite в xe3


15-1377514696
istok
2013-08-26 14:58
2014.02.09
ищем системного программиста...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский