Форум: "Система";
Текущий архив: 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]А антивирус ругаться не будет???
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c