Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 01.10.2007, 20:40   #1
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,230
Восклицание Прочитать загрузочную запись

Из знаний ассемблера, матем-ие операции .Нужно приименяя Ассемблер в Дельфи получить данные с логического диска( ИСПОЛЬЗУЯ прерывание: INT 25h ). Прочитать требуется с загрузочной записи РАЗНЫХ дисков параметры из записи. Формат загрузочной записи( Смещение, Размер байт, Содержание ): 0, 3, Команда JMP ххххх - ближний переход на программу нач-ой загрузки 3, 8, название фирмы-изготовителя OC и версия 11, 25, Расширенный блок параметров BIOS 36, 1, Физический номер устройства (0-НГМД, 80h-НМД) 37, 1, Зарезервировано 38, 1, Символ "("-признак расширенной загрузочной записи 39, 4, Серийный номер диска, создан во время форматир-ия 43, 11, Метка диска 54, 8, Содержит запись "FAT12" или "FAT16", которая идентифицирует формат таблицы размещения файлов (FAT)
Alter вне форума Ответить с цитированием
Старый 01.10.2007, 21:17   #2
rpy3uH
добрый няша
СуперМодератор
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,808
По умолчанию

Цитата:
Сообщение от Alter Посмотреть сообщение
Нужно приименяя Ассемблер в Дельфи получить данные с логического диска( ИСПОЛЬЗУЯ прерывание: INT 25h ).
ЭТО НЕВОЗМОЖНО!!!!
int 25 может работать только в режиме реальных адресов либо в режиме виртуального 8086 под Windows. Режим релаьных адресов исключается так как надо использовать Delphi, а дельфийские программы могут работать только под Windows. Режим виртулаьного 8086 тоже невоможен так как это исключает возможность нормальной работы самой дельфийской программы
rpy3uH вне форума Ответить с цитированием
Старый 03.10.2007, 16:36   #3
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,230
Сообщение

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
ЭТО НЕВОЗМОЖНО!!!!
int 25 может работать только в режиме реальных адресов либо в режиме виртуального 8086 под Windows. Режим релаьных адресов исключается так как надо использовать Delphi, а дельфийские программы могут работать только под Windows. Режим виртулаьного 8086 тоже невоможен так как это исключает возможность нормальной работы самой дельфийской программы
Хорошо, тогда в Паскале записать точно возможно.Как это можно сделать на Паскале? Пример, набросок ...
Alter вне форума Ответить с цитированием
Старый 03.10.2007, 19:52   #4
rpy3uH
добрый няша
СуперМодератор
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,808
По умолчанию

первый сектор жесткого диска содержит главную загрузочную запись, в нём же содержится таблица размещения разделов (это таблица где написано расположение каждого раздела C:, D:,E:....).
Тебе надо просто считывать первый сектор жесткого диска, обработать его и вывести данные.

Последний раз редактировалось rpy3uH; 03.10.2007 в 19:59.
rpy3uH вне форума Ответить с цитированием
Старый 04.10.2007, 17:40   #5
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Цитата:
Тебе надо просто считывать первый сектор жесткого диска, обработать его и вывести данные.
Как это можно сделать? (Я тож заинтересовался)
Есть слухи что в винде ХР это сделать не получится...
zetrix вне форума Ответить с цитированием
Старый 04.10.2007, 20:16   #6
rpy3uH
добрый няша
СуперМодератор
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,808
По умолчанию

правильно в WinNT это не получится. но если запустить паскалевскую прогу из под DOS, либо из под Win9x, то получится.
Надо просто считать самый первый сектор (т.е. нулевой сектор диска) жесткого диска. В регистре cx int25 принимает количество сектором для чтения, в dx логический номер сектора т.е. 0. там ещё в al надо указать номер диска и в ds bx адрес куда копировать данные.
Как было уже сказано в WinNT это работать не будет. В WinNT надо использовать функции CreateFile и DeviceIoControl
rpy3uH вне форума Ответить с цитированием
Старый 05.10.2007, 20:22   #7
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,230
Вопрос

Весь вопрос уперается в реализацию, есть мысли как это можно сделать?
Alter вне форума Ответить с цитированием
Старый 05.10.2007, 20:57   #8
rpy3uH
добрый няша
СуперМодератор
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,808
По умолчанию

вот пример: считывает первый килобайт с жётского диска и сохраняет в файл. Я дизассемблировал файл - вроде там находится первичный загрузчик и ещё какая-то ерунда, наверно таблица размещения разделов.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  h:THandle;
  c:DWORD;
  buff:array[0..1023] of char;
begin

  h:=CreateFile(PChar('\\.\PhysicalDrive0'),GENERIC_READ,0,0,OPEN_EXISTING,0,0);
  if h=INVALID_HANDLE_VALUE then ShowMessage('net');

  if not  ReadFile(h,buff,1024,c,0) then ShowMessage('net');
  CloseHandle(h);
  h:=CreateFile(PChar('F:\file.dat'),GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0);
  WriteFile(h,buff,1024,c,0);
  CloseHandle(h);
end;
Но автору по ходу это не надо, ему наврено надо получить содержимое первого сектора системного раздела, а вот это я думаю, то что надо
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  h:THandle;
  c:DWORD;
  buff:array[0..1023] of char;
  st:pointer;
begin

  h:=CreateFile('\\.\C:',GENERIC_READ,FILE_SHARE_READ+FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
  if h=INVALID_HANDLE_VALUE then ShowMessage('îòñòîé');

  if not  ReadFile(h,buff,1024,c,0) then ShowMessage('îòñòîé');

  CloseHandle(h);
  h:=CreateFile(PChar('F:\file.dat'),GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0);
  WriteFile(h,buff,1024,c,0);
  CloseHandle(h);
end;

Последний раз редактировалось rpy3uH; 05.10.2007 в 21:04.
rpy3uH вне форума Ответить с цитированием
Старый 25.12.2007, 18:21   #9
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,230
Сообщение

Вот код программы которую хотел получить, только ненашол структуру NTFS. В программу для упрощения использованно чтение дисков типа FAT12, FAT16 (дискет). Другие типы невводились.

Последний раз редактировалось Alter; 21.02.2008 в 20:22.
Alter вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Xml, как правильно прочитать Parcenson Общие вопросы Delphi 0 02.09.2008 06:29
Где прочитать про WinApi? jurij Win Api 1 27.05.2008 13:32
прочитать что выдало CMD.exe malevich Win Api 5 03.03.2008 22:35
Как прочитать сообщение по ICQ? Иллидан Работа с сетью в Delphi 5 18.02.2008 19:33
как прочитать файл бодяга Общие вопросы Delphi 1 09.09.2007 20:37