Tuesday, May 27, 2008

Век живи, век учись (_ReturnAddress)

Оказывается, есть такой простой и доступный ms-specific способ для получения адреса инструкции, которая будет выполнятся после возврата из функции:

extern "C" void * _ReturnAddress();
void fnc()
{
void * pCaller = _ReturnAddress();
}
Полезная вещь. Хороша тем, что освобождает от необходимости писать naked-стабы на асме в тривиальных случаях, например, если вдруг захочется подменить менеджер памяти:

void * DbgAllocatePool(IN POOL_TYPE PoolType,
IN SIZE_T NumberOfBytes)
{
void * pData = ExAllocatePool(PoolType, NumberOfBytes);
if (pData)
RegisterAllocation(PoolType, NumberOfBytes, pData, _ReturnAddress());
return pData;
}
_Winnie C++ Colorizer

No comments: