VfPutScatterGatherList

VOID __fastcall VfPutScatterGatherList(
        _DMA_ADAPTER *DmaAdapter,
        _SCATTER_GATHER_LIST *ScatterGather,
        UINT8 WriteToDevice){
  void(__fastcall *v6)(_DMA_ADAPTER *, _SCATTER_GATHER_LIST *, __int64); 
  INT64 v7; 
  LIST_ENTRY *AdapterInformationInternal; 
  __int64 v9; 
  UINT64 v10; 
  _LIST_ENTRY **v11; 
  _LIST_ENTRY *v12; 
  unsigned __int8 v13; 
  unsigned __int64 v14; 
  _LIST_ENTRY **p_Blink; 
  unsigned int NumberOfElements; 
  _LIST_ENTRY *v17; 
  _LIST_ENTRY *v18; 
  __int64 v19; 
  _LIST_ENTRY *v20; 
  void(__fastcall *v21)(_DMA_ADAPTER *, _SCATTER_GATHER_LIST *, __int64); 
  LODWORD(v6) = ViGetRealDmaOperation(DmaAdapter, 0x60ui64);
  LOBYTE(v7) = 1;
  v21 = v6;
  AdapterInformationInternal = ViGetAdapterInformationInternal(DmaAdapter, v7);
  if( !AdapterInformationInternal
    || (VF_ASSERT_IRQL(2u), v11 = &AdapterInformationInternal[3].Blink, *v11 == (_LIST_ENTRY *)v11) )
  {
LABEL_8:
    LOBYTE(v9) = WriteToDevice;
    v21(DmaAdapter, ScatterGather, v9);
    if( AdapterInformationInternal )
      DECREMENT_SCATTER_GATHER_LISTS((__int64)AdapterInformationInternal);
  }
  else
  {
    KeAcquireSpinLockRaiseToDpc((UINT64 *)&AdapterInformationInternal[4].Blink, v10);
    v12 = *v11;
    v14 = v13;
    while( 1 )
    {
      p_Blink = &v12[-5].Blink;
      if( v11 == p_Blink + 9 )
      {
        KxReleaseSpinLock((UINT64 *)&AdapterInformationInternal[4].Blink);
        __writecr8(v14);
        goto LABEL_8;
      }
      if( p_Blink[8] == (_LIST_ENTRY *)ScatterGather )
        break;
      v12 = p_Blink[9];
    }
    NumberOfElements = ScatterGather->NumberOfElements;
    v17 = p_Blink[9];
    v18 = p_Blink[10];
    if( (_LIST_ENTRY **)v17->Blink != p_Blink + 9 || (_LIST_ENTRY **)v18->Flink != p_Blink + 9 )
      __fastfail(3u);
    v18->Flink = v17;
    v17->Blink = v18;
    KxReleaseSpinLock((UINT64 *)&AdapterInformationInternal[4].Blink);
    __writecr8(v14);
    v20 = p_Blink[12];
    if( ScatterGather->Reserved == -559026163i64 && v20 )
      ScatterGather->Reserved = (unsigned __int64)v20[3].Flink;
    LOBYTE(v19) = WriteToDevice;
    v21(DmaAdapter, ScatterGather, v19);
    SUBTRACT_MAP_REGISTERS((INT64)AdapterInformationInternal, NumberOfElements);
    DECREMENT_SCATTER_GATHER_LISTS((__int64)AdapterInformationInternal);
    ViFlushDoubleBuffer(
      p_Blink[12],
      (ULONG_PTR)p_Blink[2],
      (ULONG_PTR)p_Blink[3],
      *((_DWORD *)p_Blink + 8),
      WriteToDevice);
    ViFreeMapRegisterFile((__int64)AdapterInformationInternal, (struct _SLIST_ENTRY *)p_Blink[12]);
    ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViHalWaitBlockLookaside, p_Blink);
  }
}

Referenced by:

No references.