HalpDmaRemoveAdapterFromMasterQueue
NTSTATUS __stdcall HalpDmaRemoveAdapterFromMasterQueue(_ADAPTER_OBJECT *ChildAdapter){
_HALP_DMA_MASTER_ADAPTER_OBJECT *MasterAdapter;
_LIST_ENTRY *p_ContiguousAdapterQueue;
_LIST_ENTRY *p_ScatterAdapterQueue;
char v5;
_LIST_ENTRY *Flink;
_LIST_ENTRY *WaitQueueEntry;
_LIST_ENTRY *v8;
NTSTATUS result;
_LIST_ENTRY *Blink;
_KLOCK_QUEUE_HANDLE LockHandle;
MasterAdapter = ChildAdapter->MasterAdapter;
memset(&LockHandle, 0, sizeof(LockHandle));
KeAcquireInStackQueuedSpinLock(&MasterAdapter->AdapterObject.SpinLock, &LockHandle);
p_ContiguousAdapterQueue = &MasterAdapter->ContiguousAdapterQueue;
p_ScatterAdapterQueue = &MasterAdapter->ScatterAdapterQueue;
if( !ChildAdapter->ScatterGather )
p_ScatterAdapterQueue = p_ContiguousAdapterQueue;
v5 = 0;
Flink = p_ScatterAdapterQueue->Flink;
if( p_ScatterAdapterQueue->Flink != p_ScatterAdapterQueue )
{
WaitQueueEntry = ChildAdapter->WaitQueueEntry;
while( 1 )
{
v8 = Flink->Flink;
if( Flink == WaitQueueEntry )
break;
Flink = Flink->Flink;
if( v8 == p_ScatterAdapterQueue )
goto LABEL_7;
}
Blink = Flink->Blink;
if( v8->Blink != Flink || Blink->Flink != Flink )
__fastfail(3u);
Blink->Flink = v8;
v5 = 1;
v8->Blink = Blink;
}
LABEL_7:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
result = KiIrqlFlags;
__writecr8(LockHandle.OldIrql);
LOBYTE(result) = v5;
return result;
}Referenced by:
HalCancelAdapterChannel
HalCancelAdapterChannelThin
HalpAllocateDmaResourcesInternal