Pour un projet, je voudrais appeler le MBR sur le premier disque dur directement à partir de DOS. J'ai écrit un petit programme assembleur qui charge le MBR en mémoire à 0: 7c00h et fait un saut lointain. J'ai mis mon util sur une disquette bootable (DOS). Le disque (HD0, 0x80) que j'essaie de démarrer contient un chargeur de démarrage TrueCrypt. Lorsque je lance l'outil dans cette configuration, il affiche l'écran TrueCrypt, mais après avoir entré le mot de passe, il plante le système. Quand je lance ma petite utlility (w00t.com) sur une machine WinXP normale, elle semble se briser immédiatement.Démarrage MBR à partir du DOS
Apparemment, j'oublie certaines choses cruciales que le BIOS fait normalement, je suppose que c'est quelque chose de trivial. Est-ce que quelqu'un avec une meilleure expérience en DOS et BIOS peut m'aider?
Heres mon code:
.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
Il est un fichier COM en effet, si c'est pourquoi il est ORGed à 100h. Tout comme n'importe quel autre fichier .com. Il charge le MBR à mem et saute à est. Comme vous pouvez le lire dans ma question initiale, il fait le travail: le chargeur de démarrage TrueCrypt démarre et affiche le bon écran. Donc, le chargement et le saut fonctionne. Seulement après cela, l'ordinateur se fige. Quelque chose doit être faux, peut-être que l'environnement n'est pas réglé correctement? – Rogier
Si le chargeur de démarrage TrueCrypt sur votre disque _expecte_ un fichier '.com' normal, alors le' ORG 100h' ne devrait pas poser de problème. Sinon, je pense que c'est une erreur. - Deuxièmement, il n'est pas surprenant que votre programme se bloque lorsqu'il est exécuté sous Windows XP. Lorsque l'ordinateur démarre pour la première fois, le processeur est en mode réel (émulation 8086) et les chargeurs de démarrage l'attendent. Une fois que Windows XP a démarré, le processeur ne reviendra jamais en mode réel. Les programmes DOS peuvent être exécutés dans ce qu'on appelle le mode Virtual 8086 (si je me souviens bien du nom), et les bootloaders ne fonctionneront pas dans ce mode CPU. – stakx
Non, même charger un chargeur de démarrage à l'adresse 0: 7c00 n'est pas possible sous Windows (XP) avec cet utilitaire. Vous ne pouvez pas accéder au disque directement à partir de Windows et vous ne pouvez pas vous contenter de vous déplacer dans le mem. Mais s'il vous plaît lisez dans ma question que je cours l'outil à partir de disquette (image), c'est-à-dire qu'il s'exécute en DOS, mode réel 16 bits. En outre est en fait le travail en partie déjà; le GETS Bootloader TC a démarré et affiche l'écran "Bienvenue à TC, s'il vous plaît entrer mot de passe". Seulement après ça ça croute. Ergo, il doit y avoir quelque chose de mal dans l'environnement que le BIOS met normalement en place. – Rogier