(2831) Mon 14 Feb 94 12:46p By: Elad Nachman To: Maynard Philbrook Re: PROTECT INSTRUTIONS St: <1848 --------------------------------------------------------------------------- @MSGID: 2:403/169.4 2d5f72fc @REPLY: 1:320/42 52f6b466 @PID: GED G1218 Hello Maynard! On the Tuesday February 08 1994 22:49, Maynard Philbrook Headbanged on my metal fuses and wrote to Craig Jackson: MP> EMM386 interface.. But if i Disble EMM386 i can do any of thing MP> with out a problem. I have most of the data on the EMM386 and it MP> explains some what about the few functions in the VCPI, it MP> mentions getting the machine state and getting a LDT but my Docs MP> do not explain how to do it. You can go to a raw-like CPL0 protected mode via VCPI using int 67/ax=de01 and then int 67/ax=de0c (You must set the LDT,GDT,IDT,TSS,Page frame and so on). Here's a one (Took me fairly long to do, but it works!): .radix 16 .386P code segment USE16 assume cs:code,ds:code,es:code,ss:code org 100h begin: jmp start desc struc Limit dw ? ; Segment Limit, 286/386 Base1 dw ? base2 db ? ; 24 linear Pointer to start of segment rights db ? ; Access Rights dat386 db ? ; limit+other flags base3 db ? ; 386 Addition ENDS TSS equ $ previous_tss dd 0 ; only low-word is used _esp0 dd 0 ; Esp for ring 0 _ss0 dd 028h ; SS for ring 0, only low word used _esp1 dd 0 ; same for ring 1 _ss1 dd 028h ; " " " 1 _esp2 dd 0 ; same for ring 2 _ss2 dd 028h ; same for ring 2 _cr3_ dd 0 _eip dd 0 _eflags dd 0 _eax dd 0 _ecx dd 0 _edx dd 0 _ebx dd 0 _esp dd 0 ; Current - After Task Switch _Ebp dd 0 _esi dd 0 _edi dd 0 _es dd 20h _cs dd 30h ; Set after task switch _ss dd 28h ; current _ds dd 28h _fs dd 28h _gs dd 28h _LDTR_ dd 0 ; All selectors from _es to _ldtr_ are counted only for low word IO_bitmap dd 00680000h ; I/O premission bitmap - if 0, not I/O allowed bitmap db 100h dup (0) ; I/O bitmap - most required I/Os allowed pdata equ $ _cr3 dd 0 ; Value for CR3 register - address of PDT _GDTR dd 0 ; Pointer to GDTR register _IDTR dd 0 ; Pointer to IDTR register _LDTR dw 0 ; Selector for LDT _TSS dw 40h ; Selector for TSS entry df 003000000000h ; FWORD cs:EIP msg1 db "No Memory Manager Present",'$' msg2 db "Not in V86 mode!",'$' msg3 db "No VCPI installed!",'$' ServerPtr df 000800000000h pt_seg dw 0 ; Segment for page table pdt_seg dw 0 ; Segment for Page Directory Table real_seg dw 0 IDTR equ $ IDTR1 dw 0ffh*8 IDTR2 dd ? IDT dq 0ffh dup (0) GDTR equ $ GDTR1 dw 080h ; GDT limit (16 descriptors) GDTR2 dd ? ; Linear 32 bit pointer to GDT nope dw 0 ; For compatibility ??!?!?!? GDT equ $ data_nul dq 4 dup (0) ; null descriptor data2 desc <0ffffh,8000h,0bh,10010010b,11001111b,0> ; 4GB video segment - 20h data3 desc <0ffffh,0,0,10010010b,0,0> ; Real Mode style 64KB data segment data4 desc <0ffffh,0,0,10011010b,0,0> ; Real Mode Style 64kb Code Segment - 30h data5 desc <0ffffh,0,0,10010010b,11001111b,0> ; 4GB Data Segment - 38h tss_sel desc <0160h,0,0,10001001b,0,0> ; Selector for Task Segmet = 40h data_ dq 6 dup (0) ; More descriptors stck db 200h dup (0) ; stack start: push ds xor ax,ax mov ds,ax mov eax,ds:[67h*4] pop ds or eax,eax jne EMM mov ah,9h mov dx,offset msg1 int 21h mov ah,4ch int 21h emm: smsw ax test ax,1 jne v86 mov ah,09h mov dx,offset msg2 int 21h mov ah,4ch int 21h v86: mov ax,0de00h int 67h or ah,ah je VCPI mov ah,9 mov dx,offset msg3 int 21h mov ah,4ch int 21h VCPI: push cs pop ds push cs pop es cli mov sp,offset stck+100h sti mov bx,offset dummy mov cl,4 shr bx,cl ; Bytes -> paragraphs inc bx add bx,300h ; Makes sure we can align both page table and page table mov ah,4ah ; Directory on a 4Kb boundary ( 12 lower bits of page entries/ int 21h ; Cr3 are not counted in the address ) mov ax,cs mov bx,offset dummy mov cl,4 shr bx,cl ; Offset -> segment add bx,ax ; add segment and bx,0ff00h add bx,100h ; Align on Page boundary mov [pdt_seg],bx ; Got it mov es,bx add bx,100h ; Align on next page - that's the Page Table mov [pt_seg],bx movzx ebx,bx mov cl,4 shl ebx,4 ; Segment->Linear or ebx,1 ; Set Present Bit mov dword ptr Es:[0000],ebx ; Store the needed PDT entry mov bx,[pt_seg] mov es,bx xor di,di ; Aligned on page boundary, remember? mov si,offset GDT+8 mov ax,0de01h int 67h push cs pop ds mov dword ptr ds:[serverptr],ebx mov ax,cs movzx eax,ax mov cl,04h shl eax,cl ; Segment -> linear mov ebx,eax mov cx,offset GDT movzx ecx,cx add eax,ecx mov [GDTR2],eax ; Store linear GDT address sub eax,ecx mov cx,offset IDT movzx ecx,cx add eax,ecx mov [IDTR2],eax sub eax,ecx xor ecx,ecx mov cx,offset GDTR add eax,ecx mov [_GDTR],eax sub eax,ecx mov cx,offset IDTR movzx ecx,cx add eax,ecx mov [_IDTR],eax sub eax,ecx mov si,offset data3.base1 mov ecx,02h set_base: mov eax,[si] or eax,ebx mov [si],eax add si,08h loop set_base ; Set base addresses for data/code descriptors add si,08h mov eax,[si] mov cx,offset TSS movzx ecx,cx or eax,ebx add eax,ecx mov [si],eax ; same for TSS mov ax,offset start_pmode movzx eax,ax mov dword ptr [entry],eax mov dx,[pdt_seg] mov cl,4 movzx edx,dx shl edx,4 ; Segment->linear mov [_cr3],edx mov [_cr3_],edx ; Set cr3 both in data for VCPI and in TSS mov ax,offset start_pmode movzx eax,ax mov [_eip],eax mov ax,offset stck+50h movzx eax,ax mov [_esp],eax mov [_esp0],eax mov [_esp1],eax mov [_esp2],eax mov ax,cs mov [real_seg],ax mov ax,offset pdata movzx eax,ax add eax,ebx mov esi,eax mov ax,0de0ch cli int 67 ; Bye bye V86 mode... Will we succeed? nop nop start_pmode: ; Here we go (Or not!) cli mov ax,20h mov es,ax mov edi,0000h ; Video Screen - What else ? mov ecx,100h ; That'll be enough mov eax,08c418c41h ; 2 Flashing A's cld rep stosd mov ax,28h mov ds,ax mov ss,ax mov ax,offset stck+100h movzx esp,ax mov ax,0de03h call fword ptr cs:[serverptr] xor di,di xor eax,eax mov ecx,90h cld rep stosd mov ax,cs:[real_seg] movzx eax,ax push eax push eax push eax push eax push eax ; GS,FS,DS,ES,SS register's values (real mode?) mov ax,offset stck+100h movzx eax,ax push eax ; ESP pushfd mov ax,cs:[real_seg] movzx eax,ax push eax ; Code Segment Selector mov ax,offset return_v86 movzx eax,ax push eax ; Offset for return mov ax,38h mov ds,ax mov eax,8c418c41h mov ds:[0b8000h],eax ; Tests if 4gb segment ok mov ax,0de0ch call fword ptr cs:[serverptr] return_v86: sti mov ax,4c00h int 21h dummy: code ends end begin Fare thee well, Elad --- * Origin: None is Listed! (2:403/169.4) @PATH: 403/169 150 170/400 209/209 270/101 260/1 362