126 lines
2.6 KiB
NASM
126 lines
2.6 KiB
NASM
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
|
||
|