65,184
社区成员




#include <iostream>
#include <process.h>
#include <Windows.h>
typedef NT_TIB* (NTAPI *FuncGetTIB)();
bool is_address_on_stack(void* address)
{
HINSTANCE ntdll = LoadLibrary(_T("ntdll.dll"));
if (ntdll == NULL) {
return false;
}
FuncGetTIB gettib = (FuncGetTIB)GetProcAddress(ntdll, "NtCurrentTeb");
if (gettib == NULL){
return false;
}
NT_TIB* tib = gettib();
if (tib == NULL){
return false;
}
return address < tib->StackBase && address > tib->StackLimit;
}
int main()
{
int stackobject = 0;
static int globalobject = 1;
auto_ptr<int> heapaddr(new int(2));
int* stackaddr = &stackobject;
int* globaladdr = &globalobject;
cout << "address " << stackaddr << " "
<< (is_address_on_stack(stackaddr) ? "is on stack" : "is not on stack")
<< endl;
cout << "address " << heapaddr.get() << " "
<< (is_address_on_stack(heapaddr.get()) ? "is on stack" : "is not on stack")
<< endl;
cout << "address " << globaladdr << " "
<< (is_address_on_stack(globaladdr) ? "is on stack" : "is not on stack")
<< endl;
system("PAUSE");
return 0;
}
const char* mystrcpy(const char* str2)
{
int len = strlen(str2);
char* str1 = new char[len+1];
for(int i =0; i <len; i++)
str1[i] = str2[i];
str1[len] = '\0';
return str1;
}
const char* newstr = mystrcpy(oldstr);
void mystrcpy(char* &str1, const char* str2)
{
int len = strlen(str2);
str1 = new char[len+1];
for(int i =0; i <len; i++)
str1[i] = str2[i];
str1[len] = '\0';
}
const char* newstr = NULL;
mystrcpy(newstr, oldstr);
bool IsInStack(char *p)
{
int i;
// 判断p和栈变量i的地址,看其高8位是否相等,若相等则p指向栈变量.
if ( ((unsigned)&i >> 24) == ((unsigned)p >> 24) )
return true;
return false;
}