Еще раз про загрузку Win.

Тема в разделе "WASM.ASSEMBLER", создана пользователем Mika0x65, 25 окт 2006.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Мое почтение всем.

    Еще пара вопросов про загрузку. Мне необходимо выполнить некоторые действия до передачи управления загр. сектору 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... Промахнулся форумом :dntknw:. Модераторы, перекиньте, пожалуйста, в WASM.Win...
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Так, похоже, кое-что пряснилось. Упростил сейчас код в LDR -- он просто передает управление загрузчику от Win. Удалось загрузиться, посмотрел, активный раздел -- раздел №2. Т.е. код, как буд-то не записал изменения на диск. В чем м.б. причина?..

    Код (Text):
    1. ;Код загружается по адресу 0x1000:0
    2.  
    3.  mov ax, 0x1000
    4.  mov ds, ax
    5.  
    6.  mov ah, 0x42
    7.  mov dl, 0x80
    8.  mov si, packet
    9.  mov [disk_addr], dword 0x0
    10.  int 0x13                              ;читаем MBR по адресу 0x0:0x7C00
    11.  jc .error
    12.  mov [es:0x7DBE], byte 0x80            ;ставим меняем признак активности для раздела №1
    13.  mov [es:0x7DCE], byte 0x0             ;удаляем признак активности для раздела №2
    14.  mov ah, 0x43
    15.  mov dl, 0x80
    16.  mov si, packet
    17.  int 0x13                              ;записываем изменения. (Записи как буд-то не происходит...)
    18.  
    19.  mov ah, 0x42                          ;прочитаем загр. сектор Win
    20.  mov dl, 0x80
    21.  mov si, packet
    22.  mov [disk_addr], dword 0x000816E1     ;это смещение на первый сектор раздела, где живет Win.
    23.  int 0x13
    24.  jc .error
    25.  
    26.  jmp 0x0:0x7C00
    27.  
    28. .error:                                ;просто выведем символ, в случае ошибки
    29.  mov al, 0x21
    30.  mov bx, 0x7
    31.  mov ah, 0xE
    32.  int 0x10
    33.  jmp $
    34.  
    35. packet:
    36. dd 0x00010010
    37. dd 0x00007C00
    38. disk_addr:
    39. dd 0x00000000
    40. dd 0x00000000
    Тему, похоже, переносить не надо :).
     
  3. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    На входе загрузчик получает:
    cs:ip = 0000:7C00
    dl = Boot Drive
    Думаю ты dl не передаёшь Win загрузчику.
    Ну и ещё рекомендуют делать до 3 попыток чтения в случае ошибки.
    Но это для CHS BIOS, для EDD (LBA) BIOS про это нигде не встречал, но попробуй - вдруг поможет.