📄 int21h.asm
字号:
mov ax,cs:_seg_buf
mov word ptr [ebp+24h],ax
mov word ptr [ebp+22h],ax
mov word ptr [ebp+04h],0200h
mov word ptr [ebp+00h],0000h
call int21h
push es
pop ds
mov esi,cs:_lobufbase
pop edi es
test byte ptr [ebp+20h],1
jnz @@err
@@2: lods byte ptr ds:[esi]
stos byte ptr es:[edi]
test al,al
jnz @@2
add esp,32h
jmp @__ok
@@err: movzx eax,word ptr [ebp+1Ch]
add esp,32h
mov [esp+1Ch],eax
jmp @__err
;=============================================================================
; Win95 Create or Open File
; In: BX = access mode
; CX = attributes
; DX = action
; DI = alias hint
; DS:ESI = ASCIIZ long filename
; Out: AX = file handle
; CX = action taken
;
@_716C: sub esp,32h
mov ebp,esp
mov [ebp+00h],di
mov [ebp+10h],bx
mov [ebp+14h],dx
mov [ebp+18h],cx
mov [ebp+1Ch],ax
mov ax,cs:_seg_buf
mov word ptr [ebp+24h],ax
mov word ptr [ebp+04h],0
mov es,cs:_sel_ds
mov edi,cs:_lobufbase
@@0: lods byte ptr ds:[esi]
stos byte ptr es:[edi]
test al,al
jnz @@0
call int21h
movzx eax,word ptr [ebp+1Ch]
movzx ecx,word ptr [ebp+18h]
test byte ptr [ebp+20h],1
lea esp,[esp+32h]
mov [esp+1Ch],eax
jnz @__err
mov [esp+18h],ecx
jmp @__ok
;=============================================================================
; DOS/4G Identification call
; In: AX = 0FF00h, DX = 0078h
; Out: EAX = 0FFFF3447h '..4G'
;
@__FFh: cmp al,88h ; AX=0FF88h - DOS/32A functional call
jz @_FF88
cmp al,89h ; AX=0FF89h - DOS/32A get config
jz @_FF89
cmp al,8Ah ; AX=0FF8Ah - DOS/32A get info
jz @_FF8A
cmp al,8Dh ; AX=0FF8Dh - DOS/32A decompress data
jz @_FF8D
cmp al,8Eh ; AX=0FF8Eh - DOS/32A get Client ptrs
jz @_FF8E
cmp al,8Fh ; AX=0FF8Fh - DOS/32A resize DOS buf
jz @_FF8F
cmp al,80h ; AX=0FF80h - DOS/32A prints (magic)
jz @_FF80
cmp al,90h ; AX=0FF90h - DOS/32A get hi mem
jz @_FF90
cmp al,91h ; AX=0FF91h - DOS/32A alloc hi mem
jz @_FF91
cmp al,92h ; AX=0FF92h - DOS/32A free hi mem
jz @_FF92
cmp al,93h ; AX=0FF93h - DOS/32A resize hi mem
jz @_FF93
cmp al,94h ; AX=0FF94h - DOS/32A get lo mem
jz @_FF94
cmp al,95h ; AX=0FF95h - DOS/32A alloc lo mem
jz @_FF95
cmp al,96h ; AX=0FF96h - DOS/32A free lo mem
jz @_FF96
cmp al,97h ; AX=0FF97h - DOS/32A resize lo mem
jz @_FF97
cmp al,98h ; AX=0FF98h - DOS/32A map phys mem
jz @_FF98
cmp al,99h ; AX=0FF99h - DOS/32A free phys mem
jz @_FF99
cmp al,9Ah ; AX=0FF9Ah - DOS/32A alloc selector
jz @_FF9A
cmp dx,0078h ; DX=0078h - DOS/4G functional call
jnz @__go21
mov gs,cs:_sel_ds
mov dword ptr [esp+1Ch],4734FFFFh
jmp @__ok
;=============================================================================
; DOS/32A Identification call
; In: AX = 0FF88h
; Out: EAX = 'ID32'
; EBX = DOS Extender version
;
@_FF88: sub esp,32h ; DOS/32A internal function
mov ebp,esp
mov [ebp+1Ch],ax
call int21h
mov eax,'ID32'
movzx ebx,cs:_version
mov ecx,[ebp+18h]
mov edx,[ebp+14h]
mov esi,[ebp+04h]
mov edi,[ebp+00h]
mov ebp,[esp+3Ah]
add esp,52h
jmp @__exi
;=============================================================================
; DOS/32A Get Client Configuration
; In: AX = 0FF89h
; Out: EAX = 'ID32'
; EBX = DOS Extender version
; ECX = size of low buffer
; EDX = configuration bits
; ESI = pointer to ID32 config header
; FS = zero selector
;
@_FF89: mov eax,'ID32'
movzx esi,cs:_seg_id32
shl esi,4
mov fs,cs:_sel_zero
movzx ebx,cs:_version
mov ecx,cs:_lobufsize
movzx edx,word ptr cs:_misc_byte
add esp,20h
jmp @__exi
;=============================================================================
; DOS/32A Get Kernel Configuration
; In: AX = 0FF8Ah
; Out: EAX = 'ID32'
; EBX = DOS Extender version
; CL = CPU type
; CH = System software
; DL = Kernel configuration bits
; ESI = pointer to Kernel config header
; FS = zero selector
;
@_FF8A: mov eax,'ID32'
movzx esi,cs:_seg_kernel
shl esi,4
add esi,offs pm32_data
mov fs,cs:_sel_zero
movzx ebx,cs:_version
mov cl,cs:_cpu_type
mov ch,cs:_sys_type
mov dl,fs:[esi+00h]
add esp,20h
jmp @__exi
;=============================================================================
; DOS/32A Decompress data
; In: AX = 0FF8Dh
; DS:EBX = source address
; DS:EDI = destination address
; ECX = source size
; Out: EAX = destination size
;
@_FF8D: push gs ds
pop gs
mov ds,cs:_sel_ds
call decompress
mov eax,_codesize
sub eax,edi
pop gs
mov [esp+1Ch],eax
jmp @__ok
;=============================================================================
; DOS/32A Return pointers to Client variables
; In: AX = 0FF8Eh
; Out: GS = Client data selector
; EDX = pointer to "start" == module file name
; ESI = pointer to loaded application sel/base table
; EDI = pointer to Client variables structure
;
@_FF8E: mov gs,cs:_sel_ds
mov edx,offset start
mov esi,offset _app_buf_allocsel
mov edi,offset _misc_byte
add esp,20h
jmp @__exi
;=============================================================================
; DOS/32A Resize DOS transfer buffer
; In: AX = 0FF8Fh
; EBX = new size of DOS transfer buffer in bytes
; Out: EBX = old size of DOS transfer buffer in bytes
;
@_FF8F: mov ds,cs:_sel_ds
xchg _lobufsize,ebx
mov [esp+10h],ebx
jmp @__ok
;=============================================================================
; DOS/32A Print String (Magic)
; In: AX = 0FF80h
; EBX = value
; DS:EDX = pointer to string
; Out: -
;
@_FF80: mov es,cs:_sel_ds
mov edi,cs:_lobufbase
mov esi,edx
mov dx,di
@@1: lods byte ptr ds:[esi]
stosb
test al,al
jnz @@1
push es
pop ds
mov _int_ss,ss
mov _int_esp,esp
lss esp,fword ptr _sel_esp
push ecx
push ebx
call prints
lss esp,fword ptr _int_esp
jmp @__ok
;=============================================================================
; DOS/32A Get Free Extended Memory Information
; In: AX = 0FF90h
; Out: EAX = largest free memory block
;
@_FF90: push ss
pop es
sub esp,30h
mov edi,esp
mov ax,0500h
int 31h
mov eax,[esp]
add esp,30h
mov [esp+1Ch],eax
jmp @__ok
;=============================================================================
; DOS/32A Allocate Extended Memory
; In: AX = 0FF91h
; EBX = size of block
; Out: EBX = linear address of block
; ESI = handle of block
;
@_FF91: call @_FF9x1
mov ax,0501h
int 31h
jmp @_FF9x2
;=============================================================================
; DOS/32A Free Extended Memory
; In: AX = 0FF92h
; ESI = handle of block
; Out: -
;
@_FF92: call @_FF9x1
mov ax,0502h
int 31h
jc @__err
jmp @__ok
;=============================================================================
; DOS/32A Resize Extended Memory
; In: AX = 0FF93h
; EBX = new size of block
; ESI = handle of block
; Out: EBX = new linear address of block
; ESI = new handle of block
;
@_FF93: call @_FF9x1
mov ax,0503h
int 31h
jmp @_FF9x2
;=============================================================================
; DOS/32A Get Free DOS Memory Information
; In: AX = 0FF94h
; Out: EAX = largest free memory block
;
@_FF94: mov ah,48h
mov bx,-1
call @__all
shl ebx,4
mov [esp+1Ch],ebx
jmp @__ok
;=============================================================================
; DOS/32A Allocate DOS Memory
; In: AX = 0FF94h
; EBX = size of block
; Out: EBX = linear address of block
; ESI = handle of block
;
@_FF95: add ebx,0Fh
shr ebx,4
test ebx,0FFFF0000h
jnz @__err
test bx,bx
jz @__err
mov ah,48h
call @__all
jnz @__err
mov [esp+04h],eax
shl eax,4
mov [esp+10h],eax
jmp @__ok
;=============================================================================
; DOS/32A Free DOS Memory
; In: AX = 0FF96h
; ESI = handle of block
; Out: -
;
@_FF96: sub esp,32h
mov ebp,esp
mov byte ptr [ebp+1Dh],49h
mov word ptr [ebp+22h],si
call int21h
test byte ptr [ebp+20h],1
lea esp,[esp+32h]
jnz @__err
jmp @__ok
;=============================================================================
; DOS/32A Resize DOS Memory
; In: AX = 0FF97h
; EBX = new size of block
; ESI = handle of block
; Out: EBX = new linear address of block
; ESI = new handle of block
;
@_FF97: add ebx,0Fh
shr ebx,4
test ebx,0FFFF0000h
jnz @__err
test bx,bx
jz @__err
sub esp,32h
mov ebp,esp
mov byte ptr [ebp+1Dh],4Ah
mov word ptr [ebp+10h],bx
mov word ptr [ebp+22h],si
call int21h
test byte ptr [ebp+20h],1
lea esp,[esp+32h]
jnz @__err
jmp @__ok
;=============================================================================
; DOS/32A Map Physical Memory
; In: AX = 0FF98h
; EBX = base of physical memory
; ESI = size of region
; Out: EBX = linear address of memory
;
@_FF98: call @_FF9x1
mov ax,0800h
int 31h
jc @__err
jmp @_FF9x3
;=============================================================================
; DOS/32A Unmap Physical Memory
; In: AX = 0FF99h
; EBX = linear address of memory
; Out: -
;
@_FF99: call @_FF9x1
mov ax,0801h
int 31h
jc @__err
jmp @__ok
;=============================================================================
; DOS/32A Allocate Selector
; In: AX = 0FF94h
; EBX = selector base
; ECX = selector limit
; DX = selector access rights
; Out: AX = selector
;
@_FF9A: mov edi,ebx
call set_descriptor
jc @__err
mov [esp+1Ch],ax
jmp @__ok
;-----------------------------------------------------------------------------
@_FF9x1:mov cx,bx ; convert BX:CX to EBX
shr ebx,16
mov di,si ; convert SI:DI to EDI
shr esi,16
ret
@_FF9x2:jc @__err
shl esi,16
mov si,di
mov [esp+04h],esi
@_FF9x3:shl ebx,16
mov bx,cx
mov [esp+10h],ebx
jmp @__ok
;*****************************************************************************
@__cpy: push ds ; copy NULL-terminated string to buffer
pop es
xor ax,ax
mov esi,edx
mov edi,edx
or ecx,-1
repne scas byte ptr es:[edi]
not ecx
mov es,cs:_sel_ds
mov edi,cs:_lobufbase
rep movs byte ptr es:[edi],[esi]
mov ax,cs:_seg_buf
mov word ptr [ebp+24h],ax
mov word ptr [ebp+14h],0
jmp int21h
@__std: sub esp,32h
mov ebp,esp
mov [ebp+04h],si ; these two pass-downs are
mov [ebp+10h],bx ; for Win95 longfilenames
mov [ebp+18h],cx
mov [ebp+1Ch],ax
call @__cpy
movzx eax,word ptr [ebp+1Ch]
movzx ecx,word ptr [ebp+18h]
test byte ptr [ebp+20h],1
lea esp,[esp+32h] ; restore stack
ret
@__all: sub esp,32h
mov ebp,esp
mov [ebp+10h],bx
mov [ebp+14h],dx
mov [ebp+18h],cx
mov [ebp+1Ch],ax
call int21h
movzx eax,word ptr [ebp+1Ch]
movzx ecx,word ptr [ebp+18h]
movzx edx,word ptr [ebp+14h]
movzx ebx,word ptr [ebp+10h]
movzx edi,word ptr [ebp+22h] ; ES
movzx esi,word ptr [ebp+24h] ; DS
test byte ptr [ebp+20h],1
lea esp,[esp+32h] ; restore stack
ret
@__tst: movzx eax,word ptr [ebp+1Ch] ; get error number
test byte ptr [ebp+20h],1 ; check if CF is set
lea esp,[esp+32h] ; restore stack
mov [esp+1Ch],eax ; put EAX (error) on stack
jnz @__err
@__ok: popad ; return ok
@__exi: pop es ds
and byte ptr [esp+8],0FEh
iretd
@__err: popad ; return with error
pop es ds
or byte ptr [esp+8],01h
iretd
PopState
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -