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
|
|||
|
|