Я не знаю какого-либо способа определить размер стека напрямую с помощью API, если у вас нет доступа к вызову CreateThread
или, если это основной поток, посмотреть размер потока по умолчанию в EXE-файле в PE заголовок.
В вашей ситуации я бы выделил кучу для безопасности, хотя массив небольших данных размером 10 КБ вряд ли будет максимизировать стек в нерекурсивных сценариях.
Однако вы можете проверить предел стека, если все сделано осторожно. Стек фиксируется в 4К-страницах, когда вы касаетесь их (через защитные страницы ), пока не достигнете предела, после чего Windows выдаст исключение переполнения стека. Когда отправляется исключение, остается одна страница стека, так что сама логика диспетчеризации исключений (включая функции фильтра) может выполняться, но Windows выдает исключение , поскольку не может выделить другую защитную страницу . Это означает, что следующее переполнение стека или зондирование не приведет к исключению переполнения стека, а будет нарушение доступа . Таким образом, чтобы обеспечить надежную работу зонда (и, в частности, повторяемость), вам необходимо извлечь из памяти память, выделенную для зонда, и восстановить защитную страницу.
В этой статье о КБ описывается, как декомпозировать стековую память и восстановить защитную страницу. Она исследует с использованием рекурсии и приращений по 10 000 байт; по умолчанию компилятор реализует свой собственный анализ стека для локальных выделений> 4 КБ, чтобы механизм роста стека работал правильно.