sub_1405BC6E0

void __fastcall __noreturn sub_1405BC6E0(__int64 a1){
  __int64 *v2; 
  __int64 *v3; 
  unsigned int v4; 
  _ETHREAD *CurrentThread; 
  _KEVENT *p_Object; 
  __int64 v7; 
  __int64 v8; 
  unsigned int v9; 
  __int64 v10; 
  __int64 v11; 
  __int64 v12; 
  unsigned __int8 CurrentIrql; 
  int *v14; 
  __int64 v15; 
  unsigned __int64 v16; 
  _QWORD *v17; 
  int *v18; 
  char v19; 
  __int64 v20; 
  unsigned int v21; 
  unsigned int v22; 
  unsigned int v23; 
  char v24; 
  __int64 v25; 
  __int64 v26; 
  __int64 *v27; 
  __int64 v28; 
  __int64 v29; 
  bool v30; 
  __int64 v31; 
  __int64 v32; 
  __int64 v33; 
  __int64 *v34; 
  __int64 v35; 
  int v36[4]; 
  __int16 Object; 
  char v38; 
  int v39; 
  __int64 v40[3]; 
  __int64 v41; 
  _LARGE_INTEGER Interval; 

  KeExitRetpoline();
  LODWORD(v2) = PsQueryThreadTerminationPort();
  v34 = v2;
  v3 = v2;
  v4 = ExGenRandom(ExGenRandomDomainUserVisible);
  v30 = *(_QWORD *)(a1 + 8) == 1i64;
  Interval.QuadPart = -1200000000i64 - v4 % 0x5F5E100ui64;
  if( v30 )
    KeRundownApcQueues(KeGetCurrentThread());
  if( (unsigned int)ExGenRandom(ExGenRandomDomainUserVisible) % 0xA < 3 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.SpecialApcDisable;
  }
  p_Object = *(_KEVENT **)a1;
  KeWaitForSingleObject(*(_QWORD *)a1, 0, 0, 0, 0i64);
  if( (unsigned int)ExGenRandom(ExGenRandomDomainUserVisible) % 0xA >= 5 )
  {
    KeResetEvent(p_Object);
  }
  else
  {
    Object = 0;
    v40[1] = (__int64)v40;
    p_Object = (_KEVENT *)&Object;
    v38 = 6;
    v40[0] = (__int64)v40;
    v39 = 0;
  }
  v7 = *(_QWORD *)(a1 + 16);
  *(_QWORD *)(a1 + 16) = 0i64;
  v8 = *(_QWORD *)(v7 + 32);
  v9 = ExGenRandom(ExGenRandomDomainUserVisible);
  v10 = v9 ^ 0x6A15A217BC2A27DBi64;
  *v3 = 0i64;
  v11 = v7 ^ v10;
  v12 = v8 ^ v10;
  v33 = ((unsigned __int8)v9 ^ 0xDB) & 1;
  while( 1 )
  {
    if( (v12 ^ v10) >> 47 == -1 || (v12 ^ v10) >> 47 == 0 )
    {
      (*(void(__fastcall **)(__int64, __int64, _QWORD, _QWORD))((v11 ^ v10) + 0x18))(
        v11 ^ v10,
        v12 ^ v10,
        *(_QWORD *)((v11 ^ v10) + 0x28),
        *(_QWORD *)((v11 ^ v10) + 0x30));
      v12 = v10 ^ *(_QWORD *)((v11 ^ v10) + 0x20);
    }
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    v36[0] = 34539786;
    v36[1] = 218497804;
    v36[2] = 235143175;
    v14 = v36;
    v36[3] = 134284555;
    v15 = 16i64;
    v16 = v12 ^ v10 ^ *(_QWORD *)((v11 ^ v10) + 0x40) | 0xFFFF800000000000ui64;
    v17 = (_QWORD *)v16;
    v18 = v36;
    v41 = __ROR8__(v16, (v12 ^ v10 ^ *(_BYTE *)((v11 ^ v10) + 0x40)) & 0x3F);
    do
    {
      v19 = *(_BYTE *)v18;
      v18 = (int *)((char *)v18 + 1);
      *(_BYTE *)v14 = v19 ^ 0xA;
      v14 = (int *)((char *)v14 + 1);
      --v15;
    }
    while( v15 );
    v20 = v41;
    v21 = 16;
    v22 = 25;
    v23 = 0;
    do
    {
      v24 = ~(unsigned __int8)*v17 & 0x3F;
      *v17 = v16 + (KiWaitAlways ^ _byteswap_uint64(v20 ^ __ROL8__(KiWaitNever ^ *v17, KiWaitNever))) + v23;
      v20 = (v16 + __ROL8__(__ROR8__(v23 ^ (unsigned __int64)(200 - v23), v24) ^ v20, v24)) ^ 0x3D406922;
      v25 = v21;
      do
      {
        v26 = __ROL8__(*v17, 4);
        *v17 = *((unsigned __int8 *)v36 + (v26 & 0xF)) | v26 & 0xFFFFFFFFFFFFFFF0ui64;
        --v25;
      }
      while( v25 );
      ++v17;
      if( ++v23 == 25 )
      {
        if( *(_QWORD *)v16 != 0x85131481131482Ei64 )
        {
          *(v17 - 1) ^= *(_QWORD *)v16 ^ 0x85131481131482Ei64;
          v22 += *((_DWORD *)v17 - 1);
          *(v17 - 1) ^= *(_QWORD *)v16 ^ 0x85131481131482Ei64;
        }
        v21 = 1;
      }
    }
    while( v23 < v22 );
    v27 = v34;
    v28 = *(_QWORD *)v16 ^ 0x85131481131482Ei64;
    *(_BYTE *)(v16 + 3) = 17;
    *(_BYTE *)(v16 + 2) = 49;
    *(_BYTE *)(v16 + 1) = 72;
    *(_BYTE *)v16 = 46;
    ((void(__fastcall *)(unsigned __int64, __int64, _QWORD, _QWORD))v16)(v16, v28, 0i64, 0i64);
    __writecr8(CurrentIrql);
    v29 = *v27;
    v30 = *v27 == 0;
    if( *v27 > 0 )
    {
      v31 = -v29;
      *v34 = 0i64;
      v35 = v31;
      (*(void(__fastcall **)(_QWORD))(v31 + 16))(*(_QWORD *)(v31 + 24));
      memset((void *)v31, 0, 0x20ui64);
      memset(&v35, 0, sizeof(v35));
      v29 = *v34;
      v30 = *v34 == 0;
    }
    if( v30 )
    {
      do
      {
        if( v33 )
          KeDelayExecutionThread(0, 0, &Interval);
        else
          KeWaitForSingleObject((UINT64)p_Object, 0, 0, 0, (INT64)&Interval);
        v29 = *v34;
      }
      while( !*v34 );
    }
    v32 = *(_QWORD *)(v29 + 32);
    v11 = v10 ^ v29;
    *v34 = 0i64;
    v12 = v10 ^ v32;
    if( v33 )
      KeDelayExecutionThread(0, 0, &Interval);
    else
      KeWaitForSingleObject((UINT64)p_Object, 0, 0, 0, (INT64)&Interval);
  }
}

Referenced by:

No references.