76 lines
3.0 KiB
C
76 lines
3.0 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_
|