VfAllocateAdapterChannel
NTSTATUS __stdcall VfAllocateAdapterChannel(
DMA_ADAPTER *DmaAdapter,
PDEVICE_OBJECT DeviceObject,
UINT32 NumberOfMapRegisters,
PDRIVER_CONTROL ExecutionRoutine,
PVOID Context){
char *v6;
__int64(__fastcall *v10)(DMA_ADAPTER *, PDEVICE_OBJECT, _QWORD, PDRIVER_CONTROL, PVOID);
INT64 v11;
LIST_ENTRY *AdapterInformationInternal;
INT64 v13;
PVOID v15;
__int64 v16;
NTSTATUS v17;
NTSTATUS v18;
UINT64 v19;
unsigned __int8 v20;
unsigned __int64 v21;
char **v22;
void **v23;
struct _SLIST_ENTRY *v24;
__int64(__fastcall *v25)(DMA_ADAPTER *, PDEVICE_OBJECT, _QWORD, PDRIVER_CONTROL, PVOID);
v6 = 0i64;
LODWORD(v10) = ViGetRealDmaOperation(DmaAdapter, 0x20ui64);
LOBYTE(v11) = 1;
v25 = v10;
AdapterInformationInternal = ViGetAdapterInformationInternal(DmaAdapter, v11);
if( AdapterInformationInternal )
{
VF_ASSERT_IRQL(2u);
LODWORD(v13) = ExAllocateFromNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViHalWaitBlockLookaside);
v6 = (char *)v13;
if( !v13 )
return -1073741670;
memset(v13, 0i64);
*(_QWORD *)v6 = Context;
*((_QWORD *)v6 + 1) = ExecutionRoutine;
*((_QWORD *)v6 + 7) = AdapterInformationInternal;
*((_DWORD *)v6 + 12) = NumberOfMapRegisters;
if( !BYTE1(AdapterInformationInternal[2].Flink) && LODWORD(AdapterInformationInternal[12].Flink) < 3 )
*((_QWORD *)v6 + 12) = ViAllocateMapRegisterFile((INT64)AdapterInformationInternal, NumberOfMapRegisters);
if( !AdapterInformationInternal[1].Blink )
AdapterInformationInternal[1].Blink = (_LIST_ENTRY *)DeviceObject;
ExecutionRoutine = (PDRIVER_CONTROL)ViAdapterCallback;
v15 = v6;
INCREMENT_ADAPTER_CHANNELS((__int64)AdapterInformationInternal);
ADD_MAP_REGISTERS((__int64)AdapterInformationInternal, NumberOfMapRegisters, 0);
v16 = (__int64)&AdapterInformationInternal[9];
ExInterlockedInsertTailList(
AdapterInformationInternal + 8,
(PLIST_ENTRY)(v6 + 72),
(PKSPIN_LOCK)&AdapterInformationInternal[9]);
}
else
{
v15 = Context;
v16 = 144i64;
}
v17 = v25(DmaAdapter, DeviceObject, NumberOfMapRegisters, ExecutionRoutine, v15);
v18 = v17;
if( AdapterInformationInternal && v17 && ViIsActiveChannelWcb((INT64)AdapterInformationInternal, (INT64)v6) )
{
KeAcquireSpinLockRaiseToDpc((UINT64 *)v16, v19);
v21 = v20;
v22 = (char **)*((_QWORD *)v6 + 9);
v23 = (void **)*((_QWORD *)v6 + 10);
if( v22[1] != v6 + 72 || *v23 != v6 + 72 )
__fastfail(3u);
*v23 = v22;
v22[1] = (char *)v23;
KxReleaseSpinLock((UINT64 *)v16);
__writecr8(v21);
DECREMENT_ADAPTER_CHANNELS((__int64)AdapterInformationInternal);
SUBTRACT_MAP_REGISTERS((INT64)AdapterInformationInternal, NumberOfMapRegisters);
v24 = (struct _SLIST_ENTRY *)*((_QWORD *)v6 + 12);
if( v24 )
ViFreeMapRegisterFile((__int64)AdapterInformationInternal, v24);
ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)ViHalWaitBlockLookaside, v6);
}
return v18;
}Referenced by:
No references.