VfAllocateAdapterChannelEx
NTSTATUS __stdcall VfAllocateAdapterChannelEx(
_DMA_ADAPTER *DmaAdapter,
INT64 a2,
INT64 a3,
UINT64 a4,
INT64 a5,
INT64 a6,
INT64 a7,
INT64 a8){
INT64 v8;
INT64 v9;
unsigned int v10;
ULONG_PTR v12;
char *v13;
_LIST_ENTRY *AdapterInformationInternal;
char *v15;
INT64 v17;
__int64 v18;
VOID *RealDmaOperation;
NTSTATUS v20;
unsigned __int64 v21;
char **v22;
VOID **v23;
v8 = a6;
v9 = a2;
LOBYTE(a2) = 1;
v10 = a4;
v12 = (unsigned int)DmaAdapter;
v13 = 0i64;
AdapterInformationInternal = ViGetAdapterInformationInternal(DmaAdapter, a2);
if( AdapterInformationInternal )
{
VF_ASSERT_IRQL(2u);
v15 = (char *)ExAllocateFromNPagedLookasideList(&ViHalWaitBlockLookaside);
v13 = v15;
if( !v15 )
return -1073741670;
memset(v15, 0i64, 0x98u);
v17 = a7;
*(_QWORD *)v13 = a7;
*((_QWORD *)v13 + 1) = a6;
*((_QWORD *)v13 + 7) = AdapterInformationInternal;
*((_DWORD *)v13 + 12) = v10;
*((_QWORD *)v13 + 5) = a3;
if( !AdapterInformationInternal[1].Blink )
AdapterInformationInternal[1].Blink = (_LIST_ENTRY *)v9;
if( a6 )
v17 = (INT64)v13;
INCREMENT_ADAPTER_CHANNELS((__int64)AdapterInformationInternal);
ADD_MAP_REGISTERS((_ADAPTER_INFORMATION *)AdapterInformationInternal, v10, 1u);
v18 = (__int64)&AdapterInformationInternal[9];
ExInterlockedInsertTailList(
AdapterInformationInternal + 8,
(PLIST_ENTRY)(v13 + 72),
(PKSPIN_LOCK)&AdapterInformationInternal[9]);
v8 = (INT64)ViAdapterCallback;
if( !a6 )
v8 = 0i64;
}
else
{
v17 = a7;
v18 = 144i64;
}
RealDmaOperation = ViGetRealDmaOperation(v12, 0xA0ui64);
v20 = ((__int64(__fastcall *)(_DMA_ADAPTER *, INT64, INT64, _QWORD, _DWORD, INT64, INT64, INT64))RealDmaOperation)(
DmaAdapter,
v9,
a3,
v10,
a5,
v8,
v17,
a8);
if( AdapterInformationInternal
&& ViIsActiveChannelWcb((_ADAPTER_INFORMATION *)AdapterInformationInternal, (_VF_WAIT_CONTEXT_BLOCK *)v13) )
{
if( v20 )
{
v21 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)v18);
v22 = (char **)*((_QWORD *)v13 + 9);
v23 = (VOID **)*((_QWORD *)v13 + 10);
if( v22[1] != v13 + 72 || *v23 != v13 + 72 )
__fastfail(3u);
*v23 = v22;
v22[1] = (char *)v23;
KxReleaseSpinLock((UINT64 *)v18);
__writecr8(v21);
DECREMENT_ADAPTER_CHANNELS((__int64)AdapterInformationInternal);
SUBTRACT_MAP_REGISTERS((_ADAPTER_INFORMATION *)AdapterInformationInternal, v10);
ExFreeToNPagedLookasideList(&ViHalWaitBlockLookaside, v13);
}
else if( !v8 )
{
*((_DWORD *)v13 + 13) = 1;
*((_QWORD *)v13 + 11) = *(_QWORD *)a8;
}
}
return v20;
}Referenced by:
No references.