获取Win7当前使用的堆栈大小

时间:2018-09-19 10:12:55

标签: c++ c windows winapi stack

是否有用于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

2 个答案:

答案 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);
}

在我猜想的大多数系统上都可以使用,出于诊断目的,它已经足够脏了;-)。