1035 lines
26 KiB
PHP
1035 lines
26 KiB
PHP
|
ifdef IS_16
|
||
|
include thkrp.inc
|
||
|
include k32share.inc
|
||
|
include public.inc
|
||
|
include cbcheck.inc
|
||
|
include newls.inc
|
||
|
include newmisc.inc
|
||
|
include frame.inc
|
||
|
include struc.inc
|
||
|
include cvtstruc.inc
|
||
|
include cbcid.inc
|
||
|
include usrcbid.inc
|
||
|
|
||
|
externDef GlobalAlloc:far16
|
||
|
|
||
|
externDef DefFrameProc32:far16
|
||
|
externDef DefDlgProc32:far16
|
||
|
externDef SendMessage32:far16
|
||
|
externDef DefWindowProc32:far16
|
||
|
externDef DefMDIChildProc32:far16
|
||
|
externDef PostMessage32:far16
|
||
|
externDef PostThreadMessage32:far16
|
||
|
externDef GetMessage32:far16
|
||
|
externDef PeekMessage32Ex:far16
|
||
|
externDef TranslateAccelerator:far16
|
||
|
externDef TranslateMDISysAccel:far16
|
||
|
externDef TranslateMessage32:far16
|
||
|
externDef IsDialogMessage32:far16
|
||
|
|
||
|
externDef GetNullhInst:far16
|
||
|
externDef MaphinstLS:far16
|
||
|
externDef MaphinstSL:far16
|
||
|
externDef GetStdCBLS:far16
|
||
|
externDef GetStdCBSL:far16
|
||
|
externDef ThkMsgLS:near16
|
||
|
externDef ThkMsgSL:near16
|
||
|
externDef CALLBACK_BODY_16:far16
|
||
|
externDef IsValidPostedMessage:near16
|
||
|
|
||
|
.286
|
||
|
externDef abWMIndex:word
|
||
|
|
||
|
.386
|
||
|
|
||
|
ifdef DEBUG
|
||
|
externDef _DebugOutput:far16
|
||
|
|
||
|
DBF_WARNING equ 04000h
|
||
|
DBF_ERROR equ 08000h
|
||
|
DBF_USER equ 00800h
|
||
|
endif
|
||
|
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
; DXAX2EAX
|
||
|
; mov dx to eax high word
|
||
|
;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
DXAX2EAX macro
|
||
|
ror eax,16
|
||
|
xchg ax,dx
|
||
|
ror eax,16
|
||
|
endm
|
||
|
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
; body_CALLMSGFILTER
|
||
|
;-----------------------------------------------------------------------;
|
||
|
body_CALLMSGFILTER macro
|
||
|
bp_pMsg equ <bp_top>
|
||
|
bp_nCode equ <bp_top+4>
|
||
|
si_msg16 equ <(si_space-(MSGSTRUCT16_SIZE))>
|
||
|
|
||
|
mov si,sp ;;set up si for local variable frame
|
||
|
|
||
|
MsgStructThkPreProc
|
||
|
|
||
|
lea ax,si_msg16
|
||
|
push ss
|
||
|
push ax
|
||
|
push word ptr bp_nCode
|
||
|
push 1
|
||
|
call CallMsgFilter32
|
||
|
cwde
|
||
|
|
||
|
MsgStructThkPostProc
|
||
|
endm
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
; body_SLOWCALLWINDOWPROCA
|
||
|
;-----------------------------------------------------------------------;
|
||
|
body_SLOWCALLWINDOWPROCA macro
|
||
|
local have_stub16
|
||
|
|
||
|
bp_pfn equ <bp_top >
|
||
|
bp_hwnd equ <bp_top+ 4>
|
||
|
bp_message equ <bp_top+ 8>
|
||
|
bp_wParamLo equ <bp_top+ 12>
|
||
|
bp_wParamHi equ <bp_top+ 14>
|
||
|
bp_lParam equ <bp_top+ 16>
|
||
|
|
||
|
mov si,sp ;;set up si for local variable frame
|
||
|
|
||
|
MsgThkPreProc
|
||
|
|
||
|
push dword ptr bp_pfn
|
||
|
push dword ptr CBID_WNDPROC
|
||
|
call GetStdCBSL
|
||
|
|
||
|
push eax
|
||
|
push word ptr bp_space.s16_hwnd
|
||
|
push word ptr bp_space.s16_message
|
||
|
push word ptr bp_space.s16_wParam.lo
|
||
|
push dword ptr bp_space.s16_lParam
|
||
|
push word ptr bp_space.s16_wParam.hi
|
||
|
call CallWindowProc32
|
||
|
|
||
|
or bp_space.s16_fw, TF_THUNKMSGRESULT
|
||
|
MsgThkPostProc
|
||
|
endm
|
||
|
|
||
|
|
||
|
|
||
|
; ---------------------------------------------------------------------------
|
||
|
;
|
||
|
; body_SENDMESSAGETHINGA
|
||
|
;
|
||
|
; ---------------------------------------------------------------------------
|
||
|
body_SENDMESSAGETHINGA macro
|
||
|
local mpfnSendThing
|
||
|
local SendThingCleanup
|
||
|
|
||
|
bp_type equ <bp_top >
|
||
|
bp_hwnd equ <bp_top+ 4>
|
||
|
bp_hwnd2 equ <bp_top+ 8>
|
||
|
bp_message equ <bp_top+ 12>
|
||
|
bp_wParamLo equ <bp_top+ 16>
|
||
|
bp_wParamHi equ <bp_top+ 18>
|
||
|
bp_lParam equ <bp_top+ 20>
|
||
|
|
||
|
mov si,sp ;;set up si for local variable frame
|
||
|
|
||
|
MsgThkPreProc
|
||
|
|
||
|
push word ptr bp_space.s16_hwnd
|
||
|
|
||
|
cmp word ptr bp_type, SMT_DEFFRAMEPROC
|
||
|
jne @F
|
||
|
|
||
|
push word ptr bp_hwnd2
|
||
|
|
||
|
@@:
|
||
|
push word ptr bp_space.s16_message
|
||
|
push word ptr bp_space.s16_wParam.lo
|
||
|
push dword ptr bp_space.s16_lParam
|
||
|
push word ptr bp_space.s16_wParam.hi
|
||
|
|
||
|
;
|
||
|
; Which type of message call do we want to make?
|
||
|
; (0) SendMesage32
|
||
|
; (1) DefWindowProc32
|
||
|
; (2) DefMDIChildProc32
|
||
|
; (3) DefDlgProc32
|
||
|
; (4) DefFrameProc32
|
||
|
;
|
||
|
mov bx, word ptr bp_type
|
||
|
shl bx, 2
|
||
|
|
||
|
call dword ptr cs:mpfnSendThing[bx]
|
||
|
jmp SendThingCleanup
|
||
|
|
||
|
mpfnSendThing label dword
|
||
|
dd SendMessage32 ; 0
|
||
|
dd DefWindowProc32 ; 1
|
||
|
dd DefMDIChildProc32 ; 2
|
||
|
dd DefDlgProc32 ; 3
|
||
|
dd DefFrameProc32 ; 4
|
||
|
|
||
|
SendThingCleanup:
|
||
|
or bp_space.s16_fw, TF_THUNKMSGRESULT
|
||
|
MsgThkPostProc
|
||
|
endm
|
||
|
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
; body_TRANSLATEMESSAGETHING
|
||
|
; TMT_TRANSLATEACCELERATOR == TranslateAccelerator
|
||
|
; TMT_TRANSLATEMDISYSACCEL == TranslateMDISysAccel
|
||
|
; TMT_ISDIALOGMESSAGE == IsDialogMessage
|
||
|
; TMT_TRANSLATEMESSAGE == TranslateMessageA
|
||
|
;-----------------------------------------------------------------------;
|
||
|
body_TRANSLATEMESSAGETHING macro
|
||
|
local not_dde
|
||
|
local exit
|
||
|
local mpfnTranslate
|
||
|
local PushMessage
|
||
|
local MakeCall
|
||
|
local Cleanup
|
||
|
|
||
|
bp_type equ <bp_top >
|
||
|
bp_hwnd equ <bp_top+ 4>
|
||
|
bp_haccel equ <bp_top+ 8>
|
||
|
bp_pMsg equ <bp_top+12>
|
||
|
|
||
|
si_msg16 equ <(si_space-(MSGSTRUCT16_SIZE))>
|
||
|
|
||
|
; Check for DDE message, in which case we know no translation will occur,
|
||
|
; so there's no need to call the api.
|
||
|
|
||
|
sub eax,eax ;assume no translation
|
||
|
mov es,FlatData
|
||
|
mov edi,bp_pMsg
|
||
|
cmp word ptr es:[edi].ms32_message,WM_DDE_FIRST
|
||
|
jb not_dde
|
||
|
cmp word ptr es:[edi].ms32_message,WM_DDE_LAST
|
||
|
jbe exit
|
||
|
cmp word ptr es:[edi].ms32_message,WM_DROPFILES
|
||
|
je exit
|
||
|
|
||
|
not_dde:
|
||
|
mov si,sp ;;set up si for local variable frame
|
||
|
MsgStructThkPreProc ,no_load_pmsg
|
||
|
|
||
|
;
|
||
|
; TranslateAccelerator(hwnd, haccel pmsg);
|
||
|
; TranslateMDISysAccel(hwnd, pmsg);
|
||
|
; IsDialogMessage32(hwnd, psmg, TRUE);
|
||
|
; TranslateMessage32(pmsg, TRUE);
|
||
|
;
|
||
|
mov bx, word ptr bp_type
|
||
|
cmp bx, TMT_TRANSLATEMESSAGE
|
||
|
je PushMessage
|
||
|
|
||
|
; We push hwnd for all but TranslateMessage32()
|
||
|
push word ptr bp_hwnd
|
||
|
|
||
|
; We only push haccel for TranslateAccelerator()
|
||
|
cmp bx, TMT_TRANSLATEACCELERATOR
|
||
|
jne PushMessage
|
||
|
push word ptr bp_haccel
|
||
|
|
||
|
PushMessage:
|
||
|
; We push lpmsg for all
|
||
|
lea ax,si_msg16
|
||
|
push ss
|
||
|
push ax
|
||
|
|
||
|
cmp bx, TMT_ISDIALOGMESSAGE
|
||
|
jb MakeCall
|
||
|
|
||
|
; We push TRUE for IsDialogMessage32() and TranslateMessage32()
|
||
|
push 1
|
||
|
|
||
|
MakeCall:
|
||
|
shl bx, 2
|
||
|
call dword ptr cs:mpfnTranslate[bx]
|
||
|
jmp Cleanup
|
||
|
|
||
|
mpfnTranslate label dword
|
||
|
dd TranslateAccelerator
|
||
|
dd TranslateMDISysAccel
|
||
|
dd IsDialogMessage32
|
||
|
dd TranslateMessage32
|
||
|
|
||
|
Cleanup:
|
||
|
cwde
|
||
|
|
||
|
MsgStructThkPostProc
|
||
|
exit:
|
||
|
endm
|
||
|
|
||
|
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
; body_DISPATCHMESSAGEA
|
||
|
;-----------------------------------------------------------------------;
|
||
|
body_DISPATCHMESSAGEA macro
|
||
|
local DispatchExit
|
||
|
|
||
|
bp_pMsg equ <bp_top>
|
||
|
si_msg16 equ <(si_space-(MSGSTRUCT16_SIZE))>
|
||
|
|
||
|
; Blow off if message implies a pointer
|
||
|
mov es, FlatData
|
||
|
mov edi, dword ptr bp_pMsg
|
||
|
push word ptr es:[edi].ms32_message
|
||
|
call IsValidPostedMessage
|
||
|
or eax, eax
|
||
|
|
||
|
ifdef DEBUG
|
||
|
jnz @F
|
||
|
|
||
|
push eax
|
||
|
|
||
|
push cs
|
||
|
push offset szDispatchError
|
||
|
push DBF_USER or DBF_ERROR
|
||
|
call _DebugOutput
|
||
|
add sp, 2+4
|
||
|
|
||
|
pop eax
|
||
|
jmp DispatchExit
|
||
|
|
||
|
szDispatchError label byte
|
||
|
db 'DispatchMessage: ignoring retrieved message with pointer',0
|
||
|
|
||
|
@@:
|
||
|
else
|
||
|
jz DispatchExit
|
||
|
endif
|
||
|
|
||
|
mov si,sp ;;set up si for local variable frame
|
||
|
|
||
|
MsgStructThkPreProc TF_NOTPAIRED,
|
||
|
|
||
|
lea ax,si_msg16
|
||
|
push ss
|
||
|
push ax
|
||
|
push 1
|
||
|
call DispatchMessage32
|
||
|
|
||
|
DXAX2EAX
|
||
|
|
||
|
lea sp, si_cleanup
|
||
|
|
||
|
DispatchExit:
|
||
|
endm
|
||
|
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
; body_GETMESSAGETHINGA
|
||
|
;-----------------------------------------------------------------------;
|
||
|
body_GETMESSAGETHINGA macro
|
||
|
local GetThingExit
|
||
|
local GetNextMessage
|
||
|
local ItsAPeekMessage
|
||
|
local GetThingCleanup
|
||
|
local MessageError
|
||
|
|
||
|
bp_fPeek equ <bp_top >
|
||
|
bp_pMsg equ <bp_top+ 4>
|
||
|
bp_hwnd equ <bp_top+ 8>
|
||
|
bp_uMsgMin equ <bp_top+ 12>
|
||
|
bp_uMsgMax equ <bp_top+ 16>
|
||
|
bp_dwRemove equ <bp_top+ 20>
|
||
|
|
||
|
bp_msg16 equ <(bp_space-(MSGSTRUCT16_SIZE))>
|
||
|
si_msg16 equ <(si_space-(MSGSTRUCT16_SIZE))>
|
||
|
|
||
|
sub sp,(size THKSPACE16 + MSGSTRUCT16_SIZE)
|
||
|
|
||
|
mov si,sp
|
||
|
|
||
|
next_message:
|
||
|
; Repush GM/PM parms
|
||
|
push ss
|
||
|
push si
|
||
|
push word ptr bp_hwnd
|
||
|
push word ptr bp_uMsgMin
|
||
|
push word ptr bp_uMsgMax
|
||
|
|
||
|
cmp word ptr bp_fPeek, 0
|
||
|
jne ItsAPeekMessage
|
||
|
|
||
|
push 1
|
||
|
call GetMessage32
|
||
|
cwde
|
||
|
jmp GetThingCleanup
|
||
|
|
||
|
ItsAPeekMessage:
|
||
|
push dword ptr bp_dwRemove
|
||
|
push 1
|
||
|
call PeekMessage32Ex
|
||
|
cwde ; Get return into EAX in case 0
|
||
|
test ax, ax
|
||
|
jz GetThingExit
|
||
|
|
||
|
GetThingCleanup:
|
||
|
; SAVE API RETURN VALUE
|
||
|
push eax
|
||
|
|
||
|
; Blow off if message has pointers (could've come from old 16-bit app)
|
||
|
push word ptr bp_msg16.ms16_message
|
||
|
call IsValidPostedMessage
|
||
|
test eax, eax
|
||
|
jz MessageError
|
||
|
|
||
|
; The message is OK to be retrieved
|
||
|
mov si,bp ;set up frame pointer
|
||
|
|
||
|
mov cx,word ptr bp_dwRemove
|
||
|
and cx,PM_REMOVE
|
||
|
xor cx,PM_REMOVE ;turn it into PM_NOREMOVE indicator
|
||
|
shl cx,5
|
||
|
.errnz PM_REMOVE - 1
|
||
|
or cx,TF_NOTPAIRED
|
||
|
|
||
|
InitLocalSpace cx,bp
|
||
|
|
||
|
; RESTORE API RETURN VALUE
|
||
|
pop eax
|
||
|
|
||
|
MsgStructThkPostProc bp,
|
||
|
jmp GetThingExit
|
||
|
|
||
|
MessageError:
|
||
|
ifdef DEBUG
|
||
|
push cs
|
||
|
push offset szGetError
|
||
|
push DBF_USER or DBF_WARNING
|
||
|
call _DebugOutput
|
||
|
add sp, 2+4
|
||
|
|
||
|
jmp @F
|
||
|
|
||
|
szGetError label byte
|
||
|
db 'GetMessage: ignoring retrieved message with pointer',0
|
||
|
|
||
|
@@:
|
||
|
endif
|
||
|
|
||
|
; Pop off API return value to clean up stack
|
||
|
pop eax
|
||
|
|
||
|
; If this is PeekMessage PM_REMOVE or GetMessage, then just jump back to
|
||
|
; the top of the Peek loop and try again. We'll skip over this one and
|
||
|
; get the next message.
|
||
|
cmp word ptr bp_fPeek, 0
|
||
|
jz next_message
|
||
|
mov eax, dword ptr bp_dwRemove
|
||
|
test eax, PM_REMOVE
|
||
|
jnz next_message
|
||
|
|
||
|
; OK, so this is a PeekMessage PM_NOREMOVE call. This is a little more
|
||
|
; complicated. We need to call PeekMessage PM_REMOVE with the other
|
||
|
; parms the same so we swallow this bad message. THEN we want to jump
|
||
|
; back to the top of the loop and try again. Otherwise the app will
|
||
|
; hang forever because this bad message will never get removed from the
|
||
|
; front of the message list.
|
||
|
push ss
|
||
|
push si
|
||
|
push word ptr bp_hwnd
|
||
|
push word ptr bp_uMsgMin
|
||
|
push word ptr bp_uMsgMax
|
||
|
or eax, PM_REMOVE
|
||
|
push eax
|
||
|
push 1
|
||
|
call PeekMessage32Ex
|
||
|
|
||
|
; Now we can try this again.
|
||
|
jmp next_message
|
||
|
|
||
|
GetThingExit:
|
||
|
endm
|
||
|
|
||
|
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
; body_POSTMESSAGETHINGA
|
||
|
;-----------------------------------------------------------------------;
|
||
|
body_POSTMESSAGETHINGA macro
|
||
|
local mpfnPostThing
|
||
|
local PostThingWord
|
||
|
local PostThingParms
|
||
|
local PostThingCleanup
|
||
|
local exit
|
||
|
|
||
|
bp_type equ <bp_top >
|
||
|
bp_hwnd equ <bp_top+ 4>
|
||
|
bp_message equ <bp_top+ 8>
|
||
|
bp_wParamLo equ <bp_top+ 12>
|
||
|
bp_wParamHi equ <bp_top+ 14>
|
||
|
bp_lParam equ <bp_top+ 16>
|
||
|
|
||
|
; Blow this off if message implies a pointer.
|
||
|
push word ptr bp_message
|
||
|
call IsValidPostedMessage
|
||
|
or eax, eax
|
||
|
|
||
|
ifdef DEBUG
|
||
|
jnz @F
|
||
|
push eax
|
||
|
push cs
|
||
|
push offset szPostError
|
||
|
push DBF_USER or DBF_ERROR
|
||
|
call _DebugOutput
|
||
|
add sp, 2+4
|
||
|
pop eax
|
||
|
|
||
|
jmp exit
|
||
|
|
||
|
szPostError label byte
|
||
|
db 'PostMessage: ignoring posted message with pointer',0
|
||
|
@@:
|
||
|
else
|
||
|
jz exit
|
||
|
endif
|
||
|
|
||
|
mov si,sp ;;set up si for local variable frame
|
||
|
|
||
|
MsgThkPreProc TF_NOTPAIRED
|
||
|
|
||
|
;
|
||
|
; Which type of message post do we want to make?
|
||
|
; (0) PostThreadMessage32 -- dword "hwnd" (idThread really)
|
||
|
; (1) PostMessage32
|
||
|
;
|
||
|
mov eax, bp_hwnd
|
||
|
mov bx, word ptr bp_type
|
||
|
cmp bx, PMT_POSTTHREADMESSAGE
|
||
|
jne PostThingWord
|
||
|
|
||
|
push eax
|
||
|
jmp PostThingParms
|
||
|
|
||
|
PostThingWord:
|
||
|
push ax
|
||
|
|
||
|
PostThingParms:
|
||
|
push word ptr bp_space.s16_message
|
||
|
push word ptr bp_space.s16_wParam.lo
|
||
|
push dword ptr bp_space.s16_lParam
|
||
|
push word ptr bp_space.s16_wParam.hi
|
||
|
|
||
|
shl bx, 2
|
||
|
call dword ptr cs:mpfnPostThing[bx]
|
||
|
jmp PostThingCleanup
|
||
|
|
||
|
mpfnPostThing label dword
|
||
|
dd PostThreadMessage32 ; PMT_POSTTHREADMESSAGE
|
||
|
dd PostMessage32 ; PMT_POSTMESSAGE
|
||
|
|
||
|
PostThingCleanup:
|
||
|
cwde
|
||
|
|
||
|
exit:
|
||
|
endm
|
||
|
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
; body_SENDMESSAGETIMEOUTA
|
||
|
;-----------------------------------------------------------------------;
|
||
|
body_SENDMESSAGETIMEOUTA macro
|
||
|
bp_hwnd equ <bp_top >
|
||
|
bp_message equ <bp_top+ 4>
|
||
|
bp_wParamLo equ <bp_top+ 8>
|
||
|
bp_wParamHi equ <bp_top+ 10>
|
||
|
bp_lParam equ <bp_top+ 12>
|
||
|
bp_flags equ <bp_top+ 16>
|
||
|
bp_TimeOut equ <bp_top+ 20>
|
||
|
bp_lpResult equ <bp_top+ 24>
|
||
|
|
||
|
bp_lRet equ <[bp-4]>
|
||
|
|
||
|
xor eax, eax
|
||
|
push eax
|
||
|
|
||
|
mov si,sp ;;set up si for local variable frame
|
||
|
|
||
|
MsgThkPreProc , si
|
||
|
|
||
|
push word ptr si_space.s16_hwnd
|
||
|
push word ptr si_space.s16_message
|
||
|
push word ptr si_space.s16_wParam.lo
|
||
|
push dword ptr si_space.s16_lParam
|
||
|
push word ptr si_space.s16_wParam.hi
|
||
|
push word ptr bp_flags ; Only the first word of flags is used now.
|
||
|
push dword ptr bp_TimeOut
|
||
|
|
||
|
; Push FAR ptr to si_space.s16_lResult
|
||
|
push ss ; Push pointer to temp location.
|
||
|
lea ax, si_space.s16_lResult
|
||
|
push ax
|
||
|
|
||
|
call SendMessageTimeOut32
|
||
|
|
||
|
; Save _REAL_ result
|
||
|
mov word ptr bp_lRet, ax
|
||
|
mov word ptr bp_lRet+2, dx
|
||
|
|
||
|
; Replace result with one filled in by SMTO()--the "real" message return
|
||
|
mov ax, word ptr si_space.s16_lResult
|
||
|
mov dx, word ptr si_space.s16_lResult+2
|
||
|
|
||
|
or si_space.s16_fw, TF_THUNKMSGRESULT
|
||
|
MsgThkPostProc si
|
||
|
|
||
|
; EAX NOW HAS "message result" return
|
||
|
;Did caller pass in a lpResult pointer? If so, fill it in with
|
||
|
;thunked result.
|
||
|
mov edi, dword ptr bp_lpResult
|
||
|
or edi, edi
|
||
|
jz @F
|
||
|
|
||
|
mov es, FlatData
|
||
|
stosd es:[edi]
|
||
|
|
||
|
@@:
|
||
|
;Now put real SMTO return into eax
|
||
|
mov eax, dword ptr bp_lRet
|
||
|
endm
|
||
|
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
; body_SENDMESSAGECALLBACKA
|
||
|
;-----------------------------------------------------------------------;
|
||
|
body_SENDMESSAGECALLBACKA macro
|
||
|
local cleanup
|
||
|
local exit
|
||
|
bp_hwnd equ <bp_top >
|
||
|
bp_message equ <bp_top+ 4>
|
||
|
bp_wParamLo equ <bp_top+ 8>
|
||
|
bp_wParamHi equ <bp_top+ 10>
|
||
|
bp_lParam equ <bp_top+ 12>
|
||
|
bp_fnCallback equ <bp_top+ 16>
|
||
|
bp_dwData equ <bp_top+ 20>
|
||
|
|
||
|
; Blow this off if message implies a pointer.
|
||
|
|
||
|
; Unless it is WM_WININICHANGE and the pointer is NULL
|
||
|
cmp word ptr bp_lParam, 0 ; NULL pointer
|
||
|
jnz check_call
|
||
|
cmp word ptr bp_message, 1ah ; WM_WININICHANGE
|
||
|
jz valid_call ; It's ok, let it through
|
||
|
|
||
|
check_call:
|
||
|
|
||
|
push word ptr bp_message
|
||
|
call IsValidPostedMessage
|
||
|
or eax, eax
|
||
|
|
||
|
ifdef DEBUG
|
||
|
jnz @F
|
||
|
push eax
|
||
|
push cs
|
||
|
push offset szCallbackError
|
||
|
push DBF_USER or DBF_ERROR
|
||
|
call _DebugOutput
|
||
|
add sp, 2+4
|
||
|
pop eax
|
||
|
|
||
|
jmp exit
|
||
|
|
||
|
szCallbackError label byte
|
||
|
db 'SendMessageCallback: message with pointer not allowed',0
|
||
|
@@:
|
||
|
else
|
||
|
jz exit
|
||
|
endif
|
||
|
|
||
|
valid_call:
|
||
|
|
||
|
mov si,sp ;;set up si for local variable frame
|
||
|
|
||
|
MsgThkPreProc
|
||
|
|
||
|
push word ptr bp_space.s16_hwnd
|
||
|
push word ptr bp_space.s16_message
|
||
|
push word ptr bp_space.s16_wParam.lo
|
||
|
push dword ptr bp_space.s16_lParam
|
||
|
push word ptr bp_space.s16_wParam.hi
|
||
|
|
||
|
; Get 16:16 callback wrapper
|
||
|
push dword ptr bp_fnCallback
|
||
|
push dword ptr CBID_SENDMSGCALLBACK ;callback type
|
||
|
call GetStdCBSL ;create 16-bit callback stub
|
||
|
push eax
|
||
|
|
||
|
push dword ptr bp_dwData
|
||
|
|
||
|
call SendMessageCallback32
|
||
|
|
||
|
; No msg result to thunk; this will save DX:AX return & restore to EAX
|
||
|
MsgThkPostProc
|
||
|
|
||
|
exit:
|
||
|
endm
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
; body_BROADCASTSYSTEMMESSAGE
|
||
|
;-----------------------------------------------------------------------;
|
||
|
body_BROADCASTSYSTEMMESSAGE macro
|
||
|
bp_dwFlags equ <bp_top>
|
||
|
bp_lpdwRecipientList equ <bp_top+4>
|
||
|
;; NOTE: There is no hwnd parameter here; However, to satisfy the MsgThkPre/PostProc
|
||
|
;; macros, we define a dummy bp_hwnd here.
|
||
|
bp_hwnd equ <bp_top+ 4 >
|
||
|
bp_message equ <bp_top+ 8>
|
||
|
bp_wParamLo equ <bp_top+ 12>
|
||
|
bp_wParamHi equ <bp_top+ 14>
|
||
|
bp_lParam equ <bp_top+ 16>
|
||
|
|
||
|
mov si,sp ;;set up si for local variable frame
|
||
|
|
||
|
MsgThkPreProc TF_INTERPROCESS
|
||
|
push dword ptr bp_lpdwRecipientList
|
||
|
call MapLS
|
||
|
push eax ;; Save the mapped selector.
|
||
|
|
||
|
push dword ptr bp_dwFlags
|
||
|
push eax ;; 16:16 lpdwRecipientList.
|
||
|
push word ptr bp_space.s16_message
|
||
|
push word ptr bp_space.s16_wParam.lo
|
||
|
push dword ptr bp_space.s16_lParam
|
||
|
|
||
|
call BroadcastSystemMessage
|
||
|
|
||
|
pop ecx ;; Restore the 16:16 mapped selector.
|
||
|
|
||
|
; Preserve the msg result
|
||
|
push dx
|
||
|
push ax
|
||
|
|
||
|
push ecx ;; 16:16
|
||
|
call UnMapLS ;; Unmap.
|
||
|
|
||
|
; Restore the msg result
|
||
|
pop ax
|
||
|
pop dx
|
||
|
|
||
|
or bp_space.s16_fw, TF_THUNKMSGRESULT
|
||
|
MsgThkPostProc
|
||
|
endm
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
; body_CALLNEXTHOOKEX
|
||
|
;-----------------------------------------------------------------------;
|
||
|
|
||
|
; BOGUS
|
||
|
; These are already defined in user.inc, but we can't include that file
|
||
|
; here because of conflicts with public.inc
|
||
|
|
||
|
HHOOK_MAGIC equ ('H' or ('K' * 256))
|
||
|
|
||
|
HOOK struc
|
||
|
hkMagic dw ?
|
||
|
hkPhkNext dw ?
|
||
|
hkIdHook dw ?
|
||
|
hkPpi dw ?
|
||
|
hkHq dw ?
|
||
|
hkHqCreator dw ?
|
||
|
hkFlags dw ?
|
||
|
hkAtomModule dw ?
|
||
|
hkHmodOwner dd ?
|
||
|
hkLpfn dd ?
|
||
|
hkcCalled dw ?
|
||
|
HOOK ends
|
||
|
|
||
|
|
||
|
body_CALLNEXTHOOKEX macro
|
||
|
local thk_WH_MSGFILTER
|
||
|
local thk_WH_JOURNALRECORD
|
||
|
local thk_WH_JOURNALPLAYBACK
|
||
|
local thk_WH_JOURNAL
|
||
|
local thk_WH_KEYBOARD
|
||
|
local thk_WH_GETMESSAGE
|
||
|
local thk_WH_CALLWNDPROC
|
||
|
local thk_WH_CBT
|
||
|
local thk_WH_SYSMSGFILTER
|
||
|
local thk_WH_MOUSE
|
||
|
local thk_WH_HARDWARE
|
||
|
local thk_WH_DEBUG
|
||
|
local thk_WH_SHELL
|
||
|
local thk_WH_FOREGROUNDIDLE
|
||
|
local thk_WH_CALLWNDPROCRET
|
||
|
local hook_exit
|
||
|
local npfnHookThunk
|
||
|
local bad_hook_type
|
||
|
local jr_null_msg
|
||
|
local jp_push
|
||
|
|
||
|
bp_hhk equ <bp_top >
|
||
|
bp_nCode equ <bp_top+ 4>
|
||
|
bp_wParam equ <bp_top+ 8>
|
||
|
bp_lParam equ <bp_top+ 12>
|
||
|
|
||
|
;
|
||
|
; WE ARE IN USER16 NOW
|
||
|
; We can do the same validation that our hook functions do on hook
|
||
|
; handles.
|
||
|
;
|
||
|
|
||
|
xor ax, ax
|
||
|
cwd
|
||
|
|
||
|
; HIWORD of hook must be HHOOK_MAGIC
|
||
|
cmp word ptr bp_hhk+2, HHOOK_MAGIC
|
||
|
jne hook_exit
|
||
|
|
||
|
; LOWORD of hook is local ptr & therefore not NULL
|
||
|
mov di, word ptr bp_hhk
|
||
|
or di, di
|
||
|
jz hook_exit
|
||
|
|
||
|
; MAGIC field inside of hook must be HHOOK_MAGIC
|
||
|
cmp [di].hkMagic, HHOOK_MAGIC
|
||
|
jne hook_exit
|
||
|
|
||
|
mov ax, [di].hkIdHook
|
||
|
inc ax
|
||
|
add ax,ax
|
||
|
xchg ax,bx
|
||
|
jmp cs:npfnHookThunk[bx]
|
||
|
|
||
|
;dispatch table
|
||
|
|
||
|
npfnHookThunk label word
|
||
|
dw offset thk_WH_MSGFILTER
|
||
|
dw offset thk_WH_JOURNALRECORD
|
||
|
dw offset thk_WH_JOURNALPLAYBACK
|
||
|
dw offset thk_WH_KEYBOARD
|
||
|
dw offset thk_WH_GETMESSAGE
|
||
|
dw offset thk_WH_CALLWNDPROC
|
||
|
dw offset thk_WH_CBT
|
||
|
dw offset thk_WH_SYSMSGFILTER
|
||
|
dw offset thk_WH_MOUSE
|
||
|
dw offset thk_WH_HARDWARE
|
||
|
dw offset thk_WH_DEBUG
|
||
|
dw offset thk_WH_SHELL
|
||
|
dw offset thk_WH_FOREGROUNDIDLE
|
||
|
dw offset thk_WH_CALLWNDPROCRET
|
||
|
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
thk_WH_MOUSE:
|
||
|
bp_pMhs equ <bp_lParam>
|
||
|
si_mhs16 equ <(si_cleanup-(MOUSEHOOKSTRUCT16_SIZE))>
|
||
|
mov si,sp
|
||
|
MhsStructThkPreProc
|
||
|
|
||
|
push dword ptr bp_hhk
|
||
|
push word ptr bp_nCode
|
||
|
push word ptr bp_wParam
|
||
|
lea ax,si_mhs16
|
||
|
push ss
|
||
|
push ax
|
||
|
call CallNextHookEx
|
||
|
|
||
|
MhsStructThkPostProc
|
||
|
jmp hook_exit_no_return
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
thk_WH_JOURNALRECORD:
|
||
|
xor dx, dx
|
||
|
jmp thk_WH_JOURNAL
|
||
|
|
||
|
thk_WH_JOURNALPLAYBACK:
|
||
|
xor dx, dx
|
||
|
inc dx
|
||
|
|
||
|
thk_WH_JOURNAL:
|
||
|
|
||
|
bp_pJhs equ <bp_lParam>
|
||
|
si_type equ <(si_cleanup-2)>
|
||
|
si_jhs16 equ <(si_cleanup-2-(EVENTMSG16_SIZE))>
|
||
|
|
||
|
;JhsStructThkPreProc assumes type is in DX
|
||
|
mov si,sp
|
||
|
JhsStructThkPreProc
|
||
|
|
||
|
push dword ptr bp_hhk
|
||
|
push word ptr bp_nCode
|
||
|
push word ptr bp_wParam
|
||
|
mov eax, bp_pJhs
|
||
|
or eax, eax
|
||
|
jnz @F
|
||
|
push eax
|
||
|
jmp JhsCallHook
|
||
|
|
||
|
@@:
|
||
|
lea ax, si_jhs16
|
||
|
push ss
|
||
|
push ax
|
||
|
|
||
|
JhsCallHook:
|
||
|
call CallNextHookEx
|
||
|
DXAX2EAX
|
||
|
|
||
|
JhsStructThkPostProc
|
||
|
jmp hook_exit_no_return
|
||
|
|
||
|
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
thk_WH_MSGFILTER:
|
||
|
thk_WH_SYSMSGFILTER:
|
||
|
thk_WH_GETMESSAGE:
|
||
|
bp_pMsg equ <bp_lParam>
|
||
|
si_msg16 equ <(si_space-(MSGSTRUCT16_SIZE))>
|
||
|
mov si,sp
|
||
|
MsgStructThkPreProc
|
||
|
|
||
|
push dword ptr bp_hhk
|
||
|
push word ptr bp_nCode
|
||
|
push word ptr bp_wParam
|
||
|
lea ax,si_msg16
|
||
|
push ss
|
||
|
push ax
|
||
|
call CallNextHookEx
|
||
|
DXAX2EAX
|
||
|
MsgStructThkPostProc
|
||
|
|
||
|
; MsgStructThkPostProc puts return into EAX for us.
|
||
|
jmp hook_exit_no_return
|
||
|
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
thk_WH_CBT:
|
||
|
mov si,sp
|
||
|
CbtStructThkPreProc
|
||
|
;!!! assumes no need to copy back structures
|
||
|
|
||
|
thk_WH_CBT_call:
|
||
|
push dword ptr bp_hhk
|
||
|
push word ptr bp_nCode
|
||
|
push word ptr bp_wParam
|
||
|
push dword ptr si_space.s16_lParam
|
||
|
call CallNextHookEx
|
||
|
|
||
|
CbtStructThkPostProc
|
||
|
jmp hook_exit_no_return
|
||
|
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
thk_WH_DEBUG:
|
||
|
bp_pDhs equ <bp_lParam>
|
||
|
si_dhs16 equ <(si_cleanup-(DEBUGHOOK16_SIZE))>
|
||
|
mov si, sp
|
||
|
DhsStructThkPreProc
|
||
|
|
||
|
push dword ptr bp_hhk
|
||
|
push word ptr bp_nCode
|
||
|
push word ptr bp_wParam
|
||
|
lea ax, si_dhs16
|
||
|
push ss
|
||
|
push ax
|
||
|
call CallNextHookEx
|
||
|
|
||
|
DhsStructThkPostProc
|
||
|
jmp hook_exit_no_return
|
||
|
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
thk_WH_CALLWNDPROC:
|
||
|
bp_pCwp equ <bp_lParam>
|
||
|
si_cwp16 equ <(si_space-(CWPSTRUCT16_SIZE))>
|
||
|
mov si,sp
|
||
|
CwpStructThkPreProc
|
||
|
|
||
|
push dword ptr bp_hhk
|
||
|
push word ptr bp_nCode
|
||
|
push word ptr bp_wParam
|
||
|
|
||
|
; HACK
|
||
|
; Pass lpCwp16, without wParamHi on top
|
||
|
;
|
||
|
lea ax,si_cwp16
|
||
|
add ax, 2
|
||
|
push ss
|
||
|
push ax
|
||
|
call CallNextHookEx
|
||
|
|
||
|
CwpStructThkPostProc
|
||
|
jmp hook_exit_no_return
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
thk_WH_CALLWNDPROCRET:
|
||
|
bp_pCwpRet equ <bp_lParam>
|
||
|
si_cwpret16 equ <(si_space-(CWPRETSTRUCT16_SIZE))>
|
||
|
mov si,sp
|
||
|
CwpRetStructThkPreProc
|
||
|
|
||
|
push dword ptr bp_hhk
|
||
|
push word ptr bp_nCode
|
||
|
push word ptr bp_wParam
|
||
|
lea ax,si_cwpret16
|
||
|
push ss
|
||
|
push ax
|
||
|
call CallNextHookEx
|
||
|
|
||
|
CwpRetStructThkPostProc
|
||
|
jmp hook_exit_no_return
|
||
|
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
thk_WH_HARDWARE:
|
||
|
bp_pHhs equ <bp_lParam>
|
||
|
si_hhs16 equ <(si_space-(HARDWAREHOOKSTRUCT16_SIZE))>
|
||
|
mov si,sp
|
||
|
HhsStructThkPreProc
|
||
|
|
||
|
push dword ptr bp_hhk
|
||
|
push word ptr bp_nCode
|
||
|
push word ptr bp_wParam
|
||
|
lea ax,si_hhs16
|
||
|
push ss
|
||
|
push ax
|
||
|
call CallNextHookEx
|
||
|
|
||
|
HhsStructThkPostProc
|
||
|
jmp hook_exit_no_return
|
||
|
|
||
|
|
||
|
;-----------------------------------------------------------------------;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
;-----------------------------------------------------------------------;
|
||
|
thk_WH_KEYBOARD:
|
||
|
thk_WH_SHELL:
|
||
|
thk_WH_FOREGROUNDIDLE:
|
||
|
push dword ptr bp_hhk
|
||
|
push word ptr bp_nCode
|
||
|
push word ptr bp_wParam
|
||
|
push dword ptr bp_lParam
|
||
|
call CallNextHookEx
|
||
|
|
||
|
hook_exit:
|
||
|
DXAX2EAX
|
||
|
|
||
|
hook_exit_no_return:
|
||
|
endm
|
||
|
|
||
|
endif
|