windows-nt/Source/XPSP1/NT/base/mvdm/wow16/mmsystem/dpmipage.asm
2020-09-26 16:20:57 +08:00

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