;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RDOS operating system ; Copyright (C) 1988-2000, Leif Ekblad ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 2 of the License, or ; (at your option) any later version. The only exception to this rule ; is for commercial usage in embedded systems. For information on ; usage in commercial embedded systems, contact embedded@rdos.net ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; ; The author of this program may be contacted at leif@rdos.net ; ; DPMI32.ASM ; 32-bit DPMI functions ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NAME dpmi32 GateSize = 32 INCLUDE system.def INCLUDE protseg.def INCLUDE driver.def INCLUDE user.def INCLUDE virt.def INCLUDE os.def INCLUDE int.def INCLUDE user.inc INCLUDE virt.inc INCLUDE os.inc INCLUDE dpmi.inc INCLUDE system.inc .386p code SEGMENT byte public use32 'CODE' assume cs:code,ds:dpmi_data_seg ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: ALLOCATE_DESCR ; ; DESCRIPTION: ALLOCATE SELECTORS ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; allocate_descr PROC far cmp cx,1 je dpmi_create_one AllocateMultipleLdt jmp dpmi_create_done dpmi_create_one: AllocateLdt dpmi_create_done: mov ax,thread_sel mov ds,ax mov ds,ds:p_ldt_sel xor ax,ax mov [bx],ax mov [bx+2],ax mov [bx+4],al mov byte ptr [bx+5],0F2h mov [bx+7],al mov byte ptr [bx+6],40h mov ax,bx or ax,7 mov ebx,[bp].vm_ebx mov ds,[bp].pm_ds and byte ptr [bp].vm_eflags,NOT 1 retf16 allocate_descr ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: FREE_DESCR ; ; DESCRIPTION: FREE SELECTOR ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; free_descr PROC far push ds push es push fs push gs xor ax,ax mov ds,ax mov es,ax mov fs,ax mov gs,ax test bl,4 jz free_descr_fail and bl,0F8h FreeLdt clc pop eax verr ax jnz free_gs mov gs,ax free_gs: pop eax verr ax jnz free_fs mov fs,ax free_fs: pop eax verr ax jnz free_es mov es,ax free_es: pop eax verr ax jnz free_ds mov ds,ax free_ds: and byte ptr [bp].vm_eflags,NOT 1 mov eax,[bp].vm_eax mov bx,[bp].vm_ebx retf16 free_descr_fail: or byte ptr [bp].vm_eflags,1 mov ax,[bp].vm_eax mov bx,[bp].vm_ebx pop gs pop fs pop es pop ds retf16 free_descr ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_DECSR_DIST ; ; DESCRIPTION: GET DISTANCE BETWEEN SELECTORS ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_descr_dist PROC far mov ax,8 and byte ptr [bp].vm_eflags,NOT 1 retf16 get_descr_dist ENDP page ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_DECSR_BASE ; ; DESCRIPTION: GET SELCTOR BASE ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_descr_base PROC far test bl,4 jz get_descr_base_fail mov cx,thread_sel mov ds,cx mov ds,ds:p_ldt_sel and bl,0F8h mov al,[bx+5] and al,70h cmp al,70h jnz get_descr_base_fail mov dx,[bx+2] mov cl,[bx+4] mov ch,[bx+7] mov bx,[bp].vm_ebx mov ds,[bp].pm_ds and byte ptr [bp].vm_eflags,NOT 1 retf16 get_descr_base_fail: or byte ptr [bp].vm_eflags,1 retf16 get_descr_base ENDP page ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SET_DECSR_BASE ; ; DESCRIPTION: SET SELCTOR BASE ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set_descr_base PROC far push es push fs push gs test bl,4 jz set_descr_base_fail mov ax,thread_sel mov ds,ax mov ds,ds:p_ldt_sel and bl,0F8h mov al,[bx+5] and al,70h cmp al,70h jnz set_descr_base_fail mov [bx+2],dx mov [bx+4],cl mov [bx+7],ch mov ax,[bp].vm_eax mov bx,[bp].vm_ebx mov ds,[bp].pm_ds and byte ptr [bp].vm_eflags,NOT 1 pop gs pop fs pop es retf16 set_descr_base_fail: or byte ptr [bp].vm_eflags,1 pop gs pop fs pop es retf16 set_descr_base ENDP page ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SET_DECSR_LIMIT ; ; DESCRIPTION: SET SELCTOR LIMIT ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set_descr_limit PROC far push es push fs push gs test bl,4 jz set_descr_limit_fail mov ax,thread_sel mov ds,ax mov ds,ds:p_ldt_sel and bl,0F8h mov al,[bx+5] and al,70h cmp al,70h jnz set_descr_limit_fail push cx push dx pop eax cmp eax,100000h jc set_descr_small shr eax,12 or byte ptr [bx+6],80h jmp set_descr_lim_do set_descr_small: and byte ptr [bx+6],NOT 80h set_descr_lim_do: mov [bx],ax shr eax,16 mov ah,[bx+6] and ah,0F0h or al,ah mov [bx+6],al and byte ptr [bp].vm_eflags,NOT 1 mov eax,[bp].vm_eax mov bx,[bp].vm_ebx mov ds,[bp].pm_ds pop gs pop fs pop es retf16 set_descr_limit_fail: or byte ptr [bp].vm_eflags,1 pop gs pop fs pop es retf16 set_descr_limit ENDP page ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: CREATE_CODE_DESCR_ALIAS ; ; DESCRIPTION: CREATES CODE DESCRIPTOR ALIAS ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; create_code_descr_alias PROC far or bl,3 verr bx jnz create_code_alias_fail test bl,4 jz create_code_alias_fail mov ax,thread_sel mov ds,ax mov ds,ds:p_ldt_sel and bl,0F8h mov al,[bx+5] test al,8 jz create_code_alias_fail push es push si push di mov ax,ds mov es,ax mov si,bx AllocateLdt mov di,bx movsd movsd mov byte ptr [bx+5],0F2h pop di pop si pop es mov ax,bx or al,7 mov bx,[bp].vm_ebx mov ds,[bp].pm_ds and byte ptr [bp].vm_eflags,NOT 1 retf16 create_code_alias_fail: mov ax,[bp].vm_eax mov bx,[bp].vm_ebx mov ds,[bp].pm_ds or byte ptr [bp].vm_eflags,1 retf16 create_code_descr_alias ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SEGMENT_TO_DESCR ; ; DESCRIPTION: SEGMENT TO DESCR ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; segment_to_descr PROC far AllocateLdt movzx eax,word ptr[bp].vm_ebx shl eax,4 mov [bx+2],eax xor ax,ax mov byte ptr [bx+5],0F2h mov [bx+7],al dec ax mov [bx],ax mov byte ptr [bx+6],40h or bx,7 mov [bp].vm_eax,bx mov eax,[bp].vm_eax mov ebx,[bp].vm_ebx mov ds,[bp].pm_ds and byte ptr [bp].vm_eflags,NOT 1 retf16 segment_to_descr ENDP page ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SET_DECSR_ACCESS ; ; DESCRIPTION: SET SELCTOR ACCESS RIGHTS ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set_descr_access PROC far push es push fs push gs test bl,4 jz set_descr_access_fail mov al,cl and al,70h cmp al,70h jnz set_descr_access_fail test cl,8 jz set_descr_access_ok test cl,4 jnz set_descr_access_fail test cl,2 jz set_descr_access_fail set_descr_access_ok: test ch,30h jnz set_descr_access_fail and ch,0F0h mov ax,thread_sel mov ds,ax mov ds,ds:p_ldt_sel and bl,0F8h mov al,[bx+5] and al,70h cmp al,70h jnz set_descr_access_fail mov [bx+5],cl mov al,[bx+6] and al,0Fh or al,ch mov [bx+6],al and byte ptr [bp].vm_eflags,NOT 1 mov ax,[bp].vm_eax mov bx,[bp].vm_ebx mov ds,[bp].pm_ds pop gs pop fs pop es retf16 set_descr_access_fail: mov ax,[bp].vm_eax or byte ptr [bp].vm_eflags,1 pop gs pop fs pop es retf16 set_descr_access ENDP page ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_DESCR ; ; DESCRIPTION: GET DESCRIPTOR ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_descr PROC far test bl,4 jz get_descr_fail mov ax,thread_sel mov ds,ax mov ds,ds:p_ldt_sel and bl,0F8h mov al,[bx+5] and al,70h cmp al,70h jnz get_descr_fail mov eax,[bx] mov es:[edi],eax mov eax,[bx+4] mov es:[edi+4],eax mov eax,[bp].vm_eax mov bx,[bp].vm_ebx mov ds,[bp].pm_ds and byte ptr [bp].vm_eflags,NOT 1 retf16 get_descr_fail: or byte ptr [bp].vm_eflags,1 retf16 get_descr ENDP page ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SET_DESCR ; ; DESCRIPTION: SET DESCRIPTOR ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set_descr PROC far push es push fs push gs test bl,4 jz set_descr_fail mov al,es:[edi+6] test al,30h jnz set_descr_fail mov al,es:[edi+5] and al,70h cmp al,70h jnz set_descr_fail mov al,es:[edi+5] test al,8 jz set_descr_ok test al,4 jnz set_descr_fail test al,2 jz set_descr_fail set_descr_ok: mov ax,thread_sel mov ds,ax mov ds,ds:p_ldt_sel and bl,0F8h mov al,[bx+5] and al,70h cmp al,70h jnz set_descr_fail mov eax,es:[edi] mov [bx],eax mov eax,es:[edi+4] mov [bx+4],eax mov eax,[bp].vm_eax mov bx,[bp].vm_ebx mov ds,[bp].pm_ds and byte ptr [bp].vm_eflags,NOT 1 pop gs pop fs pop es retf16 set_descr_fail: mov ax,[bp].vm_eax or byte ptr [bp].vm_eflags,1 pop gs pop fs pop es retf16 set_descr ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: ALLOCATE_SPECIFIC_DESCR ; ; DESCRIPTION: ALLOCATE SPECIFIC DESCRIPTOR ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; allocate_specific_descr PROC far test bl,4 jz alloc_spec_descr_fail cmp bx,100h jnc alloc_spec_descr_fail and bl,0F8h mov ax,thread_sel mov ds,ax mov ds,ds:p_ldt_sel mov al,[bx+5] or al,al jnz alloc_spec_descr_fail xor ax,ax mov [bx],ax mov [bx+2],ax mov [bx+4],al mov byte ptr [bx+5],0F2h mov byte ptr [bx+6],40h mov [bx+7],al mov ax,[bp].vm_eax mov ebx,[bp].vm_ebx mov ds,[bp].pm_ds and byte ptr [bp].vm_eflags,NOT 1 retf16 alloc_spec_descr_fail: mov ax,[bp].vm_eax or byte ptr [bp].vm_eflags,1 retf16 allocate_specific_descr ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_REAL_INT ; ; DESCRIPTION: GET REAL MODE INT VECTOR ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_real_int PROC far mov al,bl GetVMInt mov cx,dx mov dx,bx mov ax,[bp].vm_eax mov bx,[bp].vm_ebx and byte ptr [bp].vm_eflags,NOT 1 retf16 get_real_int ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SET_REAL_INT ; ; DESCRIPTION: SET REAL MODE INT VECTOR ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set_real_int PROC far mov al,bl mov bx,dx mov dx,cx SetVMInt mov ax,[bp].vm_eax mov bx,[bp].vm_ebx and byte ptr [bp].vm_eflags,NOT 1 retf16 set_real_int ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_EXCEPTION ; ; DESCRIPTION: GET EXCEPTION VECTOR ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_exception PROC far push es push edi mov al,bl GetException mov cx,es mov edx,edi pop edi pop es mov ax,[bp].vm_eax and byte ptr [bp].vm_eflags,NOT 1 retf16 get_exception ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SET_EXCEPTION ; ; DESCRIPTION: SET EXCEPTION VECTOR ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set_exception PROC far push es push edi mov al,bl mov es,cx mov edi,edx SetException pop edi pop es mov ax,[bp].vm_eax and byte ptr [bp].vm_eflags,NOT 1 retf16 set_exception ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_VECTOR ; ; DESCRIPTION: GET INT VECTOR ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_vector PROC far push es push edi mov al,bl GetPMInt mov cx,es mov edx,edi pop edi pop es mov ax,[bp].vm_eax and byte ptr [bp].vm_eflags,NOT 1 retf16 get_vector ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SET_VECTOR ; ; DESCRIPTION: SET INT VECTOR ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set_vector PROC far push es push edi mov al,bl mov es,cx mov edi,edx SetPMInt pop edi pop es mov ax,[bp].vm_eax and byte ptr [bp].vm_eflags,NOT 1 retf16 set_vector ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SIM_REAL_INT ; ; DESCRIPTION: SIMULERA REAL MODE INT ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; sim_real_int PROC far push esi mov ds,[bp].vm_ss movzx esi,word ptr [bp].vm_esp mov al,bl DpmiInt pop esi mov ds,[bp].pm_ds mov eax,[bp].vm_eax and byte ptr [bp].vm_eflags, NOT 1 retf16 sim_real_int ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SIM_REAL_CALL ; ; DESCRIPTION: SIMULERA REAL MODE CALL ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; sim_real_call PROC far push esi mov ds,[bp].vm_ss movzx esi,word ptr [bp].vm_esp DpmiCall pop esi mov ds,[bp].pm_ds and byte ptr [bp].vm_eflags, NOT 1 retf16 sim_real_call ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SIM_REAL_CALL_INT ; ; DESCRIPTION: SIMULERA REAL MODE CALL WITH IRET ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; sim_real_call_int PROC far push esi mov ds,[bp].vm_ss movzx esi,word ptr [bp].vm_esp DpmiCallInt pop esi mov ds,[bp].pm_ds and byte ptr [bp].vm_eflags, NOT 1 retf16 sim_real_call_int ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: ALLOCATE_VM_CALLBACK ; ; DESCRIPTION: ALLOKERA VM CALLBACK ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; allocate_vm_callback PROC far AllocateVMCallback mov cx,dx mov dx,ax mov ax,[bp].vm_eax mov ds,[bp].pm_ds and byte ptr [bp].vm_eflags, NOT 1 retf16 allocate_vm_callback ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: FREE_VM_CALLBACK ; ; DESCRIPTION: FRIG™R VM CALLBACK ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; free_vm_callback PROC far push cx push dx mov ax,dx mov dx,cx FreeVMCallback pop dx pop cx and byte ptr [bp].vm_eflags, NOT 1 retf16 free_vm_callback ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: DPMI_GET_STATE_SR_ADDR ; ; DESCRIPTION: GET STATE SAVE/RESTORE ADDRESS ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; dpmi_get_save_restore_addr PROC far xor ax,ax and byte ptr [bp].vm_eflags,NOT 1 retf16 dpmi_get_save_restore_addr ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: DPMI_GET_RAW_SWITCH_ADDR ; ; DESCRIPTION: GET RAW MODE SWITCH ADDRESS ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; dpmi_get_raw_switch_addr PROC far GetRawSwitchAds mov ds,[bp].pm_ds and byte ptr [bp].vm_eflags,NOT 1 retf16 dpmi_get_raw_switch_addr ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_VERSION ; ; DESCRIPTION: GET DPMI VERSION ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_version PROC far mov ax,9 mov bx,5 mov cl,3 mov dx,2838h and byte ptr [bp].vm_eflags,NOT 1 retf16 get_version ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_FREE_MEM ; ; DESCRIPTION: GET FREE MEMORY INFO ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_free_mem PROC far push eax push edx UsedLocalLinear mov edx,eax AvailableLocalLinear add edx,eax shr edx,12 mov es:[edi],eax shr eax,12 mov es:[edi+4],eax mov es:[edi+8],eax mov es:[edi+12],edx mov es:[edi+28],edx mov dword ptr es:[edi+16],-1 GetFreePhysical shr eax,12 mov es:[edi+20],eax mov dword ptr es:[edi+24],-1 mov dword ptr es:[edi+32],-1 pop edx pop eax and byte ptr [bp].vm_eflags,NOT 1 retf16 get_free_mem ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: ALLOCATE_MEM ; ; DESCRIPTION: ALLOCATE LOCAL MEMORY ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; allocate_mem PROC far push edx push ecx mov eax,8 AllocateLocalLinear push edx mov di,dx shr edx,16 mov si,dx mov ax,flat_sel mov ds,ax mov ax,bx shl eax,16 mov ax,cx AllocateLocalLinear pop ecx mov [ecx],eax mov [ecx+4],edx pop ecx mov cx,dx shr edx,16 mov bx,dx pop edx mov eax,[bp].vm_eax mov ds,[bp].pm_ds and byte ptr [bp].vm_eflags,NOT 1 retf16 allocate_mem ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: FREE_MEM ; ; DESCRIPTION: FREE LOCAL MEMORY ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; free_mem PROC far push ecx push edx mov dx,si shl edx,16 mov dx,di mov ax,flat_sel mov ds,ax mov ecx,[edx] mov edx,[edx+4] FreeLinear pop edx pop ecx mov eax,[bp].vm_eax mov ds,[bp].pm_ds and byte ptr [bp].vm_eflags,NOT 1 retf16 free_mem ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: DPMI_PAGE_SIZE ; ; DESCRIPTION: GET PAGE SIZE 16 AND 32-BIT ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; dpmi_page_size PROC far xor bx,bx mov cx,1000h and byte ptr [bp].vm_eflags,NOT 1 retf16 dpmi_page_size ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_INT ; ; DESCRIPTION: GET VIRTUAL INTERRUPT STATE ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_int PROC far xor ax,ax GetFlags shr ax,9 and al,1 mov ah,9 and byte ptr [bp].vm_eflags,NOT 1 retf16 get_int ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_DISABLE_INT ; ; DESCRIPTION: GET AND DISABLE VIRTUAL INTERRUPT STATE ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_disable_int PROC far xor ax,ax GetFlags SimCli shr ax,9 and al,1 mov ah,9 and byte ptr [bp].vm_eflags,NOT 1 retf16 get_disable_int ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GET_ENABLE_INT ; ; DESCRIPTION: GET AND ENABLE VIRTUAL INTERRUPT STATE ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_enable_int PROC near xor ax,ax GetFlags SimSti shr ax,9 and al,1 mov ah,9 and byte ptr [bp].vm_eflags,NOT 1 ret get_enable_int ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: DPMI_DUMMY ; ; DESCRIPTION: DUMMY DPMI ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; dpmi_dummy PROC far and byte ptr [bp].vm_eflags,NOT 1 retf16 dpmi_dummy ENDP dpmi_error PROC far int 3 or byte ptr [bp].vm_eflags,1 retf16 dpmi_error ENDP dpmi_descriptor: dd_ant DD 0Dh dd00 DD OFFSET allocate_descr dd01 DD OFFSET free_descr dd02 DD OFFSET segment_to_descr dd03 DD OFFSET get_descr_dist dd04 DD OFFSET dpmi_error dd05 DD OFFSET dpmi_error dd06 DD OFFSET get_descr_base dd07 DD OFFSET set_descr_base dd08 DD OFFSET set_descr_limit dd09 DD OFFSET set_descr_access dd0A DD OFFSET create_code_descr_alias dd0B DD OFFSET get_descr dd0C DD OFFSET set_descr dd0D DD OFFSET allocate_specific_descr dpmi_dosmem: ds_ant DD 2 ds00 DD OFFSET dpmi_error ds01 DD OFFSET dpmi_error ds02 DD OFFSET dpmi_error dpmi_int: di_ant DD 5 di00 DD OFFSET get_real_int di01 DD OFFSET set_real_int di02 DD OFFSET get_exception di03 DD OFFSET set_exception di04 DD OFFSET get_vector di05 DD OFFSET set_vector dpmi_translate: dt_ant DD 6 dt00 DD OFFSET sim_real_int dt01 DD OFFSET sim_real_call dt02 DD OFFSET sim_real_call_int dt03 DD OFFSET allocate_vm_callback dt04 DD OFFSET free_vm_callback dt05 DD OFFSET dpmi_get_save_restore_addr dt06 DD OFFSET dpmi_get_raw_switch_addr dpmi_ver: dv_ant DD 0 dv00 DD OFFSET get_version dpmi_mem: dm_ant DD 3 dm00 DD OFFSET get_free_mem dm01 DD OFFSET allocate_mem dm02 DD OFFSET free_mem dm03 DD OFFSET dpmi_error dpmi_page: dp_ant DD 4 dp00 DD OFFSET dpmi_dummy dp01 DD OFFSET dpmi_dummy dp02 DD OFFSET dpmi_dummy dp03 DD OFFSET dpmi_dummy dp04 DD OFFSET dpmi_page_size dpmi_paging: dg_ant DD 3 dg00 DD OFFSET dpmi_error dg01 DD OFFSET dpmi_error dg02 DD OFFSET dpmi_dummy dg03 DD OFFSET dpmi_dummy dpmi_physical: dy_ant DD 0 dy00 DD OFFSET dpmi_dummy dpmi_virtint: dr_ant DD 2 dr00 DD OFFSET get_disable_int dr01 DD OFFSET get_enable_int dr02 DD OFFSET get_int dpmi_vendorapi: da_ant DD 0 da00 DD OFFSET dpmi_error dpmi_debug: de_ant DD 3 de00 DD OFFSET dpmi_error de01 DD OFFSET dpmi_error de02 DD OFFSET dpmi_error de03 DD OFFSET dpmi_error dpmi_tab: dpmi00 DD OFFSET dpmi_descriptor dpmi01 DD OFFSET dpmi_dosmem dpmi02 DD OFFSET dpmi_int dpmi03 DD OFFSET dpmi_translate dpmi04 DD OFFSET dpmi_ver dpmi05 DD OFFSET dpmi_mem dpmi06 DD OFFSET dpmi_page dpmi07 DD OFFSET dpmi_paging dpmi08 DD OFFSET dpmi_physical dpmi09 DD OFFSET dpmi_virtint dpmi0A DD OFFSET dpmi_vendorapi dpmi0B DD OFFSET dpmi_debug int31: movzx ebx,ah mov ebx,dword ptr cs:[ebx*4].dpmi_tab cmp al,cs:[ebx] jz int31_ok jc int31_ok mov ebx,OFFSET dpmi_error jmp int31_do int31_ok: movzx eax,al mov ebx,cs:[eax*4+ebx+4] int31_do: push ebx mov eax,[bp].vm_eax mov ebx,[bp].vm_ebx mov ds,[bp].pm_ds retn PAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: INIT_DPMI32 ; ; DESCRIPTION: Init 32-bit DPMI ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public init_dpmi32 init_dpmi32 PROC far push ds push es pushad ; mov ax,cs mov ds,ax mov es,ax ; mov al,31h mov edi,OFFSET int31 HookProt32Int ; popad pop es pop ds ret init_dpmi32 ENDP code ENDS END