VfAllocateAdapterChannel

NTSTATUS __stdcall VfAllocateAdapterChannel(
        DMA_ADAPTER *DmaAdapter,
        PDEVICE_OBJECT DeviceObject,
        UINT32 NumberOfMapRegisters,
        PDRIVER_CONTROL ExecutionRoutine,
        PVOID Context){
  char *v6; 
  __int64(__fastcall *v10)(DMA_ADAPTER *, PDEVICE_OBJECT, _QWORD, PDRIVER_CONTROL, PVOID); 
  INT64 v11; 
  LIST_ENTRY *AdapterInformationInternal; 
  INT64 v13; 
  PVOID v15; 
  __int64 v16; 
  NTSTATUS v17; 
  NTSTATUS v18; 
  UINT64 v19; 
  unsigned __int8 v20; 
  unsigned __int64 v21; 
  char **v22; 
  void **v23; 
  struct _SLIST_ENTRY *v24; 
  __int64(__fastcall *v25)(DMA_ADAPTER *, PDEVICE_OBJECT, _QWORD, PDRIVER_CONTROL, PVOID); 
  v6 = 0i64;
  LODWORD(v10) = ViGetRealDmaOperation(DmaAdapter, 0x20ui64);
  LOBYTE(v11) = 1;
  v25 = v10;
  AdapterInformationInternal = ViGetAdapterInformationInternal(DmaAdapter, v11);
  if( AdapterInformationInternal )
  {
    VF_ASSERT_IRQL(2u);
    LODWORD(v13) = ExAllocateFromNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViHalWaitBlockLookaside);
    v6 = (char *)v13;
    if( !v13 )
      return -1073741670;
    memset(v13, 0i64);
    *(_QWORD *)v6 = Context;
    *((_QWORD *)v6 + 1) = ExecutionRoutine;
    *((_QWORD *)v6 + 7) = AdapterInformationInternal;
    *((_DWORD *)v6 + 12) = NumberOfMapRegisters;
    if( !BYTE1(AdapterInformationInternal[2].Flink) && LODWORD(AdapterInformationInternal[12].Flink) < 3 )
      *((_QWORD *)v6 + 12) = ViAllocateMapRegisterFile((INT64)AdapterInformationInternal, NumberOfMapRegisters);
    if( !AdapterInformationInternal[1].Blink )
      AdapterInformationInternal[1].Blink = (_LIST_ENTRY *)DeviceObject;
    ExecutionRoutine = (PDRIVER_CONTROL)ViAdapterCallback;
    v15 = v6;
    INCREMENT_ADAPTER_CHANNELS((__int64)AdapterInformationInternal);
    ADD_MAP_REGISTERS((__int64)AdapterInformationInternal, NumberOfMapRegisters, 0);
    v16 = (__int64)&AdapterInformationInternal[9];
    ExInterlockedInsertTailList(
      AdapterInformationInternal + 8,
      (PLIST_ENTRY)(v6 + 72),
      (PKSPIN_LOCK)&AdapterInformationInternal[9]);
  }
  else
  {
    v15 = Context;
    v16 = 144i64;
  }
  v17 = v25(DmaAdapter, DeviceObject, NumberOfMapRegisters, ExecutionRoutine, v15);
  v18 = v17;
  if( AdapterInformationInternal && v17 && ViIsActiveChannelWcb((INT64)AdapterInformationInternal, (INT64)v6) )
  {
    KeAcquireSpinLockRaiseToDpc((UINT64 *)v16, v19);
    v21 = v20;
    v22 = (char **)*((_QWORD *)v6 + 9);
    v23 = (void **)*((_QWORD *)v6 + 10);
    if( v22[1] != v6 + 72 || *v23 != v6 + 72 )
      __fastfail(3u);
    *v23 = v22;
    v22[1] = (char *)v23;
    KxReleaseSpinLock((UINT64 *)v16);
    __writecr8(v21);
    DECREMENT_ADAPTER_CHANNELS((__int64)AdapterInformationInternal);
    SUBTRACT_MAP_REGISTERS((INT64)AdapterInformationInternal, NumberOfMapRegisters);
    v24 = (struct _SLIST_ENTRY *)*((_QWORD *)v6 + 12);
    if( v24 )
      ViFreeMapRegisterFile((__int64)AdapterInformationInternal, v24);
    ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViHalWaitBlockLookaside, v6);
  }
  return v18;
}

Referenced by:

No references.