ST_STORE::StDmHandleDecompressionFailure
__int64 __fastcall ST_STORE::StDmHandleDecompressionFailure(
__int64 a1,
const void *a2,
void *a3,
ULONG_PTR a4,
__int64 a5){
int v5;
__int64 v6;
int v9;
__int64 v11;
_DWORD *v12;
char *v13;
int v14;
char v15;
unsigned int v16;
_DWORD *v17;
INT64 *v18;
_ETHREAD *CurrentThread;
UINT8 *v20;
char fixed;
void *v22;
CHAR *v23;
UINT64 v24;
_ETHREAD *v25;
__int64 v26;
ULONG_PTR BugCheckParameter4;
UINT64 SourceHash;
CHAR *RegionStart;
__int128 v31;
__int128 v32;
__int64 v33;
UINT64 FinalUncompressedSize;
UINT64 RegionIndex;
PVOID v36;
UINT64 v37;
v36 = a3;
v5 = *(_DWORD *)a4;
v6 = a5;
LODWORD(RegionIndex) = *(_DWORD *)a4 >> *(_DWORD *)(a1 + 812);
LODWORD(v37) = RegionIndex;
v9 = v5 & *(_DWORD *)(a1 + 808);
LODWORD(FinalUncompressedSize) = 0;
RegionStart = (char *)a2 - (unsigned int)(16 * v9);
v33 = 0i64;
v11 = *(_QWORD *)(a5 + 56);
v12 = 0i64;
v33 = 1i64;
v32 = 0i64;
DWORD2(v32) = -1;
v31 = 0i64;
if( (int)B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeSearchKey(
a1,
*(_DWORD *)(v11 + 16),
(__int64)&v31) >= 0 )
{
if( DWORD2(v32) == -1 || !DWORD2(v32) )
v13 = (char *)&v31 + 8;
else
v13 = (char *)(v31 + 16i64 * (unsigned int)(DWORD2(v32) - 1));
v12 = ST_STORE::ST_PAGE_RECORD_GET((_DWORD *)a1, *((_QWORD *)v13 + 1));
}
B_TREE<_SM_PAGE_KEY,ST_STORE::_ST_PAGE_ENTRY,4096,NP_CONTEXT,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeSearchResultCleanup(
(__int64 *)a1,
(__int64)&v31,
0);
if( !v12 )
goto LABEL_15;
if( *(_DWORD *)a4 != *v12 )
goto LABEL_14;
v14 = 4096;
if( (v12[1] & 0xFFF) != 0 )
v14 = v12[1] & 0xFFF;
if( *(unsigned __int16 *)(a4 + 4) != v14 )
LABEL_14:
KeBugCheckEx(0x1C7u, 3ui64, a4, (ULONG_PTR)v12, 0i64);
v15 = SmHpChunkUnprotect(a1 + 192, (INT64)v12, 6, 2ui64);
v16 = v15 & 1;
if( (v15 & 1) != 0 )
{
LABEL_15:
v17 = (_DWORD *)(v6 + 64);
v18 = (INT64 *)(*(_QWORD *)(a1 + 800) + 6024i64);
if( v6 == -64 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockSharedEx((UINT64)v18, 0i64);
}
else
{
if( _InterlockedCompareExchange64(v18, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v18);
KeAbPostRelease(v18);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
v20 = *(UINT8 **)(v6 + 48);
memmove(v20, (UINT8 *)a2, *(unsigned __int16 *)(a4 + 4));
fixed = SmFixSingleBitCorruption(v20, *(unsigned __int16 *)(a4 + 4), *(unsigned int *)(a4 + 8));
v16 = fixed & 1;
if( (fixed & 1) != 0 )
{
v22 = *(void **)(v6 + 16);
v23 = (CHAR *)v36;
LODWORD(BugCheckParameter4) = *(unsigned __int16 *)(a4 + 4);
if( RtlDecompressBufferEx(
*(_WORD *)(a1 + 992),
(UINT8 *)v36,
0x1000ui64,
v20,
BugCheckParameter4,
&FinalUncompressedSize,
v22) >= 0
&& (_DWORD)FinalUncompressedSize == 4096 )
{
_InterlockedIncrement((volatile signed __int32 *)(a1 + 1928));
v24 = *(unsigned __int16 *)(a4 + 4);
_InterlockedIncrement((volatile signed __int32 *)&dword_140D23514);
MmStoreLogCorruptionFixed((INT64)a2, v24, (unsigned int)dword_140D23514);
v16 |= 2u;
}
}
else
{
v23 = (CHAR *)v36;
}
v25 = (_ETHREAD *)KeGetCurrentThread();
v26 = *(_QWORD *)(a1 + 800);
--*((_WORD *)v25 + 243);
ExAcquirePushLockSharedEx(v26 + 6024, 0i64);
*v17 = 2;
if( v16 < 2 )
{
LODWORD(SourceHash) = *(_DWORD *)(a4 + 8);
LODWORD(BugCheckParameter4) = *(unsigned __int16 *)(a1 + 992);
SmPrepareForFatalPageError(
RegionStart,
*(unsigned int *)(a1 + 784),
*(unsigned __int16 *)(a4 + 4),
(unsigned int)v37,
BugCheckParameter4,
SourceHash,
(PSTR)a2,
v23);
}
}
else
{
LODWORD(SourceHash) = *(_DWORD *)(a4 + 8);
LODWORD(BugCheckParameter4) = *(unsigned __int16 *)(a1 + 992);
SmPrepareForFatalPageError(
RegionStart,
*(unsigned int *)(a1 + 784),
*(unsigned __int16 *)(a4 + 4),
(unsigned int)RegionIndex,
BugCheckParameter4,
SourceHash,
(PSTR)a2,
(PSTR)v36);
SmHpChunkUnprotect(a1 + 192, (INT64)v12, v16 + 2, v16 + 2);
}
return v16 >> 1;
}
Referenced by:
No references.