mirror of https://github.com/tongzx/nt5src
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.
1180 lines
30 KiB
1180 lines
30 KiB
;-----------------------------------------------------------------------;
|
|
; Thunk direction
|
|
;-----------------------------------------------------------------------;
|
|
dir equ <SL>
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; Define the order of message thunk classes
|
|
;-----------------------------------------------------------------------;
|
|
;ClassList equ <WM,DM>
|
|
ClassList equ <WM>
|
|
|
|
;***********************************************************************;
|
|
; Thunk pre- and post-processing macros. These perform any necessary
|
|
; setup prior to calling the thunking subroutines.
|
|
;***********************************************************************;
|
|
;-----------------------------------------------------------------------;
|
|
; MsgStructThkPreProc
|
|
;
|
|
; flags
|
|
; Indicates api-specific flags to set in s16_fw.
|
|
;
|
|
; noprethunk
|
|
; If non-blank, indicates that the message structure is uninitialized
|
|
; and should not be thunked before calling the API.
|
|
;
|
|
; no_load_pmsg
|
|
; Indicates that es:di already contains pmsg, so don't reload it.
|
|
;
|
|
; Requirements:
|
|
; bp_pMsg be defined
|
|
; si_space be defined
|
|
; si_msg32 be defined
|
|
;
|
|
; Results:
|
|
; SP = original SP - size THKSPACE16 - size MSGSTRUCT32
|
|
; - extra space allocated by thunk, if any
|
|
; History:
|
|
; 08-07-91 BobGru
|
|
; Wrote it.
|
|
;-----------------------------------------------------------------------;
|
|
MsgStructThkPreProc macro flags:=<0>
|
|
|
|
AssertUserDS
|
|
|
|
;;Allocate local variable space
|
|
sub sp,size THKSPACE16 + MSGSTRUCT32_SIZE
|
|
InitLocalSpace flags
|
|
|
|
les di,bp_pMsg
|
|
|
|
;;Pack the non-thunked message structure elements into the msg16 structure.
|
|
mov eax, dword ptr es:[di].ms16_time
|
|
mov dword ptr si_msg32.ms32_time, eax
|
|
|
|
movsx eax, word ptr es:[di].ms16_pt.pt16_x
|
|
mov dword ptr si_msg32.ms32_pt.pt32_x, eax
|
|
|
|
movsx eax, word ptr es:[di].ms16_pt.pt16_y
|
|
mov dword ptr si_msg32.ms32_pt.pt32_y, eax
|
|
|
|
;;Thunk the message parameters.
|
|
push word ptr es:[di].ms16_hwnd
|
|
push word ptr es:[di].ms16_message
|
|
push word ptr es:[di].ms16_wParamHi
|
|
push word ptr es:[di].ms16_wParamLo
|
|
push dword ptr es:[di].ms16_lParam
|
|
call ThkMsgSL
|
|
|
|
;;Pack the thunked parameters into the msg32 structure.
|
|
xor eax, eax
|
|
|
|
mov ax, word ptr si_space.s16_hwnd
|
|
mov dword ptr si_msg32.ms32_hwnd, eax
|
|
|
|
mov ax, word ptr si_space.s16_message
|
|
mov dword ptr si_msg32.ms32_message, eax
|
|
|
|
mov eax, dword ptr si_space.s16_wParam
|
|
mov dword ptr si_msg32.ms32_wParam, eax
|
|
|
|
mov eax, dword ptr si_space.s16_lParam
|
|
mov dword ptr si_msg32.ms32_lParam, eax
|
|
endm
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; MsgStructThkPostProc
|
|
;
|
|
; checknull
|
|
; If non-blank, indicates that if the return code is zero, the
|
|
; message structure should not be unthunked, since it is uninitialized.
|
|
; noprethunk
|
|
; If non-blank, indicates that the lParam field of the thunk space
|
|
; should not be initialized from the value passed in, since there
|
|
; was no value passed in.
|
|
;
|
|
; Requirements:
|
|
; bp_pMsg be defined
|
|
; si_space be defined
|
|
; si_msg32 be defined
|
|
; si_cleanup be defined
|
|
;
|
|
; Results:
|
|
;-----------------------------------------------------------------------;
|
|
MsgStructThkPostProc macro
|
|
|
|
AssertUserDS
|
|
|
|
; Save return from 32-bits
|
|
mov dword ptr si_space.s16_lResult, eax
|
|
|
|
push word ptr si_msg32.ms32_hwnd
|
|
push word ptr si_msg32.ms32_message
|
|
push dword ptr si_msg32.ms32_wParam
|
|
push dword ptr si_msg32.ms32_lParam
|
|
|
|
call ThkMsgLS
|
|
|
|
;;Copy the 32-bit message parameters from si_space back into the
|
|
;;MSGSTRUCT32 structure.
|
|
|
|
les di,bp_pMsg
|
|
cld
|
|
|
|
mov ax,word ptr si_space.s16_hwnd
|
|
stosw es:[di]
|
|
.errnz ms16_hwnd
|
|
|
|
mov ax,word ptr si_space.s16_message
|
|
stosw es:[di]
|
|
.errnz ms16_message - ms16_hwnd - 2
|
|
|
|
mov ax,word ptr si_space.s16_wParam.lo
|
|
stosw es:[di]
|
|
.errnz ms16_wParamLo - ms16_message - 2
|
|
|
|
mov eax,si_space.s16_lParam
|
|
stosd es:[di]
|
|
.errnz ms16_lParam - ms16_wParamLo - 2
|
|
|
|
mov eax,si_msg32.ms32_time
|
|
stosd es:[di]
|
|
.errnz ms16_time - ms16_lParam - 4
|
|
|
|
mov ax,word ptr (si_msg32.ms32_pt.pt32_y)
|
|
ror eax,16
|
|
mov ax,word ptr (si_msg32.ms32_pt.pt32_x)
|
|
stosd es:[di]
|
|
.errnz ms16_pt - ms16_time - 4
|
|
.errnz pt16_x
|
|
.errnz pt16_y - pt16_x - 2
|
|
.errnz POINT16_SIZE - pt16_y - 2
|
|
|
|
mov ax,word ptr si_space.s16_wParam.hi
|
|
stosw es:[di]
|
|
.errnz ms16_wParamHi - ms16_pt - 4
|
|
.errnz MSGSTRUCT16_SIZE - ms16_wParamHi - 2
|
|
|
|
; Restore return to 16-bits DX:AX
|
|
mov ax, word ptr si_space.s16_lResult
|
|
mov dx, word ptr si_space.s16_lResult+2
|
|
|
|
lea sp,si_cleanup
|
|
endm
|
|
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; CwpStructThkPreProc
|
|
;
|
|
; flags
|
|
; Indicates api-specific flags to set in s16_fw.
|
|
;
|
|
; noprethunk
|
|
; If non-blank, indicates that the message structure is uninitialized
|
|
; and should not be thunked before calling the API.
|
|
;
|
|
; Requirements:
|
|
; bp_pCwp be defined
|
|
; si_space be defined
|
|
; si_cwp32 be defined
|
|
;
|
|
; Results:
|
|
; SP = original SP - size THKSPACE16 - size CWPSTRUCT32
|
|
; - extra space allocated by thunk, if any
|
|
; History:
|
|
; 08-07-91 BobGru
|
|
; Wrote it.
|
|
;-----------------------------------------------------------------------;
|
|
CwpStructThkPreProc macro flags:=<0>
|
|
|
|
AssertUserDS
|
|
|
|
;;Allocate local variable space
|
|
sub sp,size THKSPACE16 + CWPSTRUCT32_SIZE
|
|
InitLocalSpace flags
|
|
|
|
;Need pCwp32. User16 has wParamHi in nice place.
|
|
les di,bp_pCwp
|
|
sub di,2
|
|
|
|
;;Thunk the message parameters.
|
|
push word ptr es:[di].cwp16_hwnd
|
|
push word ptr es:[di].cwp16_message
|
|
push word ptr es:[di].cwp16_wParamHi
|
|
push word ptr es:[di].cwp16_wParamLo
|
|
push dword ptr es:[di].cwp16_lParam
|
|
call ThkMsgSL
|
|
|
|
;;Pack the thunked parameters into the cwp32 structure.
|
|
xor eax, eax
|
|
|
|
mov ax, word ptr si_space.s16_hwnd
|
|
mov dword ptr si_cwp32.cwp32_hwnd, eax
|
|
|
|
mov ax, word ptr si_space.s16_message
|
|
mov dword ptr si_cwp32.cwp32_message, eax
|
|
|
|
mov eax, dword ptr si_space.s16_wParam
|
|
mov dword ptr si_cwp32.cwp32_wParam, eax
|
|
|
|
mov eax, dword ptr si_space.s16_lParam
|
|
mov dword ptr si_cwp32.cwp32_lParam, eax
|
|
endm
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; CwpStructThkPostProc
|
|
;
|
|
; checknull
|
|
; If non-blank, indicates that if the return code is zero, the
|
|
; message structure should not be unthunked, since it is uninitialized.
|
|
; noprethunk
|
|
; If non-blank, indicates that the lParam field of the thunk space
|
|
; should not be initialized from the value passed in, since there
|
|
; was no value passed in.
|
|
;
|
|
; Requirements:
|
|
; bp_pCwp be defined
|
|
; si_space be defined
|
|
; si_cwp32 be defined
|
|
; si_cleanup be defined
|
|
;
|
|
; Results:
|
|
;-----------------------------------------------------------------------;
|
|
CwpStructThkPostProc macro
|
|
|
|
AssertUserDS
|
|
|
|
; Save hook return result
|
|
mov dword ptr si_space.s16_lResult, eax
|
|
|
|
push word ptr si_cwp32.cwp32_hwnd
|
|
push word ptr si_cwp32.cwp32_message
|
|
push dword ptr si_cwp32.cwp32_wParam
|
|
push dword ptr si_cwp32.cwp32_lParam
|
|
|
|
call ThkMsgLS
|
|
|
|
;;Copy the 32-bit message parameters from si_space back into the
|
|
;;CWPSTRUCT32 structure.
|
|
|
|
;HACK
|
|
;wParamHi is nice location because of User16.
|
|
les di,bp_pCwp
|
|
sub di, 2
|
|
cld
|
|
|
|
; HACK: lpCwp is really lpCwp32 if you subtract 2 from offset.
|
|
mov ax, word ptr si_space.s16_wParam.hi
|
|
stosw es:[di]
|
|
.errnz cwp16_wParamHi
|
|
|
|
mov eax,si_space.s16_lParam
|
|
stosd es:[di]
|
|
.errnz cwp16_lParam - cwp16_wParamHi - 2
|
|
|
|
mov ax,word ptr si_space.s16_wParam.lo
|
|
stosw es:[di]
|
|
.errnz cwp16_wParamLo - cwp16_lParam - 4
|
|
|
|
mov ax,word ptr si_space.s16_message
|
|
stosw es:[di]
|
|
.errnz cwp16_message - cwp16_wParamLo - 2
|
|
|
|
mov ax, word ptr si_space.s16_hwnd
|
|
stosw es:[di]
|
|
.errnz cwp16_hwnd - cwp16_message - 2
|
|
.errnz CWPSTRUCT16_SIZE - cwp16_hwnd - 2
|
|
|
|
; Restore return code to 16bits DX:AX
|
|
mov ax, word ptr si_space.s16_lResult
|
|
mov dx, word ptr si_space.s16_lResult+2
|
|
|
|
lea sp,si_cleanup
|
|
endm
|
|
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; CwpRetStructThkPreProc
|
|
;
|
|
; flags
|
|
; Indicates api-specific flags to set in s16_fw.
|
|
;
|
|
; noprethunk
|
|
; If non-blank, indicates that the message structure is uninitialized
|
|
; and should not be thunked before calling the API.
|
|
;
|
|
; Requirements:
|
|
; bp_pCwpRet be defined
|
|
; si_space be defined
|
|
; si_cwpret32 be defined
|
|
;
|
|
; Results:
|
|
; SP = original SP - size THKSPACE16 - size CWPRETSTRUCT32
|
|
; - extra space allocated by thunk, if any
|
|
;-----------------------------------------------------------------------;
|
|
CwpRetStructThkPreProc macro
|
|
AssertUserDS
|
|
|
|
;;Allocate local variable space
|
|
sub sp,size THKSPACE16 + CWPRETSTRUCT32_SIZE
|
|
InitLocalSpace TF_THUNKMSGRESULT
|
|
|
|
les di,bp_pCwpRet
|
|
|
|
; Thunk the message parameters
|
|
mov eax, dword ptr es:[di].cwpret16_lResult
|
|
mov dword ptr si_space.s16_lResult, eax
|
|
|
|
push word ptr es:[di].cwpret16_hwnd
|
|
push word ptr es:[di].cwpret16_message
|
|
push word ptr es:[di].cwpret16_wParamHi
|
|
push word ptr es:[di].cwpret16_wParamLo
|
|
push dword ptr es:[di].cwpret16_lParam
|
|
call ThkMsgSL
|
|
|
|
; Copy the thunked parms back
|
|
mov eax, dword ptr si_space.s16_lResult
|
|
mov dword ptr si_cwpret32.cwpret32_lResult, eax
|
|
|
|
xor eax, eax
|
|
mov ax, word ptr si_space.s16_hwnd
|
|
mov dword ptr si_cwpret32.cwpret32_hwnd, eax
|
|
|
|
mov ax, word ptr si_space.s16_message
|
|
mov dword ptr si_cwpret32.cwpret32_message, eax
|
|
|
|
mov eax, dword ptr si_space.s16_wParam
|
|
mov dword ptr si_cwpret32.cwpret32_wParam, eax
|
|
|
|
mov eax, dword ptr si_space.s16_lParam
|
|
mov dword ptr si_cwpret32.cwpret32_lParam, eax
|
|
endm
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; CwpRetStructThkPostProc
|
|
;
|
|
; checknull
|
|
; If non-blank, indicates that if the return code is zero, the
|
|
; message structure should not be unthunked, since it is uninitialized.
|
|
; noprethunk
|
|
; If non-blank, indicates that the lParam field of the thunk space
|
|
; should not be initialized from the value passed in, since there
|
|
; was no value passed in.
|
|
;
|
|
; Requirements:
|
|
; bp_pCwpRet be defined
|
|
; si_space be defined
|
|
; si_cwpret32 be defined
|
|
; si_cleanup be defined
|
|
;
|
|
; Results:
|
|
;-----------------------------------------------------------------------;
|
|
CwpRetStructThkPostProc macro
|
|
|
|
AssertUserDS
|
|
|
|
ifdef DEBUG
|
|
; Better have TF_THUNKMSGRESULT set
|
|
test si_space.s16_fw, TF_THUNKMSGRESULT
|
|
jnz @F
|
|
|
|
int 3
|
|
@@:
|
|
endif
|
|
|
|
; Save 32bit hook return code
|
|
push eax
|
|
|
|
mov eax, dword ptr si_cwpret32.cwpret32_lResult
|
|
mov dword ptr si_space.s16_lResult, eax
|
|
|
|
push dword ptr si_cwpret32.cwpret32_lResult
|
|
push word ptr si_cwpret32.cwpret32_hwnd
|
|
push word ptr si_cwpret32.cwpret32_message
|
|
push dword ptr si_cwpret32.cwpret32_wParam
|
|
push dword ptr si_cwpret32.cwpret32_lParam
|
|
|
|
call ThkMsgLS
|
|
|
|
;;Copy the 32-bit message parameters from si_space back into the
|
|
;;CWPSTRUCT32 structure.
|
|
|
|
les di,bp_pCwpRet
|
|
cld
|
|
|
|
; Result
|
|
mov eax, dword ptr si_space.s16_lResult
|
|
stosd es:[di]
|
|
.errnz cwpret16_lResult
|
|
|
|
mov ax, word ptr si_space.s16_wParam.hi
|
|
stosw es:[di]
|
|
.errnz cwpret16_wParamHi - cwpret16_lResult - 4
|
|
|
|
mov eax, dword ptr si_space.s16_lParam
|
|
stosd es:[di]
|
|
.errnz cwpret16_lParam - cwpret16_wParamHi - 2
|
|
|
|
mov ax, word ptr si_space.s16_wParam.lo
|
|
stosw es:[di]
|
|
.errnz cwpret16_wParamLo - cwpret16_lParam - 4
|
|
|
|
mov ax, word ptr si_space.s16_message
|
|
stosw es:[di]
|
|
.errnz cwpret16_message - cwpret16_wParamLo - 2
|
|
|
|
mov ax,word ptr si_space.s16_hwnd
|
|
stosw es:[di]
|
|
.errnz cwpret16_hwnd - cwpret16_message - 2
|
|
.errnz CWPRETSTRUCT16_SIZE - cwpret16_hwnd - 2
|
|
|
|
;Restore 16bit hook return code
|
|
pop ax
|
|
pop dx
|
|
|
|
lea sp,si_cleanup
|
|
endm
|
|
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; HhsStructThkPreProc
|
|
;
|
|
; flags
|
|
; Indicates api-specific flags to set in s16_fw.
|
|
;
|
|
; noprethunk
|
|
; If non-blank, indicates that the message structure is uninitialized
|
|
; and should not be thunked before calling the API.
|
|
;
|
|
; Requirements:
|
|
; bp_pHhs be defined
|
|
; si_space be defined
|
|
; si_hhs32 be defined
|
|
;
|
|
; Results:
|
|
; SP = original SP - size THKSPACE16 - size HARDWAREHOOKSTRUCT32
|
|
; - extra space allocated by thunk, if any
|
|
; History:
|
|
; 08-07-91 BobGru
|
|
; Wrote it.
|
|
;-----------------------------------------------------------------------;
|
|
HhsStructThkPreProc macro flags:=<0>
|
|
|
|
AssertUserDS
|
|
|
|
;;Allocate local variable space
|
|
sub sp,size THKSPACE16 + HARDWAREHOOKSTRUCT32_SIZE
|
|
InitLocalSpace flags
|
|
|
|
les di,bp_pHhs
|
|
|
|
;;Thunk the message parameters.
|
|
push word ptr es:[di].hhs16_hwnd
|
|
push word ptr es:[di].hhs16_message
|
|
push word ptr es:[di].hhs16_wParamHi
|
|
push word ptr es:[di].hhs16_wParamLo
|
|
push dword ptr es:[di].hhs16_lParam
|
|
call ThkMsgSL
|
|
|
|
;;Pack the thunked parameters into the HARDWAREHOOK32 structure.
|
|
xor eax, eax
|
|
mov ax, word ptr si_space.s16_hwnd
|
|
mov dword ptr si_hhs32.hhs32_hwnd, eax
|
|
|
|
mov ax, word ptr si_space.s16_message
|
|
mov dword ptr si_hhs32.hhs32_message, eax
|
|
|
|
mov eax, dword ptr si_space.s16_wParam
|
|
mov dword ptr si_hhs32.hhs32_wParam, eax
|
|
|
|
mov eax, dword ptr si_space.s16_lParam
|
|
mov dword ptr si_hhs32.hhs32_lParam, eax
|
|
endm
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; HhsStructThkPostProc
|
|
;
|
|
; checknull
|
|
; If non-blank, indicates that if the return code is zero, the
|
|
; message structure should not be unthunked, since it is uninitialized.
|
|
; noprethunk
|
|
; If non-blank, indicates that the lParam field of the thunk space
|
|
; should not be initialized from the value passed in, since there
|
|
; was no value passed in.
|
|
;
|
|
; Requirements:
|
|
; bp_pHhs be defined
|
|
; si_space be defined
|
|
; si_hhs32 be defined
|
|
; si_cleanup be defined
|
|
;
|
|
; Results:
|
|
;-----------------------------------------------------------------------;
|
|
HhsStructThkPostProc macro
|
|
|
|
AssertUserDS
|
|
|
|
;Save 32bit hook return code
|
|
mov dword ptr si_space.s16_lResult, eax
|
|
|
|
push word ptr si_hhs32.hhs32_hwnd
|
|
push word ptr si_hhs32.hhs32_message
|
|
push dword ptr si_hhs32.hhs32_wParam
|
|
push dword ptr si_hhs32.hhs32_lParam
|
|
|
|
call ThkMsgLS
|
|
|
|
;;Copy the 32-bit message parameters from si_space back into the
|
|
;;HARDWAREHOOKSTRUCT32 structure.
|
|
|
|
les di,bp_pHhs
|
|
cld
|
|
|
|
mov ax,word ptr si_space.s16_hwnd
|
|
stosw es:[di]
|
|
.errnz hhs16_hwnd
|
|
|
|
mov ax,word ptr si_space.s16_message
|
|
stosw es:[di]
|
|
.errnz hhs16_message - hhs16_hwnd - 2
|
|
|
|
mov ax,word ptr si_space.s16_wParam.lo
|
|
stosw es:[di]
|
|
.errnz hhs16_wParamLo - hhs16_message - 2
|
|
|
|
mov eax,si_space.s16_lParam
|
|
stosd es:[di]
|
|
.errnz hhs16_lParam - hhs16_wParamLo - 2
|
|
|
|
mov ax, word ptr si_space.s16_wParam.hi
|
|
stosw es:[di]
|
|
.errnz hhs16_wParamHi - hhs16_lParam - 4
|
|
.errnz HARDWAREHOOKSTRUCT16_SIZE - hhs16_wParamHi - 2
|
|
|
|
;Restore 16bit hook return code
|
|
mov ax, word ptr si_space.s16_lResult
|
|
mov dx, word ptr si_space.s16_lResult+2
|
|
|
|
lea sp,si_cleanup
|
|
endm
|
|
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; CbtStructThkPreProc
|
|
;
|
|
; flags
|
|
; Indicates api-specific flags to set in s16_fw.
|
|
;
|
|
; Requirements:
|
|
; bp_nCode be defined
|
|
; bp_wParamLo be defined
|
|
; bp_wParamHi be defined
|
|
; bp_pMsg be defined
|
|
; si_space be defined
|
|
; cbt_switch_stacks be defined
|
|
; cbt_exit be defined
|
|
;-----------------------------------------------------------------------;
|
|
CbtStructThkPreProc macro flags:=<0>
|
|
local cbt_hook_error
|
|
local HookDispatch
|
|
local MAX_CBT_CODE
|
|
local thk_HCBT_MOVESIZE
|
|
local thk_HCBT_MINMAX
|
|
local thk_HCBT_QS
|
|
local thk_HCBT_CREATEWND
|
|
local thk_HCBT_DESTROYWND
|
|
local thk_HCBT_ACTIVATE
|
|
local thk_HCBT_CLICKSKIPPED
|
|
local thk_HCBT_KEYSKIPPED
|
|
local thk_HCBT_SYSCOMMAND
|
|
local thk_HCBT_SETFOCUS
|
|
local cbt_done
|
|
|
|
AssertUserDS
|
|
|
|
sub sp,size THKSPACE16
|
|
InitLocalSpace flags
|
|
|
|
; Convert wParam -- same for all HCBT_ hooks
|
|
movzx eax, bp_wParamLo
|
|
mov dword ptr si_space.s16_wParam, eax
|
|
|
|
mov bx,bp_nCode
|
|
cmp bx,MAX_CBT_CODE
|
|
ja cbt_hook_error
|
|
|
|
add bx,bx
|
|
jmp cs:HookDispatch[bx]
|
|
|
|
HookDispatch label word
|
|
dw offset thk_HCBT_MOVESIZE
|
|
dw offset thk_HCBT_MINMAX
|
|
dw offset thk_HCBT_QS
|
|
dw offset thk_HCBT_CREATEWND
|
|
dw offset thk_HCBT_DESTROYWND
|
|
dw offset thk_HCBT_ACTIVATE
|
|
dw offset thk_HCBT_CLICKSKIPPED
|
|
dw offset thk_HCBT_KEYSKIPPED
|
|
dw offset thk_HCBT_SYSCOMMAND
|
|
dw offset thk_HCBT_SETFOCUS
|
|
MAX_CBT_CODE equ ($-HookDispatch)/2
|
|
|
|
;Error -- invalid CBT code. Fall through to the minimal thunking.
|
|
cbt_hook_error:
|
|
|
|
|
|
thk_HCBT_DESTROYWND:
|
|
thk_HCBT_KEYSKIPPED:
|
|
thk_HCBT_MINMAX:
|
|
thk_HCBT_QS:
|
|
thk_HCBT_SETFOCUS:
|
|
thk_HCBT_SYSCOMMAND:
|
|
mov eax, dword ptr bp_pMsg
|
|
mov dword ptr si_space.s16_lParam, eax
|
|
jmp cbt_done
|
|
|
|
thk_HCBT_ACTIVATE:
|
|
sub sp,CBTACTIVATESTRUCT32_SIZE
|
|
|
|
xchg bx,si ;save frame pointer
|
|
mov di,ss ;init DS:ESI --> source, ES:EDI --> dest
|
|
mov es,di
|
|
movzx edi,sp ;do before "push ds"
|
|
push ds
|
|
lds si,bp_pMsg
|
|
movzx esi,si
|
|
cld
|
|
|
|
call cvtCBTACTIVATESTRUCTSL
|
|
|
|
pop ds
|
|
xchg bx,si ;restore frame pointer
|
|
or si_space.s16_fw, TF_CLEANUP
|
|
|
|
; Save SP since pushing SS will modify it!
|
|
mov bx,sp
|
|
push ss
|
|
push bx
|
|
call MapSL
|
|
mov dword ptr si_space.s16_lParam,eax
|
|
|
|
jmp cbt_done
|
|
|
|
thk_HCBT_MOVESIZE:
|
|
sub sp,RECT32_SIZE
|
|
|
|
xchg bx,si ;save frame pointer
|
|
mov di,ss ;init DS:ESI --> source, ES:EDI --> dest
|
|
mov es,di
|
|
movzx edi,sp ;do before "push ds"
|
|
push ds
|
|
lds si,bp_pMsg
|
|
movzx esi,si
|
|
cld
|
|
|
|
call cvtRECTSL
|
|
|
|
pop ds
|
|
xchg bx,si ;restore frame pointer
|
|
or si_space.s16_fw, TF_CLEANUP
|
|
|
|
; Save SP since pushing SS will modify it!
|
|
mov bx,sp
|
|
push ss
|
|
push bx
|
|
call MapSL
|
|
mov dword ptr si_space.s16_lParam,eax
|
|
|
|
jmp cbt_done
|
|
|
|
thk_HCBT_CREATEWND:
|
|
si_cbtc equ <(si_space - CBT_CREATEWND32_SIZE)>
|
|
sub sp,CBT_CREATEWND32_SIZE + CREATESTRUCT32_SIZE
|
|
lea ax,si_cbtc
|
|
push ss
|
|
push ax
|
|
call MapSL
|
|
mov dword ptr si_space.s16_lParam,eax
|
|
|
|
les di,bp_pMsg
|
|
movzx eax, word ptr es:[di].cbtc16_hwndInsertAfter
|
|
mov dword ptr si_cbtc.cbtc32_hwndInsertAfter, eax
|
|
|
|
xchg bx,si ;save frame pointer
|
|
mov di,ss ;init DS:ESI --> source, ES:EDI --> dest
|
|
mov es,di
|
|
movzx edi,sp ;do before "push ds"
|
|
|
|
push ds
|
|
lds si,bp_pMsg ;This sets up LPCBT in ds:si
|
|
lds si,ds:[si].cbtc16_lpcs ;This sets up LPCREATESTRUCT (1st field of cbtc16) in ds:si
|
|
movzx esi,si
|
|
sub si,2
|
|
cld
|
|
|
|
call cvtCREATESTRUCTSL
|
|
|
|
pop ds
|
|
|
|
; Restore frame pointer
|
|
xchg bx,si
|
|
or word ptr si_space.s16_fw, TF_CLEANUP
|
|
|
|
; Save SP since pushing SS will modify it!
|
|
mov bx,sp
|
|
push ss
|
|
push bx
|
|
call MapSL
|
|
mov dword ptr si_cbtc.cbtc32_lpcs,eax
|
|
|
|
;Safety check that we haven't forgotten any fields of the structure.
|
|
.errnz cbtc32_lpcs
|
|
.errnz cbtc32_hwndInsertAfter - cbtc32_lpcs - 4
|
|
.errnz CBT_CREATEWND32_SIZE - cbtc32_hwndInsertAfter - 4
|
|
|
|
jmp cbt_done
|
|
|
|
thk_HCBT_CLICKSKIPPED:
|
|
sub sp,MOUSEHOOKSTRUCT32_SIZE
|
|
|
|
xchg bx,si ;save frame pointer
|
|
mov di,ss ;init DS:ESI --> source, ES:EDI --> dest
|
|
mov es,di
|
|
movzx edi,sp ;do before "push ds"
|
|
push ds
|
|
lds si,bp_pMsg
|
|
movzx esi,si
|
|
cld
|
|
|
|
call cvtMOUSEHOOKSTRUCTSL
|
|
|
|
pop ds
|
|
xchg bx,si ;restore frame pointer
|
|
or si_space.s16_fw, TF_CLEANUP
|
|
|
|
; Save SP since pushing SS will modify it!
|
|
mov bx,sp
|
|
push ss
|
|
push bx
|
|
call MapSL
|
|
mov dword ptr si_space.s16_lParam,eax
|
|
|
|
cbt_done:
|
|
endm
|
|
|
|
|
|
|
|
;----------------------------------------------------------------------------
|
|
;
|
|
; CbtStructThkPostProc
|
|
;
|
|
; We need to cleanup after making 32-bit call. Any HCBT_ codes with
|
|
; LP to structures in lParam require cleanup. This structure must be
|
|
; We need to cleanup after HCBT_CREATEWND, converting back the CREATESTRUCT
|
|
;
|
|
;----------------------------------------------------------------------------
|
|
CbtStructThkPostProc macro
|
|
local cbt_hook_error
|
|
local cbt_done
|
|
local HookDispatch
|
|
local MAX_CBT_CODE
|
|
local thk_HCBT_MOVESIZE
|
|
local thk_HCBT_MINMAX
|
|
local thk_HCBT_QS
|
|
local thk_HCBT_CREATEWND
|
|
local thk_HCBT_DESTROYWND
|
|
local thk_HCBT_ACTIVATE
|
|
local thk_HCBT_CLICKSKIPPED
|
|
local thk_HCBT_KEYSKIPPED
|
|
local thk_HCBT_SYSCOMMAND
|
|
local thk_HCBT_SETFOCUS
|
|
|
|
AssertUserDS
|
|
|
|
; Save 32bit return code
|
|
mov si_space.s16_lResult, eax
|
|
|
|
mov bx, bp_nCode
|
|
cmp bx, MAX_CBT_CODE
|
|
ja cbt_hook_error
|
|
|
|
add bx, bx
|
|
jmp cs:HookDispatch[bx]
|
|
|
|
HookDispatch label word
|
|
dw offset thk_HCBT_MOVESIZE
|
|
dw offset thk_HCBT_MINMAX
|
|
dw offset thk_HCBT_QS
|
|
dw offset thk_HCBT_CREATEWND
|
|
dw offset thk_HCBT_DESTROYWND
|
|
dw offset thk_HCBT_ACTIVATE
|
|
dw offset thk_HCBT_CLICKSKIPPED
|
|
dw offset thk_HCBT_KEYSKIPPED
|
|
dw offset thk_HCBT_SYSCOMMAND
|
|
dw offset thk_HCBT_SETFOCUS
|
|
MAX_CBT_CODE equ ($-HookDispatch)/2
|
|
|
|
thk_HCBT_CREATEWND:
|
|
si_cbtc equ <(si_space-CBT_CREATEWND32_SIZE)>
|
|
; lParam is LPCBT_CREATEWND, which contains an embedded LPCREATESTRUCT
|
|
push ds
|
|
push esi
|
|
push edi
|
|
|
|
; 16-bit LPCBT_CREATEWND
|
|
les di, bp_pMsg
|
|
|
|
; 32-bit LPCBT_CREATEWND. Save frame pointer in BX!
|
|
mov bx, si
|
|
mov ds, FlatData
|
|
mov esi, dword ptr si_space.s16_lParam
|
|
|
|
; Copy back the HWND
|
|
mov ax, word ptr ds:[esi].cbtc32_hwndInsertAfter
|
|
mov es:[di].cbtc16_hwndInsertAfter, ax
|
|
|
|
; Cleanup the CREATESTRUCT
|
|
|
|
; 16-bit LPCREATESTRUCT
|
|
les di, es:[di].cbtc16_lpcs
|
|
sub di, 2
|
|
movzx edi, di
|
|
|
|
; 32-bit LPCREATESTRUCT
|
|
mov esi, dword ptr ds:[esi].cbtc32_lpcs
|
|
|
|
cld
|
|
call cvtCREATESTRUCTLS
|
|
|
|
pop edi
|
|
pop esi
|
|
pop ds
|
|
jmp cbt_done
|
|
|
|
thk_HCBT_ACTIVATE:
|
|
; lParam is LPCBTACTIVATESTRUCT
|
|
push ds
|
|
push esi
|
|
push edi
|
|
|
|
; 16-bit LPCBTACTIVATESTRUCT
|
|
les di, bp_pMsg
|
|
movzx edi, di
|
|
|
|
; 32-bit LPCBTACTIVATESTRUCT
|
|
mov bx, si
|
|
mov ds, FlatData
|
|
mov esi, dword ptr si_space.s16_lParam
|
|
|
|
cld
|
|
call cvtCBTACTIVATESTRUCTLS
|
|
|
|
pop edi
|
|
pop esi
|
|
pop ds
|
|
jmp cbt_done
|
|
|
|
thk_HCBT_MOVESIZE:
|
|
; lParam is LPRECT
|
|
push ds
|
|
push esi
|
|
push edi
|
|
|
|
; 16-bit LPRECT
|
|
les di, bp_pMsg
|
|
movzx edi, di
|
|
|
|
; 32-bit LPRECT
|
|
mov bx, si
|
|
mov ds, FlatData
|
|
mov esi, dword ptr si_space.s16_lParam
|
|
|
|
cld
|
|
call cvtRECTLS
|
|
|
|
pop edi
|
|
pop esi
|
|
pop ds
|
|
jmp cbt_done
|
|
|
|
thk_HCBT_CLICKSKIPPED:
|
|
; lParam is LPMOUSEHOOKSTRUCT
|
|
push ds
|
|
push esi
|
|
push edi
|
|
|
|
; 16-bit LPMOUSEHOOKSTRUCT
|
|
les di, bp_pMsg
|
|
movzx edi, di
|
|
|
|
; 32-bit LPMOUSEHOOKSTRUCT
|
|
mov bx, si
|
|
mov ds, FlatData
|
|
mov esi, dword ptr si_space.s16_lParam
|
|
|
|
cld
|
|
call cvtMOUSEHOOKSTRUCTLS
|
|
|
|
pop edi
|
|
pop esi
|
|
pop ds
|
|
jmp cbt_done
|
|
|
|
cbt_hook_error:
|
|
; Error -- invalid CBT code.
|
|
; FALL THRU
|
|
|
|
thk_HCBT_DESTROYWND:
|
|
thk_HCBT_KEYSKIPPED:
|
|
thk_HCBT_MINMAX:
|
|
thk_HCBT_QS:
|
|
thk_HCBT_SETFOCUS:
|
|
thk_HCBT_SYSCOMMAND:
|
|
; No cleanup required
|
|
|
|
cbt_done:
|
|
; Restore 16bit return code
|
|
mov ax, word ptr si_space.s16_lResult.lo
|
|
mov dx, word ptr si_space.s16_lResult.hi
|
|
|
|
lea sp, si_cleanup
|
|
endm
|
|
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; MhsStructThkPreProc
|
|
;
|
|
; Requirements:
|
|
; bp_pMhs be defined
|
|
;
|
|
; Results:
|
|
; SP = original SP - size MOUSEHOOKSTRUCT32
|
|
; History:
|
|
; 04-10-92 BobGru
|
|
; Wrote it.
|
|
;-----------------------------------------------------------------------;
|
|
MhsStructThkPreProc macro
|
|
|
|
AssertUserDS
|
|
|
|
sub sp,MOUSEHOOKSTRUCT32_SIZE
|
|
|
|
xchg bx,si ;save frame pointer
|
|
mov di,ss ;init DS:ESI --> source, ES:EDI --> dest
|
|
mov es,di
|
|
movzx edi,sp ;do before any pushes
|
|
|
|
push ds
|
|
|
|
lds si,bp_pMhs
|
|
movzx esi,si
|
|
cld
|
|
|
|
call cvtMOUSEHOOKSTRUCTSL
|
|
|
|
pop ds
|
|
|
|
xchg bx,si ;restore frame pointer
|
|
endm
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; MhsStructThkPostProc
|
|
;
|
|
; Requirements:
|
|
; bp_pMhs be defined
|
|
;
|
|
; Results:
|
|
;
|
|
; History:
|
|
; 04-10-92 BobGru
|
|
; Wrote it.
|
|
;-----------------------------------------------------------------------;
|
|
MhsStructThkPostProc macro
|
|
|
|
AssertUserDS
|
|
|
|
xchg bx,si ;save frame pointer
|
|
movzx esi,sp ;do before any pushes
|
|
|
|
;Save return code and DS
|
|
push eax
|
|
push ds
|
|
|
|
mov di,ss ;init DS:ESI --> source, ES:EDI --> dest
|
|
mov ds,di
|
|
|
|
les di,bp_pMhs
|
|
movzx edi,di
|
|
cld
|
|
|
|
call cvtMOUSEHOOKSTRUCTLS
|
|
|
|
;Restore return code and DS
|
|
pop ds
|
|
pop eax
|
|
|
|
xchg si, bx
|
|
lea sp,si_cleanup
|
|
endm
|
|
|
|
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; JhsStructThkPreProc
|
|
;
|
|
; Requirements:
|
|
; bp_pJhs be defined
|
|
; si_type ""
|
|
; DX must be 0 or 1; 0 for JOURNALRECORD, 1 for JOURNALPLAYBACK
|
|
;
|
|
; Results:
|
|
; SP = original SP - size EVENTMSG32
|
|
;-----------------------------------------------------------------------;
|
|
JhsStructThkPreProc macro
|
|
AssertUserDS
|
|
|
|
; Leave space for si_type and si_Jhs32
|
|
push dx
|
|
sub sp, EVENTMSG32_SIZE
|
|
|
|
xchg bx,si ;save frame pointer
|
|
mov di,ss ;init DS:ESI --> source, ES:EDI --> dest
|
|
mov es,di
|
|
movzx edi,sp ;do before any pushes
|
|
|
|
push ds
|
|
|
|
mov ds,word ptr bp_pJhs+2
|
|
mov si,ds
|
|
or si,si
|
|
jz @F
|
|
movzx esi,word ptr bp_pJhs
|
|
cld
|
|
|
|
call cvtEVENTMSGSL
|
|
@@:
|
|
pop ds
|
|
|
|
xchg bx,si ;restore frame pointer
|
|
endm
|
|
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; JhsStructThkPostProc
|
|
;
|
|
; Requirements:
|
|
; bp_pJhs be defined
|
|
; si_type ""
|
|
; DX must be 0 or 1; 0 for JOURNALRECORD, 1 for JOURNALPLAYBACK
|
|
;
|
|
; Results:
|
|
;
|
|
;-----------------------------------------------------------------------;
|
|
JhsStructThkPostProc macro
|
|
|
|
AssertUserDS
|
|
|
|
; DO THIS FIRST BEFORE SI IS TRASHED
|
|
mov dx, word ptr si_type
|
|
|
|
xchg bx,si ;save frame pointer
|
|
movzx esi,sp ;do before any pushes
|
|
|
|
;Save return code and DS
|
|
push eax
|
|
push ds
|
|
|
|
mov di,ss ;init DS:ESI --> source, ES:EDI --> dest
|
|
mov ds,di
|
|
mov es,word ptr bp_pJhs+2
|
|
mov di,es
|
|
or di,di
|
|
jz @F
|
|
|
|
mov di,word ptr bp_pJhs
|
|
movzx edi,di
|
|
|
|
cld
|
|
call cvtEVENTMSGLS
|
|
@@:
|
|
|
|
;Restore return code and DS
|
|
pop ds
|
|
pop ax
|
|
pop dx
|
|
|
|
xchg bx,si ;restore frame pointer
|
|
lea sp,si_cleanup
|
|
endm
|
|
|
|
|
|
|
|
;----------------------------------------------------------------------------
|
|
;
|
|
; DhsStructThkPreProc
|
|
; Thunks S->L for WH_DEBUG
|
|
;
|
|
;----------------------------------------------------------------------------
|
|
DhsStructThkPreProc macro
|
|
|
|
AssertUserDS
|
|
|
|
sub sp, DEBUGHOOK32_SIZE
|
|
xchg bx, si
|
|
mov di, ss
|
|
mov es, di
|
|
movzx edi, sp
|
|
|
|
push ds
|
|
lds si, bp_pDhs
|
|
movzx esi, si
|
|
cld
|
|
|
|
; EXPECTS hTask in AX
|
|
; RETURNS whType in AX
|
|
mov ax, word ptr bp_wParam
|
|
call cvtDEBUGHOOKSL
|
|
mov word ptr bp_wParam, ax
|
|
|
|
pop ds
|
|
xchg bx, si
|
|
endm
|
|
|
|
|
|
;----------------------------------------------------------------------------
|
|
;
|
|
; DhsStructThkPostProc()
|
|
; Cleans up L->S for WH_DEBUG
|
|
;
|
|
;----------------------------------------------------------------------------
|
|
DhsStructThkPostProc macro
|
|
|
|
AssertUserDS
|
|
|
|
xchg bx, si
|
|
movzx esi, sp
|
|
|
|
; Save return code and DS AFTER setting up ESI with SP
|
|
push eax
|
|
push ds
|
|
|
|
mov di, ss
|
|
mov ds, di
|
|
|
|
les di, bp_pDhs
|
|
movzx edi, di
|
|
cld
|
|
|
|
; EXPECTS whType in AX
|
|
; RETURNS hTask in AX (don't need it)
|
|
mov ax, word ptr bp_wParam
|
|
call cvtDEBUGHOOKLS
|
|
|
|
; Restore DS and return code
|
|
pop ds
|
|
pop eax
|
|
|
|
xchg si, bx
|
|
lea sp, si_cleanup
|
|
endm
|
|
|