SRC: GetThreadStackSize
От: Алекс Россия http://wise-orm.com
Дата: 11.12.02 05:53
Оценка: 22 (2)
Всем привет!

Вот так можно узнать размер стека любого потока в процессе (своем) с точностью до 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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.