Today on Codeproject, someone posted a question like "Is there any way to find whether a pointer points to stack or heap?" Is there actually an API for the same??
Well, windows dosen't provide an API or a straight forward way to accomplish this. Any how, we can find a pointer points to stack or heap by simple computations and of course with the help of TIB (Thread Information Block - if you want to learn more about TIB, have a look at the Under The Hood article of Matt Pietrek). In the Thread information block, there are two members, the "
StackTop" (located at FS) and "
StackBase" (located at FS). The "
StackTop" is the memory from which the stack started, and the "
StackBase" is the stack location the program commits upto that point. So any object created on stack will have an address between these two pointers. So if we get a pointer, just check whether the pointer falls between the above two memory locations. If it does, then it can be considered a pointer to some stack object. So here is my API to find whether the pointer points to stack or heap.
bool IsMemoryOnStack( LPVOID pVoid )
LPVOID dwStackTop = 0;
LPVOID dwStackLowCurrent = 0;
mov EAX, FS:
mov dwStackTop, eax
mov EAX, FS:
mov dwStackLowCurrent, eax
if( pVoid <= dwStackTop && pVoid >= dwStackLowCurrent )
Sample code that uses the above API.
bool bOnStack = IsMemoryOnStack( &OnStack );
int *pOnHeap = new int;
bOnStack = IsMemoryOnStack( pOnHeap );