Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
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_
|