VfAllocateAdapterChannelEx

__int64 __fastcall VfAllocateAdapterChannelEx(
        ULONG_PTR a1,
        _LIST_ENTRY *a2,
        __int64 a3,
        unsigned int a4,
        int a5,
        __int64 (__fastcall *a6)(__int64 a1, __int64 a2, __int64 a3, _DWORD *a4),
        __int64 a7,
        _QWORD *a8){
  void *v8; 
  _LIST_ENTRY *v9; 
  INT64 v13; 
  LIST_ENTRY *AdapterInformationInternal; 
  INT64 v15; 
  __int64 v17; 
  __int64 v18; 
  __int64(__fastcall *v19)(ULONG_PTR, _LIST_ENTRY *, __int64, _QWORD, int, void *, __int64, _QWORD *); 
  unsigned int v20; 
  UINT64 v21; 
  unsigned __int8 v22; 
  unsigned __int64 v23; 
  __int64 v24; 
  _QWORD *v25; 
  v8 = a6;
  v9 = a2;
  LOBYTE(a2) = 1;
  v13 = 0i64;
  AdapterInformationInternal = ViGetAdapterInformationInternal((DMA_ADAPTER *)a1, (INT64)a2);
  if( AdapterInformationInternal )
  {
    VF_ASSERT_IRQL(2u);
    LODWORD(v15) = ExAllocateFromNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViHalWaitBlockLookaside);
    v13 = v15;
    if( !v15 )
      return 3221225626i64;
    memset(v15, 0i64);
    v17 = a7;
    *(_QWORD *)v13 = a7;
    *(_QWORD *)(v13 + 8) = a6;
    *(_QWORD *)(v13 + 56) = AdapterInformationInternal;
    *(_DWORD *)(v13 + 48) = a4;
    *(_QWORD *)(v13 + 40) = a3;
    if( !AdapterInformationInternal[1].Blink )
      AdapterInformationInternal[1].Blink = v9;
    if( a6 )
      v17 = v13;
    INCREMENT_ADAPTER_CHANNELS((__int64)AdapterInformationInternal);
    ADD_MAP_REGISTERS((__int64)AdapterInformationInternal, a4, 1);
    v18 = (__int64)&AdapterInformationInternal[9];
    ExInterlockedInsertTailList(
      AdapterInformationInternal + 8,
      (PLIST_ENTRY)(v13 + 72),
      (PKSPIN_LOCK)&AdapterInformationInternal[9]);
    v8 = ViAdapterCallback;
    if( !a6 )
      v8 = 0i64;
  }
  else
  {
    v17 = a7;
    v18 = 144i64;
  }
  LODWORD(v19) = ViGetRealDmaOperation((_DMA_ADAPTER *)a1, 0xA0ui64);
  v20 = v19(a1, v9, a3, a4, a5, v8, v17, a8);
  if( AdapterInformationInternal && ViIsActiveChannelWcb((INT64)AdapterInformationInternal, v13) )
  {
    if( v20 )
    {
      KeAcquireSpinLockRaiseToDpc((UINT64 *)v18, v21);
      v23 = v22;
      v24 = *(_QWORD *)(v13 + 72);
      v25 = *(_QWORD **)(v13 + 80);
      if( *(_QWORD *)(v24 + 8) != v13 + 72 || *v25 != v13 + 72 )
        __fastfail(3u);
      *v25 = v24;
      *(_QWORD *)(v24 + 8) = v25;
      KxReleaseSpinLock((UINT64 *)v18);
      __writecr8(v23);
      DECREMENT_ADAPTER_CHANNELS((__int64)AdapterInformationInternal);
      SUBTRACT_MAP_REGISTERS((INT64)AdapterInformationInternal, a4);
      ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViHalWaitBlockLookaside, (PVOID)v13);
    }
    else if( !v8 )
    {
      *(_DWORD *)(v13 + 52) = 1;
      *(_QWORD *)(v13 + 88) = *a8;
    }
  }
  return v20;
}

Referenced by:

No references.