ViHookDmaAdapter

_LIST_ENTRY *__fastcall ViHookDmaAdapter(PVOID Object, __int64 a2, int a3, char a4){
  LIST_ENTRY *AdapterInformationInternal; 
  LIST_ENTRY *PoolWithTag; 
  UINT8 v10; 
  AdapterInformationInternal = ViGetAdapterInformationInternal((DMA_ADAPTER *)Object, 0i64);
  if( !AdapterInformationInternal )
  {
    PoolWithTag = (LIST_ENTRY *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x140ui64, 0x566C6148ui64);
    AdapterInformationInternal = PoolWithTag;
    if( !PoolWithTag )
      return AdapterInformationInternal;
    memset((INT64)PoolWithTag, 0i64);
    AdapterInformationInternal[1].Flink = (_LIST_ENTRY *)Object;
    ExInterlockedInsertHeadList(&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], (DEVICE_DESCRIPTION *)a2, v10);
    LODWORD(AdapterInformationInternal[9].Blink) = a3;
    if( *(_DWORD *)(a2 + 20) == 1 && *(_DWORD *)(a2 + 16) < 8u || !*(_BYTE *)(a2 + 4) )
      BYTE2(AdapterInformationInternal[2].Flink) = 1;
    AdapterInformationInternal[17].Blink = 0i64;
    if( *(_BYTE *)(a2 + 4) && *(_BYTE *)(a2 + 5) )
      ViAllocateContiguousMemory((INT64)AdapterInformationInternal);
    else
      BYTE1(AdapterInformationInternal[2].Flink) = 1;
    AdapterInformationInternal[3].Flink = (_LIST_ENTRY *)*((_QWORD *)Object + 1);
    *((_QWORD *)Object + 1) = &ViDmaOperations;
  }
  if( a4 )
    _InterlockedIncrement((volatile signed __int32 *)&AdapterInformationInternal[2].Flink + 1);
  return AdapterInformationInternal;
}

Referenced by:

VfGetDmaAdapter