Мне нужно найти текущий размер используемого стека потоков.(usedstacksize! = Maximumstacksize)
в этом случае 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 -) - сами запросите эти ограничения