SmPrepareForFatalPageError

NTSTATUS __stdcall SmPrepareForFatalPageError(
        PSTR RegionStart,
        UINT64 RegionSize,
        UINT64 CompressedSize,
        UINT64 RegionIndex,
        UINT64 CompressionFormat,
        UINT64 SourceHash,
        PSTR Source,
        PSTR Target){
  INT64 v9; 
  VOID *v10; 
  int v11; 
  __int64 v12; 
  INT64 v13; 
  INT64 v14; 
  VOID **PoolWithTag; 
  NTSTATUS v16; 
  unsigned __int64 v17; 
  VOID **v18; 
  unsigned __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  __int64 v24; 
  UINT64 BugCheckOnFailure; 
  UINT64 Priority; 
  int v28; 
  size_t Size; 
  unsigned int v30; 
  int v31; 

  v31 = RegionIndex;
  v30 = CompressedSize;
  Size = RegionSize;
  v9 = 0i64;
  v10 = 0i64;
  v11 = 0;
  v12 = (unsigned int)RegionSize;
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, (unsigned int)RegionSize + 104i64, 1348627827i64);
  if( !PoolWithTag )
    goto LABEL_2;
  v28 = (int)RegionStart;
  v17 = ((unsigned __int64)((unsigned __int16)RegionStart & 0xFFF) + v12 + 4095) >> 12;
  v18 = ExAllocatePoolWithTag(0x200ui64, 8 * v17 + 48, 1346530675i64);
  v9 = (INT64)v18;
  if( !v18 )
    goto LABEL_2;
  *v18 = 0i64;
  *((_WORD *)v18 + 4) = 8 * (v17 + 6);
  *((_WORD *)v18 + 5) = 0;
  v18[4] = (VOID *)((unsigned __int64)RegionStart & 0xFFFFFFFFFFFFF000ui64);
  *((_DWORD *)v18 + 11) = (unsigned __int16)RegionStart & 0xFFF;
  *((_DWORD *)v18 + 10) = Size;
  MiProbeAndLockPages((INT64)v18, 0, 0i64);
  v11 = 1;
  if( (*(_BYTE *)(v9 + 10) & 5) != 0 )
  {
    v10 = *(VOID **)(v9 + 24);
  }
  else
  {
    LODWORD(Priority) = 1073741856;
    LODWORD(BugCheckOnFailure) = 0;
    v10 = MmMapLockedPagesSpecifyCache((_MDL *)v9, 0, MmCached, 0i64, BugCheckOnFailure, Priority);
  }
  if( !v10 )
    goto LABEL_2;
  v19 = ((unsigned __int64)PoolWithTag + 55) & 0xFFFFFFFFFFFFFFF8ui64;
  *((_BYTE *)PoolWithTag + 44) = 0;
  *(_QWORD *)(v19 + 32) = 0i64;
  *(_QWORD *)(v19 + 40) = 0i64;
  *(_QWORD *)(v19 + 48) = 0i64;
  *(_QWORD *)(v19 + 56) = 0i64;
  *(_DWORD *)v19 = 65539;
  *(_DWORD *)(v19 + 4) = v30;
  *(_DWORD *)(v19 + 8) = v31;
  *(_DWORD *)(v19 + 12) = Size;
  *(_DWORD *)(v19 + 16) = CompressionFormat;
  v20 = (unsigned int)((_DWORD)Source - v28);
  *(_DWORD *)(v19 + 20) = v20;
  *(_QWORD *)(v19 + 24) = (unsigned int)SourceHash;
  LODWORD(v21) = MmGetPhysicalAddress((UINT64)v10 + v20);
  *(_QWORD *)(v19 + 32) = v21 / 4096;
  if( ((((unsigned __int16)Source & 0xFFF) + v30 + 4095i64) & 0xFFFFFFFFFFFFF000ui64) == 4096 )
  {
    v23 = -1i64;
  }
  else
  {
    LODWORD(v22) = MmGetPhysicalAddress((UINT64)v10 + v30 + *(unsigned int *)(v19 + 20) - 1);
    v23 = v22 / 4096;
  }
  *(_QWORD *)(v19 + 40) = v23;
  LODWORD(v24) = MmGetPhysicalAddress((UINT64)Target);
  *(_QWORD *)(v19 + 48) = v24 / 4096;
  memmove((VOID *)(v19 + 56), v10, Size);
  if( KeRegisterBugCheckReasonCallback(
         (PKBUGCHECK_REASON_CALLBACK_RECORD)PoolWithTag,
         (PKBUGCHECK_REASON_CALLBACK_ROUTINE)SmFatalPageErrorDumpCallback,
         KbCallbackSecondaryDumpData,
         (PUCHAR)"nt!store memory compression") )
  {
    PoolWithTag = 0i64;
    v16 = 0;
  }
  else
  {
LABEL_2:
    v16 = -1073741670;
  }
  if( v10 )
    MmUnmapLockedPages(v10, (_MDL *)v9);
  if( v11 )
    MmUnlockPages(v9, v13, v14);
  if( v9 )
    ExFreePoolWithTag((PVOID)v9, 0);
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0);
  return v16;
}

Referenced by:

ST_STORE::StDmHandleDecompressionFailure