Получить текущий размер используемого стека для win7 - PullRequest
0 голосов
/ 19 сентября 2018

Есть ли функция Windows7 для GetCurrentThreadStackLimits, которая, кажется, работает только на Windows> = 8?[1] и - если нет - как я могу получить эту информацию о выигрыше 7?

Мне нужно найти текущий размер используемого стека потоков.(usedstacksize! = Maximumstacksize)

Спасибо!

PS: Это для диагностических целей.Нам нужно найти размер стека, который нужно зарезервировать для приложения stm32, и я просто хотел, чтобы компьютерная симуляция тоже работала.

[1]: при вызове функции программа компилируется, но во время выполнения появляется окно сообщения, котороеговорит, что «точка входа в функцию не может быть найдена в kernel32.dll» Документация заявляет, что для этой функции требуется windows8: https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-getcurrentthreadstacklimits

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

я нашел удивительно простое «быстрое и грязное» решение.(что совершенно очевидно)

Это просто объявление локальной переменной в функции и получение адреса этой переменной:

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

Это должно работать на большинстве систем, которые я предполагаю, и для моей диагностикицель его достаточно грязная; -).

0 голосов
/ 19 сентября 2018

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


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...