;-----------------------------------------------------------------------; ; Thunk direction ;-----------------------------------------------------------------------; dir equ ;-----------------------------------------------------------------------; ; Define the order of message thunk classes ;-----------------------------------------------------------------------; ;ClassList equ ClassList equ ;***********************************************************************; ; 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