ST_STORE::StDmSinglePageCopy

__int64 __fastcall ST_STORE::StDmSinglePageCopy(
        unsigned int *VirtualAddress,
        void *a2,
        __int64 a3,
        unsigned __int64 a4,
        __int64 a5,
        __int64 a6){
  __int64 v7; 
  int v10; 
  unsigned __int64 v11; 
  _SMCR_ENCRYPT_CONTEXT *v12; 
  int v13; 
  UINT8 *v14; 
  unsigned int v15; 
  _SMCR_ENCRYPT_CONTEXT *v16; 
  char v17; 
  unsigned __int64 v18; 
  _EX_PUSH_LOCK *v19; 
  unsigned int v20; 
  int v21; 
  _ETHREAD *v22; 
  _EX_PUSH_LOCK *v23; 
  size_t v25; 
  const VOID *v26; 
  _ETHREAD *CurrentThread; 
  UINT64 CompressedBufferSize; 
  UINT64 *FinalUncompressedSize; 
  UINT64 v30; 
  unsigned int v31; 
  PVOID WorkSpace; 
  __int64 Nonce; 
  int v34; 

  v7 = VirtualAddress[206];
  WorkSpace = a2;
  v10 = *(unsigned __int16 *)(a5 + 4) - 1;
  Nonce = 0i64;
  v11 = v7 + a3;
  v34 = 0;
  v12 = (_SMCR_ENCRYPT_CONTEXT *)*((_QWORD *)VirtualAddress + 127);
  v13 = 0;
  LODWORD(v30) = 0;
  v14 = (UINT8 *)a4;
  v15 = -v12[2] & (v12[2] + v10);
  v31 = v15;
  if( (a4 & 1) != 0 )
  {
    v14 = *(UINT8 **)(a6 + 48);
    a4 &= ~1ui64;
  }
  v16 = v12;
  if( (v11 & 3) != 0 )
  {
    v17 = v11;
    v18 = a3 & 0xFFFFFFFFFFFFFFFCui64;
    v11 &= 0xFFFFFFFFFFFFFFFCui64;
    if( (v17 & 2) != 0 )
    {
      v25 = v7 + v15;
      v26 = (const VOID *)v18;
      goto LABEL_25;
    }
    if( v12[6] )
    {
      memmove(*((VOID **)VirtualAddress + 223), (const VOID *)v11, v15);
      v16 = (_SMCR_ENCRYPT_CONTEXT *)*((_QWORD *)VirtualAddress + 127);
      v15 = v31;
      v11 = *((_QWORD *)VirtualAddress + 223);
    }
  }
  if( v16[6] )
  {
    LODWORD(Nonce) = *(unsigned __int16 *)(a5 + 4);
    HIDWORD(Nonce) = *(_DWORD *)(a5 + 8);
    v34 = *(_DWORD *)(a5 + 12);
    if( SmCrAuthDecrypt(v16, (UINT8 *)v11, (UINT8 *)v11, v15, &Nonce, FinalUncompressedSize) < 0 )
    {
      v20 = -1073741173;
      ST_STORE::StDmPageError(VirtualAddress, (PVOID)v11, (PVOID)a4, a5, a6, -1073741173);
      goto LABEL_19;
    }
  }
  if( (VirtualAddress[194] & 0x40000) != 0 )
  {
    v19 = (_EX_PUSH_LOCK *)(*((_QWORD *)VirtualAddress + 100) + 6024i64);
    if( a6 == -64 )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --CurrentThread->Tcb.SpecialApcDisable;
      ExAcquirePushLockSharedEx(v19, 0i64);
    }
    else
    {
      if( _InterlockedCompareExchange64(&v19->_bf_0, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared(v19);
      KeAbPostRelease(v19);
      KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
    }
    v13 = 2;
  }
  if( *(unsigned __int16 *)(a5 + 4) >= 0x1000u )
  {
    v25 = *(unsigned __int16 *)(a5 + 4);
    v26 = (const VOID *)v11;
    goto LABEL_25;
  }
  LODWORD(CompressedBufferSize) = *(unsigned __int16 *)(a5 + 4);
  if( RtlDecompressBufferEx(
         *((_WORD *)VirtualAddress + 496),
         v14,
         0x1000ui64,
         (UINT8 *)v11,
         CompressedBufferSize,
         &v30,
         WorkSpace) >= 0
    && (_DWORD)v30 == 4096 )
  {
    if( v14 == (UINT8 *)a4 )
    {
LABEL_18:
      v20 = 0;
LABEL_19:
      v21 = 0;
      goto LABEL_20;
    }
    v25 = 4096;
    v26 = v14;
LABEL_25:
    memmove((VOID *)a4, v26, v25);
    goto LABEL_18;
  }
  v20 = -1073741116;
  v21 = 1;
  v13 &= 2u;
LABEL_20:
  if( v13 )
  {
    v22 = (_ETHREAD *)KeGetCurrentThread();
    v23 = (_EX_PUSH_LOCK *)*((_QWORD *)VirtualAddress + 100);
    --v22->Tcb.SpecialApcDisable;
    ExAcquirePushLockSharedEx(v23 + 753, 0i64);
    *(_DWORD *)(a6 + 64) = 2;
  }
  if( v21 && (ST_STORE::StDmPageError(VirtualAddress, (PVOID)v11, (PVOID)a4, a5, a6, v20) & 1) != 0 )
    return 0;
  return v20;
}

Referenced by:

No references.