IoGetDmaAdapter

_DMA_ADAPTER *__stdcall IoGetDmaAdapter(
        _DEVICE_OBJECT *PhysicalDeviceObject,
        _DEVICE_DESCRIPTION *DeviceDescription,
        UINT64 *NumberOfMapRegisters){
  _DMA_ADAPTER *v5; 
  _DWORD *DeviceNode; 
  _DMA_ADAPTER *v7; 
  size_t v9; 
  NTSTATUS DeviceProperty; 
  int v11; 
  _DRIVER_OBJECT *DriverObject; 
  _UNICODE_STRING *p_DriverName; 
  VOID **v14; 
  VOID **v15; 
  _DEVOBJ_EXTENSION *DeviceObjectExtension; 
  _WORD *v17; 
  __int64 v18; 
  _WORD *v19; 
  __int64 v20; 
  __int64 ResultLength[2]; 
  int v22[16]; 

  memset(v22, 0i64, sizeof(v22));
  v5 = 0i64;
  LODWORD(ResultLength[0]) = 0;
  if( PhysicalDeviceObject )
  {
    DeviceNode = PhysicalDeviceObject->DeviceObjectExtension->DeviceNode;
    if( !DeviceNode || (DeviceNode[99] & 0x20000) != 0 )
    {
      IoAddTriageDumpDataBlock(PhysicalDeviceObject, (_BYTE *)PhysicalDeviceObject->Size);
      DriverObject = PhysicalDeviceObject->DriverObject;
      if( DriverObject )
      {
        IoAddTriageDumpDataBlock(DriverObject, (_BYTE *)(unsigned int)DriverObject->Size);
        p_DriverName = &PhysicalDeviceObject->DriverObject->DriverName;
        if( p_DriverName->Length )
        {
          IoAddTriageDumpDataBlock(p_DriverName, (_BYTE *)2);
          IoAddTriageDumpDataBlock(
            PhysicalDeviceObject->DriverObject->DriverName.Buffer,
            (_BYTE *)PhysicalDeviceObject->DriverObject->DriverName.Length);
        }
      }
      v14 = (VOID **)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode;
      if( v14 )
      {
        v15 = v14 + 5;
        IoAddTriageDumpDataBlock(v14, (_BYTE *)0x310);
        if( *(_WORD *)v15 )
        {
          IoAddTriageDumpDataBlock(v15, (_BYTE *)2);
          IoAddTriageDumpDataBlock(v15[1], (_BYTE *)*(unsigned __int16 *)v15);
        }
        DeviceObjectExtension = PhysicalDeviceObject->DeviceObjectExtension;
        v17 = (char *)DeviceObjectExtension->DeviceNode + 56;
        if( *v17 )
        {
          IoAddTriageDumpDataBlock(v17, (_BYTE *)2);
          IoAddTriageDumpDataBlock(
            *((VOID **)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode + 8),
            (_BYTE *)*((unsigned __int16 *)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode + 28));
          DeviceObjectExtension = PhysicalDeviceObject->DeviceObjectExtension;
        }
        v18 = *((_QWORD *)DeviceObjectExtension->DeviceNode + 2);
        if( v18 )
        {
          v19 = (_WORD *)(v18 + 56);
          if( *v19 )
          {
            IoAddTriageDumpDataBlock(v19, (_BYTE *)2);
            v20 = *((_QWORD *)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode + 2);
            IoAddTriageDumpDataBlock(*(VOID **)(v20 + 64), (_BYTE *)*(unsigned __int16 *)(v20 + 56));
          }
        }
      }
      KeBugCheckEx(0xCAu, (PVOID)2, PhysicalDeviceObject, 0i64, 0i64);
    }
    ((void(__fastcall *)(struct _KTHREAD *, _DEVICE_OBJECT *))off_140C00908[0])(
      KeGetCurrentThread(),
      PhysicalDeviceObject);
    if( ((DeviceDescription->InterfaceType + 1) & 0xFFFFFFEF) == 0 )
    {
      if( DeviceDescription->Version >= 3 )
      {
        v9 = 0;
        if( DeviceDescription->Version == 3 )
          v9 = 64;
      }
      else
      {
        v9 = 40;
      }
      memmove(v22, DeviceDescription, v9);
      DeviceProperty = IoGetDeviceProperty(PhysicalDeviceObject, 13, 4ui64, &v22[5], (UINT64 *)ResultLength);
      v11 = v22[5];
      if( DeviceProperty < 0 )
        v11 = 1;
      v22[5] = v11;
    }
    LODWORD(v7) = PiGetDmaAdapterFromBusInterface((ULONG)PhysicalDeviceObject);
    v5 = v7;
    ((void(__fastcall *)(struct _KTHREAD *, _QWORD))off_140C00908[0])(KeGetCurrentThread(), 0i64);
  }
  return v5;
}

Referenced by:

VfGetDmaAdapter