VfAllocateAdapterChannel
NTSTATUS __stdcall VfAllocateAdapterChannel(
_DMA_ADAPTER *DmaAdapter,
_DEVICE_OBJECT *DeviceObject,
UINT64 NumberOfMapRegisters,
_IO_ALLOCATION_ACTION *ExecutionRoutine,
_DEVICE_OBJECT *a5,
_IRP *a6,
VOID *a7,
VOID *a8,
VOID *Context){
char *v10;
unsigned int v12;
__int64(__fastcall *RealDmaOperation)(_DMA_ADAPTER *, _DEVICE_OBJECT *, _QWORD, _IO_ALLOCATION_ACTION *, _DEVICE_OBJECT *);
INT64 v15;
_LIST_ENTRY *AdapterInformationInternal;
char *v17;
_DEVICE_OBJECT *v19;
__int64 v20;
NTSTATUS v21;
NTSTATUS v22;
unsigned __int64 v23;
char **v24;
VOID **v25;
_MAP_REGISTER_FILE *v26;
__int64(__fastcall *v27)(_DMA_ADAPTER *, _DEVICE_OBJECT *, _QWORD, _IO_ALLOCATION_ACTION *, _DEVICE_OBJECT *);
v10 = 0i64;
v12 = NumberOfMapRegisters;
RealDmaOperation = (__int64(__fastcall *)(_DMA_ADAPTER *, _DEVICE_OBJECT *, _QWORD, _IO_ALLOCATION_ACTION *, _DEVICE_OBJECT *))ViGetRealDmaOperation((ULONG_PTR)DmaAdapter, 0x20ui64);
LOBYTE(v15) = 1;
v27 = RealDmaOperation;
AdapterInformationInternal = ViGetAdapterInformationInternal(DmaAdapter, v15);
if( AdapterInformationInternal )
{
VF_ASSERT_IRQL(2u);
v17 = (char *)ExAllocateFromNPagedLookasideList(&ViHalWaitBlockLookaside);
v10 = v17;
if( !v17 )
return -1073741670;
memset(v17, 0i64, 0x98u);
*(_QWORD *)v10 = a5;
*((_QWORD *)v10 + 1) = ExecutionRoutine;
*((_QWORD *)v10 + 7) = AdapterInformationInternal;
*((_DWORD *)v10 + 12) = v12;
if( !BYTE1(AdapterInformationInternal[2].Flink) && LODWORD(AdapterInformationInternal[12].Flink) < 3 )
*((_QWORD *)v10 + 12) = ViAllocateMapRegisterFile((_ADAPTER_INFORMATION *)AdapterInformationInternal, v12);
if( !AdapterInformationInternal[1].Blink )
AdapterInformationInternal[1].Blink = (_LIST_ENTRY *)DeviceObject;
ExecutionRoutine = (_IO_ALLOCATION_ACTION *)ViAdapterCallback;
v19 = (_DEVICE_OBJECT *)v10;
INCREMENT_ADAPTER_CHANNELS((__int64)AdapterInformationInternal);
ADD_MAP_REGISTERS((_ADAPTER_INFORMATION *)AdapterInformationInternal, v12, 0);
v20 = (__int64)&AdapterInformationInternal[9];
ExInterlockedInsertTailList(
AdapterInformationInternal + 8,
(PLIST_ENTRY)(v10 + 72),
(PKSPIN_LOCK)&AdapterInformationInternal[9]);
}
else
{
v19 = a5;
v20 = 144i64;
}
v21 = v27(DmaAdapter, DeviceObject, v12, ExecutionRoutine, v19);
v22 = v21;
if( AdapterInformationInternal
&& v21
&& ViIsActiveChannelWcb((_ADAPTER_INFORMATION *)AdapterInformationInternal, (_VF_WAIT_CONTEXT_BLOCK *)v10) )
{
v23 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)v20);
v24 = (char **)*((_QWORD *)v10 + 9);
v25 = (VOID **)*((_QWORD *)v10 + 10);
if( v24[1] != v10 + 72 || *v25 != v10 + 72 )
__fastfail(3u);
*v25 = v24;
v24[1] = (char *)v25;
KxReleaseSpinLock((UINT64 *)v20);
__writecr8(v23);
DECREMENT_ADAPTER_CHANNELS((__int64)AdapterInformationInternal);
SUBTRACT_MAP_REGISTERS((_ADAPTER_INFORMATION *)AdapterInformationInternal, v12);
v26 = (_MAP_REGISTER_FILE *)*((_QWORD *)v10 + 12);
if( v26 )
ViFreeMapRegisterFile((_ADAPTER_INFORMATION *)AdapterInformationInternal, v26);
ExFreeToNPagedLookasideList(&ViHalWaitBlockLookaside, v10);
}
return v22;
}Referenced by:
No references.