HalpAllocateDmaChannels
NTSTATUS __stdcall HalpAllocateDmaChannels(_ADAPTER_OBJECT *ChildAdapter){
_HALP_DMA_CONTROLLER *DmaController;
__int64 v3;
unsigned __int8 CurrentIrql;
UINT64 *p_Lock;
NTSTATUS result;
_LIST_ENTRY *v7;
_LIST_ENTRY **p_Blink;
_LIST_ENTRY *Blink;
DmaController = ChildAdapter->DmaController;
v3 = (__int64)&DmaController->Channels[ChildAdapter->ChannelNumber];
CurrentIrql = KeGetCurrentIrql();
__writecr8(DmaController->Irql);
p_Lock = &DmaController->Lock;
KxAcquireSpinLock(p_Lock);
if( *(_BYTE *)(v3 + 5) )
{
if( (ChildAdapter->CurrentWcb->_bf_14 & 1) == 0 )
{
v7 = (_LIST_ENTRY *)(v3 + 144);
p_Blink = &ChildAdapter->WaitQueueEntry[2].Blink;
Blink = v7->Blink;
if( Blink->Flink != v7 )
__fastfail(3u);
*p_Blink = v7;
p_Blink[1] = Blink;
Blink->Flink = (_LIST_ENTRY *)p_Blink;
v7->Blink = (_LIST_ENTRY *)p_Blink;
}
KxReleaseSpinLock(p_Lock);
result = CurrentIrql;
__writecr8(CurrentIrql);
LOBYTE(result) = 0;
}
else
{
*(_BYTE *)(v3 + 5) = 1;
ChildAdapter->AllocatedChannelCount = 1;
*(_QWORD *)(v3 + 24) = ChildAdapter;
KxReleaseSpinLock(p_Lock);
result = KiIrqlFlags;
__writecr8(CurrentIrql);
LOBYTE(result) = 1;
}
return result;
}Referenced by:
HalpAllocateDmaResourcesInternal