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.