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

89 lines
3.8 KiB
NASM

;**************************************************************************
;* MEMMAN.ASM
;*
;* Returns information about the VMM.
;*
;**************************************************************************
INCLUDE TOOLPRIV.INC
sBegin CODE
assumes CS,CODE
; MemManInfo
;
; Returns information through DPMI about the VMM
cProc MemManInfo, <PUBLIC,FAR>, <si,di,ds>
parmD lpMemMan
localV DPMIBuffer,30h ;30h byte buffer for DPMI info
cBegin
mov ax,_DATA ;Get our data segment
mov ds,ax
;** Fill the buffer with -1 so if the call messes up like
;** in 3.0 std mode we get the correct results
push ss ;Point to the local variable block
pop es
lea di,DPMIBuffer ;Get offset of buffer
mov cx,30h ;Max len of DPMI buffer
mov al,0ffh ;-1
rep stosb ;Fill buffer
;** Prepare to build public structure
mov ax,0500h ;DPMI -- Get Free Memory Info
lea di,DPMIBuffer ;Get offset of buffer
int 31h ;Call DPMI
jnc MMI_10 ;Success
xor ax,ax ;Return FALSE
jmp MMI_End ;Get out because of DPMI error
MMI_10: lds si,lpMemMan ;Point to the MEMMANINFO structure
;** Fill MEMMANINFO structure
mov ax,es:[di+0] ;Loword of largest free block
mov WORD PTR [si].vmm_dwLargestFreeBlock,ax
mov ax,es:[di+2] ;High word
mov WORD PTR [si].vmm_dwLargestFreeBlock + 2,ax
mov ax,es:[di+4] ;Loword of largest unlockable block
mov WORD PTR [si].vmm_dwMaxPagesAvailable,ax
mov ax,es:[di+6] ;Hiword
mov WORD PTR [si].vmm_dwMaxPagesAvailable + 2,ax
mov ax,es:[di+8] ;Loword of largest lockable page
mov WORD PTR [si].vmm_dwMaxPagesLockable,ax
mov ax,es:[di+0ah] ;Hiword
mov WORD PTR [si].vmm_dwMaxPagesLockable + 2,ax
mov ax,es:[di+0ch] ;Loword of linear address space
mov WORD PTR [si].vmm_dwTotalLinearSpace,ax
mov ax,es:[di+0eh] ;Hiword
mov WORD PTR [si].vmm_dwTotalLinearSpace + 2,ax
mov ax,es:[di+10h] ;Loword of number of unlocked pages
mov WORD PTR [si].vmm_dwTotalUnlockedPages,ax
mov ax,es:[di+12h] ;Hiword
mov WORD PTR [si].vmm_dwTotalUnlockedPages + 2,ax
mov ax,es:[di+14h] ;Loword of number of free pages
mov WORD PTR [si].vmm_dwFreePages,ax
mov ax,es:[di+16h] ;Hiword
mov WORD PTR [si].vmm_dwFreePages + 2,ax
mov ax,es:[di+18h] ;Loword of total physical pages
mov WORD PTR [si].vmm_dwTotalPages,ax
mov ax,es:[di+1ah] ;Hiword
mov WORD PTR [si].vmm_dwTotalPages + 2,ax
mov ax,es:[di+1ch] ;Loword of free lin addr space (pages)
mov WORD PTR [si].vmm_dwFreeLinearSpace,ax
mov ax,es:[di+1eh] ;Hiword
mov WORD PTR [si].vmm_dwFreeLinearSpace + 2,ax
mov ax,es:[di+20h] ;Loword of size of paging file (pages)
mov WORD PTR [si].vmm_dwSwapFilePages,ax
mov ax,es:[di+22h] ;Hiword
mov WORD PTR [si].vmm_dwSwapFilePages + 2,ax
mov [si].vmm_wPageSize,4096 ;Safe to hard code this for 386/486
mov ax,TRUE ;Return TRUE
MMI_End:
cEnd
sEnd
END