IopInitializeActiveConnectBlock
VOID __stdcall IopInitializeActiveConnectBlock(
_INTERRUPT_CONNECTION_DATA *ConnectionData,
_ACTIVE_CONNECT_BLOCK *ConnectBlock){
unsigned int Gsiv;
__int64 *v5;
__int64 *v6;
_ACTIVE_CONNECT_BLOCK *v7;
_ACTIVE_CONNECT_BLOCK **v8;
_ACTIVE_CONNECT_BLOCK **v9;
memset(ConnectBlock, 0i64, 0x50u);
if( ConnectionData->Vectors[0].Type == InterruptTypeControllerInput )
{
*((_QWORD *)ConnectBlock + 1) = ConnectBlock;
*(_QWORD *)ConnectBlock = ConnectBlock;
KeInitializeEvent((INT64)(ConnectBlock + 10), 1, 1u);
ConnectBlock[16] = 1;
Gsiv = ConnectionData->Vectors[0].ControllerInput.Gsiv;
ConnectBlock[4] = Gsiv;
IopAcquireReleaseConnectLockInternal(0i64, 1u, 2ui64);
v5 = (__int64 *)qword_140C452C0;
v6 = 0i64;
while( v5 != &qword_140C452C0 )
{
if( *((_DWORD *)v5 + 4) == Gsiv )
{
v6 = v5;
break;
}
if( *((_DWORD *)v5 + 4) > Gsiv )
break;
v5 = (__int64 *)*v5;
}
if( v6 )
{
*((_QWORD *)ConnectBlock + 3) = v6[3];
*((_QWORD *)ConnectBlock + 4) = v6[4];
_InterlockedIncrement((volatile signed __int32 *)v6[4]);
}
else
{
*((_QWORD *)ConnectBlock + 3) = ConnectBlock + 10;
*((_QWORD *)ConnectBlock + 4) = ConnectBlock + 16;
}
v7 = (_ACTIVE_CONNECT_BLOCK *)qword_140C452C0;
if( (_QWORD *)qword_140C452C0 != &qword_140C452C0 )
{
while( v7[4] <= (unsigned int)ConnectBlock[4] )
{
v7 = *(_ACTIVE_CONNECT_BLOCK **)v7;
if( v7 == (_ACTIVE_CONNECT_BLOCK *)&qword_140C452C0 )
goto LABEL_21;
}
v9 = (_ACTIVE_CONNECT_BLOCK **)*((_QWORD *)v7 + 1);
if( *v9 != v7 )
goto LABEL_23;
*(_QWORD *)ConnectBlock = v7;
*((_QWORD *)ConnectBlock + 1) = v9;
*v9 = ConnectBlock;
*((_QWORD *)v7 + 1) = ConnectBlock;
LABEL_21:
if( v7 != (_ACTIVE_CONNECT_BLOCK *)&qword_140C452C0 )
goto LABEL_9;
}
v8 = (_ACTIVE_CONNECT_BLOCK **)qword_140C452C8;
if( *(_QWORD **)qword_140C452C8 == &qword_140C452C0 )
{
*(_QWORD *)ConnectBlock = &qword_140C452C0;
*((_QWORD *)ConnectBlock + 1) = v8;
*v8 = ConnectBlock;
qword_140C452C8 = (__int64)ConnectBlock;
LABEL_9:
IopAcquireReleaseConnectLockInternal(0i64, 0, 2ui64);
return;
}
LABEL_23:
__fastfail(3u);
}
}Referenced by:
IoDisconnectInterrupt
IopConnectInterrupt