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.
 
 
 
 
 
 

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