TtmpInsertPowerRequestToSession

INT8 __stdcall TtmpInsertPowerRequestToSession(UINT64 SessionId, INT64 a2, INT64 a3, INT64 a4, INT64 a5, INT64 a6){
  VOID *v6; 
  int v8; 
  INT8 v9; 
  int v10; 
  _TTMI_SESSION *v11; 
  INT64 v12; 
  UINT64 v13; 
  VOID **PoolWithTag; 
  VOID **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; 
  _TTMI_SESSION *Session; 

  v6 = (VOID *)(int)a2;
  Session = 0i64;
  v8 = a3;
  v9 = 0;
  v10 = (unsigned int)TtmpAcquireSessionById(&Session, (unsigned int)SessionId);
  v11 = Session;
  if( v10 < 0 )
  {
    v12 = (unsigned int)v10;
    v13 = 3418i64;
LABEL_3:
    TtmiLogError((INT8 *)"TtmpInsertPowerRequestToSession", v13, v12, -1i64);
    goto LABEL_28;
  }
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x40ui64, 1381004372i64);
  v15 = PoolWithTag;
  if( !PoolWithTag )
  {
    v13 = 3427i64;
    v12 = 3221225626i64;
    goto LABEL_3;
  }
  *((_DWORD *)PoolWithTag + 5) = v8;
  PoolWithTag[1] = v6;
  v16 = (unsigned __int64)(v11 + 68);
  *((_DWORD *)PoolWithTag + 4) = (_DWORD)v6;
  PoolWithTag[3] = (VOID *)a4;
  PoolWithTag[4] = (VOID *)a5;
  *((_DWORD *)PoolWithTag + 10) = a6;
  PoolWithTag[7] = PoolWithTag + 6;
  PoolWithTag[6] = PoolWithTag + 6;
  v17 = v11[69];
  v18 = 2 * (v17 >> 5);
  if( v11[68] < v18 )
    goto LABEL_27;
  v19 = v18;
  if( v18 < 4 )
    v19 = 4i64;
  LODWORD(v20) = TtmpPowerRequestHashAllocator(8 * 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 << (v11[69] & 0x1F);
    if( (v11[69] & 0xFFFFFFE0) != 0 )
    {
      do
      {
        v25 = *((_QWORD *)v11 + 35);
        while( 1 )
        {
          v26 = *(_QWORD **)(v25 + 8i64 * v23);
          if( ((unsigned __int8)v26 & 1) != 0 )
            break;
          *(_QWORD *)(v25 + 8i64 * v23) = *v26;
          Session = (_TTMI_SESSION *)(v24 & v26[1]);
          v27 = (37
               * (BYTE6(Session)
                + 37
                * (BYTE5(Session)
                 + 37
                 * (BYTE4(Session)
                  + 37
                  * (BYTE3(Session)
                   + 37 * (BYTE2(Session) + 37 * (BYTE1(Session) + 37 * ((unsigned __int8)Session + 11623883)))))))
               + HIBYTE(Session)) & (unsigned int)(v19 - 1);
          *v26 = *(_QWORD *)&v20[8 * v27];
          *(_QWORD *)&v20[8 * v27] = v26;
        }
        ++v23;
      }
      while( v23 < (unsigned int)v11[69] >> 5 );
    }
    v28 = (VOID *)*((_QWORD *)v11 + 35);
    v17 = v11[69] & 0x1F | (32 * v19);
    *((_QWORD *)v11 + 35) = v20;
    v11[69] = v17;
    if( v28 )
    {
      TtmpPowerRequestHashDeallocator(v28);
      v17 = v11[69];
    }
    goto LABEL_27;
  }
  v17 = v11[69];
  if( v17 >= 0x20 )
  {
LABEL_27:
    v9 = 1;
    Session = (_TTMI_SESSION *)((unsigned __int64)v15[1] & (-1i64 << (v17 & 0x1F)));
    v29 = *((_QWORD *)v11 + 35);
    v30 = (37
         * (BYTE6(Session)
          + 37
          * (BYTE5(Session)
           + 37
           * (BYTE4(Session)
            + 37
            * (BYTE3(Session)
             + 37 * (BYTE2(Session) + 37 * (BYTE1(Session) + 37 * ((unsigned __int8)Session + 11623883)))))))
         + HIBYTE(Session)) & ((v17 >> 5) - 1);
    *v15 = *(VOID **)(v29 + 8 * v30);
    *(_QWORD *)(v29 + 8 * v30) = v15;
    ++*(_DWORD *)v16;
    goto LABEL_28;
  }
  TtmiLogError((INT8 *)"TtmpInsertPowerRequestToSession", 0xD7Aui64, 3221225626i64, -1i64);
  ExFreePoolWithTag(v15, 0x52507454u);
LABEL_28:
  if( v11 )
  {
    ExReleaseResourceLite(&TtmpSessionLock);
    KeLeaveCriticalRegion();
  }
  return v9;
}

Referenced by:

PopNotifySessionUserPowerRequestCreated
TtmNotifySessionPowerRequestPresent