Форум: "Система";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];




Вниз

Запись на первый сектор 


Neox   (2001-12-01 20:26) [0]

Как записать данные на первый физический сектор дискеты? (boot sector)

Заранее благодарен.



Кострюков Сергей   (2001-12-02 22:45) [1]

А в Win32 вот как:

ПРЕДИСЛОВИЕ
-----------
В ОС MS-DOS для прямого доступа к диску существовало 3 пути:
- через порты ввода-вывода (низкий уровень)
- через функции ROM BIOS (самый оптимальный)
- через функции MS-DOS
Но в Windows к портам ввода-вывода и к ROM BIOS путь закрыт, да и функции такой не имеется, но зато в Win32 появился драйвер (WINDOWS\SYSTEM\VWIN32.VXD), с помощью которого можно использовать некоторые функции BIOS и DOS и с помощью его возможен доступ к дискам.

ПРЕДОСТЕРИЖЕНИЕ
---------------
1. В Win16 такого драйвера нет
2. В WinNT из-за соображений безопасности такая возможность отключена (зато если в WinNT иметь нужные права доступа, то возможен доступ к секторам диска, как к обычному файлу*)
3. Достучаться до сектора винчестера мне так и не удалось, что-то не работает. Можно только до секторов дискет.

ХОД ДЕЙСТВИЙ
------------
1. Создаем дескриптор на драйвер

var
hDevice: THandle;
...
hDevice := CreateFile("\\.\VWIN32", 0, 0, nil, 0, 0, 0);


2. Работаем с секторами
Для этого используется функция DeviceIoControl:

function DeviceIoControl(hDevice: THandle; // Дескриптор к драйверу
dwIoControlCode: DWORD; // Номер функции
lpInBuffer: Pointer; // Буффер для вх. параметров
nInBufferSize: DWORD; // Размер буффера
lpOutBuffer: Pointer; // Буффер для вых. параметров
nOutBufferSize: DWORD; // Размер буффера
var lpBytesReturned: DWORD;
lpOverlapped: POverlapped): BOOL; stdcall;

lpBytesReturned и lpOverlapped у нас не используются

Номера функций
--------------
2 - чтение сектора с диска (вызов ДОС-прерывания $25)
3 - запись сектора на диск (вызов ДОС-прерывания $25)
4 - работа с секторами (вызов прерывания ROM BIOS $13)

Буффер
------
Так как этот драйвер вызывает прерывания, то параметры задаются в этой записи-буффере:

type
TRegs = record
reg_EBX: LongWord;
reg_EDX: LongWord;
reg_ECX: LongWord;
reg_EAX: LongWord;
reg_EDI: LongWord;
reg_ESI: LongWord;
reg_Flags: LongWord;
end;

Данную запись следует описать в коде вашей программы!

Как это работает
----------------
Работает это так: вы заносите в запись значения регистров и вызываете функцию с этой записью в виде буффера; функция устанавливает регистры по содержимому записи и вызывает прерывание, а потом в эту же запись заносит значения регистров после выполнения прерывания.

Пример
------

var
Regs: TRegs;
cb: Cardinal;

...

begin
... Устанавливаем значения регистров ...
Regs.regEAX ...

// Вызываем функцию
Result := DeviceIoControl(hDevice, 4,
Regs, SizeOf(Regs), Regs, SizeOf(Regs), cb, 0);

... Анализируем результат по значениям регистров
if (Regs.regEAX ...
end;


3. Уничтожаем дескриптор

CloseHandle(hDevice);

-----------
* - смотрите описание функции CreateFile
Литература: Hepl-файл MS SDK Programmer"s Guide to Windows 95 (поставляется с Delphi).
Про значения регистров читайте в книгах П.Нортона или в любом учебнике по ассемблеру.
Используя эту функцию так же можно форматировать и проверять поверхность (как ScanDisk) диска.
Видимо в ближайшее время я про это подробную статью напишу!



Neox   (2001-12-02 23:59) [2]

THANKS!



Pat   (2001-12-03 21:03) [3]

А антивирус ругаться не будет???




Форум: "Система";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.042 c
1-19126           Дремучий              2002-02-20 11:27  2002.03.07  
Удалить коментарии!


1-19177           1g0r                  2002-02-21 19:06  2002.03.07  
Ошибка ~Control has no parent window~ помогите разобраться почему


14-19306          Delirium              2002-01-17 18:42  2002.03.07  
Кто сколько часов в день работает?


4-19391           Renard                2002-01-11 07:57  2002.03.07  
Можно ли взять текстовую строку из чужего ListBox a?


1-19146           lightix               2002-02-21 12:06  2002.03.07  
Как передать параметр в программу ?