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

279 lines
6.4 KiB
NASM

page ,132
;-----------------------------Module-Header-----------------------------;
; Module Name: HEAP.ASM
;
; This module contains functions for dealing with external local heaps
;
; Created: 09-20-90
; Author: Todd Laney [ToddLa]
;
; Copyright (c) 1984-1990 Microsoft Corporation
;
; Exported Functions: none
;
; Public Functions: HeapCreate
; HeapDestroy
; HeapAlloc
; HeapFree
;
; Public Data: none
;
; General Description:
;
; Restrictions:
;
;-----------------------------------------------------------------------;
?PLM = 1
?WIN = 0
?NODATA = 1
.286p
.xlist
include cmacros.inc
include windows.inc
.list
MIN_HEAPSIZE = 128
GMEM_SHARE = GMEM_DDESHARE
externFP LocalInit ; in KERNEL
externFP LocalAlloc ; in KERNEL
externFP LocalReAlloc ; in KERNEL
externFP LocalFree ; in KERNEL
externFP LocalCompact ; in KERNEL
externFP GlobalAlloc ; in KERNEL
externFP GlobalLock ; in KERNEL
externFP GlobalUnlock ; in KERNEL
externFP GlobalFree ; in KERNEL
; 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
createSeg INIT, InitSeg, word, public, CODE
sBegin InitSeg
assumes cs,InitSeg
assumes ds,nothing
assumes es,nothing
;---------------------------Public-Routine------------------------------;
; HeapCreate
;
; Create a external heap
;
; Entry:
; cbSize is the initial size of the heap
;
; Returns:
; AX = handle to heap
; Error Returns:
; AX = 0
; Registers Preserved:
; BP,DS,SI,DI
; Registers Destroyed:
; AX,BX,CX,DX,FLAGS
; Calls:
; GlobalAlloc, LocalInit
; History:
; Fri 21-Sep-1990 13:45:58 -by- Todd Laney [ToddLa]
; Created.
;-----------------------------------------------------------------------;
assumes ds,nothing
assumes es,nothing
cProc HeapCreate, <FAR,PUBLIC>, <>
ParmW cbSize
cBegin
mov ax,cbSize
cmp ax,MIN_HEAPSIZE
jg hc_alloc
mov ax,MIN_HEAPSIZE
mov cbSize,ax
hc_alloc:
cCall GlobalAlloc, <GHND+GMEM_SHARE,0,ax>
or ax,ax
jz hc_exit
cCall GlobalLock, <ax>
push dx
mov ax,cbSize
dec ax
cCall LocalInit,<dx,0,ax>
pop ax
hc_exit:
cEnd
;---------------------------Public-Routine------------------------------;
; HeapDestroy
;
; Destroys a external heap
;
; Entry:
; hHeap contains heap handle (ie the selector)
;
; Returns:
; none
; Error Returns:
; none
; Registers Preserved:
; BP,DS,SI,DI
; Registers Destroyed:
; AX,BX,CX,DX,FLAGS
; Calls:
; GlobalUnlock, GlobalFree
; History:
; Fri 21-Sep-1990 13:45:58 -by- Todd Laney [ToddLa]
; Created.
;-----------------------------------------------------------------------;
assumes ds,nothing
assumes es,nothing
cProc HeapDestroy, <FAR,PUBLIC>, <>
ParmW hHeap
cBegin
cCall GlobalUnlock, <hHeap> ; !!! only need in REAL mode
cCall GlobalFree, <hHeap>
cEnd
sEnd
ifndef SEGNAME
SEGNAME equ <_TEXT>
endif
createSeg %SEGNAME, CodeSeg, word, public, CODE
sBegin CodeSeg
assumes cs,CodeSeg
assumes ds,nothing
assumes es,nothing
;---------------------------Public-Routine------------------------------;
; HeapAlloc
;
; allocate memory from a external heap
;
; Entry:
; hHeap contains heap handle (ie the selector)
; cbSize contains the requested size of the allocation
;
; Returns:
; DX:AX = pointer to allocated object
; Error Returns:
; DX:AX = NULL
; Registers Preserved:
; BP,DS,SI,DI
; Registers Destroyed:
; AX,BX,CX,DX,FLAGS
; Calls:
; LocalAlloc
; History:
; Fri 21-Sep-1990 13:45:58 -by- Todd Laney [ToddLa]
; Created.
;-----------------------------------------------------------------------;
assumes ds,nothing
assumes es,nothing
cProc HeapAlloc, <FAR,PUBLIC>, <ds>
ParmW hHeap
ParmW cbSize
cBegin
mov ds,hHeap
cCall LocalAlloc, <LPTR, cbSize>
xor dx,dx
or ax,ax
jz hal_exit
mov dx,ds
hal_exit:
cEnd
;---------------------------Public-Routine------------------------------;
; HeapReAlloc
;
; reallocate memory from a external heap
;
; Entry:
; lpObject contains the pointer to the object to be reallocated
; cbSize contains the requested size of the reallocation
;
; Returns:
; DX:AX = pointer to allocated object
; Error Returns:
; DX:AX = NULL
; Registers Preserved:
; BP,DS,SI,DI
; Registers Destroyed:
; AX,BX,CX,DX,FLAGS
; Calls:
; LocalAlloc
; History:
; Wed 8-Jan-1991 1: 2: 3 -by- David Levine [DavidLe]
; Created based on HeapAlloc.
;-----------------------------------------------------------------------;
assumes ds,nothing
assumes es,nothing
cProc HeapReAlloc, <FAR,PUBLIC>, <ds>
ParmD lpObject
ParmW cbSize
cBegin
lds ax,lpObject
AllocFlags EQU LMEM_MOVEABLE OR LMEM_ZEROINIT
cCall LocalReAlloc, <ax, cbSize, AllocFlags>
xor dx,dx
or ax,ax
jz hral_exit
mov dx,ds
hral_exit:
cEnd
;---------------------------Public-Routine------------------------------;
; HeapFree
;
; free memory from a external heap
;
; Entry:
; hObject contains the object to free
;
; Returns:
; none
; Error Returns:
; none
; Registers Preserved:
; BP,DS,SI,DI
; Registers Destroyed:
; AX,BX,CX,DX,FLAGS
; Calls:
; LocalFree
; History:
; Fri 21-Sep-1990 13:45:58 -by- Todd Laney [ToddLa]
; Created.
;-----------------------------------------------------------------------;
assumes ds,nothing
assumes es,nothing
cProc HeapFree, <FAR,PUBLIC>, <ds>
ParmD lpObject
cBegin
lds ax,lpObject
cCall LocalFree, <ax>
cEnd
sEnd CodeSeg
end