HalAllocateAdapterChannelV2
NTSTATUS __stdcall HalAllocateAdapterChannelV2(
PDMA_ADAPTER DmaAdapter,
_KDEVICE_QUEUE_ENTRY *DeviceQueueEntry,
UINT64 a3,
_LIST_ENTRY *a4){
char v4;
char v5;
unsigned __int8 CurrentIrql;
unsigned int v8;
char v11;
_DMA_OPERATIONS *MapRegisters;
_DMA_OPERATIONS *DmaOperations;
int v15;
*(_DWORD *)&DeviceQueueEntry->Inserted &= ~4u;
v4 = 0;
v5 = 0;
DeviceQueueEntry[1].DeviceListEntry.Flink = a4;
CurrentIrql = 0;
DeviceQueueEntry[1].SortKey = a3;
v8 = a3;
if( KeGetCurrentIrql() < 2u )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v5 = 1;
}
KeInsertDeviceQueue((_KDEVICE_QUEUE *)&DmaAdapter[11], DeviceQueueEntry);
if( !v11 )
{
*(_DWORD *)&DmaAdapter[15].Version = v8;
DmaAdapter[21].DmaOperations = (_DMA_OPERATIONS *)DeviceQueueEntry;
if( v8 && (LOBYTE(DmaAdapter[27].Version) || !*((_BYTE *)&DmaAdapter[27].Size + 3)) )
{
if( v8 > *(_DWORD *)&DmaAdapter[14].Version )
{
*(_DWORD *)&DmaAdapter[15].Version = 0;
IoFreeAdapterChannel(DmaAdapter);
if( v5 )
__writecr8(CurrentIrql);
return -1073741670;
}
MapRegisters = (_DMA_OPERATIONS *)HalpDmaAllocateMapRegisters((_ADAPTER_OBJECT *)DmaAdapter, v8);
DmaAdapter[14].DmaOperations = MapRegisters;
if( !MapRegisters )
{
HalpDmaQueueAdapter((_ADAPTER_OBJECT *)DmaAdapter);
v4 = 1;
HalpQueueMapBufferWorker((_ADAPTER_OBJECT *)DmaAdapter, v8);
}
}
else
{
DmaAdapter[14].DmaOperations = 0i64;
*(_DWORD *)&DmaAdapter[15].Version = 0;
}
if( DmaAdapter[26].DmaOperations )
(*(void(**)(void))(DmaDispatch + 32))();
if( !v4 )
{
DmaOperations = DmaAdapter[14].DmaOperations;
DmaAdapter[21].DmaOperations = (_DMA_OPERATIONS *)DeviceQueueEntry;
v15 = ((__int64(__fastcall *)(_LIST_ENTRY *, _LIST_ENTRY *, _DMA_OPERATIONS *, _LIST_ENTRY *))a4)(
DeviceQueueEntry[2].DeviceListEntry.Flink,
DeviceQueueEntry[2].DeviceListEntry.Blink,
DmaOperations,
DeviceQueueEntry[1].DeviceListEntry.Blink);
if( v15 == 2 )
{
LABEL_20:
IoFreeAdapterChannel(DmaAdapter);
goto LABEL_21;
}
if( v15 == 3 )
{
*(_DWORD *)&DmaAdapter[15].Version = 0;
goto LABEL_20;
}
}
}
LABEL_21:
if( v5 )
__writecr8(CurrentIrql);
return 0;
}Referenced by:
HalAllocateAdapterChannel