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.