Мое почтение всем. Еще пара вопросов про загрузку. Мне необходимо выполнить некоторые действия до передачи управления загр. сектору Win. Для этого я использую свой FAT загрузчик, который читает файл из корн. каталога, загружает его и передает ему управление. Файл (LDR), в свою очередь выплняет нужные действия, затем читает первый сектор загрузочного раздела Win в адрес 0x7C00, и передает ему управление. LDR находится на разделе №2, Win на №1. Как я понял, NTLDR определяет номер раздела, с которого он был загружен, перечитывая MBR. В MBR у меня находится загрузчик от BSD, который устанавливает активным тот раздел, с которого была выбрана загрузка. Поэтому, в LDR приходится менять MBR прописывая признак активности разделу №1. Но Win при этом все равно отказывается загружаться -- доходит до логина, но не выполняет вход в систему. При этом, на разделе №2 появляются каталоги program files & System Volume Info. Т.е. получается, что Win все равно думает, что грузится с раздела №2... Но как она об этом догадывается? Что я не учел? Заранее благодарен. Oops... Промахнулся форумом . Модераторы, перекиньте, пожалуйста, в WASM.Win...
Так, похоже, кое-что пряснилось. Упростил сейчас код в LDR -- он просто передает управление загрузчику от Win. Удалось загрузиться, посмотрел, активный раздел -- раздел №2. Т.е. код, как буд-то не записал изменения на диск. В чем м.б. причина?.. Код (Text): ;Код загружается по адресу 0x1000:0 mov ax, 0x1000 mov ds, ax mov ah, 0x42 mov dl, 0x80 mov si, packet mov [disk_addr], dword 0x0 int 0x13 ;читаем MBR по адресу 0x0:0x7C00 jc .error mov [es:0x7DBE], byte 0x80 ;ставим меняем признак активности для раздела №1 mov [es:0x7DCE], byte 0x0 ;удаляем признак активности для раздела №2 mov ah, 0x43 mov dl, 0x80 mov si, packet int 0x13 ;записываем изменения. (Записи как буд-то не происходит...) mov ah, 0x42 ;прочитаем загр. сектор Win mov dl, 0x80 mov si, packet mov [disk_addr], dword 0x000816E1 ;это смещение на первый сектор раздела, где живет Win. int 0x13 jc .error jmp 0x0:0x7C00 .error: ;просто выведем символ, в случае ошибки mov al, 0x21 mov bx, 0x7 mov ah, 0xE int 0x10 jmp $ packet: dd 0x00010010 dd 0x00007C00 disk_addr: dd 0x00000000 dd 0x00000000 Тему, похоже, переносить не надо .
На входе загрузчик получает: cs:ip = 0000:7C00 dl = Boot Drive Думаю ты dl не передаёшь Win загрузчику. Ну и ещё рекомендуют делать до 3 попыток чтения в случае ошибки. Но это для CHS BIOS, для EDD (LBA) BIOS про это нигде не встречал, но попробуй - вдруг поможет.