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

标签 c++ c windows winapi stack

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/

相关文章:

c - C 中 kill 系统调用的不明确行为

Python、WMI、注册表和奇怪的结果

c# - 可以假设 MSMQ 永远不会崩溃吗?

c++ - 使用多个 std::arrays 初始化 2D std::array

c++ - ostream 中的负精度值

c - 我的代码不适用于大输入

c - union 体中的数据被覆盖

html - 尽管我的 Linux 上存在 Helvetica.ttf,但 Helvetica 又回到了 arial

c++ - 如何确保 Visual C++ 不允许范围内的枚举访问?

c++ - 如何使用 boost::future 重新抛出 std::exception_ptr 存储的原始异常?