HalpDmaRemoveAdapterFromChannelQueue
NTSTATUS __stdcall HalpDmaRemoveAdapterFromChannelQueue(_ADAPTER_OBJECT *ChildAdapter){
_HALP_DMA_CONTROLLER *DmaController;
__int64 v3;
unsigned __int8 CurrentIrql;
_ADAPTER_OBJECT **v5;
char v6;
_ADAPTER_OBJECT *v7;
_ADAPTER_OBJECT **v8;
NTSTATUS result;
_DMA_OPERATIONS *DmaOperations;
DmaController = ChildAdapter->DmaController;
v3 = (__int64)&DmaController->Channels[ChildAdapter->ChannelNumber];
CurrentIrql = KeGetCurrentIrql();
__writecr8(DmaController->Irql);
KxAcquireSpinLock(&ChildAdapter->DmaController->Lock);
v5 = (_ADAPTER_OBJECT **)(v3 + 144);
v6 = 0;
v7 = *v5;
if( *v5 != (_ADAPTER_OBJECT *)v5 )
{
while( 1 )
{
v8 = *(_ADAPTER_OBJECT ***)&v7->AdapterObject.DmaHeader.Version;
if( v7 == (_ADAPTER_OBJECT *)&ChildAdapter->WaitQueueEntry[2].Blink )
break;
v7 = *(_ADAPTER_OBJECT **)&v7->AdapterObject.DmaHeader.Version;
if( v8 == v5 )
goto LABEL_4;
}
DmaOperations = v7->AdapterObject.DmaHeader.DmaOperations;
if( v8[1] != v7 || *(_ADAPTER_OBJECT **)&DmaOperations->Size != v7 )
__fastfail(3u);
*(_QWORD *)&DmaOperations->Size = v8;
v6 = 1;
v8[1] = (_ADAPTER_OBJECT *)DmaOperations;
}
LABEL_4:
KxReleaseSpinLock(&ChildAdapter->DmaController->Lock);
result = KiIrqlFlags;
__writecr8(CurrentIrql);
LOBYTE(result) = v6;
return result;
}Referenced by:
HalCancelAdapterChannel
HalCancelAdapterChannelThin
HalpAllocateDmaResourcesInternal