S
Hi alle zusammen,
habe für mein OS einen PXE Bootloader geschrieben, der auf den Zielcomputer übertragen wird und dann dort in den Protected Mode wechselt und ein paar Informationen auf dem Bildschirm ausgibt. So weit so gut. Nun möchte ich natürlich noch einige Dateien vom Server nachladen, da ein Bootloader alleine ja wenig nützlich ercheint Also habe ich mir die PXE Spezifikation besorgt. Dort steht drin, dass ich in einem bestimmten Speicherbereich nach der !PXE Struktur suchen sollen. Diese habe ich auch gefunden.
Nun speicher ich den Entry Point, welcher sich am Offset 0x14 der Struktur befindet, für die Protected Mode Funktionen von PXE in einer Variablen:
add edi, 0x14
mov dword esi, [es:edi]
mov dword [PXE_API_Entry], esi
Nun setze ich den "Status Call Out" wie gefordert auf -1
add edi, 0x04
mov dword [es:edi], -1
Nun prüfe ich an Offset 0x1D (SegDescCnt), ob ich 4 oder 7 Deskriptoren für PXE anlegen muss
add edi, 0x05
cmp byte [es:edi], 0x04
je sel4
cmp byte [es:edi], 0x07
je sel7
In meinem Fall brauche ich sieben Deskriptoren, also schreibe ich nun an Offset 0x1E den FirstSelector wie gefordert:
add edi, 0x01
mov word [es:edi], PXE_STACK_SEL
Und natürlich trage ich dann auch die anderen Selektoren in die foglenden sieben, dafür vorgesehenen, Felder ein
add edi, 0x02
mov word [es:edi], PXE_STACK_SEL
add edi, 0x02
mov dword [es:edi], 0x00002000
add edi, 0x04
mov word [es:edi], 0xFFFF
add edi, 0x02
mov word [es:edi], PXE_UNDIDATA_SEL
add edi, 0x02
mov dword [es:edi], 0x00003000
add edi, 0x04
mov word [es:edi], 0xFFFF
add edi, 0x02
mov word [es:edi], PXE_UNDICODE_SEL
add edi, 0x02
mov dword [es:edi], 0x00004000
add edi, 0x04
mov word [es:edi], 0xFFFF
add edi, 0x02
mov word [es:edi], PXE_UNDICODEWRITE_SEL
add edi, 0x02
mov dword [es:edi], 0x00005000
add edi, 0x04
mov word [es:edi], 0xFFFF
add edi, 0x02
mov word [es:edi], PXE_BCDATA_SEL
add edi, 0x02
mov dword [es:edi], 0x00006000
add edi, 0x04
mov word [es:edi], 0xFFFF
add edi, 0x02
mov word [es:edi], PXE_BCCODE_SEL
add edi, 0x02
mov dword [es:edi], 0x00007000
add edi, 0x04
mov word [es:edi], 0xFFFF
add edi, 0x02
mov word [es:edi], PXE_BCWRITE_SEL
add edi, 0x02
mov dword [es:edi], 0x00008000
add edi, 0x04
mov word [es:edi], 0xFFFF
Soweit so gut! Die Deskriptoren müssen natürlich 16-Bit Deskriptoren sein, auch dann, wenn ich mich im 32-Bit Protected Mode befinde und der Stack auch 32-bittig ist. Hier die sieben Deskriptoren, die ich für PXE angelegt habe
PXE_STACK_SEL equ $-gdt
gdt9:
dw 0xFFFF
dw 0x2000
db 0
db 0x91
db 0x4F
db 0
PXE_UNDIDATA_SEL equ $-gdt
gdt10:
dw 0xFFFF
dw 0x3000
db 0
db 0x91
db 0x4F
db 0
PXE_UNDICODE_SEL equ $-gdt
gdt11:
dw 0xFFFF
dw 0x4000
db 0
db 0x95
db 0x4F
db 0
PXE_UNDICODEWRITE_SEL equ $-gdt
gdt12:
dw 0xFFFF
dw 0x5000
db 0
db 0x91
db 0x4F
db 0
PXE_BCDATA_SEL equ $-gdt
gdt13:
dw 0xFFFF
dw 0x6000
db 0
db 0x91
db 0x4F
db 0
PXE_BCCODE_SEL equ $-gdt
gdt14:
dw 0xFFFF
dw 0x7000
db 0
db 0x95
db 0x4F
db 0
PXE_BCWRITE_SEL equ $-gdt
gdt15:
dw 0xFFFF
dw 0x8000
db 0
db 0x91
db 0x4F
db 0
Nun möchte ich gerne die PXE Funktion GET CACHED INFO aufrufen und versuche dies wie folgt
mov ax, PXE_UNDICODE_SEL
mov es, ax
push es
push s_PXENV_GET_CACHED_INFO
push 0x0071
call far [PXE_API_Entry]
add esp, 3 * 4
s_PXENV_GET_CACHED_INFO ist eine Struktur, die ich wie folgt angelegt habe
s_PXENV_GET_CACHED_INFO:
status db 0x00
packetType dw 0x0002
bufferSize dw 0x0000
buffer dw 0x0000
bufferLimit dw 0x0000
Wenn ich aber nun den Far Call ausführe, startet sich der PC neu, bzw. mein OS gibt eine Schutzverletzung aus.
Wo liegt mein Fehler. Vielleciht habe ich was fundermentales übersehen. Ich bin für jede Hilfe dankbar. Wenn ihr noch mehr Informationen brauchen solltet, sagt einfach bescheid
Und schonmal vielen Dank für eure Mühen!