VfGetDmaAdapter
_DMA_ADAPTER *__stdcall VfGetDmaAdapter(
PDEVICE_OBJECT PhysicalDeviceObject,
_DEVICE_DESCRIPTION *DeviceDescription,
PULONG NumberOfMapRegisters,
INT64 a4,
INT64 a5,
INT64 a6,
INT64 a7,
UINT64 a8){
_ADAPTER_INFORMATION *v11;
int v12;
CHAR v13;
_DMA_ADAPTER *v14;
_DMA_ADAPTER *v15;
_LIST_ENTRY *v16;
_LIST_ENTRY *v17;
UINT64 Size;
UINT64 RequiredSize[2];
_LIST_ENTRY *retaddr;
int Data;
Data = 0;
RequiredSize[0] = 0i64;
if( !ViVerifyDma || ViDMADisabledNoRebootNeeded == 1 || VfIsPCIBus(PhysicalDeviceObject) )
return IoGetDmaAdapter(PhysicalDeviceObject, DeviceDescription, (UINT64 *)NumberOfMapRegisters);
if( (MmVerifierData & 0x20000) == 0 )
VF_ASSERT_IRQL(0);
if( PhysicalDeviceObject )
{
while( 1 )
{
v11 = (_ADAPTER_INFORMATION *)VF_FIND_INACTIVE_ADAPTER_AND_REMOVE(PhysicalDeviceObject);
if( !v11 )
break;
ViReleaseDmaAdapter(v11);
}
}
if( *NumberOfMapRegisters > 0x20 )
*NumberOfMapRegisters = 32;
v12 = ((__int64(__fastcall *)(struct _KTHREAD *))off_140C00910)(KeGetCurrentThread());
if( v12 < 0 )
{
if( v12 != -1073741275 )
return 0i64;
v13 = 1;
}
else
{
v13 = 0;
}
v14 = (_DMA_ADAPTER *)((__int64(__fastcall *)(PDEVICE_OBJECT, _DEVICE_DESCRIPTION *, PULONG))pXdvIoGetDmaAdapter)(
PhysicalDeviceObject,
DeviceDescription,
NumberOfMapRegisters);
v15 = v14;
if( !v14 )
return 0i64;
v16 = ViHookDmaAdapter(v14, DeviceDescription, *NumberOfMapRegisters, v13);
v17 = v16;
if( !v16 )
{
v15->DmaOperations->PutDmaAdapter(v15);
return 0i64;
}
v16[1].Blink = (_LIST_ENTRY *)PhysicalDeviceObject;
v16[2].Blink = retaddr;
if( PhysicalDeviceObject )
{
LODWORD(Size) = 4;
if( IoGetDevicePropertyData(
PhysicalDeviceObject,
(_DEVPROPKEY *)&DEVPKEY_Device_Capabilities,
0i64,
0i64,
Size,
&Data,
(UINT64 *)((char *)RequiredSize + 4),
RequiredSize) >= 0
&& (Data & 0x400) != 0 )
{
BYTE3(v17[2].Flink) = 1;
}
}
return v15;
}Referenced by:
No references.