SmPrepareForFatalHeapCorruption
INT64 __stdcall SmPrepareForFatalHeapCorruption(VOID *Src, INT64 a2){
unsigned int v2;
unsigned int v3;
__int64 v4;
__int64 v6;
struct _KBUGCHECK_REASON_CALLBACK_RECORD *PoolWithTag;
struct _KBUGCHECK_REASON_CALLBACK_RECORD *v8;
unsigned int v9;
unsigned __int64 v10;
LONGLONG *v12;
v4 = v3;
v6 = v2;
*v12 = MmGetPhysicalAddress(Src).QuadPart / 4096;
PoolWithTag = (struct _KBUGCHECK_REASON_CALLBACK_RECORD *)ExAllocatePoolWithTag(
NonPagedPoolNx,
0x1060ui64,
0x50626D73ui64);
v8 = PoolWithTag;
if( PoolWithTag )
{
PoolWithTag->State = 0;
v10 = ((unsigned __int64)&PoolWithTag[1].Entry.Flink + 7) & 0xFFFFFFFFFFFFFFF8ui64;
*(_QWORD *)v10 = 1i64;
*(_QWORD *)(v10 + 48) = 0i64;
*(_QWORD *)(v10 + 40) = *v12;
*(_QWORD *)(v10 + 8) = Src;
*(_QWORD *)(v10 + 16) = 4096i64;
*(_QWORD *)(v10 + 32) = v4;
*(_QWORD *)(v10 + 24) = v6;
memmove((UINT8 *)(v10 + 48), (UINT8 *)Src, 0x1000ui64);
if( KeRegisterBugCheckReasonCallback(
v8,
(PKBUGCHECK_REASON_CALLBACK_ROUTINE)SmFatalHeapCorruptionDumpCallback,
KbCallbackSecondaryDumpData,
(PUCHAR)"nt!store memory compression") )
{
v8 = 0i64;
v9 = 0;
}
else
{
v9 = -1073741670;
}
if( v8 )
ExFreePoolWithTag(v8, 0);
}
else
{
return(unsigned int)-1073741670;
}
return v9;
}Referenced by:
SmHpBufferProtectEx