获取当前使用的堆栈大小为win7

问题描述 投票:-1回答:2

是否有一个用于GetCurrentThreadStackLimits的windows7函数,它似乎仅适用于windows> = 8? [1]和 - 如果不是 - 我怎么能在win 7上获得这个信息?

我需要找到当前使用堆栈大小的线程。 (使用了stacksize!=最大堆栈大小)

谢谢!

PS:用于诊断目的。我们需要找到为stm32应用程序保留的堆栈大小,我只想让pc模拟工作。

[1]:在调用该函数时,程序会编译,但在运行时会弹出一个消息框,上面写着“在kernel32.dll中找不到函数入口点”文档声明这个函数需要windows8:https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-getcurrentthreadstacklimits

c++ c windows winapi stack
2个回答
0
投票

我需要找到当前使用堆栈大小的线程。 (使用了stacksize!=最大堆栈大小)

在这种情况下,GetCurrentThreadStackLimits完全错误的功能,因为它返回分配的堆栈大小。所以最大限度地堆叠可能的堆栈大小。但通常大部分内存都是保留的,但尚未分配。如果你想要精确使用的堆栈大小 - 你需要从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 - ) - 你自己查询这个限制



-4
投票

我发现了一个令人惊讶的“快速而肮脏”的解决方案。 (这很明显)

它只是在函数中声明一个局部变量并获取该变量的地址:

uint GetCurrentStackAdress()
{
  uint aDummy;
  return reinterpret_cast<uint>(&aDummy);
}

这应该适用于大多数系统我认为和我的诊断目的它足够脏;-)。

© www.soinside.com 2019 - 2024. All rights reserved.