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.