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.