|
|
title "x86-only Helper routine for generic thunk interface CallProc32[Ex]W" ;++ ; ; Copyright (c) 1996 Microsoft Corporation ; ; Module Name: ; ; callpr32.asm ; ; Abstract: ; ; WK32ICallProc32MakeCall is a helper routine for wkgthunk.c's ; WK32ICallProc32, the common thunk for CallProc32W and ; CallProc32ExW, the two generic thunk routines which allow ; 16-bit code to call any 32-bit function. ; ; Author: ; ; Dave Hart (davehart) 23-Jan-96 ;-- .386p
include callconv.inc
if DBG DEBUG equ 1 endif
ifdef DEBUG DEBUG_OR_WOWPROFILE equ 1 endif ifdef WOWPROFILE DEBUG_OR_WOWPROFILE equ 1 endif
;include wow.inc
_TEXT SEGMENT PARA PUBLIC 'CODE' ASSUME DS:FLAT, ES:FLAT, SS:FLAT, FS:NOTHING, GS:NOTHING
; EXTRNP _DispatchInterrupts,0
_TEXT ENDS
_DATA SEGMENT DWORD PUBLIC 'DATA'
; extrn _aw32WOW:Dword
_DATA ENDS
_TEXT SEGMENT
page ,132 subttl "WK32ICallProc32MakeCall" ;++ ; ; Routine Description: ; ; WK32ICallProc32MakeCall is a helper routine for wkgthunk.c's ; WK32ICallProc32, the common thunk for CallProc32W and ; CallProc32ExW, the two generic thunk routines which allow ; 16-bit code to call any 32-bit function. ; ; Like Win95's implementation, this code allows the called ; routine to fail to restore esp (for example, if we are ; told the routine is STDCALL but it's really CDECL). ; A number of Works 95's Wizards don't work otherwise. ; ; Arguments: ; ; pfn procedure to call ; cArgs count of DWORDs ; pArgs Argument array ; ; Returns: ; ; return value of called routine. ;
assume DS:_DATA,ES:Nothing,SS:_DATA ALIGN 16 cPublicProc _WK32ICallProc32MakeCall,3 .FPO (0,3,2,2,0,0) ; 3 params, 2 byte prolog, 2 saved registers
push edi push esi
pfn equ [esp+0ch] cbArgs equ [esp+10h] pArgs equ [esp+14h]
mov ecx,cbArgs mov edx,pfn mov edi,esp ; Save ESP if no args or ecx,ecx mov eax,ecx jz DoneArgs shr ecx,2 ; convert bytes to dwords
mov esi,pArgs sub esp,eax ; parm macros are invalid cld ; "push" the arguments mov edi,esp rep movsd ; edi is left at correct post-call ESP DoneArgs:
call edx mov esp,edi
pop esi pop edi stdRET _WK32ICallProc32MakeCall
stdENDP _WK32ICallProc32MakeCall
_TEXT ends
end
|