93 lines
3.2 KiB
PHP
93 lines
3.2 KiB
PHP
; 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
|