Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

54 lines
1.4 KiB

externFP GetSelectorBase ; in KERNEL
sBegin Data
externD flatBase
externW flatSel
sEnd
;--------------------------------------------------------------------------;
;
; MapFlat - convert a 16:16 pointer into a 0:32 pointer
;
; note this macro assumes the memory will *not* move
; while being accessed. If this is not true call GlobalFix
; on the memory
;
; INPUT:
; ptr16 16:16 pointer to map flat.
; ptr32 put flat pointer here.
;
; OUTPUT:
; eax flat pointer (or pointer stored)
;
;--------------------------------------------------------------------------;
assumes ds,Data
assumes es,nothing
MapFlat macro ptr16, ptr32
; is this call safe from a 32-bit seg?
push word ptr ptr16[2]
db 66h,9Ah ; call <far ptr GetSelectorBase>
dw OFFSET GetSelectorBase
dw SEG GetSelectorBase
ror eax,16 ; xchg HIWORD(eax) and LOWORD(eax)
shrd eax,edx,16 ; move LOWORD(edx) to HIWORD(eax)
movzx edx,word ptr ptr16[0] ; add pointer offset
add eax,edx
sub eax,[flatBase] ; make relative to base offset
ifb <ptr32>
mov ptr16,eax
else
mov ptr32,eax
endif
endm
FlatDS macro
mov ds,[flatSel]
mov es,[flatSel]
endm