windows-nt/Source/XPSP1/NT/base/mvdm/wow32/fastwow.h

82 lines
2.4 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++ BUILD Version: 0003
*
* WOW v1.0
*
* Copyright (c) 1991, 1992, 1993 Microsoft Corporation
*
* FASTWOW.H
* WOW32 x86 fast callback/API support
*
* History:
* Created 4-Dec-1992 by barry bradie (barryb)
--*/
#if defined(i386) && !defined(DEBUG_OR_WOWPROFILE)
#define FASTBOPPING 1
#else
#define FASTBOPPING 0
#endif
#if FASTBOPPING
extern BYTE fKernelCSIPFixed;
// Used by the monitor to dispatch interupts. Updated for callbacks and bops
extern DECLSPEC_IMPORT PVOID CurrentMonitorTeb;
#endif
#if FASTBOPPING
VOID WOWBopEntry(VOID);
VPVOID FastBopVDMStack(void);
VOID FastBopSetVDMStack(VPVOID vp);
VOID FastWOWCallbackCall(VOID);
VOID FastWOWCallbackRet(VOID);
#define FASTVDMSTACK() FastBopVDMStack()
#define SETFASTVDMSTACK(vp) FastBopSetVDMStack(vp)
#endif
//#if FASTBOPPING
//
// Used to put lock prefixes in appropriate places for MP machines
//
extern VOID FastWowFirstCode(VOID);
extern VOID FixLocks(VOID);
//#endif
#if 0
How to set a 16-bit register from the 32-bit side:
WOW16Call is called by all API thunks. this routine sets up a stack
frame (the VDMFRAME) before getting over to WOW32. the VDMFRAME is where
all the registers are stored - whenever a task has crossed over to WOW32
either via an API call or by returning from a callback, it saves
its registers in the frame. immediately upon returning from WOW32
it pops the stuff off the stack back into the registers. the way
to get a value into a specific register when the task starts executing
16-bit code again is to put it in the frame.
*** do not use the setAX(), setDX(), etc. functions for this purpose ***
those routines update a context block. when the app re-enters 16-bit
code the registers will have the requested values but will be
immediately overwritten by the values on the stack.
similarly, to retrieve a value that was in a register at the time
of the API call you should fetch it out of the frame.
note that this is only valid for a few registers, because the
validation layer may modify the general-purpose registers.
upon returning from a callback everything on the 16-bit stack
should be valid. to get the value that was in a register
after a callback, pull it out of the callback frame. note that
there are general-purpose words in the callback frame for passing
extra data from the 16-bit callback routine to WOW32.
*** do not use the getAX(), getDX(), etc. functions for this purpose ***
#endif