SmPrepareForFatalHeapCorruption

NTSTATUS __stdcall SmPrepareForFatalHeapCorruption(VOID *Src, INT64 a2){
  unsigned int v2; 
  unsigned int v3; 
  __int64 v4; 
  __int64 v6; 
  __int64 v7; 
  VOID **PoolWithTag; 
  _KBUGCHECK_REASON_CALLBACK_RECORD *v9; 
  NTSTATUS v10; 
  _QWORD *v11; 
  __int64 *v13; 

  v4 = v3;
  v6 = v2;
  LODWORD(v7) = MmGetPhysicalAddress((UINT64)Src);
  *v13 = v7 / 4096;
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x1060ui64, 1348627827i64);
  v9 = (_KBUGCHECK_REASON_CALLBACK_RECORD *)PoolWithTag;
  if( !PoolWithTag )
    return -1073741670;
  *((_BYTE *)PoolWithTag + 44) = 0;
  v11 = (_QWORD *)(((unsigned __int64)PoolWithTag + 55) & 0xFFFFFFFFFFFFFFF8ui64);
  *v11 = 1i64;
  v11[6] = 0i64;
  v11[5] = *v13;
  v11[1] = Src;
  v11[2] = 4096i64;
  v11[4] = v4;
  v11[3] = v6;
  memmove(v11 + 6, Src, 0x1000u);
  if( KeRegisterBugCheckReasonCallback(
         v9,
         (PKBUGCHECK_REASON_CALLBACK_ROUTINE)SmFatalHeapCorruptionDumpCallback,
         KbCallbackSecondaryDumpData,
         (PUCHAR)"nt!store memory compression") )
  {
    v9 = 0i64;
    v10 = 0;
  }
  else
  {
    v10 = -1073741670;
  }
  if( v9 )
    ExFreePoolWithTag(v9, 0);
  return v10;
}

Referenced by:

SmHpBufferProtectEx