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.
 
 
 
 
 
 

92 lines
3.2 KiB

; DWORD CallCPLEntry16(UINT hinst, DWORD lpfnEntry,
; HWND hwndCPL, UINT msg,
; DWORD lParam1, DWORD lParam2)
BODYQT_CALLCPLENTRY16 macro index
local CPL_afMapping
local do_callcplentry16
local apm_map_explicit
local before_call
local call_the_bugger
local no_unmapping
hinst equ <[ebp_qttop]>
lpfnEntry equ <[ebp_qttop+4]>
hwndCPL equ <[ebp_qttop+8]>
msg equ <[ebp_qttop+12]>
lParam1 equ <[ebp_qttop+16]>
lParam2 equ <[ebp_qttop+20]>
; skip past our table below to the meat of the routine
jmp do_callcplentry16
;
; This table indicates whether we need to thunk lParam2 or not.
;
CPL_afMapping label byte
db 0 ; CPL_INIT
db 0 ; CPL_GETCOUNT
db 1 ; CPL_INQUIRE int, LPCPINFO
db 0 ; CPL_SELECT int, DWORD
db 0 ; CPL_DBLCLK int, DWORD
db 0 ; CPL_STOP int, DWORD
db 0 ; CPL_EXIT
db 1 ; CPL_NEWINQUIRE int, LPNEWCPLINFO
db 1 ; CPL_STARTWPARAMS int, LPSTR
CPL_MAX equ ($-CPL_afMapping)
apm_map_explicit:
inc ecx ;explicitly set mapping flag
jmp before_call
do_callcplentry16:
xor ecx, ecx ;ecx controls pointer mapping, init 0
mov edx, dword ptr msg ;message index so we can decide
; HACK: OEM APM extensions use entrypoints identical to CPlApplet,
; but have msgs needing special care. Caller sets bit 15
; (0x8000) on these msgs. Both msgs needing special care
; map identically to CPL_NEWINQUIRE
test edx, 8000h ;special APM msg?
jnz apm_map_explicit ;we will need to map
; use table above to determine mapping, assumes ecx is still zero
dec edx ;the table is 0 based
cmp edx, CPL_MAX ;check for index within table
jnc before_call ;let it through with no mapping
; move the correct mapping flag from our table into ecx
mov cl, byte ptr cs:[edx + CPL_afMapping]
before_call:
push ecx ;save mapping flag for thunk return
jcxz call_the_bugger ;skip mapping if it's zero
; map lParam2 to 16:16
push dword ptr lParam2
call MapLS
mov dword ptr lParam2, eax ;pass mapped result instead
call_the_bugger:
push word ptr hinst ;hinst: dword->word
push dword ptr lpfnEntry ;lpfnEntry: dword->dword
push word ptr hwndCPL ;hwndCPL: dword->word
push word ptr msg ;msg: dword->word
push dword ptr lParam1 ;lParam1: dword->dword
push dword ptr lParam2 ;lParam2: dword->dword
mov cl,index ;thunk index
call QT_Call16_DWordToDWord
pop ecx ;restore mapping flag from above
jcxz no_unmapping ;skip unmapping if it's zero
; free 16:16 mapping for lParam2
push eax ;save CplApplet return value
push dword ptr lParam2
call UnMapLS
pop eax ;restore CplApplet return value
no_unmapping:
endm