TtmpInsertPowerRequestToSession

CHAR __fastcall TtmpInsertPowerRequestToSession(INT64 a1, INT64 a2, INT64 a3, INT64 a4, INT64 a5, INT64 a6){
  __int64 v6; 
  int v8; 
  CHAR v9; 
  int v10; 
  __int64 v11; 
  INT64 v12; 
  INT64 v13; 
  _QWORD *PoolWithTag; 
  _QWORD *v15; 
  unsigned __int64 v16; 
  unsigned int v17; 
  unsigned int v18; 
  __int64 v19; 
  char *v20; 
  char v21; 
  unsigned __int64 v22; 
  unsigned int v23; 
  __int64 v24; 
  __int64 v25; 
  _QWORD *v26; 
  __int64 v27; 
  VOID *v28; 
  __int64 v29; 
  __int64 v30; 
  __int64 v32; 
  v6 = (int)a2;
  v32 = 0i64;
  v8 = a3;
  v9 = 0;
  v10 = TtmpAcquireSessionById(&v32, a1);
  v11 = v32;
  if( v10 < 0 )
  {
    v12 = (unsigned int)v10;
    v13 = 3418i64;
LABEL_3:
    TtmiLogError((PSTR)"TtmpInsertPowerRequestToSession", v13, v12, -1i64);
    goto LABEL_28;
  }
  PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0x40ui64, 0x52507454ui64);
  v15 = PoolWithTag;
  if( !PoolWithTag )
  {
    v13 = 3427i64;
    v12 = 3221225626i64;
    goto LABEL_3;
  }
  *((_DWORD *)PoolWithTag + 5) = v8;
  PoolWithTag[1] = v6;
  v16 = v11 + 272;
  *((_DWORD *)PoolWithTag + 4) = v6;
  PoolWithTag[3] = a4;
  PoolWithTag[4] = a5;
  *((_DWORD *)PoolWithTag + 10) = a6;
  PoolWithTag[7] = PoolWithTag + 6;
  PoolWithTag[6] = PoolWithTag + 6;
  v17 = *(_DWORD *)(v11 + 276);
  v18 = 2 * (v17 >> 5);
  if( *(_DWORD *)(v11 + 272) < v18 )
    goto LABEL_27;
  v19 = v18;
  if( v18 < 4 )
    v19 = 4i64;
  v20 = (char *)TtmpPowerRequestHashAllocator(8i64 * (unsigned int)v19);
  if( v20 )
  {
    if( (((_DWORD)v19 - 1) & (unsigned int)v19) != 0 )
    {
      v21 = -1;
      do
      {
        ++v21;
        LODWORD(v19) = (unsigned int)v19 >> 1;
      }
      while( (_DWORD)v19 );
      v19 = (unsigned int)(1 << v21);
    }
    if( (unsigned int)v19 > 0x4000000 )
      v19 = 0x4000000i64;
    v22 = (unsigned int)v19;
    if( v20 > &v20[8 * v19] )
      v22 = 0i64;
    if( v22 )
      memset64(v20, v16 | 1, v22);
    v23 = 0;
    v24 = -1i64 << (*(_BYTE *)(v11 + 276) & 0x1F);
    if( (*(_DWORD *)(v11 + 276) & 0xFFFFFFE0) != 0 )
    {
      do
      {
        v25 = *(_QWORD *)(v11 + 280);
        while( 1 )
        {
          v26 = *(_QWORD **)(v25 + 8i64 * v23);
          if( ((unsigned __int8)v26 & 1) != 0 )
            break;
          *(_QWORD *)(v25 + 8i64 * v23) = *v26;
          v32 = v24 & v26[1];
          v27 = (37
               * (BYTE6(v32)
                + 37
                * (BYTE5(v32)
                 + 37
                 * (BYTE4(v32)
                  + 37 * (BYTE3(v32) + 37 * (BYTE2(v32) + 37 * (BYTE1(v32) + 37 * ((unsigned __int8)v32 + 11623883)))))))
               + HIBYTE(v32)) & (unsigned int)(v19 - 1);
          *v26 = *(_QWORD *)&v20[8 * v27];
          *(_QWORD *)&v20[8 * v27] = v26;
        }
        ++v23;
      }
      while( v23 < *(_DWORD *)(v11 + 276) >> 5 );
    }
    v28 = *(VOID **)(v11 + 280);
    v17 = *(_DWORD *)(v11 + 276) & 0x1F | (32 * v19);
    *(_QWORD *)(v11 + 280) = v20;
    *(_DWORD *)(v11 + 276) = v17;
    if( v28 )
    {
      TtmpPowerRequestHashDeallocator(v28);
      v17 = *(_DWORD *)(v11 + 276);
    }
    goto LABEL_27;
  }
  v17 = *(_DWORD *)(v11 + 276);
  if( v17 >= 0x20 )
  {
LABEL_27:
    v9 = 1;
    v32 = v15[1] & (-1i64 << (v17 & 0x1F));
    v29 = *(_QWORD *)(v11 + 280);
    v30 = (37
         * (BYTE6(v32)
          + 37
          * (BYTE5(v32)
           + 37
           * (BYTE4(v32)
            + 37 * (BYTE3(v32) + 37 * (BYTE2(v32) + 37 * (BYTE1(v32) + 37 * ((unsigned __int8)v32 + 11623883)))))))
         + HIBYTE(v32)) & ((v17 >> 5) - 1);
    *v15 = *(_QWORD *)(v29 + 8 * v30);
    *(_QWORD *)(v29 + 8 * v30) = v15;
    ++*(_DWORD *)v16;
    goto LABEL_28;
  }
  TtmiLogError((PSTR)"TtmpInsertPowerRequestToSession", 3450i64, 3221225626i64, -1i64);
  ExFreePoolWithTag(v15, 0x52507454u);
LABEL_28:
  if( v11 )
  {
    ExReleaseResourceLite(&TtmpSessionLock);
    KeLeaveCriticalRegion();
  }
  return v9;
}

Referenced by:

PopNotifySessionUserPowerRequestCreated
TtmNotifySessionPowerRequestPresent