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

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

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

Студворк — интернет-сервис помощи студентам
Почитал тут одну статью 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.09.2019, 22:15
Ответы с готовыми решениями:

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

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

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

3
Модератор
 Аватар для D1973
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,424
Записей в блоге: 3
01.10.2019, 08:35
Первое, что бросилось в глаза: что такое Disk и hDisk? Какого они типа, где они описаны, где и чем инициализируются?
0
2 / 2 / 0
Регистрация: 10.04.2016
Сообщений: 73
01.10.2019, 08:55  [ТС]
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
Сообщений: 73
01.10.2019, 18:40  [ТС]
Нашел ответ на англоязычном форуме. Оказывается с Windows Vista и Windows Server 2008 введено ограничение. Как я понял загрузочная область MBR и таблицы разделов находятся вне контроля файловой системы, поэтому, чтобы исключить могущие возникнуть коллизии, доступ к этим разделам запрещен. Проверил на Windows XP, программа также не работает. Странно.

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

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

Добавлено через 35 минут
Нашел прогу ReadMBr, программа работает все считывает. Я думал, что может быть это нельзя в принципе сейчас сделать (может быть из-за обновления очередного). Оказалось, что реализовать можно. Осталось выяснить как
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.10.2019, 18:40
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru