385 lines
8.8 KiB
NASM
385 lines
8.8 KiB
NASM
|
page ,132
|
||
|
;-----------------------------Module-Header-----------------------------;
|
||
|
; Module Name: PAGELOCK
|
||
|
;
|
||
|
; This module contains functions for page locking memory using DPMI
|
||
|
;
|
||
|
; Created: 03-20-90
|
||
|
; Author: Todd Laney [ToddLa]
|
||
|
;
|
||
|
; Copyright (c) 1984-1990 Microsoft Corporation
|
||
|
;
|
||
|
; Exported Functions: none
|
||
|
;
|
||
|
; Public Functions: DpmiPageLock
|
||
|
; DpmiPageUnlock
|
||
|
;
|
||
|
; Public Data: none
|
||
|
;
|
||
|
; General Description:
|
||
|
;
|
||
|
; Restrictions:
|
||
|
;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
|
||
|
?PLM = 1
|
||
|
?WIN = 0
|
||
|
?NODATA = 1
|
||
|
|
||
|
.286
|
||
|
.xlist
|
||
|
include cmacros.inc
|
||
|
include int31.inc
|
||
|
.list
|
||
|
|
||
|
externA __AHINCR ; KERNEL
|
||
|
externFP GlobalHandle ; KERNEL
|
||
|
externFP GlobalHandleNoRip ; KERNEL
|
||
|
externFP GlobalFix ; KERNEL
|
||
|
externFP GlobalUnFix ; KERNEL
|
||
|
|
||
|
ifndef SEGNAME
|
||
|
SEGNAME equ <_TEXT>
|
||
|
endif
|
||
|
|
||
|
createSeg %SEGNAME, CodeSeg, word, public, CODE
|
||
|
|
||
|
Int31_SelMgt_Get_Base EQU ((Int31_Sel_Mgt shl 8) + SelMgt_Get_Base )
|
||
|
Int31_Lock_Region EQU ((Int31_Page_Lock shl 8) + Lock_Region )
|
||
|
Int31_Unlock_Region EQU ((Int31_Page_Lock shl 8) + Unlock_Region )
|
||
|
|
||
|
; The following structure should be used to access high and low
|
||
|
; words of a DWORD. This means that "word ptr foo[2]" -> "foo.hi".
|
||
|
|
||
|
LONG struc
|
||
|
lo dw ?
|
||
|
hi dw ?
|
||
|
LONG ends
|
||
|
|
||
|
FARPOINTER struc
|
||
|
off dw ?
|
||
|
sel dw ?
|
||
|
FARPOINTER ends
|
||
|
|
||
|
sBegin CodeSeg
|
||
|
assumes cs,CodeSeg
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
;---------------------------Public-Routine------------------------------;
|
||
|
; DpmiPageLock
|
||
|
;
|
||
|
; page lock a region using DPMI
|
||
|
;
|
||
|
; Entry:
|
||
|
; lpBase Selector:offset of base of region to lock
|
||
|
; dwSize size in bytes of region to lock
|
||
|
;
|
||
|
; Returns:
|
||
|
; NZ
|
||
|
; AX = TRUE if successful
|
||
|
;
|
||
|
; Error Returns:
|
||
|
; Z
|
||
|
; AX = FALSE if error
|
||
|
;
|
||
|
; Registers Preserved:
|
||
|
; BP,DS,SI,DI
|
||
|
; Registers Destroyed:
|
||
|
; AX,BX,CX,DX,FLAGS
|
||
|
; Calls:
|
||
|
; INT 31h
|
||
|
; History:
|
||
|
;
|
||
|
; Wed 04-Jan-1990 13:45:58 -by- Todd Laney [ToddLa]
|
||
|
; Created.
|
||
|
;-----------------------------------------------------------------------;
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
cProc DpmiPageLock, <NEAR>, <>
|
||
|
; parmD lpBase
|
||
|
; parmD dwSize
|
||
|
cBegin nogen
|
||
|
mov cx,Int31_Lock_Region
|
||
|
jmp short DpmiPageLockUnLock
|
||
|
cEnd nogen
|
||
|
|
||
|
;---------------------------Public-Routine------------------------------;
|
||
|
; DpmiPageUnlock
|
||
|
;
|
||
|
; un-page lock a region using DPMI
|
||
|
;
|
||
|
; Entry:
|
||
|
; lpBase Selector:offset of base of region to unlock
|
||
|
; dwSize size in bytes of region to unlock
|
||
|
;
|
||
|
; Returns:
|
||
|
; NZ
|
||
|
; AX = TRUE if successful
|
||
|
;
|
||
|
; Error Returns:
|
||
|
; Z
|
||
|
; AX = FALSE if error
|
||
|
;
|
||
|
; Registers Preserved:
|
||
|
; BP,DS,SI,DI
|
||
|
; Registers Destroyed:
|
||
|
; AX,BX,CX,DX,FLAGS
|
||
|
; Calls:
|
||
|
; INT 31h
|
||
|
; History:
|
||
|
;
|
||
|
; Wed 04-Jan-1990 13:45:58 -by- Todd Laney [ToddLa]
|
||
|
; Created.
|
||
|
;-----------------------------------------------------------------------;
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
cProc DpmiPageUnlock, <NEAR>, <>
|
||
|
; parmD lpBase
|
||
|
; parmD dwSize
|
||
|
cBegin nogen
|
||
|
mov cx,Int31_Unlock_Region
|
||
|
errn$ DpmiPageLockUnLock
|
||
|
cEnd nogen
|
||
|
|
||
|
cProc DpmiPageLockUnLock, <NEAR>, <si,di>
|
||
|
parmD lpBase
|
||
|
parmD dwSize
|
||
|
cBegin
|
||
|
mov si,cx ; save lock/unlock flag
|
||
|
|
||
|
mov ax,Int31_SelMgt_Get_Base
|
||
|
mov bx,lpBase.sel
|
||
|
int 31h ; returns CX:DX selector base
|
||
|
jc dpl_exit
|
||
|
|
||
|
mov bx,cx ; BX:CX is base
|
||
|
mov cx,dx
|
||
|
|
||
|
add cx,lpBase.off ; add offset into selector base
|
||
|
adc bx,0
|
||
|
|
||
|
mov ax,si ; get lock/unlock flag
|
||
|
mov si,dwSize.hi ; SI:DI length
|
||
|
mov di,dwSize.lo
|
||
|
|
||
|
int 31h ; lock or unlock it
|
||
|
dpl_exit:
|
||
|
cmc ; set carry iff success
|
||
|
sbb ax,ax ; return TRUE/FALSE
|
||
|
cEnd
|
||
|
|
||
|
;---------------------------Public-Routine------------------------------;
|
||
|
; HugePageLock
|
||
|
;
|
||
|
; page lock a range of windows allocated memory
|
||
|
;
|
||
|
; Entry:
|
||
|
; lpBase Selector:offset of base of region to lock
|
||
|
; dwSize size in bytes of region to lock
|
||
|
;
|
||
|
; Returns:
|
||
|
; AX = TRUE if successful
|
||
|
;
|
||
|
; Error Returns:
|
||
|
; AX = FALSE if error
|
||
|
;
|
||
|
; Registers Preserved:
|
||
|
; BP,DS,SI,DI
|
||
|
; Registers Destroyed:
|
||
|
; AX,BX,CX,DX,FLAGS
|
||
|
; Calls:
|
||
|
; INT 31h
|
||
|
; History:
|
||
|
;
|
||
|
; Wed 04-Jan-1990 13:45:58 -by- Todd Laney [ToddLa]
|
||
|
; Created.
|
||
|
;-----------------------------------------------------------------------;
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
cProc HugePageLock, <FAR, PUBLIC>, <>
|
||
|
parmD lpBase
|
||
|
parmD dwSize
|
||
|
cBegin
|
||
|
mov ax,lpBase.sel ; NULL pointer, invalid
|
||
|
or ax,ax
|
||
|
jz GPageLock_Exit
|
||
|
|
||
|
call HugeGlobalFix ; fix the memory, then page lock
|
||
|
cCall DpmiPageLock,<lpBase, dwSize>
|
||
|
jnz GPageLock_Exit
|
||
|
|
||
|
mov ax,lpBase.sel ; page lock failed, un-fix
|
||
|
call HugeGlobalUnFix ; and return failure
|
||
|
xor ax,ax
|
||
|
|
||
|
GPageLock_Exit:
|
||
|
cEnd
|
||
|
|
||
|
;---------------------------Public-Routine------------------------------;
|
||
|
; HugePageUnlock
|
||
|
;
|
||
|
; un-page lock a range of windows alocated memory, (locked with HugePageLock)
|
||
|
;
|
||
|
; Entry:
|
||
|
; lpBase Selector:offset of base of region to lock
|
||
|
; dwSize size in bytes of region to lock
|
||
|
;
|
||
|
; Returns:
|
||
|
; none
|
||
|
;
|
||
|
; Registers Preserved:
|
||
|
; BP,DS,SI,DI
|
||
|
; Registers Destroyed:
|
||
|
; AX,BX,CX,DX,FLAGS
|
||
|
; Calls:
|
||
|
; INT 31h
|
||
|
; History:
|
||
|
;
|
||
|
; Wed 04-Jan-1990 13:45:58 -by- Todd Laney [ToddLa]
|
||
|
; Created.
|
||
|
;-----------------------------------------------------------------------;
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
cProc HugePageUnlock, <FAR, PUBLIC>, <>
|
||
|
parmD lpBase
|
||
|
parmD dwSize
|
||
|
cBegin
|
||
|
cCall DpmiPageUnlock,<lpBase, dwSize>
|
||
|
|
||
|
mov ax,lpBase.sel
|
||
|
call HugeGlobalUnFix
|
||
|
cEnd
|
||
|
|
||
|
;---------------------------Public-Routine------------------------------;
|
||
|
; HugeGlobalFix
|
||
|
;
|
||
|
; fix the global object that represents the passed selector
|
||
|
;
|
||
|
; Entry:
|
||
|
; AX = SELECTOR
|
||
|
;
|
||
|
; Returns:
|
||
|
; none
|
||
|
;
|
||
|
; Registers Preserved:
|
||
|
; BP,DS,SI,DI
|
||
|
; Registers Destroyed:
|
||
|
; AX,BX,CX,DX,FLAGS
|
||
|
; Calls:
|
||
|
; GlobalFix
|
||
|
; HugeGlobalHandle
|
||
|
; History:
|
||
|
;
|
||
|
; Wed 04-Jan-1990 13:45:58 -by- Todd Laney [ToddLa]
|
||
|
; Created.
|
||
|
;-----------------------------------------------------------------------;
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
HugeGlobalFix proc near
|
||
|
|
||
|
call HugeGlobalHandle
|
||
|
jz HugeGlobalFixExit
|
||
|
|
||
|
cCall GlobalFix,<ax>
|
||
|
|
||
|
HugeGlobalFixExit:
|
||
|
ret
|
||
|
|
||
|
HugeGlobalFix endp
|
||
|
|
||
|
;---------------------------Public-Routine------------------------------;
|
||
|
; HugeGlobalUnFix
|
||
|
;
|
||
|
; un-fix the global object that represents the passed selector
|
||
|
;
|
||
|
; Entry:
|
||
|
; AX = SELECTOR
|
||
|
;
|
||
|
; Returns:
|
||
|
; none
|
||
|
;
|
||
|
; Registers Preserved:
|
||
|
; BP,DS,SI,DI
|
||
|
; Registers Destroyed:
|
||
|
; AX,BX,CX,DX,FLAGS
|
||
|
; Calls:
|
||
|
; HugeGlobalHandle
|
||
|
; GlobalUnFix
|
||
|
; History:
|
||
|
;
|
||
|
; Wed 04-Jan-1990 13:45:58 -by- Todd Laney [ToddLa]
|
||
|
; Created.
|
||
|
;-----------------------------------------------------------------------;
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
HugeGlobalUnFix proc near
|
||
|
|
||
|
call HugeGlobalHandle
|
||
|
jz HugeGlobalUnFixExit
|
||
|
|
||
|
cCall GlobalUnFix,<ax>
|
||
|
|
||
|
HugeGlobalUnFixExit:
|
||
|
ret
|
||
|
|
||
|
HugeGlobalUnFix endp
|
||
|
|
||
|
;---------------------------Public-Routine------------------------------;
|
||
|
; HugeGlobalHandle
|
||
|
;
|
||
|
; Entry:
|
||
|
; AX = SELECTOR to global object
|
||
|
;
|
||
|
; Returns:
|
||
|
; NZ
|
||
|
; AX = HANDLE of global object
|
||
|
;
|
||
|
; Error Returns:
|
||
|
; Z
|
||
|
; AX = 0 if error
|
||
|
;
|
||
|
; Registers Preserved:
|
||
|
; BP,DS,SI,DI
|
||
|
; Registers Destroyed:
|
||
|
; AX,BX,CX,DX,FLAGS
|
||
|
; Calls:
|
||
|
; GlobalHandleNoRip
|
||
|
; History:
|
||
|
;
|
||
|
; Wed 04-Jan-1990 13:45:58 -by- Todd Laney [ToddLa]
|
||
|
; Created.
|
||
|
;-----------------------------------------------------------------------;
|
||
|
assumes ds,nothing
|
||
|
assumes es,nothing
|
||
|
|
||
|
HugeGlobalHandle proc near
|
||
|
|
||
|
push si
|
||
|
mov si,ax
|
||
|
|
||
|
or ax,ax ; test for NULL pointer!
|
||
|
jz HugeGlobalHandleExit
|
||
|
|
||
|
HugeGlobalHandleAgain:
|
||
|
cCall GlobalHandleNoRip,<si>
|
||
|
sub si,__AHINCR
|
||
|
or ax,ax
|
||
|
jz HugeGlobalHandleAgain
|
||
|
|
||
|
HugeGlobalHandleExit:
|
||
|
pop si
|
||
|
ret
|
||
|
|
||
|
HugeGlobalHandle endp
|
||
|
|
||
|
sEnd
|
||
|
|
||
|
end
|