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.
89 lines
2.1 KiB
89 lines
2.1 KiB
/*
|
|
* Copyright 2002-2019 Intel Corporation.
|
|
*
|
|
* This software is provided to you as Sample Source Code as defined in the accompanying
|
|
* End User License Agreement for the Intel(R) Software Development Products ("Agreement")
|
|
* section 1.L.
|
|
*
|
|
* This software and the related documents are provided as is, with no express or implied
|
|
* warranties, other than those that are expressly stated in the License.
|
|
*/
|
|
|
|
/*! @file
|
|
* This test application verifies that Pin on Windows correctly updates the
|
|
* TEB.NtTib.StackLimit value when the application and/or tool touches the
|
|
* guard page of the application stack.
|
|
* This application must be run with the "guard_page" test tool.
|
|
*/
|
|
|
|
#include <string>
|
|
#include <iostream>
|
|
#include <windows.h>
|
|
|
|
using std::endl;
|
|
using std::string;
|
|
using std::cerr;
|
|
|
|
/*!
|
|
* Return page size in bytes.
|
|
*/
|
|
static size_t PageSize = 0;
|
|
size_t GetPageSize()
|
|
{
|
|
if (PageSize == 0)
|
|
{
|
|
SYSTEM_INFO sysInfo;
|
|
GetSystemInfo(&sysInfo);
|
|
PageSize = static_cast<size_t>(sysInfo.dwPageSize);
|
|
}
|
|
return PageSize;
|
|
}
|
|
|
|
/*!
|
|
* Return pointer to the Thread Information Block of the current thread
|
|
*/
|
|
NT_TIB * GetCurrentTib()
|
|
{
|
|
return (NT_TIB *)NtCurrentTeb();
|
|
}
|
|
|
|
/*!
|
|
* Get starting address of the guard page in the stack of the current thread
|
|
*/
|
|
char * GetStackGuardPage()
|
|
{
|
|
return ((char *)(GetCurrentTib()->StackLimit)) - GetPageSize();
|
|
}
|
|
|
|
//==========================================================================
|
|
// Printing utilities
|
|
//==========================================================================
|
|
string UnitTestName("guard_page");
|
|
|
|
static void Abort(const string & msg)
|
|
{
|
|
cerr << UnitTestName << " Failure: " << msg << endl;
|
|
exit(1);
|
|
}
|
|
|
|
|
|
/*!
|
|
* The main procedure of the application.
|
|
*/
|
|
int main(int argc, char *argv[])
|
|
{
|
|
char dummy;
|
|
|
|
for (int i = 0; i < 5; i++)
|
|
{
|
|
char * guardPage = GetStackGuardPage();
|
|
dummy = *guardPage; // touch (read) the guard page
|
|
if (GetStackGuardPage() != (guardPage - GetPageSize()))
|
|
{
|
|
Abort("Stack limit is not updated");
|
|
}
|
|
}
|
|
cerr << UnitTestName << " : Completed successfully" << endl;
|
|
return 0;
|
|
}
|