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