windows-nt/Source/XPSP1/NT/base/crts/crtw32/rtc/stack.cpp
2020-09-26 16:20:57 +08:00

81 lines
1.6 KiB
C++

/***
*stack.cpp - RTC support
*
* Copyright (c) 1998-2001, Microsoft Corporation. All rights reserved.
*
*
*Revision History:
* 07-28-98 JWM Module incorporated into CRTs (from KFrei)
* 05-11-99 KBF Error if RTC support define not enabled
*
****/
#ifndef _RTC
#error RunTime Check support not enabled!
#endif
#include "rtcpriv.h"
/* Stack Checking Calls */
void
#ifndef _M_ALPHA // AXPMOD - No declspec(naked) for us.
__declspec(naked)
#endif
_RTC_CheckEsp()
{
#ifndef _M_ALPHA // AXPMOD - Disable this until we can get the
// assembly written for it.
__asm
{
jne esperror ;
ret
esperror:
; function prolog
push ebp
mov ebp, esp
sub esp, __LOCAL_SIZE
push eax ; save the old return value
push edx
push ebx
push esi
push edi
}
_RTC_Failure(_ReturnAddress(), _RTC_CHKSTK);
__asm
{
; function epilog
pop edi
pop esi
pop ebx
pop edx ; restore the old return value
pop eax
mov esp, ebp
pop ebp
ret
}
#endif
}
void __fastcall
_RTC_CheckStackVars(void *frame, _RTC_framedesc *v)
{
int i;
for (i = 0; i < v->varCount; i++)
{
int *head = (int *)(((char *)frame) + v->variables[i].addr + v->variables[i].size);
int *tail = (int *)(((char *)frame) + v->variables[i].addr - sizeof(int));
if (*tail != 0xcccccccc || *head != 0xcccccccc)
_RTC_StackFailure(_ReturnAddress(), v->variables[i].name);
}
}