Для проекта я хотел бы вызвать MBR на первом жестком диске непосредственно из DOS. Я написал небольшую программу ассемблера, которая загружает MBR в память в 0: 7c00h, и делает большой прыжок на нее. Я поместил свою утилиту на загрузочную дискету (DOS). На диске (HD0, 0x80), который я пытаюсь загрузить, на нем установлен загрузчик TrueCrypt. Когда я запускаю инструмент в этой настройке, он отображает экран TrueCrypt, но после ввода пароля он сбрасывает систему. Когда я запускаю свою небольшую утилиту (w00t.com) на обычной машине WinXP, она, похоже, сразу падает.MBR Загрузка из DOS
Видимо, я забыл о некоторых важных вещах, которые обычно выполняет BIOS, я думаю, что это нечто тривиальное. Может ли кто-нибудь с лучшим голосом DOS и BIOS получить помощь?
Heres мой код:
.MODEL tiny
.386
_TEXT SEGMENT USE16
INCLUDE BootDefs.i
ORG 100h
start:
; http://vxheavens.com/lib/vbw05.html
; Before DOS has booted the BIOS stores the amount of usable lower memory
; in a word located at 0:413h in memory. We going to erase this value because
; we have booted dos before loading the bootsector, and dos is fat (and ugly).
; fake free memory
;push ds
;push 0
;pop ds
;mov ax, TC_BOOT_LOADER_SEGMENT/1024 * 16 + TC_BOOT_MEMORY_REQUIRED
;mov word ptr ds:[413h], ax ;ax = memory in K
;pop ds
;lea si, memory_patched_msg
;call print
;mov ax, cs
mov ax, 0
mov es, ax
; read first sector to es:7c00h (== cs:7c00)
mov dl, 80h
mov cl, 1
mov al, 1
mov bx, 7c00h ;load sector to es:bx
call read_sectors
lea si, mbr_loaded_msg
call print
lea si, jmp_to_mbr_msg
call print
;Set BIOS default values in environment
cli
mov dl, 80h ;(drive C)
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0ffffh
sti
push es
push 7c00h
retf ;Jump to MBR code at 0:7c00h
; Print string
print:
xor bx, bx
mov ah, 0eh
cld
@@: lodsb
test al, al
jz print_end
int 10h
jmp @B
print_end:
ret
; Read sectors of the first cylinder
read_sectors:
mov ch, 0 ; Cylinder
mov dh, 0 ; Head
; DL = drive number passed from BIOS
mov ah, 2
int 13h
jnc read_ok
lea si, disk_error_msg
call print
read_ok:
ret
memory_patched_msg db 'Memory patched', 13, 10, 7, 0
mbr_loaded_msg db 'MBR loaded', 13, 10, 7, 0
jmp_to_mbr_msg db 'Jumping to MBR code', 13, 10, 7, 0
disk_error_msg db 'Disk error', 13, 10, 7, 0
_TEXT ENDS
END start
Это COM-файл на самом деле, так что Whys это ORGed на 100h. Как и любой другой .com-файл. Он загружает MBR в mem, а переходы - на. Как вы можете прочитать в моем первоначальном вопросе, он действительно выполняет задание: загрузчик TrueCrypt запускается и показывает правый экран. Так загружаются и прыгают работы. Только после этого компьютер зависает. Что-то должно быть неправильно, возможно, среда настроена неправильно? – Rogier
Если этот загрузчик TrueCrypt на вашем диске фактически _expects_ является обычным файлом '.com', тогда' ORG 100h' не должно быть проблемой. В противном случае, я думаю, что это ошибка. - Во-вторых, неудивительно, что ваша программа вылетает при выполнении в Windows XP. Когда компьютер загружается первым, процессор находится в режиме реального времени (эмуляция 8086), и загрузчики ожидают этого. Как только Windows XP запустится, CPU не вернется в Реальный режим. Программы DOS могут выполняться в так называемом режиме Virtual 8086 (если я правильно помню имя), а загрузчики не будут работать в этом режиме CPU. – stakx
Нет, даже загрузка загрузчика по адресу 0: 7c00 в Windows (XP) невозможна с помощью этого utils. Вы не можете получить доступ к диску непосредственно из окон, и вы не можете просто пойти в pokin в mem. Но, пожалуйста, прочитайте в моем вопросе, что я запускаю инструмент с дискеты (изображение), то есть он работает в DOS, реальном режиме на 16 бит. Кроме того, на самом деле эта работа уже частично выполнена; запускается TC Bootloader GETS и отображается экран «Добро пожаловать в TC, введите пароль». Только после этого он сует. Ergo, в среде, которую обычно устанавливает BIOS, должно быть что-то не так. – Rogier