gpt4 book ai didi

c++ - 获取win7当前使用的堆栈大小

转载 作者:行者123 更新时间:2023-11-30 19:52:58 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com