IoGetDeviceInterfaces

NTSTATUS __stdcall IoGetDeviceInterfaces(
        _GUID *InterfaceClassGuid,
        _DEVICE_OBJECT *PhysicalDeviceObject,
        UINT64 Flags,
        WCHAR **SymbolicLinkList){
  _UNICODE_STRING *v5; 
  NTSTATUS result; 
  char *DeviceNode; 
  _DRIVER_OBJECT *DriverObject; 
  _UNICODE_STRING *p_DriverName; 
  VOID **v10; 
  VOID **v11; 
  _DEVOBJ_EXTENSION *DeviceObjectExtension; 
  _WORD *v13; 
  __int64 v14; 
  _WORD *v15; 
  __int64 v16; 

  v5 = 0i64;
  if( PhysicalDeviceObject )
  {
    DeviceNode = (char *)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode;
    if( !DeviceNode || (*((_DWORD *)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);
        }
      }
      v10 = (VOID **)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode;
      if( v10 )
      {
        v11 = v10 + 5;
        IoAddTriageDumpDataBlock(v10, (_BYTE *)0x310);
        if( *(_WORD *)v11 )
        {
          IoAddTriageDumpDataBlock(v11, (_BYTE *)2);
          IoAddTriageDumpDataBlock(v11[1], (_BYTE *)*(unsigned __int16 *)v11);
        }
        DeviceObjectExtension = PhysicalDeviceObject->DeviceObjectExtension;
        v13 = (char *)DeviceObjectExtension->DeviceNode + 56;
        if( *v13 )
        {
          IoAddTriageDumpDataBlock(v13, (_BYTE *)2);
          IoAddTriageDumpDataBlock(
            *((VOID **)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode + 8),
            (_BYTE *)*((unsigned __int16 *)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode + 28));
          DeviceObjectExtension = PhysicalDeviceObject->DeviceObjectExtension;
        }
        v14 = *((_QWORD *)DeviceObjectExtension->DeviceNode + 2);
        if( v14 )
        {
          v15 = (_WORD *)(v14 + 56);
          if( *v15 )
          {
            IoAddTriageDumpDataBlock(v15, (_BYTE *)2);
            v16 = *((_QWORD *)PhysicalDeviceObject->DeviceObjectExtension->DeviceNode + 2);
            IoAddTriageDumpDataBlock(*(VOID **)(v16 + 64), (_BYTE *)*(unsigned __int16 *)(v16 + 56));
          }
        }
      }
      KeBugCheckEx(0xCAu, (PVOID)2, PhysicalDeviceObject, 0i64, 0i64);
    }
    v5 = (_UNICODE_STRING *)(DeviceNode + 40);
  }
  IopGetDeviceInterfaces(InterfaceClassGuid, v5, Flags, 0, SymbolicLinkList, 0i64);
  return result;
}

Referenced by:

IopFetchConfigurationInformation
PnprIsMemoryDevice
PnprIsProcessorDevice
VhdiMountVhdFile