windows-nt/Source/XPSP1/NT/windows/appcompat/shims/inc/shimstack.h
2020-09-26 16:20:57 +08:00

76 lines
3 KiB
C

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
ShimStack.h
Abstract:
Macros for giving APIs a temporary stack.
Notes:
None
History:
02/26/2000 linstev Created
--*/
#ifndef _SHIMSTACK_H_
#define _SHIMSTACK_H_
#ifdef _X86_
CRITICAL_SECTION g_csStack;
LPVOID g_pStack;
DWORD g_dwStackSize;
DWORD g_dwStackCopy;
// Macro to initialize memory and critical section for stack protection macros
// TotalSize : the total size for the temporary stack (in DWORDS)
// CopySize : the size of the current stack to copy (in DWORDS)
#define INIT_STACK(TotalSize, CopySize) \
InitializeCriticalSection(&g_csStack); \
g_pStack = VirtualAlloc(NULL, TotalSize * 4, MEM_COMMIT, PAGE_READWRITE); \
g_dwStackSize = TotalSize; \
g_dwStackCopy = CopySize;
// Macro to free the temporary stack and the critical section
#define FREE_STACK() \
VirtualFree(g_pStack, 0, MEM_RELEASE); \
DeleteCriticalSection(&g_csStack);
// Get a new stack by copying the old to a buffer.
#define NEW_STACK() \
EnterCriticalSection(&g_csStack); \
DWORD dwTempESP; \
DWORD dwDiff = (g_dwStackSize - g_dwStackCopy) * 4; \
__asm { mov dwTempESP,esp } \
__asm { push ecx } \
__asm { push esi } \
__asm { push edi } \
__asm { mov esi,dwTempESP } \
__asm { mov edi,g_pStack } \
__asm { add edi,dwDiff } \
__asm { mov ecx,g_dwStackCopy } \
__asm { cld } \
__asm { rep movsd } \
__asm { pop esi } \
__asm { pop edi } \
__asm { pop ecx } \
__asm { mov esp,g_pStack } \
__asm { add esp,dwDiff }
// Revert to the old stack
#define OLD_STACK() \
__asm { mov esp,dwTempESP } \
LeaveCriticalSection(&g_csStack);
#endif // _X86_
#endif // _SHIMSTACK_H_