Как узнать низ стека?
От: jekjek Россия  
Дата: 20.04.05 10:41
Оценка:
Необходимо узнать адрес последней доступной для пользователя страницы на стеке. Устроено все так: есть регион стека, который легко узнается с помощью VirtualQuery. Однако, нужно не начало этого региона, а то место, которое находится непосредственно за несмещаемой страницей с PAGE_NOACCESS. Оно находится через N страниц от AllocationBase, которое возвратит VirtualQuery. Ведь дальше располагаются подряд страницы с PAGE_GUARD (ну, в WinNT), при росте стека PAGE_GUARD с них снимается. Так вот, очень нужно узнать то место, до которого PAGE_GUARD может сниматься, то есть значение N!..

Кажется, это можно узнать из TIB, но как именно?..

Подскажите советом...
Заранее спасибо!
Re: Как узнать низ стека?
От: Сергей Мухин Россия  
Дата: 20.04.05 10:58
Оценка:
Здравствуйте, jekjek, Вы писали:

J>Необходимо узнать адрес последней доступной для пользователя страницы на стеке. Устроено все так: есть регион стека, который легко узнается с помощью VirtualQuery. Однако, нужно не начало этого региона, а то место, которое находится непосредственно за несмещаемой страницей с PAGE_NOACCESS. Оно находится через N страниц от AllocationBase, которое возвратит VirtualQuery. Ведь дальше располагаются подряд страницы с PAGE_GUARD (ну, в WinNT), при росте стека PAGE_GUARD с них снимается. Так вот, очень нужно узнать то место, до которого PAGE_GUARD может сниматься, то есть значение N!..


J>Кажется, это можно узнать из TIB, но как именно?..


J>Подскажите советом...

J>Заранее спасибо!


на вскидку. но мб смещение другое

fs:0 ExceptionList
fs:4 StcakBAse
fs:8 StackLimit
---
С уважением,
Сергей Мухин
Re[2]: Как узнать низ стека?
От: Andrew S Россия http://alchemy-lab.com
Дата: 20.04.05 12:40
Оценка:
СМ>на вскидку. но мб смещение другое

СМ>fs:0 ExceptionList

СМ>fs:4 StcakBAse
СМ>fs:8 StackLimit

Все так. В winnt.h определена структура NT_TIB, которая является частью TEB:

typedef struct _NT_TEB
{
   NT_TIB Tib;                         // 00h
   PVOID EnvironmentPointer;           // 1Ch
   CLIENT_ID Cid;                      // 20h
...
}


Получить TEB можно либо при помощи NtCurrentTeb(), либо как fs::[offset]. Нулевое смещение — начало TEB, совпадающее с началом TIB.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.