IopDeleteIoCompletionInternal
VOID __stdcall IopDeleteIoCompletionInternal(VOID *Object, UINT8 Close){
UINT8 v4;
_LIST_ENTRY *v5;
_LIST_ENTRY *v6;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v8;
_LIST_ENTRY *v9;
_LIST_ENTRY *Blink;
VOID *WaitCompletionPacket[2];
_KLOCK_QUEUE_HANDLE LockHandle;
*(_OWORD *)WaitCompletionPacket = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
if( Close )
{
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)Object + 8, &LockHandle);
v4 = 0;
*((_BYTE *)Object + 72) = 1;
}
else
{
v4 = 1;
}
v5 = KeRundownQueueEx((_KQUEUE *)Object, v4);
v6 = v5;
if( v5 )
{
Flink = v5->Flink;
if( Flink->Blink == v6 )
{
WaitCompletionPacket[0] = Flink;
WaitCompletionPacket[1] = v6;
Flink->Blink = (_LIST_ENTRY *)WaitCompletionPacket;
v6->Flink = (_LIST_ENTRY *)WaitCompletionPacket;
v6 = (_LIST_ENTRY *)WaitCompletionPacket[0];
if( WaitCompletionPacket[0] != WaitCompletionPacket )
{
do
{
v8 = v6;
v6 = v6->Flink;
if( LOBYTE(v8[1].Flink) == 2 )
{
Blink = v8->Blink;
if( v6->Blink != v8 || Blink->Flink != v8 )
goto LABEL_23;
Blink->Flink = v6;
v6->Blink = Blink;
IopFreeWaitCompletionPacket(v8, Object);
}
}
while( v6 != (_LIST_ENTRY *)WaitCompletionPacket );
v6 = (_LIST_ENTRY *)WaitCompletionPacket[0];
}
if( v6 == (_LIST_ENTRY *)WaitCompletionPacket )
{
v6 = 0i64;
goto LABEL_4;
}
v9 = (_LIST_ENTRY *)WaitCompletionPacket[1];
if( (VOID **)v6->Blink == WaitCompletionPacket && *(VOID ***)WaitCompletionPacket[1] == WaitCompletionPacket )
{
*(_QWORD *)WaitCompletionPacket[1] = v6;
v6->Blink = v9;
WaitCompletionPacket[1] = WaitCompletionPacket;
WaitCompletionPacket[0] = WaitCompletionPacket;
goto LABEL_4;
}
}
LABEL_23:
__fastfail(3u);
}
LABEL_4:
if( Close )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
}
if( v6 )
{
v6->Blink->Flink = 0i64;
IopFreeCompletionListPackets((_SLIST_ENTRY *)v6);
}
}Referenced by:
IopCloseIoCompletion
IopDeleteIoCompletion