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

216 lines
4 KiB
NASM

.xlist
include kernel.inc
.list
if KDEBUG
DataBegin
externB fBooting
externW pGlobalHeap
;externW hGlobalHeap
DataEnd
sBegin CODE
assumes CS,CODE
externW gdtdsc
externNP check_lru_list
externNP check_free_list
externNP get_physical_address
;externFP ValidateFreeSpaces
;-----------------------------------------------------------------------;
; CheckGlobalHeap ;
; ;
; The Global Heap is checked for consistency. First the forward links ;
; are examined to make sure they lead from the hi_first to the hi_last. ;
; Then the backward links are checked to make sure they lead from the ;
; hi_last to the hi_first. Then the arenas are sequentially checked ;
; to see that the moveable entries point to allocated handles and that ;
; said handles point back. The handle table is then checked to see ;
; that the number of used handles match the number of referenced ;
; handles, and that the number of total handles matches the sum of the ;
; free, discarded, and used handles. Finally the free list of handles ;
; is checked. ;
; ;
; Arguments: ;
; none ;
; ;
; Returns: ;
; CF = 0 everything is just fine ;
; all registers preserved ;
; ;
; Error Returns: ;
; CF = 1 ;
; DX = offending arena header ;
; AX = 01h Forward links invalid ;
; 02h Backward links invalid ;
; 04h ga_handle points to free handle ;
; 08h arena points to handle but not vice versa ;
; 80h ga_sig is bad ;
; DX = 0 ;
; AX = 10h allocated handles don't match used handles ;
; 20h total number of handles don't match up ;
; 40h total number of free handles don't match up ;
; ;
; Registers Preserved: ;
; All ;
; ;
; Registers Destroyed: ;
; ;
; Calls: ;
; ;
; History: ;
; ;
; Sat Nov 01, 1986 02:16:46p -by- David N. Weise [davidw] ;
; Rewrote it from C into assembly. ;
;-----------------------------------------------------------------------;
cProc CheckGlobalHeap,<PUBLIC,NEAR>
cBegin nogen
push ax
push dx
push bx
push cx
push di
push si
push ds
push es
xor ax,ax
xor dx,dx
xor di,di
SetKernelDS
cmp pGlobalHeap,di
jnz there_is_a_GlobalHeap
jmp all_done
there_is_a_GlobalHeap:
cmp fBooting, 1
jz no_check
mov ds,pGlobalHeap
UnSetKernelDS
cmp [di].hi_check,di
jnz checking_enabled
no_check:
jmp all_done
checking_enabled:
mov cx,[di].hi_count
mov dx,[di].hi_first
mov es, dx
forward_ho:
push cx
cCall get_physical_address, <es>
add ax, 10h
adc dx, 0
mov bx, es:[di].ga_size
xor cx, cx
rept 4
shl bx, 1
rcl cx, 1
endm
cmp es:[di].ga_owner, di
je no_limit_check
cmp es:[di].ga_handle, di
je no_limit_check
push bx
push cx
push si
push ds
smov ds, gdtdsc
mov si, es:[di].ga_handle
sel_check si
sub bx, 1
sbb cx, 0
or cx, cx ; More than 1 selector?
jz @F
mov bx, -1
@@:
cmp [si], bx
jne bad_limit
mov ch, [si+6]
and cx, 0F0Fh
cmp ch, cl
je ok_limit
bad_limit:
Debug_Out "gacheck: Bad limit for #SI"
ok_limit:
pop ds
pop si
pop cx
pop bx
no_limit_check:
cmp es:[di].ga_owner,GA_NOT_THERE ;286pmode has some of these
jnz check_size ; with 0 size
pop cx
jmp short size_ok
check_size:
add bx, ax
adc cx, dx
cCall get_physical_address, <es:[di].ga_next>
cmp cx, dx
pop cx
mov dx, es
xchg ax, dx
jne forward_size_mismatch
cmp dx, bx
jne forward_size_mismatch
size_ok:
mov ax, es
mov dx, es:[di].ga_next
mov es, dx
cmp ax, es:[di].ga_prev
jz size_and_next_match
forward_size_mismatch:
cmp cx,1
jnz forward_links_invalid
size_and_next_match:
loop xxxx
cmp ax,[di].hi_last
jz forward_links_okay
forward_links_invalid:
Debug_Out "gacheck: Forward links invalid"
mov dx,ax
mov ax,1
jmp all_done
xxxx:
jmp forward_ho
forward_links_okay:
xor ax, ax
clear_dx_all_done:
xor dx,dx
all_done:
pop es
pop ds
pop si
pop di
pop cx
pop bx
or ax,ax
jnz cgh_error
pop dx
pop ax
ret
cgh_error:
int 3
add sp,4
stc
ret
cEnd nogen
sEnd CODE
endif
end