IopDestroyActiveConnectBlock
VOID __stdcall IopDestroyActiveConnectBlock(_ACTIVE_CONNECT_BLOCK *ConnectBlock){
__int64 v2;
volatile signed __int32 *v3;
_KEVENT *v4;
char v5;
signed __int32 v6;
__int64 v7;
_ACTIVE_CONNECT_BLOCK **v8;
_ETHREAD *CurrentThread;
__int128 Object;
__int64 v11;
Object = 0i64;
v11 = 0i64;
if( *((_QWORD *)ConnectBlock + 3) )
{
v2 = *((_QWORD *)ConnectBlock + 4);
v3 = ConnectBlock + 16;
KeInitializeEvent((INT64)&Object, 1, 0);
v4 = 0i64;
v5 = 0;
IopAcquireReleaseConnectLockInternal(0i64, 1u, 2ui64);
v6 = _InterlockedDecrement((volatile signed __int32 *)v2);
if( (volatile signed __int32 *)v2 == v3 )
{
if( v6 )
{
v5 = 1;
*((_QWORD *)ConnectBlock + 9) = &Object;
}
}
else
{
if( !v6 )
v4 = *(_KEVENT **)(v2 + 8);
_InterlockedAdd(v3, 0xFFFFFFFF);
}
v7 = *(_QWORD *)ConnectBlock;
if( *(_ACTIVE_CONNECT_BLOCK **)(*(_QWORD *)ConnectBlock + 8i64) != ConnectBlock
|| (v8 = (_ACTIVE_CONNECT_BLOCK **)*((_QWORD *)ConnectBlock + 1), *v8 != ConnectBlock) )
{
__fastfail(3u);
}
*v8 = (_ACTIVE_CONNECT_BLOCK *)v7;
*(_QWORD *)(v7 + 8) = v8;
IopAcquireReleaseConnectLockInternal(0i64, 0, 2ui64);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
if( v5 )
{
KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
}
else if( v4 )
{
KeSetEvent(v4, 0, 0);
}
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
}Referenced by:
IoDisconnectInterrupt
IopConnectInterrupt