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