VfAllocateAdapterChannelEx

NTSTATUS __stdcall VfAllocateAdapterChannelEx(
        _DMA_ADAPTER *DmaAdapter,
        INT64 a2,
        INT64 a3,
        UINT64 a4,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8){
  INT64 v8; 
  INT64 v9; 
  unsigned int v10; 
  ULONG_PTR v12; 
  char *v13; 
  _LIST_ENTRY *AdapterInformationInternal; 
  char *v15; 
  INT64 v17; 
  __int64 v18; 
  VOID *RealDmaOperation; 
  NTSTATUS v20; 
  unsigned __int64 v21; 
  char **v22; 
  VOID **v23; 

  v8 = a6;
  v9 = a2;
  LOBYTE(a2) = 1;
  v10 = a4;
  v12 = (unsigned int)DmaAdapter;
  v13 = 0i64;
  AdapterInformationInternal = ViGetAdapterInformationInternal(DmaAdapter, a2);
  if( AdapterInformationInternal )
  {
    VF_ASSERT_IRQL(2u);
    v15 = (char *)ExAllocateFromNPagedLookasideList(&ViHalWaitBlockLookaside);
    v13 = v15;
    if( !v15 )
      return -1073741670;
    memset(v15, 0i64, 0x98u);
    v17 = a7;
    *(_QWORD *)v13 = a7;
    *((_QWORD *)v13 + 1) = a6;
    *((_QWORD *)v13 + 7) = AdapterInformationInternal;
    *((_DWORD *)v13 + 12) = v10;
    *((_QWORD *)v13 + 5) = a3;
    if( !AdapterInformationInternal[1].Blink )
      AdapterInformationInternal[1].Blink = (_LIST_ENTRY *)v9;
    if( a6 )
      v17 = (INT64)v13;
    INCREMENT_ADAPTER_CHANNELS((__int64)AdapterInformationInternal);
    ADD_MAP_REGISTERS((_ADAPTER_INFORMATION *)AdapterInformationInternal, v10, 1u);
    v18 = (__int64)&AdapterInformationInternal[9];
    ExInterlockedInsertTailList(
      AdapterInformationInternal + 8,
      (PLIST_ENTRY)(v13 + 72),
      (PKSPIN_LOCK)&AdapterInformationInternal[9]);
    v8 = (INT64)ViAdapterCallback;
    if( !a6 )
      v8 = 0i64;
  }
  else
  {
    v17 = a7;
    v18 = 144i64;
  }
  RealDmaOperation = ViGetRealDmaOperation(v12, 0xA0ui64);
  v20 = ((__int64(__fastcall *)(_DMA_ADAPTER *, INT64, INT64, _QWORD, _DWORD, INT64, INT64, INT64))RealDmaOperation)(
          DmaAdapter,
          v9,
          a3,
          v10,
          a5,
          v8,
          v17,
          a8);
  if( AdapterInformationInternal
    && ViIsActiveChannelWcb((_ADAPTER_INFORMATION *)AdapterInformationInternal, (_VF_WAIT_CONTEXT_BLOCK *)v13) )
  {
    if( v20 )
    {
      v21 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)v18);
      v22 = (char **)*((_QWORD *)v13 + 9);
      v23 = (VOID **)*((_QWORD *)v13 + 10);
      if( v22[1] != v13 + 72 || *v23 != v13 + 72 )
        __fastfail(3u);
      *v23 = v22;
      v22[1] = (char *)v23;
      KxReleaseSpinLock((UINT64 *)v18);
      __writecr8(v21);
      DECREMENT_ADAPTER_CHANNELS((__int64)AdapterInformationInternal);
      SUBTRACT_MAP_REGISTERS((_ADAPTER_INFORMATION *)AdapterInformationInternal, v10);
      ExFreeToNPagedLookasideList(&ViHalWaitBlockLookaside, v13);
    }
    else if( !v8 )
    {
      *((_DWORD *)v13 + 13) = 1;
      *((_QWORD *)v13 + 11) = *(_QWORD *)a8;
    }
  }
  return v20;
}

Referenced by:

No references.