Page 1 of 1
Running EXE
Posted: Tue Dec 13, 2005 11:36 am
by Tolga
Hi!
I am writing a real mode os. I have a problem. After loaded a EXE file to memory, how can i edit EXE file's header to run? COM files are easy. ???
Thanks
Re:Running EXE
Posted: Tue Dec 13, 2005 11:42 am
by KieranFoot
How is the executable file being loaded?
Is it a Binary or an EXE file, if its an executable then why are you using the EXE format?
Re:Running EXE
Posted: Tue Dec 13, 2005 3:36 pm
by Pype.Clicker
iirc, you need to patch segments values according to the relocation entries found in the header, provide enough stack space and then jump to the entry point. Wotsit.org may contain more info.
Re:Running EXE
Posted: Tue Dec 13, 2005 5:23 pm
by Dex4u
This code would do it:
Code: Select all
;;;;;;;;;;;;;;;;;;;
;; Type checking ;;
;;;;;;;;;;;;;;;;;;;
cli ; for stack adjustments
mov ax, ImageLoadSeg
mov es, ax
cmp word [es:0], 5A4Dh ; "MZ" signature?
je RelocateEXE ; yes, it's an EXE program
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Setup and Run COM program ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax, es
sub ax, 10h ; "org 100h" stuff :)
mov es, ax
mov ds, ax
mov ss, ax
xor sp, sp
push es
push word 100h
jmp Run
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Relocate, setup and run EXE program ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RelocateEXE:
mov ds, ax
add ax, [ds:08h] ; ax = image base
mov cx, [ds:06h] ; cx = reloc items
mov bx, [ds:18h] ; bx = reloc table pointer
jcxz RelocationDone
ReloCycle:
mov di, [ds:bx] ; di = item ofs
mov dx, [ds:bx+2] ; dx = item seg (rel)
add dx, ax ; dx = item seg (abs)
push ds
mov ds, dx ; ds = dx
add [ds:di], ax ; fixup
pop ds
add bx, 4 ; point to next entry
loop ReloCycle
RelocationDone:
mov bx, ax
add bx, [ds:0Eh]
mov ss, bx ; ss for EXE
mov sp, [ds:10h] ; sp for EXE
add ax, [ds:16h] ; cs
push ax
push word [ds:14h] ; ip
Run:
mov dl, [cs:bsDriveNumber] ; let program know boot drive
sti
retf