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