是否有用于GetCurrentThreadStackLimits的Windows7函数,该函数似乎仅在Windows> = 8上起作用? [1]和-如果没有-我如何在Win 7上获得此信息?
我需要找到当前使用的线程堆栈大小。 (usedstacksize!= maximumstacksize)
谢谢!
PS:用于诊断。我们需要找到要为stm32应用程序保留的堆栈大小,而我只是想使PC仿真也能正常工作。
[1]:调用该函数时,程序会编译,但在运行时会弹出一个消息框,提示“在kernel32.dll中找不到函数入口点”。文档指出此函数需要Windows8: https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-getcurrentthreadstacklimits
答案 0 :(得分:0)
我需要找到当前使用的线程堆栈大小。 (usedstacksize!= 最大堆栈大小)
在这种情况下,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;
}
所以我们首先尝试从GetCurrentThreadStackLimits
获取"kernel32"
的地址。可能,请在此处使用"api-ms-win-core-processthreads-l1-1-1"
代替"kernel32"
。如果我们得到系统提供的函数指针,请使用它。如果没有(win7-)-您自己查询此限制
答案 1 :(得分:-4)
我发现了一个非常容易的“快速又肮脏”的解决方案。 (这很明显)
它只是在函数中声明一个局部变量并获取该变量的地址:
uint GetCurrentStackAdress()
{
uint aDummy;
return reinterpret_cast<uint>(&aDummy);
}
在我猜想的大多数系统上都可以使用,出于诊断目的,它已经足够脏了;-)。