SmPrepareForFatalPageError

NTSTATUS __stdcall SmPrepareForFatalPageError(
        PSTR RegionStart,
        UINT64 RegionSize,
        UINT64 CompressedSize,
        UINT64 RegionIndex,
        UINT64 CompressionFormat,
        UINT64 SourceHash,
        PSTR Source,
        PSTR Target){
  struct _MDL *v9; 
  UINT8 *v10; 
  int v11; 
  __int64 v12; 
  struct _KBUGCHECK_REASON_CALLBACK_RECORD *PoolWithTag; 
  NTSTATUS v14; 
  unsigned __int64 v15; 
  struct _MDL *v16; 
  unsigned __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  int v21; 
  unsigned int Size; 
  unsigned int v23; 
  int v24; 
  v24 = RegionIndex;
  v23 = CompressedSize;
  Size = RegionSize;
  v9 = 0i64;
  v10 = 0i64;
  v11 = 0;
  v12 = (unsigned int)RegionSize;
  PoolWithTag = (struct _KBUGCHECK_REASON_CALLBACK_RECORD *)ExAllocatePoolWithTag(
                                                              NonPagedPoolNx,
                                                              (unsigned int)RegionSize + 104i64,
                                                              0x50626D73ui64);
  if( !PoolWithTag )
    goto LABEL_2;
  v21 = (int)RegionStart;
  v15 = ((unsigned __int64)((unsigned __int16)RegionStart & 0xFFF) + v12 + 4095) >> 12;
  v16 = (struct _MDL *)ExAllocatePoolWithTag(NonPagedPoolNx, 8 * v15 + 48, 0x50426D73ui64);
  v9 = v16;
  if( !v16 )
    goto LABEL_2;
  v16->Next = 0i64;
  v16->Size = 8 * (v15 + 6);
  v16->MdlFlags = 0;
  v16->StartVa = (void *)((unsigned __int64)RegionStart & 0xFFFFFFFFFFFFF000ui64);
  v16->ByteOffset = (unsigned __int16)RegionStart & 0xFFF;
  v16->ByteCount = Size;
  MiProbeAndLockPages((INT64)v16, 0, 0i64);
  v11 = 1;
  v10 = (UINT8 *)((v9->MdlFlags & 5) != 0 ? v9->MappedSystemVa : MmMapLockedPagesSpecifyCache(
                                                                   v9,
                                                                   0,
                                                                   MmCached,
                                                                   0i64,
                                                                   0,
                                                                   0x40000020u));
  if( !v10 )
    goto LABEL_2;
  v17 = ((unsigned __int64)&PoolWithTag[1].Entry.Flink + 7) & 0xFFFFFFFFFFFFFFF8ui64;
  PoolWithTag->State = 0;
  *(_QWORD *)(v17 + 32) = 0i64;
  *(_QWORD *)(v17 + 40) = 0i64;
  *(_QWORD *)(v17 + 48) = 0i64;
  *(_QWORD *)(v17 + 56) = 0i64;
  *(_DWORD *)v17 = 65539;
  *(_DWORD *)(v17 + 4) = v23;
  *(_DWORD *)(v17 + 8) = v24;
  *(_DWORD *)(v17 + 12) = Size;
  *(_DWORD *)(v17 + 16) = CompressionFormat;
  v18 = (unsigned int)((_DWORD)Source - v21);
  *(_DWORD *)(v17 + 20) = v18;
  *(_QWORD *)(v17 + 24) = (unsigned int)SourceHash;
  *(_QWORD *)(v17 + 32) = MmGetPhysicalAddress(&v10[v18]).QuadPart / 4096;
  v19 = ((((unsigned __int16)Source & 0xFFF) + v23 + 4095i64) & 0xFFFFFFFFFFFFF000ui64) == 4096 ? -1i64 : MmGetPhysicalAddress(&v10[v23 - 1 + *(unsigned int *)(v17 + 20)]).QuadPart / 4096;
  *(_QWORD *)(v17 + 40) = v19;
  *(_QWORD *)(v17 + 48) = MmGetPhysicalAddress(Target).QuadPart / 4096;
  memmove((UINT8 *)(v17 + 56), v10, Size);
  if( KeRegisterBugCheckReasonCallback(
         PoolWithTag,
         (PKBUGCHECK_REASON_CALLBACK_ROUTINE)SmFatalPageErrorDumpCallback,
         KbCallbackSecondaryDumpData,
         (PUCHAR)"nt!store memory compression") )
  {
    PoolWithTag = 0i64;
    v14 = 0;
  }
  else
  {
LABEL_2:
    v14 = -1073741670;
  }
  if( v10 )
    MmUnmapLockedPages(v10, v9);
  if( v11 )
    MmUnlockPages(v9);
  if( v9 )
    ExFreePoolWithTag(v9, 0);
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0);
  return v14;
}

Referenced by:

ST_STORE::StDmHandleDecompressionFailure