Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.07;
Скачать: CL | DM;

Вниз

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

 
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]

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



Страницы: 1 вся ветка

Текущий архив: 2002.03.07;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.015 c
4-19376
DrDrew
2002-01-09 01:09
2002.03.07
Программа перехватчик Сообщений и Ответов на них


7-19366
alex16
2001-12-01 06:12
2002.03.07
win 2000


1-19123
Andreyka
2002-02-20 19:58
2002.03.07
Вопросец про кнопки


1-19200
MK
2002-02-16 18:28
2002.03.07
Форма на весь экран


14-19347
mart
2002-01-19 03:14
2002.03.07
Билль о правах личности.