ViHookDmaAdapter

_LIST_ENTRY *__fastcall ViHookDmaAdapter(_DMA_ADAPTER *Object, _DEVICE_DESCRIPTION *Source, INT64 a3, CHAR a4){
  int v6; 
  _LIST_ENTRY *AdapterInformationInternal; 
  VOID **PoolWithTag; 
  UINT8 v10; 

  v6 = a3;
  AdapterInformationInternal = ViGetAdapterInformationInternal(Object, 0i64);
  if( !AdapterInformationInternal )
  {
    PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x140ui64, 1449943368i64);
    AdapterInformationInternal = (_LIST_ENTRY *)PoolWithTag;
    if( !PoolWithTag )
      return AdapterInformationInternal;
    memset(PoolWithTag, 0i64, 0x140u);
    AdapterInformationInternal[1].Flink = (_LIST_ENTRY *)Object;
    ExInterlockedInsertHeadList((PLIST_ENTRY)&ViAdapterList, AdapterInformationInternal, &qword_140D49088);
    ObfReferenceObject(Object);
    AdapterInformationInternal[4].Blink = 0i64;
    AdapterInformationInternal[4].Flink = (_LIST_ENTRY *)((char *)AdapterInformationInternal + 56);
    AdapterInformationInternal[3].Blink = (_LIST_ENTRY *)((char *)AdapterInformationInternal + 56);
    AdapterInformationInternal[6].Flink = 0i64;
    AdapterInformationInternal[5].Blink = AdapterInformationInternal + 5;
    AdapterInformationInternal[5].Flink = AdapterInformationInternal + 5;
    AdapterInformationInternal[7].Blink = 0i64;
    AdapterInformationInternal[7].Flink = (_LIST_ENTRY *)((char *)AdapterInformationInternal + 104);
    AdapterInformationInternal[6].Blink = (_LIST_ENTRY *)((char *)AdapterInformationInternal + 104);
    AdapterInformationInternal[9].Flink = 0i64;
    AdapterInformationInternal[8].Blink = AdapterInformationInternal + 8;
    AdapterInformationInternal[8].Flink = AdapterInformationInternal + 8;
    ViCopyDeviceDescription((_DEVICE_DESCRIPTION *)&AdapterInformationInternal[12], Source, v10);
    LODWORD(AdapterInformationInternal[9].Blink) = v6;
    if( Source->InterfaceType == Isa && Source->DmaChannel < 8 || !Source->Master )
      BYTE2(AdapterInformationInternal[2].Flink) = 1;
    AdapterInformationInternal[17].Blink = 0i64;
    if( Source->Master && Source->ScatterGather )
      ViAllocateContiguousMemory((_ADAPTER_INFORMATION *)AdapterInformationInternal);
    else
      BYTE1(AdapterInformationInternal[2].Flink) = 1;
    AdapterInformationInternal[3].Flink = (_LIST_ENTRY *)Object->DmaOperations;
    Object->DmaOperations = (_DMA_OPERATIONS *)&ViDmaOperations;
  }
  if( a4 )
    _InterlockedIncrement((volatile signed __int32 *)&AdapterInformationInternal[2].Flink + 1);
  return AdapterInformationInternal;
}

Referenced by:

VfGetDmaAdapter