Как получить размер и смещение стека на какойто конкретный момент для текущего потока? В общем случае стоит задача определения, является ли указатель "стековым". Я хочу определить это по формуле (Who >= StackBase) and (Who - StackBase < StackSize). Но для этого мне нужно получить смещение и размер стека. Как это можно сделать? Как ещё можно определить "стековость" указателя?
NtQueryInformationThread(... ThreadBasicInformation...) получишь структуру THREAD_BASIC_INFORMATION из которой получишь указатель на TEB, там по смещению 0 структура NT_TIB, в ней то что тебе надо
Какой стек, юзермодный ? Чтоб ядерный получить нужно заюзоть SystemExtendedProcessesAndThreadsInformation. Если юзермодный, то для текущего потока смысла нет юзоть сервис для определения TEB, он адресуется сегментным регистром Fs. TEB работает в идеальном случае. Для любого потока следует получать его контекст, брать значения регистров Esp/Ebp и юзоть NtQueryVirtualMemory.
для текущего тож тогда можно еsp + NtQueryVirtualMemory... дык стек мог быть перенесен, тогда часть указателей на стек, указанный в ТЕБ, часть - в одном куске памяти с esp.
Решил пока сделать так: Код (Text): Function InStack(Who: ptr): Bool; var StackBase, StackLimit: DWord; begin asm // Uses Windows NT_TIB, see: WinNT.h // StackBase := GetStackBase; mov eax, fs:[4]; mov StackBase, eax; // StackLimit := GetStackLimit; mov eax, fs:[8]; mov StackLimit, eax; // StackSize := StackBase - StackLimit; End; // Так как стек растёт в сторону младших адресов, формула получилась вот такая: // (странновато конечно, но что поделать: адрес может равняться лимиту, но не может равняться базе) Result := (DWord(Who) >= StackLimit) and (DWord(Who) < StackBase); End; Заработало. В принципи для моей задачи ничего более сложного наверное не понадобится. Потому что стек я никуда не переношу, и ничего экзотического не делаю. А через NtQueryVirtualMemory - это как, можно чуть подробнее? что значит "TEB работает в идеальном случае"?
Drag0N Это когда никаких махинаций со стеком, TEB и прочим нет, довольно часто подобное реализуется в целях защиты приложения. NtQueryVirtualMemory - чтобы границы региона памяти выделенной под стек определить.
Clerk Всё понятно. А есть под рукой пару ссылок на примеры такой защиты и описание NtQueryVirtualMemory?
http://msdn.microsoft.com/en-us/library/aa366907(VS.85).aspx Про защиту тут на форуме по топикам Flasher'а пройдись посмотри.