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