VfBuildScatterGatherList

__int64 VfBuildScatterGatherList(ULONG_PTR a1, __int64 a2, ...){
  UINT64 v2; 
  PMDL v3; 
  __int64 v5; 
  struct _SLIST_ENTRY *v6; 
  __int64(__fastcall *v7)(ULONG_PTR, __int64, PMDL, UINT64, _DWORD, VOID(__fastcall *)(_DEVICE_OBJECT *, _IRP *, _SCATTER_GATHER_LIST *, VOID *), __int64, _BYTE, __int64, _DWORD); 
  INT64 v8; 
  LIST_ENTRY *AdapterInformationInternal; 
  unsigned int v11; 
  unsigned int v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  VOID(__fastcall *v16)(_DEVICE_OBJECT *, _IRP *, _SCATTER_GATHER_LIST *, VOID *); 
  unsigned __int64 v17; 
  _QWORD *v18; 
  CHAR *MapRegisterFile; 
  CHAR v20; 
  UINT64 v21; 
  int v22; 
  size_t v23; 
  _OWORD *v24; 
  int v25; 
  unsigned int v26; 
  UINT64 v27; 
  UINT64 *p_Blink; 
  unsigned __int8 v29; 
  unsigned __int64 v30; 
  __int64 v31; 
  _QWORD *v32; 
  CHAR Param3; 
  UINT64 v34; 
  VOID *MapRegisterBase; 
  __int64(__fastcall *v36)(ULONG_PTR, __int64, PMDL, UINT64, _DWORD, VOID(__fastcall *)(_DEVICE_OBJECT *, _IRP *, _SCATTER_GATHER_LIST *, VOID *), __int64, _BYTE, __int64, _DWORD); 
  PMDL MemoryDescriptorList; 
  va_list MemoryDescriptorLista; 
  UINT64 v41; 
  va_list va1; 
  UINT64 Size; 
  VOID(__fastcall *v44)(_DEVICE_OBJECT *, _IRP *, _SCATTER_GATHER_LIST *, VOID *); 
  __int64 v45; 
  __int64 v46; 
  __int64 v47; 
  __int64 v48; 
  va_list va2; 
  va_start(va2, a2);
  va_start(va1, a2);
  va_start(MemoryDescriptorLista, a2);
  MemoryDescriptorList = va_arg(va1, PMDL);
  va_copy(va2, va1);
  v41 = va_arg(va2, _QWORD);
  Size = va_arg(va2, _QWORD);
  v44 = va_arg(
          va2,
          VOID(__fastcall *)(_DEVICE_OBJECT *DeviceObject, _IRP *Irp, _SCATTER_GATHER_LIST *ScatterGather, VOID *Context));
  v45 = va_arg(va2, _QWORD);
  v46 = va_arg(va2, _QWORD);
  v47 = va_arg(va2, _QWORD);
  v48 = va_arg(va2, _QWORD);
  v2 = v41;
  v3 = MemoryDescriptorList;
  v5 = 0i64;
  v6 = 0i64;
  LODWORD(v7) = ViGetRealDmaOperation((_DMA_ADAPTER *)a1, 0x70ui64);
  LOBYTE(v8) = 1;
  v36 = v7;
  AdapterInformationInternal = ViGetAdapterInformationInternal((DMA_ADAPTER *)a1, v8);
  if( !AdapterInformationInternal )
  {
    v14 = v45;
LABEL_14:
    v16 = v44;
    goto LABEL_15;
  }
  VF_ASSERT_IRQL(2u);
  if( !v3 )
    return 3221225485i64;
  _InterlockedIncrement((volatile signed __int32 *)&AdapterInformationInternal[10].Flink + 1);
  _InterlockedIncrement((volatile signed __int32 *)&AdapterInformationInternal[10].Blink);
  v3 = MemoryDescriptorList;
  VERIFY_BUFFER_LOCKED(MemoryDescriptorList);
  if( LODWORD(AdapterInformationInternal[12].Flink) == 3 )
  {
    v11 = ViCheckMdlLength(v3, 0i64, (unsigned int)Size);
    if( v11 )
    {
      v12 = v11;
      ViHalPreprocessOptions(
        &byte_140C12D18,
        (PSTR)"The provided MDL is not sufficient to satisfy the requested length",
        0x24ui64,
        v11,
        0i64,
        0i64,
        v34);
      VfReportIssueWithOptions(0xE6ui64, 0x24ui64, v12, 0i64, 0i64, &byte_140C12D18);
    }
  }
  LODWORD(v13) = ExAllocateFromNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViHalWaitBlockLookaside);
  v14 = v45;
  v5 = v13;
  v2 = v41;
  if( !v13 )
    goto LABEL_14;
  v15 = (unsigned int)Size;
  *(_QWORD *)(v13 + 64) = 0i64;
  v16 = v44;
  *(_QWORD *)v13 = v14;
  v17 = ((v2 & 0xFFF) + v15 + 4095) >> 12;
  *(_DWORD *)(v13 + 48) = v17;
  *(_QWORD *)(v13 + 8) = v16;
  *(_QWORD *)(v13 + 56) = AdapterInformationInternal;
  v18 = (_QWORD *)(v13 + 72);
  v18[1] = v18;
  *v18 = v18;
  MapRegisterFile = ViAllocateMapRegisterFile((INT64)AdapterInformationInternal, (unsigned int)v17);
  MapRegisterBase = MapRegisterFile;
  v6 = (struct _SLIST_ENTRY *)MapRegisterFile;
  if( !MapRegisterFile )
  {
LABEL_9:
    ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViHalWaitBlockLookaside, (PVOID)v5);
    v5 = 0i64;
    v6 = 0i64;
    goto LABEL_15;
  }
  v20 = v46;
  MapRegisterFile[25] = 1;
  Param3 = v20;
  *(_QWORD *)(v5 + 16) = v5 + 104;
  v21 = (UINT64)MapRegisterFile;
  v22 = Size;
  v23 = (unsigned int)Size;
  *(_QWORD *)(v5 + 96) = v6;
  *(_QWORD *)(v5 + 24) = v2;
  *(_DWORD *)(v5 + 32) = v22;
  if( !(unsigned int)ViMapDoubleBuffer(v21, (UINT64)v3, v2, v23, Param3) )
  {
    ViFreeMapRegisterFile((__int64)AdapterInformationInternal, v6);
    goto LABEL_9;
  }
  v24 = *(_OWORD **)(v5 + 16);
  v14 = v5;
  v16 = ViScatterGatherCallback;
  *v24 = *(_OWORD *)&v3->Next;
  v24[1] = *(_OWORD *)&v3->Process;
  v24[2] = *(_OWORD *)&v3->StartVa;
  ViSwap(&MapRegisterBase, (_MDL **)MemoryDescriptorLista, (VOID **)va1);
  v2 = v41;
  v3 = MemoryDescriptorList;
LABEL_15:
  v25 = v36(a1, a2, v3, v2, Size, v16, v14, v46, v47, v48);
  v26 = v25;
  if( AdapterInformationInternal && v25 < 0 )
  {
    DECREMENT_SCATTER_GATHER_LISTS((__int64)AdapterInformationInternal);
    if( v6 )
      ViFreeMapRegisterFile((__int64)AdapterInformationInternal, v6);
    if( v5 )
    {
      p_Blink = (UINT64 *)&AdapterInformationInternal[4].Blink;
      KeAcquireSpinLockRaiseToDpc((UINT64 *)&AdapterInformationInternal[4].Blink, v27);
      v30 = v29;
      v31 = *(_QWORD *)(v5 + 72);
      v32 = *(_QWORD **)(v5 + 80);
      if( *(_QWORD *)(v31 + 8) != v5 + 72 || *v32 != v5 + 72 )
        __fastfail(3u);
      *v32 = v31;
      *(_QWORD *)(v31 + 8) = v32;
      KxReleaseSpinLock(p_Blink);
      __writecr8(v30);
      ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViHalWaitBlockLookaside, (PVOID)v5);
    }
  }
  return v26;
}

Referenced by:

No references.