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