Касперски Крис
Шрифт:
Управлять дисками можно как через порты ввода/вывода, так и через BIOS. Порты намного более могущественны и интересны, однако BIOS программируется намного проще, к тому же она поддерживает большое количество разнокалиберных накопителей, абстрагируясь от конструктивных особенностей каждой конкретной модели. Поэтому будем действовать через нее, а точнее, через интерфейс прерывания
Попробуем прочитать сектор с диска в режиме CHS. Действовать нужно из самой MBR или из "голой" MS-DOS, иначе у нас ничего не получится, ведь Windows NT блокирует прямой доступ к диску даже из режима эмуляции MS-DOS.
Номер функции заносится в регистр
Код этой программы на языке ассемблера представлен в листинге 5.6.
Листинг 5.6. Код, считывающий загрузочный сектор или расширенную таблицу разделов
Запись сектора в режиме CHS происходит практически точно так же, только регистр
Чтение сектора осуществляется функцией
Таблица 5.4. Формат адресного пакета, используемый для чтения и записи секторов в режиме LBA
Смещение | Тип | Описание |
---|---|---|
00h | BYTE | Размер пакета — 10h или 18h |
01h | BYTE | Поле зарезервировано и должно быть равно нулю |
02h | WORD | Сколько секторов читать |
04h | DWORD | 32-разрядный адрес буфера-приемника в формате seg:offs |
08h | QWORD | Стартовый номер сектора для чтения |
10h | QWORD | 64-разрядный плоский адрес буфера-приемника. Используется только в случае, если 32-разрядный адрес равен FFFF:FFFF |
Код, читающий сектор в режиме LBA, в общем случае выглядит так, как показано в листинге 5.7.
Листинг 5.7. Код, осуществляющий чтение сектора с диска в режиме LBA