sub_140A10830

INT64 __fastcall sub_140A10830(INT64 a1){
  _DWORD *v2; 
  char *v3; 
  __int64 v4; 
  int v5; 
  __int64 v6; 
  __int64 v7; 
  unsigned __int64 v8; 
  _WORD *v9; 
  char *v10; 
  char v11; 
  _WORD *v12; 
  int v13; 
  char *v14; 
  char *v15; 
  __int64 v16; 
  char v17; 
  unsigned __int64 v18; 
  _QWORD *v19; 
  unsigned __int64 v20; 
  int v21; 
  __int64 v22; 
  INT64 v23; 
  char *v24; 
  char v25; 
  __int64 *v26; 
  __int64 v27; 
  __int64 v28; 
  __int64 v29; 
  unsigned __int64 v30; 
  _QWORD *v31; 
  unsigned __int64 v32; 
  unsigned __int64 v33; 
  volatile signed __int32 *v34; 
  char *v35; 
  _QWORD *v36; 
  _QWORD *v37; 
  unsigned int v38; 
  _QWORD *v39; 
  struct _KPRCB *CurrentPrcb; 
  char v41; 
  int v42; 
  _QWORD *v43; 
  __int64 v44; 
  char v45; 
  unsigned __int64 v46; 
  unsigned __int64 v47; 
  int v48; 
  int v49; 
  __int64 v50; 
  _QWORD *v51; 
  char *v52; 
  int v53; 
  __int64 v54; 
  char v55; 
  int v56; 
  char *v57; 
  __int64 v58; 
  char v59; 
  __int64 *v61; 
  __int64 v62; 
  char v63[16]; 
  char v64[16]; 
  __int64 v65[11]; 
  unsigned __int64 v66; 
  _QWORD *v67; 
  v2 = *(_DWORD **)(a1 + 2656);
  if( *v2 == 44 )
  {
    _disable();
    RtlMinimalBarrier((volatile INT32 *)(a1 + 2624), 0i64);
    v66 = *(_QWORD *)(a1 + 2664);
    do
    {
      v3 = v63;
      v4 = *(_QWORD *)(a1 + 2240);
      v5 = 16;
      v6 = *(unsigned int *)(a1 + 2292);
      v7 = 2i64;
      v8 = *((_QWORD *)KeGetPcr() + 7);
      v9 = (_WORD *)(v4 + 32);
      v10 = (char *)(v4 + 32);
      do
      {
        v5 -= 8;
        *(_QWORD *)v3 = *(_QWORD *)v10;
        v10 += 8;
        v3 += 8;
        --v7;
      }
      while( v7 );
      for( ; v5; --v5 )
      {
        v11 = *v10++;
        *v3++ = v11;
      }
      v12 = (_WORD *)(v4 + 288);
      v13 = 16;
      v14 = v64;
      v15 = (char *)(v4 + 288);
      v16 = 2i64;
      do
      {
        v13 -= 8;
        *(_QWORD *)v14 = *(_QWORD *)v15;
        v15 += 8;
        v14 += 8;
        --v16;
      }
      while( v16 );
      for( ; v13; --v13 )
      {
        v17 = *v15++;
        *v14++ = v17;
      }
      v61 = (__int64 *)(*(_QWORD *)(a1 + 1504) + ((v8 >> 9) & 0x7FFFFFFFF8i64));
      v62 = *v61;
      if( RtlMinimalBarrier((volatile INT32 *)(a1 + 2624), 0i64) )
      {
        v18 = v6 + a1 + 16;
        v19 = (_QWORD *)(v4 + 1024);
        *v9 = v18;
        v20 = v18 >> 16;
        v21 = 4096;
        v22 = 512i64;
        *(_DWORD *)(v4 + 40) = HIDWORD(v18);
        v23 = v6 + a1 + 144;
        *(_WORD *)(v4 + 38) = v20;
        *v12 = v23;
        *(_WORD *)(v4 + 294) = WORD1(v23);
        v24 = (char *)v66;
        *(_DWORD *)(v4 + 296) = HIDWORD(v23);
        do
        {
          v21 -= 8;
          *v19 = *(_QWORD *)v24;
          v24 += 8;
          ++v19;
          --v22;
        }
        while( v22 );
        for( ; v21; --v21 )
        {
          v25 = *v24++;
          *(_BYTE *)v19 = v25;
          v19 = (_QWORD *)((char *)v19 + 1);
        }
        *(_DWORD *)(a1 + 2206) = -255817396;
        v26 = v65;
        *(_DWORD *)(a1 + 2210) = 296816456;
        *(_DWORD *)(a1 + 2214) = -1010789361;
        LODWORD(v27) = 4;
        *(_QWORD *)(v4 + 5128) = v66;
        v28 = 4i64;
        *(_QWORD *)(v4 + 5136) = v66;
        *(_QWORD *)(v4 + 5120) = a1;
        *(_DWORD *)(v4 + 5172) = -1;
        *(_DWORD *)(v4 + 5168) = 4;
        v29 = *(_QWORD *)(a1 + 1504);
        v30 = v29 + ((v66 >> 9) & 0x7FFFFFFFF8i64);
        do
        {
          *v26++ = v30;
          v30 = v29 + ((v30 >> 9) & 0x7FFFFFFFF8i64);
          --v28;
        }
        while( v28 );
        do
          v27 = (unsigned int)(v27 - 1);
        while( (_DWORD)v27 && (*(_DWORD *)v65[v27] & 0x80) == 0 );
        v31 = (_QWORD *)v65[v27];
        *(_QWORD *)(v4 + 5160) = v31;
        *(_QWORD *)(v4 + 5152) = *v31;
      }
      RtlMinimalBarrier((volatile INT32 *)(a1 + 2624), 0i64);
      *v61 = v62 ^ (v62 ^ (*(_QWORD *)(v4 + 5144) << 12)) & 0xFFFFFFFFF000i64;
      **(_QWORD **)(v4 + 5160) = *(_QWORD *)(v4 + 5152) | 0x42i64;
      v32 = __readcr4();
      if( (v32 & 0x20080) != 0 )
      {
        __writecr4(v32 ^ 0x80);
        __writecr4(v32);
      }
      else
      {
        v33 = __readcr3();
        __writecr3(v33);
      }
      v34 = (volatile signed __int32 *)(v4 + 5168);
      if( RtlMinimalBarrier((volatile INT32 *)(a1 + 2624), 0i64) )
        _InterlockedAnd(v34, 0xFFFFFFFB);
      if( RtlMinimalBarrier((volatile INT32 *)(a1 + 2624), 0i64) )
      {
        v35 = (char *)(v4 + 1024);
        v36 = (_QWORD *)(v4 + 1024);
        *(_DWORD *)(v4 + 5172) = *((_DWORD *)KeGetPcr() + 105);
        v67 = (_QWORD *)(v4 + 1024);
        v37 = (_QWORD *)(v4 + 5136);
        v38 = 0;
        while( 1 )
        {
          v39 = (_QWORD *)v66;
          if( (*(_DWORD *)(a1 + 2452) & 0x20000) == 0 )
          {
            CurrentPrcb = KeGetCurrentPrcb();
            **(_QWORD **)(a1 + 1216) = a1 - 0x5C5FC0A76E374B18i64;
            **(_QWORD **)(a1 + 1224) = CurrentPrcb;
            v36 = v67;
            **(_QWORD **)(a1 + 1232) = v38 + v66;
            **(_QWORD **)(a1 + 1240) = 276i64;
          }
          *v37 = v38 + v66;
          if( _InterlockedCompareExchange(v34, 2, 0) )
            break;
          if( (v38 & 7) == 0 )
          {
            v41 = ((__int64(__fastcall *)(unsigned __int64, unsigned __int64, _QWORD))(a1 + 2206))(
                    v38 + v66,
                    0xC3C3C3C3C3C3C3C3ui64,
                    *v36);
            v37 = (_QWORD *)(v4 + 5136);
            if( !v41 )
            {
              _InterlockedAnd(v34, 0xFFFFFFFD);
LABEL_38:
              v39 = (_QWORD *)v66;
              break;
            }
          }
          ((void(__fastcall *)(_QWORD *))(a1 + 2195))(v37);
          _InterlockedAnd(v34, 0xFFFFFFFD);
          v37 = (_QWORD *)(v4 + 5136);
          v36 = (_QWORD *)((char *)v67 + 1);
          ++v38;
          v67 = (_QWORD *)((char *)v67 + 1);
          if( v38 >= 0x1000 )
            goto LABEL_38;
        }
        v42 = 4096;
        if( v38 != 4096 )
        {
          _InterlockedOr(v34, 8u);
          *v37 = (char *)v39 + 4095;
        }
        v43 = v39;
        v44 = 512i64;
        do
        {
          v42 -= 8;
          *v43 = *(_QWORD *)v35;
          v35 += 8;
          ++v43;
          --v44;
        }
        while( v44 );
        for( ; v42; --v42 )
        {
          v45 = *v35++;
          *(_BYTE *)v43 = v45;
          v43 = (_QWORD *)((char *)v43 + 1);
        }
        _InterlockedOr(v34, 4u);
        v12 = (_WORD *)(v4 + 288);
        v9 = (_WORD *)(v4 + 32);
        if( (*(_DWORD *)(a1 + 2452) & 0x20000) == 0 )
        {
          **(_QWORD **)(a1 + 1216) = 0xA3A03F5891C8B4E8ui64;
          **(_QWORD **)(a1 + 1224) = 0i64;
          **(_QWORD **)(a1 + 1232) = 0i64;
          **(_QWORD **)(a1 + 1240) = 0i64;
        }
      }
      RtlMinimalBarrier((volatile INT32 *)(a1 + 2624), 0i64);
      **(_QWORD **)(v4 + 5160) = *(_QWORD *)(v4 + 5152);
      *v61 = v62;
      v46 = __readcr4();
      if( (v46 & 0x20080) != 0 )
      {
        __writecr4(v46 ^ 0x80);
        __writecr4(v46);
      }
      else
      {
        v47 = __readcr3();
        __writecr3(v47);
      }
      v48 = *(_DWORD *)(v4 + 5168);
      if( RtlMinimalBarrier((volatile INT32 *)(a1 + 2624), 0i64) )
      {
        *(_QWORD *)(v4 + 5120) = 0i64;
        v49 = 4096;
        *(_QWORD *)(v4 + 5128) = 0i64;
        v50 = 512i64;
        *(_QWORD *)(v4 + 5136) = 0i64;
        *(_QWORD *)(v4 + 5152) = 0i64;
        *(_QWORD *)(v4 + 5160) = 0i64;
        *(_QWORD *)(v4 + 5168) = 0i64;
        v51 = (_QWORD *)(v4 + 1024);
        do
        {
          *v51 = 0i64;
          v49 -= 8;
          ++v51;
          --v50;
        }
        while( v50 );
        for( ; v49; --v49 )
        {
          *(_BYTE *)v51 = 0;
          v51 = (_QWORD *)((char *)v51 + 1);
        }
        v52 = v63;
        v53 = 16;
        v54 = 2i64;
        do
        {
          v53 -= 8;
          *(_QWORD *)v9 = *(_QWORD *)v52;
          v52 += 8;
          v9 += 4;
          --v54;
        }
        while( v54 );
        for( ; v53; --v53 )
        {
          v55 = *v52++;
          *(_BYTE *)v9 = v55;
          v9 = (_WORD *)((char *)v9 + 1);
        }
        v56 = 16;
        v57 = v64;
        v58 = 2i64;
        do
        {
          v56 -= 8;
          *(_QWORD *)v12 = *(_QWORD *)v57;
          v57 += 8;
          v12 += 4;
          --v58;
        }
        while( v58 );
        for( ; v56; --v56 )
        {
          v59 = *v57++;
          *(_BYTE *)v12 = v59;
          v12 = (_WORD *)((char *)v12 + 1);
        }
      }
      RtlMinimalBarrier((volatile INT32 *)(a1 + 2624), 0i64);
    }
    while( (v48 & 8) != 0 );
    _enable();
  }
  else if( !*(_DWORD *)(a1 + 2296) )
  {
    *(_QWORD *)(a1 + 2320) = 257i64;
    *(_QWORD *)(a1 + 2328) = 0i64;
    *(_QWORD *)(a1 + 2304) = a1 - 0x5C5FC0A76E374B18i64;
    *(_DWORD *)(a1 + 2296) = 1;
    *(_QWORD *)(a1 + 2312) = (char *)v2 - 0x4C48B4211BBACBEBi64;
    __b8(a1, 0i64);
  }
  return a1;
}

Referenced by:

No references.