AlpcpLookasidePacketCallbackRoutine
VOID __stdcall AlpcpLookasidePacketCallbackRoutine(_IO_MINI_COMPLETION_PACKET_USER *MiniPacket, PVOID Context){
_ALPC_COMPLETION_PACKET_LOOKASIDE *v2;
int v3;
__int64 v6;
unsigned int PendingNullCount;
unsigned int PendingCheckCompletionListCount;
_SINGLE_LIST_ENTRY *Next;
void *CompletionPort;
struct _KLOCK_QUEUE_HANDLE LockHandle;
v2 = (_ALPC_COMPLETION_PACKET_LOOKASIDE *)*((_QWORD *)Context + 2);
memset(&LockHandle, 0, sizeof(LockHandle));
v3 = 0;
while( 1 )
{
v6 = 0i64;
KeAcquireInStackQueuedSpinLock(&v2->Lock, &LockHandle);
PendingNullCount = v2->PendingNullCount;
if( PendingNullCount )
{
v2->PendingNullCount = PendingNullCount - 1;
}
else
{
PendingCheckCompletionListCount = v2->PendingCheckCompletionListCount;
if( PendingCheckCompletionListCount )
{
v6 = -1i64;
v2->PendingCheckCompletionListCount = PendingCheckCompletionListCount - 1;
}
else
{
Next = v2->FreeListHead.Next;
MiniPacket = 0i64;
--v2->ActiveCount;
*(_QWORD *)Context = Next;
v2->FreeListHead.Next = (_SINGLE_LIST_ENTRY *)Context;
if( !v2->ActiveCount && v2->PendingDelete )
v3 = 1;
}
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( !MiniPacket )
break;
if( ObReferenceObjectSafeWithTag(v2->CompletionPort, 0x746C6644ui64) )
{
CompletionPort = v2->CompletionPort;
IoSetIoCompletionEx2(CompletionPort, v2->CompletionKey, (PVOID)v6, 0i64, 0i64, 0, MiniPacket, 0);
ObfDereferenceObjectWithTag(CompletionPort, 0x746C6644ui64);
break;
}
}
if( v3 )
AlpcpDeferredFreeCompletionPacketLookaside(v2);
}Referenced by:
No references.