Всем привет!
Вот так можно узнать размер стека любого потока в процессе (своем) с точностью до 4096 байт
__declspec(naked) DWORD GetThreadId(PNT_TIB pTib)
{
__asm push ebp;
__asm mov ebp,esp;
__asm mov eax,pTib;
__asm mov eax,[eax+24h]; //get ThreadId
__asm pop ebp;
__asm retn;
}
ULONG GetThreadStackSize(DWORD dwThreadId)
{
PNT_TIB pTib = 0;
ULONG ulStackSz = 0;
__asm mov eax,fs:[30h]; //get PEB address
__asm sub eax,1000h; //get TEB address of first thread
__asm mov pTib,eax;
__try{
for(;;*PDWORD(&pTib)-=0x1000)
{
if (dwThreadId == GetThreadId(pTib)){
ulStackSz = (ULONG)pTib->StackBase-(ULONG)pTib->StackLimit;
break;
}
}
}
__except(EXCEPTION_EXECUTE_HANDLER){
ulStackSz = -1; //return -1 if there is no thread with this identifier
}
return ulStackSz;
}
Вот так можно узнать размер стека текущего потока сточностью до байта.
__declspec(naked) ULONG GetCurrentThreadStackSize()
{
__asm{
mov eax,fs:[4];
lea ebx,[esp+4]; //adjust return address
sub eax,ebx;
retn;
}
}
Пример использования
int main(int argc, char* argv[])
{
printf("Stack size is %d bytes\n",GetThreadStackSize(GetCurrentThreadId()));
printf("Current stack size is %d bytes\n",GetCurrentThreadStackSize());
printf("press any key for exit\n");
getch();
return 0;
}