sub_1405BC6E0

VOID __fastcall __noreturn sub_1405BC6E0(INT64 a1){
  unsigned int v2; 
  _ETHREAD *CurrentThread; 
  __int16 *p_Object; 
  unsigned int v5; 
  UINT8 v6; 
  UINT8 v7; 
  __int64 v8; 
  __int64 v9; 
  unsigned int v10; 
  __int64 v11; 
  __int64 v12; 
  __int64 v13; 
  unsigned __int8 CurrentIrql; 
  int *v15; 
  __int64 v16; 
  unsigned __int64 v17; 
  _QWORD *v18; 
  int *v19; 
  char v20; 
  __int64 v21; 
  unsigned int v22; 
  unsigned int v23; 
  unsigned int v24; 
  char v25; 
  __int64 v26; 
  __int64 v27; 
  __int64 *v28; 
  __int64 v29; 
  __int64 v30; 
  bool v31; 
  __int64 v32; 
  __int64 v33; 
  IRP *Timeout; 
  __int64 v35; 
  __int64 *ThreadTerminationPort; 
  __int64 v37; 
  int v38[4]; 
  __int16 Object; 
  char v40; 
  int v41; 
  __int64 v42[3]; 
  __int64 v43; 
  union _LARGE_INTEGER Interval; 
  KeExitRetpoline();
  ThreadTerminationPort = (__int64 *)PsQueryThreadTerminationPort();
  v2 = ExGenRandom(1i64);
  v31 = *(_QWORD *)(a1 + 8) == 1i64;
  Interval.QuadPart = -1200000000i64 - v2 % 0x5F5E100ui64;
  if( v31 )
    KeRundownApcQueues((__int64)KeGetCurrentThread());
  if( (unsigned int)ExGenRandom(1i64) % 0xA < 3 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 243);
  }
  p_Object = *(__int16 **)a1;
  KeWaitForSingleObject(*(PVOID *)a1, Executive, 0, 0, 0i64);
  v5 = ExGenRandom(1i64);
  if( v5 % 0xA >= 5 )
  {
    KeResetEvent(p_Object, v5 / 0xA, v6, v7, Timeout);
  }
  else
  {
    Object = 0;
    v42[1] = (__int64)v42;
    p_Object = &Object;
    v40 = 6;
    v42[0] = (__int64)v42;
    v41 = 0;
  }
  v8 = *(_QWORD *)(a1 + 16);
  *(_QWORD *)(a1 + 16) = 0i64;
  v9 = *(_QWORD *)(v8 + 32);
  v10 = ExGenRandom(1i64);
  v11 = v10 ^ 0x6A15A217BC2A27DBi64;
  *ThreadTerminationPort = 0i64;
  v12 = v8 ^ v11;
  v13 = v9 ^ v11;
  v35 = ((unsigned __int8)v10 ^ 0xDB) & 1;
  while( 1 )
  {
    if( (v13 ^ v11) >> 47 == -1 || (v13 ^ v11) >> 47 == 0 )
    {
      (*(void(__fastcall **)(__int64, __int64, _QWORD, _QWORD))((v12 ^ v11) + 0x18))(
        v12 ^ v11,
        v13 ^ v11,
        *(_QWORD *)((v12 ^ v11) + 0x28),
        *(_QWORD *)((v12 ^ v11) + 0x30));
      v13 = v11 ^ *(_QWORD *)((v12 ^ v11) + 0x20);
    }
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    v38[0] = 34539786;
    v38[1] = 218497804;
    v38[2] = 235143175;
    v15 = v38;
    v38[3] = 134284555;
    v16 = 16i64;
    v17 = v13 ^ v11 ^ *(_QWORD *)((v12 ^ v11) + 0x40) | 0xFFFF800000000000ui64;
    v18 = (_QWORD *)v17;
    v19 = v38;
    v43 = __ROR8__(v17, (v13 ^ v11 ^ *(_BYTE *)((v12 ^ v11) + 0x40)) & 0x3F);
    do
    {
      v20 = *(_BYTE *)v19;
      v19 = (int *)((char *)v19 + 1);
      *(_BYTE *)v15 = v20 ^ 0xA;
      v15 = (int *)((char *)v15 + 1);
      --v16;
    }
    while( v16 );
    v21 = v43;
    v22 = 16;
    v23 = 25;
    v24 = 0;
    do
    {
      v25 = ~(unsigned __int8)*v18 & 0x3F;
      *v18 = v17 + (KiWaitAlways ^ _byteswap_uint64(v21 ^ __ROL8__(KiWaitNever ^ *v18, KiWaitNever))) + v24;
      v21 = (v17 + __ROL8__(__ROR8__(v24 ^ (unsigned __int64)(200 - v24), v25) ^ v21, v25)) ^ 0x3D406922;
      v26 = v22;
      do
      {
        v27 = __ROL8__(*v18, 4);
        *v18 = *((unsigned __int8 *)v38 + (v27 & 0xF)) | v27 & 0xFFFFFFFFFFFFFFF0ui64;
        --v26;
      }
      while( v26 );
      ++v18;
      if( ++v24 == 25 )
      {
        if( *(_QWORD *)v17 != 0x85131481131482Ei64 )
        {
          *(v18 - 1) ^= *(_QWORD *)v17 ^ 0x85131481131482Ei64;
          v23 += *((_DWORD *)v18 - 1);
          *(v18 - 1) ^= *(_QWORD *)v17 ^ 0x85131481131482Ei64;
        }
        v22 = 1;
      }
    }
    while( v24 < v23 );
    v28 = ThreadTerminationPort;
    v29 = *(_QWORD *)v17 ^ 0x85131481131482Ei64;
    *(_BYTE *)(v17 + 3) = 17;
    *(_BYTE *)(v17 + 2) = 49;
    *(_BYTE *)(v17 + 1) = 72;
    *(_BYTE *)v17 = 46;
    ((void(__fastcall *)(unsigned __int64, __int64, _QWORD, _QWORD))v17)(v17, v29, 0i64, 0i64);
    __writecr8(CurrentIrql);
    v30 = *v28;
    v31 = *v28 == 0;
    if( *v28 > 0 )
    {
      v32 = -v30;
      *ThreadTerminationPort = 0i64;
      v37 = v32;
      (*(void(__fastcall **)(_QWORD))(v32 + 16))(*(_QWORD *)(v32 + 24));
      memset((void *)v32, 0, 0x20ui64);
      memset(&v37, 0, sizeof(v37));
      v30 = *ThreadTerminationPort;
      v31 = *ThreadTerminationPort == 0;
    }
    if( v31 )
    {
      do
      {
        if( v35 )
          KeDelayExecutionThread(0, 0, &Interval);
        else
          KeWaitForSingleObject(p_Object, Executive, 0, 0, &Interval);
        v30 = *ThreadTerminationPort;
      }
      while( !*ThreadTerminationPort );
    }
    v33 = *(_QWORD *)(v30 + 32);
    v12 = v11 ^ v30;
    *ThreadTerminationPort = 0i64;
    v13 = v11 ^ v33;
    if( v35 )
      KeDelayExecutionThread(0, 0, &Interval);
    else
      KeWaitForSingleObject(p_Object, Executive, 0, 0, &Interval);
  }
}

Referenced by:

No references.