VfGetScatterGatherList
__int64 VfGetScatterGatherList(ULONG_PTR a1, __int64 a2, ...){
UINT64 v2;
PMDL v3;
_QWORD *v5;
__int64(__fastcall *v6)(ULONG_PTR, __int64, PMDL, UINT64, unsigned int, VOID(__fastcall *)(_DEVICE_OBJECT *, _IRP *, _SCATTER_GATHER_LIST *, VOID *), __int64, _BYTE);
INT64 v7;
LIST_ENTRY *AdapterInformationInternal;
unsigned int v9;
__int64 v10;
unsigned int v12;
unsigned int v13;
_QWORD *v14;
__int64 v15;
int ByteOffset;
__int64 v17;
PMDL v18;
unsigned int v19;
unsigned int ByteCount;
int v21;
int v22;
unsigned int v23;
UINT64 v24;
CHAR *MapRegisterFile;
struct _SLIST_ENTRY *v26;
_OWORD *v27;
VOID(__fastcall *v28)(_DEVICE_OBJECT *, _IRP *, _SCATTER_GATHER_LIST *, VOID *);
int v29;
unsigned int v30;
UINT64 v31;
UINT64 *v32;
unsigned __int8 v33;
unsigned __int64 v34;
__int64 v35;
_QWORD *v36;
CHAR Param3;
UINT64 v38;
struct _SLIST_ENTRY *v39;
VOID *MapRegisterBase;
__int64(__fastcall *v41)(ULONG_PTR, __int64, PMDL, UINT64, unsigned int, VOID(__fastcall *)(_DEVICE_OBJECT *, _IRP *, _SCATTER_GATHER_LIST *, VOID *), __int64, _BYTE);
PMDL MemoryDescriptorList;
va_list MemoryDescriptorLista;
UINT64 v46;
va_list va1;
UINT64 Size;
VOID(__fastcall *v49)(_DEVICE_OBJECT *, _IRP *, _SCATTER_GATHER_LIST *, VOID *);
__int64 v50;
__int64 v51;
va_list va2;
va_start(va2, a2);
va_start(va1, a2);
va_start(MemoryDescriptorLista, a2);
MemoryDescriptorList = va_arg(va1, PMDL);
va_copy(va2, va1);
v46 = va_arg(va2, _QWORD);
Size = va_arg(va2, _QWORD);
v49 = va_arg(
va2,
VOID(__fastcall *)(_DEVICE_OBJECT *DeviceObject, _IRP *Irp, _SCATTER_GATHER_LIST *ScatterGather, VOID *Context));
v50 = va_arg(va2, _QWORD);
v51 = va_arg(va2, _QWORD);
v2 = v46;
v3 = MemoryDescriptorList;
v39 = 0i64;
v5 = 0i64;
LODWORD(v6) = ViGetRealDmaOperation((_DMA_ADAPTER *)a1, 0x58ui64);
LOBYTE(v7) = 1;
v41 = v6;
AdapterInformationInternal = ViGetAdapterInformationInternal((DMA_ADAPTER *)a1, v7);
v9 = Size;
v10 = (__int64)AdapterInformationInternal;
if( !AdapterInformationInternal )
goto LABEL_19;
VF_ASSERT_IRQL(2u);
if( !v3 )
return 3221225485i64;
_InterlockedIncrement((volatile signed __int32 *)(v10 + 164));
_InterlockedIncrement((volatile signed __int32 *)(v10 + 168));
v3 = MemoryDescriptorList;
VERIFY_BUFFER_LOCKED(MemoryDescriptorList);
if( *(_DWORD *)(v10 + 192) == 3 )
{
v12 = ViCheckMdlLength(v3, 0i64, v9);
if( v12 )
{
v13 = v12;
ViHalPreprocessOptions(
&byte_140C12D10,
(PSTR)"The provided MDL is not sufficient to satisfy the requested length",
0x24ui64,
v12,
0i64,
0i64,
v38);
VfReportIssueWithOptions(0xE6ui64, 0x24ui64, v13, 0i64, 0i64, &byte_140C12D10);
}
}
LODWORD(v14) = ExAllocateFromNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViHalWaitBlockLookaside);
v2 = v46;
v5 = v14;
if( v14 )
{
v14[8] = 0i64;
v15 = v50;
*v14 = v50;
ByteOffset = v2 & 0xFFF;
v17 = (__int64)v49;
v18 = v3;
v5[10] = v5 + 9;
v5[9] = v5 + 9;
v5[1] = v17;
v19 = LODWORD(v3->StartVa) + v3->ByteOffset + v3->ByteCount - v2;
ByteCount = v19;
v21 = 0;
while( v19 < v9 )
{
v18 = v18->Next;
if( !v18 )
break;
v22 = ByteOffset + 4095;
ByteOffset = v18->ByteOffset;
v23 = ByteCount + v22;
ByteCount = v18->ByteCount;
v21 += v23 >> 12;
v19 += ByteCount;
}
if( v19 + 4096 < ByteOffset + v9 )
{
DECREMENT_SCATTER_GATHER_LISTS(v10);
ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViHalWaitBlockLookaside, v5);
return 3221225507i64;
}
v5[7] = v10;
v24 = v21 + ((ByteOffset + ByteCount - v19 + v9 + 4095) >> 12);
*((_DWORD *)v5 + 12) = v24;
MapRegisterFile = ViAllocateMapRegisterFile(v10, v24);
MapRegisterBase = MapRegisterFile;
v26 = (struct _SLIST_ENTRY *)MapRegisterFile;
if( MapRegisterFile )
{
MapRegisterFile[25] = 1;
v5[12] = MapRegisterFile;
v5[2] = v5 + 13;
Param3 = v51;
v5[3] = v2;
*((_DWORD *)v5 + 8) = v9;
if( (unsigned int)ViMapDoubleBuffer((UINT64)MapRegisterFile, (UINT64)v3, v2, v9, Param3) )
{
v27 = (_OWORD *)v5[2];
v39 = v26;
v15 = (__int64)v5;
*v27 = *(_OWORD *)&v3->Next;
v27[1] = *(_OWORD *)&v3->Process;
v27[2] = *(_OWORD *)&v3->StartVa;
ViSwap(&MapRegisterBase, (_MDL **)MemoryDescriptorLista, (VOID **)va1);
v2 = v46;
v28 = ViScatterGatherCallback;
v3 = MemoryDescriptorList;
goto LABEL_21;
}
ViFreeMapRegisterFile(v10, v26);
}
ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViHalWaitBlockLookaside, v5);
v5 = 0i64;
}
else
{
LABEL_19:
v15 = v50;
}
v28 = v49;
LABEL_21:
v29 = v41(a1, a2, v3, v2, v9, v28, v15, v51);
v30 = v29;
if( v10 && v29 < 0 )
{
DECREMENT_SCATTER_GATHER_LISTS(v10);
if( v39 )
ViFreeMapRegisterFile(v10, v39);
if( v5 )
{
v32 = (UINT64 *)(v10 + 72);
KeAcquireSpinLockRaiseToDpc((UINT64 *)(v10 + 72), v31);
v34 = v33;
v35 = v5[9];
v36 = (_QWORD *)v5[10];
if( *(_QWORD **)(v35 + 8) != v5 + 9 || (_QWORD *)*v36 != v5 + 9 )
__fastfail(3u);
*v36 = v35;
*(_QWORD *)(v35 + 8) = v36;
KxReleaseSpinLock(v32);
__writecr8(v34);
ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViHalWaitBlockLookaside, v5);
}
}
return v30;
}Referenced by:
No references.