我做了一个简单的函数来迭代整个堆栈并打印出每个条目的内容。
void ListStack()
{
NT_TIB* tib = (NT_TIB*)NtCurrentTeb();
for (void* address = tib->StackBase; address > tib->StackLimit; address = (char*)address - sizeof(void*))
{
void* pointsTo = *((void**)address);
printf("address=%p, points to=%p\n", address, pointsTo);
}
}
在x86上,这很好用。但是,在x64上,它会给我读取访问权限。
这有什么问题?
答案 0 :(得分:1)
问题是您要取消引用tib->StackBase
。
堆栈区域大于或等于tib->StackLimit
且小于 tib->StackBase
。 1}}页面很可能不会映射到内存中。
所以只需将你的for循环更改为:
tib->StackBase