VfAllocateAdapterChannel

NTSTATUS __stdcall VfAllocateAdapterChannel(
        _DMA_ADAPTER *DmaAdapter,
        _DEVICE_OBJECT *DeviceObject,
        UINT64 NumberOfMapRegisters,
        _IO_ALLOCATION_ACTION *ExecutionRoutine,
        _DEVICE_OBJECT *a5,
        _IRP *a6,
        VOID *a7,
        VOID *a8,
        VOID *Context){
  char *v10; 
  unsigned int v12; 
  __int64(__fastcall *RealDmaOperation)(_DMA_ADAPTER *, _DEVICE_OBJECT *, _QWORD, _IO_ALLOCATION_ACTION *, _DEVICE_OBJECT *); 
  INT64 v15; 
  _LIST_ENTRY *AdapterInformationInternal; 
  char *v17; 
  _DEVICE_OBJECT *v19; 
  __int64 v20; 
  NTSTATUS v21; 
  NTSTATUS v22; 
  unsigned __int64 v23; 
  char **v24; 
  VOID **v25; 
  _MAP_REGISTER_FILE *v26; 
  __int64(__fastcall *v27)(_DMA_ADAPTER *, _DEVICE_OBJECT *, _QWORD, _IO_ALLOCATION_ACTION *, _DEVICE_OBJECT *); 

  v10 = 0i64;
  v12 = NumberOfMapRegisters;
  RealDmaOperation = (__int64(__fastcall *)(_DMA_ADAPTER *, _DEVICE_OBJECT *, _QWORD, _IO_ALLOCATION_ACTION *, _DEVICE_OBJECT *))ViGetRealDmaOperation((ULONG_PTR)DmaAdapter, 0x20ui64);
  LOBYTE(v15) = 1;
  v27 = RealDmaOperation;
  AdapterInformationInternal = ViGetAdapterInformationInternal(DmaAdapter, v15);
  if( AdapterInformationInternal )
  {
    VF_ASSERT_IRQL(2u);
    v17 = (char *)ExAllocateFromNPagedLookasideList(&ViHalWaitBlockLookaside);
    v10 = v17;
    if( !v17 )
      return -1073741670;
    memset(v17, 0i64, 0x98u);
    *(_QWORD *)v10 = a5;
    *((_QWORD *)v10 + 1) = ExecutionRoutine;
    *((_QWORD *)v10 + 7) = AdapterInformationInternal;
    *((_DWORD *)v10 + 12) = v12;
    if( !BYTE1(AdapterInformationInternal[2].Flink) && LODWORD(AdapterInformationInternal[12].Flink) < 3 )
      *((_QWORD *)v10 + 12) = ViAllocateMapRegisterFile((_ADAPTER_INFORMATION *)AdapterInformationInternal, v12);
    if( !AdapterInformationInternal[1].Blink )
      AdapterInformationInternal[1].Blink = (_LIST_ENTRY *)DeviceObject;
    ExecutionRoutine = (_IO_ALLOCATION_ACTION *)ViAdapterCallback;
    v19 = (_DEVICE_OBJECT *)v10;
    INCREMENT_ADAPTER_CHANNELS((__int64)AdapterInformationInternal);
    ADD_MAP_REGISTERS((_ADAPTER_INFORMATION *)AdapterInformationInternal, v12, 0);
    v20 = (__int64)&AdapterInformationInternal[9];
    ExInterlockedInsertTailList(
      AdapterInformationInternal + 8,
      (PLIST_ENTRY)(v10 + 72),
      (PKSPIN_LOCK)&AdapterInformationInternal[9]);
  }
  else
  {
    v19 = a5;
    v20 = 144i64;
  }
  v21 = v27(DmaAdapter, DeviceObject, v12, ExecutionRoutine, v19);
  v22 = v21;
  if( AdapterInformationInternal
    && v21
    && ViIsActiveChannelWcb((_ADAPTER_INFORMATION *)AdapterInformationInternal, (_VF_WAIT_CONTEXT_BLOCK *)v10) )
  {
    v23 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)v20);
    v24 = (char **)*((_QWORD *)v10 + 9);
    v25 = (VOID **)*((_QWORD *)v10 + 10);
    if( v24[1] != v10 + 72 || *v25 != v10 + 72 )
      __fastfail(3u);
    *v25 = v24;
    v24[1] = (char *)v25;
    KxReleaseSpinLock((UINT64 *)v20);
    __writecr8(v23);
    DECREMENT_ADAPTER_CHANNELS((__int64)AdapterInformationInternal);
    SUBTRACT_MAP_REGISTERS((_ADAPTER_INFORMATION *)AdapterInformationInternal, v12);
    v26 = (_MAP_REGISTER_FILE *)*((_QWORD *)v10 + 12);
    if( v26 )
      ViFreeMapRegisterFile((_ADAPTER_INFORMATION *)AdapterInformationInternal, v26);
    ExFreeToNPagedLookasideList(&ViHalWaitBlockLookaside, v10);
  }
  return v22;
}

Referenced by:

No references.