Главная страница
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.013 c
14-19305
Свой
2002-01-17 23:40
2002.03.07
Действия эксплорера


4-19392
otari
2002-01-05 20:05
2002.03.07
помогите мне нужно код


4-19372
zUN
2002-01-08 21:07
2002.03.07
Робоформ


1-19267
Stexen
2002-02-20 15:17
2002.03.07
ФайлЫЫЫЫЫЫЫЫЫЫЫ


6-19290
kex
2001-12-19 12:05
2002.03.07
Как узнать программно свой IP?