ST_STORE::StDmSinglePageCopy

__int64 __fastcall ST_STORE::StDmSinglePageCopy(
        __int64 a1,
        __int64 a2,
        __int64 a3,
        __int64 a4,
        ULONG_PTR a5,
        __int64 a6){
  __int64 v7; 
  __int64 a7; 
  int v10; 
  unsigned __int64 v11; 
  INT64 v12; 
  int v13; 
  UINT8 *v14; 
  unsigned int v15; 
  INT64 v16; 
  char v17; 
  INT64 *v18; 
  unsigned int v19; 
  int v20; 
  _ETHREAD *v21; 
  __int64 v22; 
  UINT64 v24; 
  UINT8 *v25; 
  _ETHREAD *CurrentThread; 
  INT64 a5a; 
  UINT64 *FinalUncompressedSize; 
  UINT64 v29; 
  unsigned int v30; 
  PVOID WorkSpace; 
  INT64 v32; 
  int v33; 
  v7 = *(unsigned int *)(a1 + 824);
  WorkSpace = (PVOID)a2;
  a7 = a3;
  v10 = *(unsigned __int16 *)(a5 + 4) - 1;
  v32 = 0i64;
  v11 = v7 + a3;
  v33 = 0;
  v12 = *(_QWORD *)(a1 + 1016);
  v13 = 0;
  LODWORD(v29) = 0;
  v14 = (UINT8 *)a4;
  v15 = -*(_DWORD *)(v12 + 8) & (*(_DWORD *)(v12 + 8) + v10);
  v30 = v15;
  if( (a4 & 1) != 0 )
  {
    v14 = *(UINT8 **)(a6 + 48);
    a4 &= ~1ui64;
  }
  v16 = v12;
  if( (v11 & 3) != 0 )
  {
    v17 = v11;
    a7 &= 0xFFFFFFFFFFFFFFFCui64;
    v11 &= 0xFFFFFFFFFFFFFFFCui64;
    if( (v17 & 2) != 0 )
    {
      v24 = (unsigned int)v7 + v15;
      v25 = (UINT8 *)a7;
      goto LABEL_25;
    }
    if( *(_DWORD *)(v12 + 24) )
    {
      memmove(*(UINT8 **)(a1 + 1784), (UINT8 *)v11, v15);
      v16 = *(_QWORD *)(a1 + 1016);
      v15 = v30;
      v11 = *(_QWORD *)(a1 + 1784);
    }
  }
  if( *(_DWORD *)(v16 + 24) )
  {
    LODWORD(v32) = *(unsigned __int16 *)(a5 + 4);
    HIDWORD(v32) = *(_DWORD *)(a5 + 8);
    v33 = *(_DWORD *)(a5 + 12);
    if( SmCrAuthDecrypt(v16, (UINT8 *)v11, (UINT64 *)v11, v15, (INT64)&v32, (INT64)FinalUncompressedSize, a7) < 0 )
    {
      v19 = -1073741173;
      ST_STORE::StDmPageError(a1, (void *)v11, (void *)a4, a5, a6, -1073741173);
      goto LABEL_19;
    }
  }
  if( (*(_DWORD *)(a1 + 776) & 0x40000) != 0 )
  {
    v18 = (INT64 *)(*(_QWORD *)(a1 + 800) + 6024i64);
    if( a6 == -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());
    }
    v13 = 2;
  }
  if( *(unsigned __int16 *)(a5 + 4) >= 0x1000u )
  {
    v24 = *(unsigned __int16 *)(a5 + 4);
    v25 = (UINT8 *)v11;
    goto LABEL_25;
  }
  LODWORD(a5a) = *(unsigned __int16 *)(a5 + 4);
  if( RtlDecompressBufferEx(*(_WORD *)(a1 + 992), v14, 0x1000ui64, (UINT8 *)v11, a5a, &v29, WorkSpace) >= 0
    && (_DWORD)v29 == 4096 )
  {
    if( v14 == (UINT8 *)a4 )
    {
LABEL_18:
      v19 = 0;
LABEL_19:
      v20 = 0;
      goto LABEL_20;
    }
    v24 = 4096i64;
    v25 = v14;
LABEL_25:
    memmove((UINT8 *)a4, v25, v24);
    goto LABEL_18;
  }
  v19 = -1073741116;
  v20 = 1;
  v13 &= 2u;
LABEL_20:
  if( v13 )
  {
    v21 = (_ETHREAD *)KeGetCurrentThread();
    v22 = *(_QWORD *)(a1 + 800);
    --*((_WORD *)v21 + 243);
    ExAcquirePushLockSharedEx(v22 + 6024, 0i64);
    *(_DWORD *)(a6 + 64) = 2;
  }
  if( v20 && (ST_STORE::StDmPageError(a1, (void *)v11, (void *)a4, a5, a6, v19) & 1) != 0 )
    return 0;
  return v19;
}

Referenced by:

No references.