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.