ST_STORE::StDmHandleDecompressionFailure
__int64 __fastcall ST_STORE::StDmHandleDecompressionFailure(
__int64 a1,
char *a2,
char *a3,
int *a4,
__int64 a5){
int v5;
__int64 v6;
int v9;
__int64 v11;
_DWORD *v12;
char *v13;
int v14;
char v15;
unsigned int v16;
_DWORD *v17;
_EX_PUSH_LOCK *v18;
_ETHREAD *CurrentThread;
VOID *v20;
char fixed;
VOID *v22;
char *v23;
UINT64 v24;
_ETHREAD *v25;
_EX_PUSH_LOCK *v26;
UINT64 CompressionFormat;
UINT64 SourceHash;
char *RegionStart;
__int128 v31;
__int128 v32;
__int64 v33;
UINT64 FinalUncompressedSize;
UINT64 RegionIndex;
PSTR Target;
UINT64 v37;
Target = a3;
v5 = *a4;
v6 = a5;
LODWORD(RegionIndex) = (unsigned int)*a4 >> *(_DWORD *)(a1 + 812);
LODWORD(v37) = RegionIndex;
v9 = v5 & *(_DWORD *)(a1 + 808);
LODWORD(FinalUncompressedSize) = 0;
RegionStart = &a2[-(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( *a4 != *v12 )
goto LABEL_14;
v14 = 4096;
if( (v12[1] & 0xFFF) != 0 )
v14 = v12[1] & 0xFFF;
if( *((unsigned __int16 *)a4 + 2) != v14 )
LABEL_14:
KeBugCheckEx(0x1C7u, (PVOID)3, a4, v12, 0i64);
v15 = SmHpChunkUnprotect(a1 + 192, (INT64)v12, 6, 2ui64);
v16 = v15 & 1;
if( (v15 & 1) != 0 )
{
LABEL_15:
v17 = (_DWORD *)(v6 + 64);
v18 = (_EX_PUSH_LOCK *)(*(_QWORD *)(a1 + 800) + 6024i64);
if( v6 == -64 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockSharedEx(v18, 0i64);
}
else
{
if( _InterlockedCompareExchange64(&v18->_bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v18);
KeAbPostRelease(v18);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
v20 = *(VOID **)(v6 + 48);
memmove(v20, a2, *((unsigned __int16 *)a4 + 2));
fixed = SmFixSingleBitCorruption((UINT8 *)v20, *((unsigned __int16 *)a4 + 2), (unsigned int)a4[2]);
v16 = fixed & 1;
if( (fixed & 1) != 0 )
{
v22 = *(VOID **)(v6 + 16);
v23 = Target;
LODWORD(CompressionFormat) = *((unsigned __int16 *)a4 + 2);
if( RtlDecompressBufferEx(
*(_WORD *)(a1 + 992),
(UINT8 *)Target,
0x1000ui64,
(UINT8 *)v20,
CompressionFormat,
&FinalUncompressedSize,
v22) >= 0
&& (_DWORD)FinalUncompressedSize == 4096 )
{
_InterlockedIncrement((volatile signed __int32 *)(a1 + 1928));
v24 = *((unsigned __int16 *)a4 + 2);
_InterlockedIncrement((volatile signed __int32 *)&dword_140D23514);
MmStoreLogCorruptionFixed((INT64)a2, v24, (unsigned int)dword_140D23514);
v16 |= 2u;
}
}
else
{
v23 = Target;
}
v25 = (_ETHREAD *)KeGetCurrentThread();
v26 = *(_EX_PUSH_LOCK **)(a1 + 800);
--v25->Tcb.SpecialApcDisable;
ExAcquirePushLockSharedEx(v26 + 753, 0i64);
*v17 = 2;
if( v16 < 2 )
{
LODWORD(SourceHash) = a4[2];
LODWORD(CompressionFormat) = *(unsigned __int16 *)(a1 + 992);
SmPrepareForFatalPageError(
RegionStart,
*(unsigned int *)(a1 + 784),
*((unsigned __int16 *)a4 + 2),
(unsigned int)v37,
CompressionFormat,
SourceHash,
a2,
v23);
}
}
else
{
LODWORD(SourceHash) = a4[2];
LODWORD(CompressionFormat) = *(unsigned __int16 *)(a1 + 992);
SmPrepareForFatalPageError(
RegionStart,
*(unsigned int *)(a1 + 784),
*((unsigned __int16 *)a4 + 2),
(unsigned int)RegionIndex,
CompressionFormat,
SourceHash,
a2,
Target);
SmHpChunkUnprotect(a1 + 192, (INT64)v12, v16 + 2, v16 + 2);
}
return v16 >> 1;
}
Referenced by:
No references.