Код (Text): ; Пример 9.2. Чтение и сохранение в файле главного загрузчика жесткого диска text segment assume cs:text, DS:data begin: mov AX,data mov DS,AX ;Чтение главного загрузчика mov AH,02h ;(1) Функция чтения секторов mov AL,1 ;(2) Прочитаем 1 сектор mov CH,0 ;(3) Номер цилиндра mov CL,1 ;(4) Номер сектора mov DH,0 ;(5) Номер поверхности mov DL,80h ;(6) Код жесткого диска mov BX, offset mboot; Буфер для прочитанного int 13h ;(7) Переход в BIOS ; Создадим файл для сохранения прочитанного mov AH,3Ch ;(8) Функция DOS создания файла mov CX,0 ;(9) Файл будет без атрибутов mov DX,offset fname ;(10) Смещение имени файла int 21h ;(11) Переход в DOS mov BX,AX ;(12) Сохраним в BX дескриптор файла ; Запишем в файл данные из буфера mboot mov AH,40h ;(13) Функция записи в файл mov CX,512 ;(14) Число выводимых байтов mov DX, offset mboot;(15) Смещение буфера int 21h ;(16) Переход в DOS data segment mboot db 512 dup(0) ; fname db 'mboot.dat',0 ; data ends stk segment stack db 256 dup(0) stk ends end begin Хотелось бы получить ответ на интересные для меня вопросы 1) Почему это код выкидывает с ошибкой- доступ в винту закрыт 2) Что нужно сделать чтобы получить доступ к винту 3) Винда обращается к такой же функции BIOS при работе или она использует для этого порты в/в. 4) Как ещё программно можно управлять винтом не черз BIOS номер 13
1. Потому что под windows нельзя получить доступ к загрузочному сектору жесткого диска. К дискете - без проблем. 2. Запустить программу под чистым ДОСом, например, с дискеты.
Запускать досовские программы под досом, а не под виндовым эмулятором. Порты. Биос не используется (почти, вроде). Написать код под винду, а не под дос
ajak Берешь дискету, создаешь загрузочный диск MS-DOS, (правой кнопкой на значке дискеты в проводнике). потом записываешь на него свою программу, загружаешься с него.
Ну из под винды можно работать с дисками как с файлами....Открыл/записал/закрыл...Правда Виста и 7-ка уже закрыли ету возможность,но ХРю на 3-м паке нормально пишет куда надо. Код (Text): WCHAR Name[] = L"\\\\.\\C:"; // вроде так нужно путь указать DWORD RetLen; Buffer = (PWORD)malloc( 32*1024 ); // сюда пишем что записать то хочем на диск hFile =CreateFile( Name, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, 0); WriteFile( hFile, Buffer, 32*1024, &RetLen, NULL ); CloseHandle( hFile );