Windows7 是否有 GetCurrentThreadStackLimits 函数,该函数似乎仅适用于 Windows >= 8 ? [1] 以及 - 如果没有 - 我如何在 win 7 上获得此信息?
我需要找到当前线程使用的堆栈大小。 (使用的堆栈大小!=最大堆栈大小)
谢谢!
PS:用于诊断目的。我们需要找到为 stm32 应用程序保留的堆栈大小,我只是想让 PC 模拟也能工作。
[1]:当调用该函数时,程序会编译,但在运行时会弹出一个消息框,显示“在 kernel32.dll 中找不到函数入口点”文档指出该函数需要 windows8: https://learn.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-getcurrentthreadstacklimits
最佳答案
I need to find the current threads used stack size. (usedstacksize != maximumstacksize)
在这种情况下,GetCurrentThreadStackLimits
函数对您来说根本就是错误的,因为它返回分配的 堆栈大小。所以maximumstacksize可能的堆栈大小。但通常大多数内存都是保留的,但没有分配。如果您想要确切使用的堆栈大小 - 您需要从 NT_TIB
读取它
void GetCurrentThreadUsedStackLimits(PULONG_PTR LowLimit, PULONG_PTR HighLimit )
{
NT_TIB* tib = (NT_TIB*)NtCurrentTeb();
*HighLimit = (ULONG_PTR)tib->StackBase;
*LowLimit = (ULONG_PTR)tib->StackLimit;
}
HighLimit
将与返回 GetCurrentThreadStackLimits
相同,但 LowLimit
通常会有所不同 - GetCurrentThreadStackLimits
返回堆栈的分配基数(因此当 NT_TIB.StackLimit
当前分配的堆栈限制(可以向下增长)时,它可能是最大大小
如果您想实现GetCurrentThreadStackLimits
的功能(但请注意 - 它不会返回最大堆栈大小。您可以执行下一步:
ULONG GetCurrentThreadStackLimits_old( _Out_ PULONG_PTR LowLimit, _Out_ PULONG_PTR HighLimit )
{
static void (WINAPI* GetCurrentThreadStackLimits)(PULONG_PTR , PULONG_PTR);
if (!GetCurrentThreadStackLimits)
{
*(void**)&GetCurrentThreadStackLimits = GetProcAddress(GetModuleHandle(L"kernel32"), "GetCurrentThreadStackLimits");
if (!GetCurrentThreadStackLimits)
{
NT_TIB* tib = (NT_TIB*)NtCurrentTeb();
*HighLimit = (ULONG_PTR)tib->StackBase;
MEMORY_BASIC_INFORMATION mbi;
if (VirtualQuery(tib->StackLimit, &mbi, sizeof(mbi)))
{
*LowLimit = (ULONG_PTR)mbi.AllocationBase;
return 0;
}
return GetLastError();
}
}
GetCurrentThreadStackLimits(LowLimit, HighLimit);
return 0;
}
所以我们首先尝试从“kernel32”
获取GetCurrentThreadStackLimits
的地址。可能并使用"api-ms-win-core-processthreads-l1-1-1"
此处改为“kernel32”
。如果我们有系统提供的函数指针 - 使用它。如果没有(win7 -) - 自己查询这个限制
关于c++ - 获取win7当前使用的堆栈大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52403473/