TtmiSessionDeviceListWorker
VOID __stdcall TtmiSessionDeviceListWorker(_TTMI_SESSION *LockedSession){
_TTMI_SESSION *v1;
__int64 i;
int v4;
void *v5;
unsigned int v6;
int v7;
int v8;
void(__fastcall *Data)(_QWORD);
__int64 v10;
void **v11;
_TTMP_CALLOUT_CONTEXT Context[4];
__int128 v13;
__int64 v14;
v1 = LockedSession + 24;
for( i = *((_QWORD *)LockedSession + 12); (_TTMI_SESSION *)i != v1; i = *(_QWORD *)i )
{
v4 = *(_DWORD *)(i + 600);
v5 = (void *)i;
if( (v4 & 4) != 0 )
goto LABEL_14;
if( (v4 & 1) != 0 )
{
v6 = v4 & 0xFFFFFFFC | 2;
*(_DWORD *)(i + 600) = v6;
if( (LockedSession[1] & 0x800) != 0 )
{
*(_DWORD *)(i + 596) = 0;
v6 |= 0x40u;
}
v7 = 3;
}
else
{
if( (v4 & 0x10) == 0 )
goto LABEL_12;
v6 = v4 & 0xFFFFFFEF;
*(_DWORD *)(i + 600) = v6;
if( (LockedSession[1] & 0x800) != 0 )
{
*(_DWORD *)(i + 596) = 0;
v6 |= 0x40u;
}
v7 = 4;
}
*(_DWORD *)(i + 600) = v6 | 0x20;
TtmpPublishDeviceEvent((__int64)LockedSession, 0i64, i, v7);
LABEL_12:
v4 = *(_DWORD *)(i + 600);
if( (v4 & 0x20) != 0 )
{
*(_DWORD *)(i + 600) = v4 & 0xFFFFFFDF;
TtmpCallAssignedToTerminal(LockedSession, (_TTMI_DEVICE_ENTRY *)i);
v4 = *(_DWORD *)(i + 600);
}
LABEL_14:
if( (v4 & 0x44) == 64 )
{
*(_DWORD *)(i + 600) = v4 & 0xFFFFFFBF;
if( TtmpPushTerminalState(LockedSession, (_TTMI_DEVICE_ENTRY *)i) )
{
*(_DWORD *)(i + 600) |= 0x40u;
LockedSession[1] |= 0x1000u;
}
}
v8 = *(_DWORD *)(i + 600);
if( (v8 & 4) != 0 )
{
if( (v8 & 2) != 0 )
{
*(_DWORD *)(i + 600) = v8 | 8;
TtmpPublishDeviceEvent((__int64)LockedSession, 0i64, i, 5);
}
Data = *(void(__fastcall **)(_QWORD))(i + 40);
if( Data )
{
v14 = 0i64;
*(_OWORD *)Context = 0i64;
v13 = 0i64;
TtmpStartCallout(Context, LockedSession, (_TTMI_DEVICE_ENTRY *)i, 2ui64, (UINT64)Data);
Data(*(_QWORD *)(i + 24));
TtmpStopCallout(Context, 0i64);
}
v10 = *(_QWORD *)i;
v11 = *(void ***)(i + 8);
i = (__int64)v11;
if( *(void **)(*(_QWORD *)v5 + 8i64) != v5 || *v11 != v5 )
__fastfail(3u);
*v11 = (void *)v10;
*(_QWORD *)(v10 + 8) = v11;
--LockedSession[29];
ExFreePoolWithTag(v5, 0x446D7454u);
}
}
TtmpCommitTerminalDisplayStateUpdateWorker(LockedSession, 0i64);
TtmpCommitTerminalDisplayStateUpdateWorker(LockedSession, 1i64);
TtmpCommitTerminalDisplayStateUpdateWorker(LockedSession, 2i64);
TtmpCommitTerminalDisplayStateUpdateWorker(LockedSession, 3i64);
}Referenced by:
TtmpSessionWorker