Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
2 / 2 / 0
Регистрация: 10.04.2016
Сообщений: 71
1

Считывание MBR жесткого диска

30.09.2019, 22:15. Показов 2058. Ответов 3

Author24 — интернет-сервис помощи студентам
Почитал тут одну статью http://www.realcoding.net/article/view/4241
Ради эксперимента решил написать прогу, которая считывает MBR и таблицы разделов. Однако, почему то функция ReadFile ничего не считывает. Привожу код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TForm1.FormShow(Sender: TObject);
var
 i: integer;
 br: DWORD;
 buf: array of byte;
 countBuf: DWORD;
begin
  Drive := 0;
  countBuf := 447;
  hDisk := CreateFile(PChar('\\.\PHYSICALDRIVE0'),
    GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);
  if hDisk_ = INVALID_HANDLE_VALUE then Exit;
  ResDefDisk := DeviceIoControl(hDisk,IOCTL_DISK_GET_DRIVE_GEOMETRY,nil,0,
    @DiskGeometry,SizeOf(TDiskGeometry),junk,nil) and (junk = SizeOf(TDiskGeometry));
  Memo1.Lines.Add('Кол-во цилиндров: '+inttostr(DiskGeometry.Cylinders));
  Memo1.Lines.Add('Тип носителя: '+inttostr(DiskGeometry.MediaType));
  Memo1.Lines.Add('Дорожек на цилиндре: '+inttostr(DiskGeometry.TracksPerCylinder));
  Memo1.Lines.Add('Cекторов на дорожке: '+inttostr(DiskGeometry.SectorsPerTrack));
  Memo1.Lines.Add('Байт в секторе: '+inttostr(DiskGeometry.BytesPerSector));
  //считываем MBR расположенный с 0 по 446 байт нулевого сектора
  SetLength(buf,447);
  if ReadFile(hDisk,buf[0],447,br,nil) then  //НЕ РАБОТАЕТ
  ShowMEssage('Успешно');
  // FileRead(hDisk,buf,447); // ЭТО ФУНКЦИЯ НАДСТРОЙКА НАД WinAPI в DELPHI тоже не работает
end;
В чем может быть проблема?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.09.2019, 22:15
Ответы с готовыми решениями:

Выполнить проверку жесткого диска через Delphi
Доброго времени суток господа! У меня возникла проблема. Делал программу для анализа и диагностики...

Прога для определения модели жесткого диска
Здравствуйте! Возможно ли как нибудь реализовать программу для определения модели жесткого диска,...

MBR и прочие радости жёсткого диска
Всем привет! Возникло несколько вопросов, но смежных (про геометрию жёстких дисков и загрузочные...

Вероятно, повредил MBR жёсткого диска
Испортился жёсткий диск MAXTOR STM3500320AS. При загрузке компьютер зависает на шаге инициализации...

3
Модератор
9261 / 6039 / 2379
Регистрация: 21.01.2014
Сообщений: 25,803
Записей в блоге: 3
01.10.2019, 08:35 2
Первое, что бросилось в глаза: что такое Disk и hDisk? Какого они типа, где они описаны, где и чем инициализируются?
0
2 / 2 / 0
Регистрация: 10.04.2016
Сообщений: 71
01.10.2019, 08:55  [ТС] 3
hDisk - это обычный хендл.
Delphi
1
hDisk: THandle;
До 22 строчки все работает. Скрин прилагаю. Не происходит считывание данных ReadFile возвращает false, при этом без ошибки - программа выполняется, просто данные не считываются. Пробовал подключать другой жесткий, такая же ситуация. Имя диска отличается только единицей в конце "\\.\PHYSICALDRIVE1". Приводу код, чтобы было понятней
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
type
  TDiskGeometry = packed record
  Cylinders: Int64;           // количество цилиндров
  MediaType: DWORD;           // тип носителя
  TracksPerCylinder: DWORD;   // дорожек на цилиндре
  SectorsPerTrack: DWORD;     // секторов на дорожке
  BytesPerSector: DWORD;      // байт в секторе
  end;
 
procedure TForm1.FormShow(Sender: TObject);
var
 i: integer;
 br: DWORD;
 buf: array of byte;
 countBuf: DWORD;
 str: string;
 res: cardinal;
 ResDefDisk: boolean;
 junk: DWORD;
 DiskGeometry: TDiskGeometry;
 hDisk: THandle;
begin
  str := '';
  //Drive := 0;
  countBuf := 447; //только MBR, таблица разделов пока не нужна
  hDisk := CreateFile(PChar('\\.\PHYSICALDRIVE0'),
  GENERIC_READ, FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  if hDisk = INVALID_HANDLE_VALUE then Exit;
  ResDefDisk := DeviceIoControl(hDisk,IOCTL_DISK_GET_DRIVE_GEOMETRY,nil,0,
    @DiskGeometry,SizeOf(TDiskGeometry),junk,nil) and (junk = SizeOf(TDiskGeometry));
  Memo1.Lines.Add('Кол-во цилиндров: '+inttostr(DiskGeometry.Cylinders));
  Memo1.Lines.Add('Тип носителя: '+inttostr(DiskGeometry.MediaType));
  Memo1.Lines.Add('Дорожек на цилиндре: '+inttostr(DiskGeometry.TracksPerCylinder));
  Memo1.Lines.Add('Cекторов на дорожке: '+inttostr(DiskGeometry.SectorsPerTrack));
  Memo1.Lines.Add('Байт в секторе: '+inttostr(DiskGeometry.BytesPerSector));
  SetLength(buf,447);
  //Так-то устанавливать указатель не нужно, потому что при открытии (создании) файла (диска)
  //указатель позиционируется на первый байт
  res := SetFIlePointer(hDisk, DiskGeometry.BytesPerSector,nil, FILE_BEGIN);
  if ReadFile(hDisk,buf[0],Length(buf),br,nil) then
  ShowMEssage('Успешно');
  for I := 0 to 446 do begin
    str := str + inttohex(buf[i],2); //в buf по прежнему нули
  end;
 // FileRead(hDisk_,buf,447);  ТОЖЕ НЕ РАБОТАЕТ
  Memo2.Lines.Add(str)
end;
Миниатюры
Считывание MBR жесткого диска  
0
2 / 2 / 0
Регистрация: 10.04.2016
Сообщений: 71
01.10.2019, 18:40  [ТС] 4
Нашел ответ на англоязычном форуме. Оказывается с Windows Vista и Windows Server 2008 введено ограничение. Как я понял загрузочная область MBR и таблицы разделов находятся вне контроля файловой системы, поэтому, чтобы исключить могущие возникнуть коллизии, доступ к этим разделам запрещен. Проверил на Windows XP, программа также не работает. Странно.

Добавлено через 1 час 17 минут
Пробовал удалять раздел, не помогло. Все равно не считывает данные

Добавлено через 36 минут
Нашел одну ошибку. Оказывается размер буфера, в который считываются данные, должен быть кратным размеру сектора в байтах. В этом случае функция ReadFile возвращает TRUE. Однако, вместо данных опять сплошные нули.

Добавлено через 35 минут
Нашел прогу ReadMBr, программа работает все считывает. Я думал, что может быть это нельзя в принципе сейчас сделать (может быть из-за обновления очередного). Оказалось, что реализовать можно. Осталось выяснить как
0
01.10.2019, 18:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.10.2019, 18:40
Помогаю со студенческими работами здесь

DOS виснет на int 13h при чтении MBR жесткого диска
читаю MBR жесткого диска, досю гружу с флешки, как доходит до инт 13 - встает. masm .model small...

Можно ли восстановить файлы после изменения таблицы раздела жёсткого диска с MBR в GPT?
Можно ли восстановить файлы, после изменения таблицы раздела жёсткого диска с MBR в GPT? При...

Ремонт логической "части" жёсткого диска, перезапись MBR и восстановление Partition Table
Здравствуйте! Тема, созданная мною, не нова, и я это прекрасно понимаю. По-этому, хочу сразу...

Victoria 5. отключил MBR OFF, после повторного включения MBR ON и перегрузки остается MBR OFF. В системе - unlocated
Приветствую Вас :) Такая беда: - работаю с идешкой PHPStorm. После одной запары стала...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru