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