VfAllocateAdapterChannelEx
__int64 __fastcall VfAllocateAdapterChannelEx(
ULONG_PTR a1,
_LIST_ENTRY *a2,
__int64 a3,
unsigned int a4,
int a5,
__int64 (__fastcall *a6)(__int64 a1, __int64 a2, __int64 a3, _DWORD *a4),
__int64 a7,
_QWORD *a8){
void *v8;
_LIST_ENTRY *v9;
INT64 v13;
LIST_ENTRY *AdapterInformationInternal;
INT64 v15;
__int64 v17;
__int64 v18;
__int64(__fastcall *v19)(ULONG_PTR, _LIST_ENTRY *, __int64, _QWORD, int, void *, __int64, _QWORD *);
unsigned int v20;
UINT64 v21;
unsigned __int8 v22;
unsigned __int64 v23;
__int64 v24;
_QWORD *v25;
v8 = a6;
v9 = a2;
LOBYTE(a2) = 1;
v13 = 0i64;
AdapterInformationInternal = ViGetAdapterInformationInternal((DMA_ADAPTER *)a1, (INT64)a2);
if( AdapterInformationInternal )
{
VF_ASSERT_IRQL(2u);
LODWORD(v15) = ExAllocateFromNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViHalWaitBlockLookaside);
v13 = v15;
if( !v15 )
return 3221225626i64;
memset(v15, 0i64);
v17 = a7;
*(_QWORD *)v13 = a7;
*(_QWORD *)(v13 + 8) = a6;
*(_QWORD *)(v13 + 56) = AdapterInformationInternal;
*(_DWORD *)(v13 + 48) = a4;
*(_QWORD *)(v13 + 40) = a3;
if( !AdapterInformationInternal[1].Blink )
AdapterInformationInternal[1].Blink = v9;
if( a6 )
v17 = v13;
INCREMENT_ADAPTER_CHANNELS((__int64)AdapterInformationInternal);
ADD_MAP_REGISTERS((__int64)AdapterInformationInternal, a4, 1);
v18 = (__int64)&AdapterInformationInternal[9];
ExInterlockedInsertTailList(
AdapterInformationInternal + 8,
(PLIST_ENTRY)(v13 + 72),
(PKSPIN_LOCK)&AdapterInformationInternal[9]);
v8 = ViAdapterCallback;
if( !a6 )
v8 = 0i64;
}
else
{
v17 = a7;
v18 = 144i64;
}
LODWORD(v19) = ViGetRealDmaOperation((_DMA_ADAPTER *)a1, 0xA0ui64);
v20 = v19(a1, v9, a3, a4, a5, v8, v17, a8);
if( AdapterInformationInternal && ViIsActiveChannelWcb((INT64)AdapterInformationInternal, v13) )
{
if( v20 )
{
KeAcquireSpinLockRaiseToDpc((UINT64 *)v18, v21);
v23 = v22;
v24 = *(_QWORD *)(v13 + 72);
v25 = *(_QWORD **)(v13 + 80);
if( *(_QWORD *)(v24 + 8) != v13 + 72 || *v25 != v13 + 72 )
__fastfail(3u);
*v25 = v24;
*(_QWORD *)(v24 + 8) = v25;
KxReleaseSpinLock((UINT64 *)v18);
__writecr8(v23);
DECREMENT_ADAPTER_CHANNELS((__int64)AdapterInformationInternal);
SUBTRACT_MAP_REGISTERS((INT64)AdapterInformationInternal, a4);
ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViHalWaitBlockLookaside, (PVOID)v13);
}
else if( !v8 )
{
*(_DWORD *)(v13 + 52) = 1;
*(_QWORD *)(v13 + 88) = *a8;
}
}
return v20;
}Referenced by:
No references.