IoGetDeviceInterfaces

NTSTATUS __stdcall IoGetDeviceInterfaces(
        const GUID *InterfaceClassGuid,
        PDEVICE_OBJECT PhysicalDeviceObject,
        ULONG Flags,
        PZZWSTR *SymbolicLinkList){
  _UNICODE_STRING *v5; 
  NTSTATUS result; 
  __int64 v7; 
  __int16 *v8; 
  _WORD *v9; 
  PVOID *v10; 
  PVOID *v11; 
  __int64 v12; 
  _WORD *v13; 
  __int64 v14; 
  _WORD *v15; 
  __int64 v16; 
  v5 = 0i64;
  if( PhysicalDeviceObject )
  {
    v7 = *(_QWORD *)(*((_QWORD *)PhysicalDeviceObject + 39) + 40i64);
    if( !v7 || (*(_DWORD *)(v7 + 396) & 0x20000) != 0 )
    {
      IoAddTriageDumpDataBlock(PhysicalDeviceObject, *((unsigned __int16 *)PhysicalDeviceObject + 1));
      v8 = (__int16 *)*((_QWORD *)PhysicalDeviceObject + 1);
      if( v8 )
      {
        IoAddTriageDumpDataBlock(v8, (unsigned int)v8[1]);
        v9 = (_WORD *)(*((_QWORD *)PhysicalDeviceObject + 1) + 56i64);
        if( *v9 )
        {
          IoAddTriageDumpDataBlock(v9, 2ui64);
          IoAddTriageDumpDataBlock(
            *(PVOID *)(*((_QWORD *)PhysicalDeviceObject + 1) + 64i64),
            *(unsigned __int16 *)(*((_QWORD *)PhysicalDeviceObject + 1) + 56i64));
        }
      }
      v10 = *(PVOID **)(*((_QWORD *)PhysicalDeviceObject + 39) + 40i64);
      if( v10 )
      {
        v11 = v10 + 5;
        IoAddTriageDumpDataBlock(v10, 0x310ui64);
        if( *(_WORD *)v11 )
        {
          IoAddTriageDumpDataBlock(v11, 2ui64);
          IoAddTriageDumpDataBlock(v11[1], *(unsigned __int16 *)v11);
        }
        v12 = *((_QWORD *)PhysicalDeviceObject + 39);
        v13 = (_WORD *)(*(_QWORD *)(v12 + 40) + 56i64);
        if( *v13 )
        {
          IoAddTriageDumpDataBlock(v13, 2ui64);
          IoAddTriageDumpDataBlock(
            *(PVOID *)(*(_QWORD *)(*((_QWORD *)PhysicalDeviceObject + 39) + 40i64) + 64i64),
            *(unsigned __int16 *)(*(_QWORD *)(*((_QWORD *)PhysicalDeviceObject + 39) + 40i64) + 56i64));
          v12 = *((_QWORD *)PhysicalDeviceObject + 39);
        }
        v14 = *(_QWORD *)(*(_QWORD *)(v12 + 40) + 16i64);
        if( v14 )
        {
          v15 = (_WORD *)(v14 + 56);
          if( *v15 )
          {
            IoAddTriageDumpDataBlock(v15, 2ui64);
            v16 = *(_QWORD *)(*(_QWORD *)(*((_QWORD *)PhysicalDeviceObject + 39) + 40i64) + 16i64);
            IoAddTriageDumpDataBlock(*(PVOID *)(v16 + 64), *(unsigned __int16 *)(v16 + 56));
          }
        }
      }
      KeBugCheckEx(0xCAu, 2ui64, (ULONG_PTR)PhysicalDeviceObject, 0i64, 0i64);
    }
    v5 = (_UNICODE_STRING *)(v7 + 40);
  }
  IopGetDeviceInterfaces(InterfaceClassGuid, v5, *(UINT64 *)&Flags, 0, SymbolicLinkList, 0i64);
  return result;
}

Referenced by:

IopFetchConfigurationInformation
PnprIsMemoryDevice
PnprIsProcessorDevice
VhdiMountVhdFile