PXE Zugriff im Protected Mode
-
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], esiNun setze ich den "Status Call Out" wie gefordert auf -1
add edi, 0x04 mov dword [es:edi], -1Nun 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 sel7In 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_SELUnd 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], 0xFFFFSoweit 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 0Nun 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 * 4s_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 0x0000Wenn 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!