HalpDmaDequeueAdapter
_LIST_ENTRY *__stdcall HalpDmaDequeueAdapter(_HALP_DMA_MASTER_ADAPTER_OBJECT *MasterAdapter, INT64 ScatterGather){
char v2;
_LIST_ENTRY *p_ScatterAdapterQueue;
_LIST_ENTRY *Flink;
_LIST_ENTRY *result;
_LIST_ENTRY *v7;
_LIST_ENTRY *v8;
_KLOCK_QUEUE_HANDLE LockHandle;
v2 = ScatterGather;
memset(&LockHandle, 0, sizeof(LockHandle));
KeAcquireInStackQueuedSpinLock(&MasterAdapter->AdapterObject.SpinLock, &LockHandle);
p_ScatterAdapterQueue = &MasterAdapter->ScatterAdapterQueue;
if( !v2 )
p_ScatterAdapterQueue = &MasterAdapter->ContiguousAdapterQueue;
Flink = p_ScatterAdapterQueue->Flink;
if( p_ScatterAdapterQueue->Flink == p_ScatterAdapterQueue )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
result = 0i64;
__writecr8(LockHandle.OldIrql);
}
else
{
v7 = Flink->Flink;
if( Flink->Blink != p_ScatterAdapterQueue || v7->Blink != Flink )
__fastfail(3u);
p_ScatterAdapterQueue->Flink = v7;
v8 = Flink - 10;
v7->Blink = p_ScatterAdapterQueue;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
return v8;
}
return result;
}Referenced by:
HalpDmaProcessMapRegisterQueueV2
HalpDmaProcessMapRegisterQueueV3