<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">

    <!-- @TODO: There should be discussion about packing this into the NT kernel symbols once
                we have the ability to include NatVis in PDBs. -->

    <Type Name="_UNICODE_STRING">
        <DisplayString>{Buffer,[Length / 2]su}</DisplayString>
    </Type>

    <!-- **************************************************
         NatVis for IRP:
         ************************************************** -->

    <!-- NOTE: The notion of being able to do easier "lookup tables" for things like these defines is being discussed between
               debugger teams involved with NatVis.  For now, the best you can do is a Condition=... cascade. -->

    <Type Name="_IO_STACK_LOCATION">
        <DisplayString Condition="MajorFunction==0x00">IRP_MJ_CREATE / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x01">IRP_MJ_CREATE_NAMED_PIPE / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x02">IRP_MJ_CLOSE / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x03">IRP_MJ_READ / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x04">IRP_MJ_WRITE / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x05">IRP_MJ_QUERY_INFORMATION / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x06">IRP_MJ_SET_INFORMATION / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x07">IRP_MJ_QUERY_EA / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x08">IRP_MJ_SET_EA / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x09">IRP_MJ_FLUSH_BUFFERS / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x0a">IRP_MJ_QUERY_VOLUME_INFORMATION / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x0b">IRP_MJ_SET_VOLUME_INFORMATION / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x0c">IRP_MJ_DIRECTORY_CONTROL / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x0d">IRP_MJ_FILE_SYSTEM_CONTROL / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x0e">IRP_MJ_DEVICE_CONTROL / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x0f">IRP_MJ_INTERNAL_DEVICE_CONTROL / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x10">IRP_MJ_SHUTDOWN / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x11">IRP_LOCK_CONTROL / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x12">IRP_MJ_CLEANUP / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x13">IRP_MJ_CREATE_MAILSLOT / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x14">IRP_MJ_QUERY_SECURITY / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x15">IRP_MJ_SET_SECURITY / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x16 &amp;&amp; MinorFunction==0x00">IRP_MJ_POWER / IRP_MN_WAIT_WAKE for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x16 &amp;&amp; MinorFunction==0x01">IRP_MJ_POWER / IRP_MN_POWER_SEQUENCE for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x16 &amp;&amp; MinorFunction==0x02">IRP_MJ_POWER / IRP_MN_SET_POWER for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x16 &amp;&amp; MinorFunction==0x03">IRP_MJ_POWER / IRP_MN_QUERY_POWER for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x17 &amp;&amp; MinorFunction==0x00">IRP_MJ_SYSTEM_CONTROL / IRP_MN_QUERY_ALL_DATA for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x17 &amp;&amp; MinorFunction==0x01">IRP_MJ_SYSTEM_CONTROL / IRP_MN_QUERY_SINGLE_INSTANCE for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x17 &amp;&amp; MinorFunction==0x02">IRP_MJ_SYSTEM_CONTROL / IRP_MN_CHANGE_SINGLE_INSTANCE for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x17 &amp;&amp; MinorFunction==0x03">IRP_MJ_SYSTEM_CONTROL / IRP_MN_CHANGE_SINGLE_ITEM for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x17 &amp;&amp; MinorFunction==0x04">IRP_MJ_SYSTEM_CONTROL / IRP_MN_ENABLE_EVENTS for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x17 &amp;&amp; MinorFunction==0x05">IRP_MJ_SYSTEM_CONTROL / IRP_MN_DISABLE_EVENTS for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x17 &amp;&amp; MinorFunction==0x06">IRP_MJ_SYSTEM_CONTROL / IRP_MN_ENABLE_COLLECTION for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x17 &amp;&amp; MinorFunction==0x07">IRP_MJ_SYSTEM_CONTROL / IRP_MN_DISABLE_COLLECTION for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x17 &amp;&amp; MinorFunction==0x08">IRP_MJ_SYSTEM_CONTROL / IRP_MN_REGINFO for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x17 &amp;&amp; MinorFunction==0x09">IRP_MJ_SYSTEM_CONTROL / IRP_MN_EXECUTE_METHOD for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x17 &amp;&amp; MinorFunction==0x0b">IRP_MJ_SYSTEM_CONTROL / IRP_MN_REGINFO_EX for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x17">IRP_MJ_SYSTEM_CONTROL / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x18">IRP_MJ_DEVICE_CHANGE / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x19">IRP_MJ_QUERY_QUOTA / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1a">IRP_MJ_SET_QUOTA / {MinorFunction} for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x00">IRP_MJ_PNP / IRP_MN_START_DEVICE for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x01">IRP_MJ_PNP / IRP_MN_QUERY_REMOVE_DEVICE for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x02">IRP_MJ_PNP / IRP_MN_REMOVE_DEVICE for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x03">IRP_MJ_PNP / IRP_MN_CANCEL_REMOVE_DEVICE for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x04">IRP_MJ_PNP / IRP_MN_STOP_DEVICE for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x05">IRP_MJ_PNP / IRP_MN_QUERY_STOP_DEVICE for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x06">IRP_MJ_PNP / IRP_MN_CANCEL_STOP_DEVICE for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x07">IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x08">IRP_MJ_PNP / IRP_MN_QUERY_INTERFACE for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x09">IRP_MJ_PNP / IRP_MN_QUERY_CAPABILITIES for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x0a">IRP_MJ_PNP / IRP_MN_QUERY_RESOURCES for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x0b">IRP_MJ_PNP / IRP_MN_QUERY_RESOURCE_REQUIREMENTS for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x0c">IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_TEXT for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x0d">IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x0f">IRP_MJ_PNP / IRP_MN_READ_CONFIG for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x10">IRP_MJ_PNP / IRP_MN_WRITE_CONFIG for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x11">IRP_MJ_PNP / IRP_MN_EJECT for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x12">IRP_MJ_PNP / IRP_MN_SET_LOCK for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x13">IRP_MJ_PNP / IRP_MN_QUERY_ID for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x14">IRP_MJ_PNP / IRP_MN_QUERY_PNP_DEVICE_STATE for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x15">IRP_MJ_PNP / IRP_MN_QUERY_BUS_INFORMATION for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x16">IRP_MJ_PNP / IRP_MN_DEVICE_USAGE_NOTIFICATION for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x17">IRP_MJ_PNP / IRP_MN_SURPRISE_REMOVAL for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b &amp;&amp; MinorFunction==0x19">IRP_MJ_PNP / IRP_MN_DEVICE_ENUMERATED for {DeviceObject}</DisplayString>
        <DisplayString Condition="MajorFunction==0x1b">IRP_MJ_PNP / {MinorFunction} for {DeviceObject}</DisplayString>
        <Expand>
            <Item Name="Device">DeviceObject</Item>
            <Item Name="File">FileObject</Item>
            <Item Name="CompletionRoutine">CompletionRoutine</Item>
            <Synthetic Name="FsctlParameters" Condition="MajorFunction==0x0d">
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x9004f">FSCTL_MARK_AS_SYSTEM_HIVE</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x9009c">FSCTL_GET_OBJECT_ID</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x900a0">FSCTL_DELETE_OBJECT_ID</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x901f0">FSCTL_QUERY_DEPENDENT_VOLUME</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x901f8">FSCTL_TXFS_READ_BACKUP_INFORMATION2</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x90200">FSCTL_TXFS_WRITE_BACKUP_INFORMATION2</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x90260">FSCTL_CORRUPTION_HANDLING</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x903bc">FSCTL_HSM_CONTROL</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x9031f">FSCTL_ENUM_OVERLAY</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x90348">FSCTL_CHECK_FOR_SECTION</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x90390">FSCTL_QUERY_VOLUME_CONTAINER_STATE</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x9040c">FSCTL_SET_REPARSE_POINT_EX</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x90410">FSCTL_DEFINE_STORAGE_RESERVE</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x94148">FSCTL_TXFS_QUERY_RM_INFORMATION</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x94160">FSCTL_TXFS_READ_BACKUP_INFORMATION</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x9416c">FSCTL_TXFS_GET_METADATA_INFO</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x94170">FSCTL_TXFS_GET_TRANSACTED_VERSION</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x9418c">FSCTL_TXFS_TRANSACTION_ACTIVE</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x941e0">FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x941e4">FSCTL_TXFS_LIST_TRANSACTIONS</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0X94264">FSCTL_OFFLOAD_READ</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x98144">FSCTL_TXFS_MODIFY_RM</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x98150">FSCTL_TXFS_ROLLFORWARD_REDO</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x98154">FSCTL_TXFS_ROLLFORWARD_UNDO</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x98158">FSCTL_TXFS_START_RM</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x9815c">FSCTL_TXFS_SHUTDOWN_RM</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x98164">FSCTL_TXFS_WRITE_BACKUP_INFORMATION</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x98168">FSCTL_TXFS_CREATE_SECONDARY_RM</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x98178">FSCTL_TXFS_SAVEPOINT_INFORMATION</DisplayString>
                <DisplayString Condition="Parameters.FileSystemControl.FsControlCode == 0x9817c">FSCTL_TXFS_CREATE_MINIVERSION</DisplayString>
                <DisplayString>FsControlCode {Parameters.FileSystemControl.FsControlCode,x}</DisplayString>
                <Expand>
                    <ExpandedItem>Parameters.FileSystemControl</ExpandedItem>
                </Expand>
            </Synthetic>
        </Expand>
    </Type>

    <Type Name="_IRP">
        <Expand>
            <Synthetic Name="IoStack">
                <DisplayString>Size = {(int)StackCount}, Current {Tail.Overlay.CurrentStackLocation}</DisplayString>
                <Expand>
                    <ArrayItems>
                        <Size>StackCount</Size>
                        <ValuePointer>Tail.Overlay.CurrentStackLocation - CurrentLocation + 1</ValuePointer>
                    </ArrayItems>
                </Expand>
            </Synthetic>
            <Item Name="CurrentStackLocation">Tail.Overlay.CurrentStackLocation</Item>
            <Item Condition="Tail.Overlay.Thread != nullptr" Name="CurrentThread">Tail.Overlay.Thread</Item>
        </Expand>
    </Type>

    <!-- **************************************************
      NatVis for FILE_OBJECT:
    ************************************************** -->
    <Type Name="_FILE_OBJECT">
        <DisplayString>{FileName} - {!Vpb ? DeviceObject : Vpb-&gt;DeviceObject}</DisplayString>
        <Expand>
          <Item Name="RelatedFile">RelatedFileObject</Item>
          <Item Name="Device">DeviceObject</Item>
        </Expand>
    </Type>


    <!-- **************************************************
         DEVICE_OBJECT and DRIVER_OBJECT
         ************************************************** -->

    <Type Name="_DEVICE_OBJECT">
        <DisplayString Condition="(Vpb == nullptr) || (Vpb->DeviceObject == this)">Device for {DriverObject-&gt;DriverName}</DisplayString>
        <DisplayString Condition="(Vpb != nullptr) &amp;&amp; (Vpb->DeviceObject != this)">Device for {DriverObject-&gt;DriverName} FileSystem:{Vpb-&gt;DeviceObject-&gt;DriverObject-&gt;DriverName}</DisplayString>
        <Expand>
            <Synthetic Name="Flags">
                <DisplayString Condition="Flags == 0">None Set</DisplayString>
                <DisplayString Condition="Flags != 0">{Flags,x}</DisplayString>
                <Expand>
                    <Item Condition="Flags &amp; 0x1" Name="VerifyVolume">(bool)(Flags &amp; 0x1)</Item>
                    <Item Condition="Flags &amp; 0x2" Name="BufferedIo">(bool)(Flags &amp; 0x2)</Item>
                    <Item Condition="Flags &amp; 0x4" Name="Exclusive">(bool)(Flags &amp; 0x4)</Item>
                    <Item Condition="Flags &amp; 0x8" Name="DirectIo">(bool)(Flags &amp; 0x8)</Item>
                    <Item Condition="Flags &amp; 0x10" Name="MapIoBuffer">(bool)(Flags &amp; 0x10)</Item>
                    <Item Condition="Flags &amp; 0x20" Name="DeviceInitializing">(bool)(Flags &amp; 0x20)</Item>
                    <Item Condition="Flags &amp; 0x80" Name="ShutdownRegistered">(bool)(Flags &amp; 0x80)</Item>
                    <Item Condition="Flags &amp; 0x1000" Name="BusEnumeratedDevice">(bool)(Flags &amp; 0x1000)</Item>
                    <Item Condition="Flags &amp; 0x2000" Name="PowerPagable">(bool)(Flags &amp; 0x2000)</Item>
                    <Item Condition="Flags &amp; 0x8000" Name="PowerInrush">(bool)(Flags &amp; 0x8000)</Item>
                    <Item Condition="Flags &amp; 0xffff4f40" Name="UnknownFlags">(Flags &amp; 0xffff4d40),x</Item>
                </Expand>
            </Synthetic>

            <!-- NOTE: There isn't a way in NatVis to express !devstack (walk up and then back down).  This gives you the
                       information, but in a slightly differently factored way (Upper Devices and Lower Devices).  This isn't
                       bad, just different. -->

            <Synthetic Name="UpperDevices">
                <DisplayString Condition="AttachedDevice == nullptr">None</DisplayString>
                <DisplayString>Immediately above is {AttachedDevice} [at {((unsigned __int64)AttachedDevice),x}]</DisplayString>
                <Expand>
                    <LinkedListItems Condition="AttachedDevice != nullptr">
                        <HeadPointer>AttachedDevice</HeadPointer>
                        <NextPointer>AttachedDevice</NextPointer>
                        <ValueNode>this</ValueNode>
                    </LinkedListItems>
                </Expand>
            </Synthetic>

            <Synthetic Name="LowerDevices">
                <DisplayString Condition="DeviceObjectExtension-&gt;AttachedTo == nullptr">None</DisplayString>
                <DisplayString>Immediately below is {DeviceObjectExtension-&gt;AttachedTo} [at {((unsigned __int64)(DeviceObjectExtension-&gt;AttachedTo)),x}]</DisplayString>
                <Expand>
                    <LinkedListItems Condition="DeviceObjectExtension-&gt;AttachedTo != nullptr">
                        <HeadPointer>DeviceObjectExtension-&gt;AttachedTo-&gt;DeviceObjectExtension</HeadPointer>
                        <NextPointer>AttachedTo-&gt;DeviceObjectExtension</NextPointer>
                        <ValueNode>DeviceObject</ValueNode>
                    </LinkedListItems>
                </Expand>
            </Synthetic>

            <Item Name="Driver">DriverObject</Item>
            <Item Condition="CurrentIrp != nullptr" Name="CurrentIrp">CurrentIrp</Item>
            <Item Condition="Vpb != nullptr" Name="FileSystem">Vpb-&gt;DeviceObject</Item>
            <Item Condition="Vpb != nullptr" Name="StorageDevice">Vpb-&gt;RealDevice</Item>
        </Expand>
    </Type>

    <Type Name="_DRIVER_OBJECT">
        <DisplayString>Driver {DriverName}</DisplayString>
        <Expand>
            <Item Name="HardwareDatabase">HardwareDatabase</Item>
            <Item Name="DeviceObject">DeviceObject</Item>
            <Synthetic Name="Flags">
                <DisplayString Condition="Flags == 0">None Set</DisplayString>
                <DisplayString Condition="Flags != 0">{Flags,x}</DisplayString>
                <Expand>
                    <Item Condition="Flags &amp; 0x1" Name="UnloadInvoked">(bool)(Flags &amp; 0x1)</Item>
                    <Item Condition="Flags &amp; 0x2" Name="LegacyDriver">(bool)(Flags &amp; 0x2)</Item>
                    <Item Condition="Flags &amp; 0x4" Name="BuiltInDriver">(bool)(Flags &amp; 0x4)</Item>
                    <Item Condition="Flags &amp; 0xfffffff8" Name="UnknownFlags">(Flags &amp; 0xfffffff8),x</Item>

                </Expand>
            </Synthetic>
            <Synthetic Name="Devices">
                <Expand>
                    <LinkedListItems>
                        <HeadPointer>DeviceObject</HeadPointer>
                        <NextPointer>NextDevice</NextPointer>
                        <ValueNode>this</ValueNode>
                    </LinkedListItems>
                </Expand>
            </Synthetic>
        </Expand>
    </Type>

    <!-- **************************************************
         PCI BUS
         ************************************************** -->

    <Type Name="_PCI_SEGMENT">
        <Version Name="pci.sys" />
        <Expand>
            <Synthetic Name="RootBuses">
                <Expand>
                    <LinkedListItems>
                        <HeadPointer>PciRootBusList</HeadPointer>
                        <NextPointer>SiblingBus</NextPointer>
                        <ValueNode>this</ValueNode>
                    </LinkedListItems>
                </Expand>
            </Synthetic>
        </Expand>
    </Type>

    <Type Name="_PCI_BUS">
        <Version Name="pci.sys" />
        <DisplayString>Bus {SecondaryBusNumber,x}</DisplayString>
        <Expand>
            <Synthetic Name="ChildDevices">
                <Expand>
                    <LinkedListItems>
                        <HeadPointer>ChildDevices</HeadPointer>
                        <NextPointer>Sibling</NextPointer>
                        <ValueNode>this</ValueNode>
                    </LinkedListItems>
                </Expand>
            </Synthetic>
        </Expand>
    </Type>

    <Type Name="_IO_RESOURCE_REQUIREMENTS_LIST">
        <Expand>
            <LinkedListItems>
                <Size>AlternativeLists</Size>
                <HeadPointer>List[0]</HeadPointer>
                <NextPointer>(_IO_RESOURCE_LIST*)(Descriptors + sizeof(Descriptors)*Count)</NextPointer>
                <ValueNode>this</ValueNode>
            </LinkedListItems>
        </Expand>
    </Type>

    <Type Name="_IO_RESOURCE_LIST">
        <Expand>
            <ArrayItems>
                <Size>Count</Size>
                <ValuePointer>Descriptors</ValuePointer>
            </ArrayItems>
        </Expand>
    </Type>

    <Type Name="_IO_RESOURCE_DESCRIPTOR">
        <DisplayString Condition="Type == 0">No Resource</DisplayString>
        <DisplayString Condition="Type == 1">Port Resource: {u.Port.MinimumAddress.QuadPart,x} - {u.Port.MaximumAddress.QuadPart,x} of length {u.Port.Length,x} and alignment {u.Port.Alignment,x}</DisplayString>
        <DisplayString Condition="Type == 2">Interrupt Resource</DisplayString>
        <DisplayString Condition="Type == 3">Memory Resource: {u.Memory.MinimumAddress.QuadPart,x} - {u.Memory.MaximumAddress.QuadPart,x} of length {u.Memory.Length,x} and alignment {u.Memory.Alignment,x}</DisplayString>
        <DisplayString Condition="Type == 4">DMA Resource</DisplayString>
        <DisplayString Condition="Type == 5">Device Specific Resource</DisplayString>
        <DisplayString Condition="Type == 6">Bus Number Resource</DisplayString>
        <DisplayString Condition="type == 7">Large Memory Resource</DisplayString>
        <DisplayString Condition="Type == 129">Private Device Resource</DisplayString>
        <DisplayString>Unknown Resource</DisplayString>
        <Expand>
            <Item Name = "Type">Type</Item>
            <Synthetic Name="Flags">
                <DisplayString>{Flags,x}</DisplayString>
                <Expand>
                    <Item Condition="Type == 1" Name="MemoryAddressSpace">(bool)true</Item>
                    <Item Condition="Type == 1 &amp;&amp; Flags &amp; 0x1" Name="IoAddressSpace">(bool)(Flags &amp; 0x1)</Item>
                    <Item Condition="Type == 1 &amp;&amp; Flags &amp; 0x4" Name="Decodes10Bits">(bool)(Flags &amp; 0x4)</Item>
                    <Item Condition="Type == 1 &amp;&amp; Flags &amp; 0x8" Name="Decodes12Bits">(bool)(Flags &amp; 0x8)</Item>
                    <Item Condition="Type == 1 &amp;&amp; Flags &amp; 0x10" Name="Decodes16Bits">(bool)(Flags &amp; 0x10)</Item>
                    <Item Condition="Type == 1 &amp;&amp; Flags &amp; 0x20" Name="PositiveDecode">(bool)(Flags &amp; 0x20)</Item>
                    <Item Condition="Type == 1 &amp;&amp; Flags &amp; 0x40" Name="PassiveDecode">(bool)(Flags &amp; 0x40)</Item>
                    <Item Condition="Type == 1 &amp;&amp; Flags &amp; 0x80" Name="WindowDecode">(bool)(Flags &amp; 0x80)</Item>

                    <Item Condition="Type == 2" Name="IrqLevelTriggered">(bool)true</Item>
                    <Item Condition="Type == 2 &amp;&amp; Flags &amp; 0x1" Name="IrqEdgeTriggered">(bool)(Flags &amp; 0x1)</Item>
                    <Item Condition="Type == 2 &amp;&amp; Flags &amp; 0x2" Name="MessageSignaledInterrupt">(bool)(Flags &amp; 0x2)</Item>
                    <Item Condition="Type == 2 &amp;&amp; Flags &amp; 0x4" Name="PolicyIncluded">(bool)(Flags &amp; 0x4)</Item>
                    <Item Condition="Type == 2 &amp;&amp; Flags &amp; 0x10" Name="SecondaryInterrupt">(bool)(Flags &amp; 0x10)</Item>
                    <Item Condition="Type == 2 &amp;&amp; Flags &amp; 0x20" Name="WakeCapable">(bool)(Flags &amp; 0x20)</Item>

                    <Item Condition="Type == 3" Name="ReadWrite">(bool)true</Item>
                    <Item Condition="Type == 3 &amp;&amp; Flags &amp; 0x1" Name="ReadOnly">(bool)(Flags &amp; 0x1)</Item>
                    <Item Condition="Type == 3 &amp;&amp; Flags &amp; 0x2" Name="WriteOnly">(bool)(Flags &amp; 0x2)</Item>
                    <Item Condition="Type == 3 &amp;&amp; Flags &amp; 0x4" Name="Prefetchable">(bool)(Flags &amp; 0x4)</Item>
                    <Item Condition="Type == 3 &amp;&amp; Flags &amp; 0x8" Name="CombinedWriteCachingAllowed">(bool)(Flags &amp; 0x8)</Item>
                    <Item Condition="Type == 3 &amp;&amp; Flags &amp; 0x10" Name="Addresses24Bits">(bool)(Flags &amp; 0x10)</Item>
                    <Item Condition="Type == 3 &amp;&amp; Flags &amp; 0x20" Name="Cacheable">(bool)(Flags &amp; 0x20)</Item>

                    <Item Condition="Type == 4" Name="DmaChannel8Bit">(bool)true</Item>
                    <Item Condition="Type == 4 &amp;&amp; Flags &amp; 0x1" Name="DmaChannel16Bit">(bool)(Flags &amp; 0x1)</Item>
                    <Item Condition="Type == 4 &amp;&amp; Flags &amp; 0x2" Name="DmaChannel32Bit">(bool)(Flags &amp; 0x2)</Item>
                    <Item Condition="Type == 4 &amp;&amp; Flags &amp; 0x4" Name="DmaChnanel8And16Bit">(bool)(Flags &amp; 0x4)</Item>
                    <Item Condition="Type == 4 &amp;&amp; Flags &amp; 0x8" Name="SupportsBusMasterDmaTransfers">(bool)(Flags &amp; 0x8)</Item>
                    <Item Condition="Type == 4 &amp;&amp; Flags &amp; 0x10" Name="TypeADma">(bool)(Flags &amp; 0x10)</Item>
                    <Item Condition="Type == 4 &amp;&amp; Flags &amp; 0x20" Name="TypeBDma">(bool)(Flags &amp; 0x20)</Item>
                    <Item Condition="Type == 4 &amp;&amp; Flags &amp; 0x40" Name="TypeFDma">(bool)(Flags &amp; 0x40)</Item>
                    <Item Condition="Type == 4 &amp;&amp; Flags &amp; 0x80" Name="UsesDmaV3Member">(bool)(Flags &amp; 0x80)</Item>
                </Expand>
            </Synthetic>
        </Expand>
    </Type>

    <Type Name="_CM_RESOURCE_LIST">
        <Expand>
            <LinkedListItems>
                <Size>Count</Size>
                <HeadPointer>List[0]</HeadPointer>
                <NextPointer>(_CM_FULL_RESOURCE_DESCRIPTOR*)(PartialResourceList.PartialDescriptors + sizeof(PartialResourceList.PartialDescriptors)*PartialResourceList.Count)</NextPointer>
                <ValueNode>this</ValueNode>
            </LinkedListItems>
        </Expand>
    </Type>

    <Type Name="_CM_FULL_RESOURCE_DESCRIPTOR">
        <Expand>
            <ArrayItems>
                <Size>PartialResourceList.Count</Size>
                <ValuePointer>PartialResourceList.PartialDescriptors</ValuePointer>
            </ArrayItems>
        </Expand>
    </Type>

    <Type Name="_CM_PARTIAL_RESOURCE_DESCRIPTOR">
        <DisplayString Condition="Type == 0">No Resource</DisplayString>
        <DisplayString Condition="Type == 1">Port Resource: {u.Port.Start.QuadPart,x} of length {u.Port.Length,x}</DisplayString>
        <DisplayString Condition="Type == 2">Interrupt Resource</DisplayString>
        <DisplayString Condition="Type == 3">Memory Resource: {u.Memory.Start.QuadPart,x} of length {u.Memory.Length,x}</DisplayString>
        <DisplayString Condition="Type == 4">DMA Resource</DisplayString>
        <DisplayString Condition="Type == 5">Device Specific Resource</DisplayString>
        <DisplayString Condition="Type == 6">Bus Number Resource</DisplayString>
        <DisplayString Condition="type == 7">Large Memory Resource</DisplayString>
        <DisplayString Condition="Type == 129">Private Device Resource</DisplayString>
        <DisplayString>Unknown Resource</DisplayString>
        <Expand>
            <Item Name = "Type">Type</Item>
            <Synthetic Name="Flags">
                <DisplayString>{Flags,x}</DisplayString>
                <Expand>
                    <Item Condition="Type == 1" Name="MemoryAddressSpace">(bool)true</Item>
                    <Item Condition="Type == 1 &amp;&amp; Flags &amp; 0x1" Name="IoAddressSpace">(bool)(Flags &amp; 0x1)</Item>
                    <Item Condition="Type == 1 &amp;&amp; Flags &amp; 0x4" Name="Decodes10Bits">(bool)(Flags &amp; 0x4)</Item>
                    <Item Condition="Type == 1 &amp;&amp; Flags &amp; 0x8" Name="Decodes12Bits">(bool)(Flags &amp; 0x8)</Item>
                    <Item Condition="Type == 1 &amp;&amp; Flags &amp; 0x10" Name="Decodes16Bits">(bool)(Flags &amp; 0x10)</Item>
                    <Item Condition="Type == 1 &amp;&amp; Flags &amp; 0x20" Name="PositiveDecode">(bool)(Flags &amp; 0x20)</Item>
                    <Item Condition="Type == 1 &amp;&amp; Flags &amp; 0x40" Name="PassiveDecode">(bool)(Flags &amp; 0x40)</Item>
                    <Item Condition="Type == 1 &amp;&amp; Flags &amp; 0x80" Name="WindowDecode">(bool)(Flags &amp; 0x80)</Item>

                    <Item Condition="Type == 2" Name="IrqLevelTriggered">(bool)true</Item>
                    <Item Condition="Type == 2 &amp;&amp; Flags &amp; 0x1" Name="IrqEdgeTriggered">(bool)(Flags &amp; 0x1)</Item>
                    <Item Condition="Type == 2 &amp;&amp; Flags &amp; 0x2" Name="MessageSignaledInterrupt">(bool)(Flags &amp; 0x2)</Item>
                    <Item Condition="Type == 2 &amp;&amp; Flags &amp; 0x4" Name="PolicyIncluded">(bool)(Flags &amp; 0x4)</Item>
                    <Item Condition="Type == 2 &amp;&amp; Flags &amp; 0x10" Name="SecondaryInterrupt">(bool)(Flags &amp; 0x10)</Item>
                    <Item Condition="Type == 2 &amp;&amp; Flags &amp; 0x20" Name="WakeCapable">(bool)(Flags &amp; 0x20)</Item>

                    <Item Condition="Type == 3" Name="ReadWrite">(bool)true</Item>
                    <Item Condition="Type == 3 &amp;&amp; Flags &amp; 0x1" Name="ReadOnly">(bool)(Flags &amp; 0x1)</Item>
                    <Item Condition="Type == 3 &amp;&amp; Flags &amp; 0x2" Name="WriteOnly">(bool)(Flags &amp; 0x2)</Item>
                    <Item Condition="Type == 3 &amp;&amp; Flags &amp; 0x4" Name="Prefetchable">(bool)(Flags &amp; 0x4)</Item>
                    <Item Condition="Type == 3 &amp;&amp; Flags &amp; 0x8" Name="CombinedWriteCachingAllowed">(bool)(Flags &amp; 0x8)</Item>
                    <Item Condition="Type == 3 &amp;&amp; Flags &amp; 0x10" Name="Addresses24Bits">(bool)(Flags &amp; 0x10)</Item>
                    <Item Condition="Type == 3 &amp;&amp; Flags &amp; 0x20" Name="Cacheable">(bool)(Flags &amp; 0x20)</Item>

                    <Item Condition="Type == 4" Name="DmaChannel8Bit">(bool)true</Item>
                    <Item Condition="Type == 4 &amp;&amp; Flags &amp; 0x1" Name="DmaChannel16Bit">(bool)(Flags &amp; 0x1)</Item>
                    <Item Condition="Type == 4 &amp;&amp; Flags &amp; 0x2" Name="DmaChannel32Bit">(bool)(Flags &amp; 0x2)</Item>
                    <Item Condition="Type == 4 &amp;&amp; Flags &amp; 0x4" Name="DmaChannel8And16Bit">(bool)(Flags &amp; 0x4)</Item>
                    <Item Condition="Type == 4 &amp;&amp; Flags &amp; 0x8" Name="SupportsBusMasterDmaTransfers">(bool)(Flags &amp; 0x8)</Item>
                    <Item Condition="Type == 4 &amp;&amp; Flags &amp; 0x10" Name="TypeADma">(bool)(Flags &amp; 0x10)</Item>
                    <Item Condition="Type == 4 &amp;&amp; Flags &amp; 0x20" Name="TypeBDma">(bool)(Flags &amp; 0x20)</Item>
                    <Item Condition="Type == 4 &amp;&amp; Flags &amp; 0x40" Name="TypeFDma">(bool)(Flags &amp; 0x40)</Item>
                    <Item Condition="Type == 4 &amp;&amp; Flags &amp; 0x80" Name="UsesDmaV3Member">(bool)(Flags &amp; 0x80)</Item>
                </Expand>
            </Synthetic>
        </Expand>
    </Type>

    <Type Name="_PCI_DEVICE_INTERRUPT_REQUIREMENT">
        <Version Name="pci.sys" />
        <Expand>
            <Synthetic Condition="LineBased.Type != 0" Name="LineBased">
                <DisplayString>Line Based: Min Vector = {LineBased.u.Interrupt.MinimumVector,x}, Max Vector = {LineBased.u.Interrupt.MaximumVector,x}</DisplayString>
            </Synthetic>
            <Synthetic Condition="Message.Type != 0" Name="MessageBased">
                <DisplayString Condition="Message.Type == 2">Msi Interrupt: {Message.MessagesRequested} messages requested</DisplayString>
                <DisplayString Condition="Message.Type == 3">Msi-X Interrupt: {Message.MessagesRequested} messages requested</DisplayString>
                <DisplayString Condition="Message.Type == 4">HyperTransport MSI Interrupt: {Message.MessagesRequested}messages requested</DisplayString>
                <DisplayString>Unknown Interrupt</DisplayString>
            </Synthetic>
        </Expand>
    </Type>

    <Type Name="_PCI_DEVICE_INTERRUPT_RESOURCE">
        <Version Name="pci.sys" />
        <DisplayString Condition="Type == 0">None</DisplayString>
        <DisplayString Condition="Type == 1">Line Based -- Interrupt Line = {InterruptLine,x}</DisplayString>
        <DisplayString Condition="Type == 2">Msi Interrupt -- {(1 &lt;&lt; Msi.GrantedBits),x} messages granted</DisplayString>
        <DisplayString Condition="Type == 3">Msi-X Interrupt -- {MsiX.MessagesGranted,x} messages granted</DisplayString>
        <DisplayString Condition="Type == 4">Hyper Transport MSI Interrupt -- {HT.MessagesGranted,x} messages granted</DisplayString>
        <DisplayString>Unknown Interrupt</DisplayString>
    </Type>

    <Type Name="_PCI_DEVICE">
        <Version Name="pci.sys" />
        <DisplayString Condition="BaseClass == 0x00 &amp;&amp; SubClass == 0x00"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Pre PCI 2.0 / Pre PCI 2.0 Non-VGA Device</DisplayString>
        <DisplayString Condition="BaseClass == 0x00 &amp;&amp; SubClass == 0x01"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Pre PCI 2.0 / Pre PCI 2.0 VGA Device</DisplayString>
        <DisplayString Condition="BaseClass == 0x00"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Pre PCI 2.0 / Unknown Sub Class</DisplayString>
        <DisplayString Condition="BaseClass == 0x01 &amp;&amp; SubClass == 0x00"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Mass Storage Controller / SCSI</DisplayString>
        <DisplayString Condition="BaseClass == 0x01 &amp;&amp; SubClass == 0x01"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Mass Storage Controller / IDE</DisplayString>
        <DisplayString Condition="BaseClass == 0x01 &amp;&amp; SubClass == 0x02"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Mass Storage Controller / Floppy</DisplayString>
        <DisplayString Condition="BaseClass == 0x01 &amp;&amp; SubClass == 0x03"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Mass Storage Controller / IPI</DisplayString>
        <DisplayString Condition="BaseClass == 0x01 &amp;&amp; SubClass == 0x04"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Mass Storage Controller / RAID</DisplayString>
        <DisplayString Condition="BaseClass == 0x01 &amp;&amp; SubClass == 0x80"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Mass Storage Controller / 'Other'</DisplayString>
        <DisplayString Condition="BaseClass == 0x01"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Mass Storage Controller / Unknown Sub Class</DisplayString>
        <DisplayString Condition="BaseClass == 0x02 &amp;&amp; SubClass == 0x00"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Network Controller / Ethernet</DisplayString>
        <DisplayString Condition="BaseClass == 0x02 &amp;&amp; SubClass == 0x01"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Network Controller / Token Ring</DisplayString>
        <DisplayString Condition="BaseClass == 0x02 &amp;&amp; SubClass == 0x02"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Network Controller / FDDI</DisplayString>
        <DisplayString Condition="BaseClass == 0x02 &amp;&amp; SubClass == 0x03"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Network Controller / ATM</DisplayString>
        <DisplayString Condition="BaseClass == 0x02 &amp;&amp; SubClass == 0x80"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Network Controller / 'Other'</DisplayString>
        <DisplayString Condition="BaseClass == 0x02"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Network Controller / Unknown Sub Class</DisplayString>
        <DisplayString Condition="BaseClass == 0x03 &amp;&amp; SubClass == 0x00"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Display Controller / VGA</DisplayString>
        <DisplayString Condition="BaseClass == 0x03 &amp;&amp; SubClass == 0x01"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Display Controller / XGA</DisplayString>
        <DisplayString Condition="BaseClass == 0x03 &amp;&amp; SubClass == 0x80"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Display Controller / 'Other'</DisplayString>
        <DisplayString Condition="BaseClass == 0x03"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Display Controller / Unknown Sub Class</DisplayString>
        <DisplayString Condition="BaseClass == 0x04 &amp;&amp; SubClass == 0x00"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Multimedia Device / Video</DisplayString>
        <DisplayString Condition="BaseClass == 0x04 &amp;&amp; SubClass == 0x01"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Multimedia Device / Audio</DisplayString>
        <DisplayString Condition="BaseClass == 0x04 &amp;&amp; SubClass == 0x80"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Multimedia Device / 'Other'</DisplayString>
        <DisplayString Condition="BaseClass == 0x04"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Multimedia Device / Unknown Sub Class</DisplayString>
        <DisplayString Condition="BaseClass == 0x05 &amp;&amp; SubClass == 0x00"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Memory Controller / RAM</DisplayString>
        <DisplayString Condition="BaseClass == 0x05 &amp;&amp; SubClass == 0x01"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Memory Controller / FLASH</DisplayString>
        <DisplayString Condition="BaseClass == 0x05 &amp;&amp; SubClass == 0x80"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Memory Controller / 'Other'</DisplayString>
        <DisplayString Condition="BaseClass == 0x05"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Memory Controller / Unknown Sub Class</DisplayString>
        <DisplayString Condition="BaseClass == 0x06 &amp;&amp; SubClass == 0x00"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Bridge / HOST to PCI</DisplayString>
        <DisplayString Condition="BaseClass == 0x06 &amp;&amp; SubClass == 0x01"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Bridge / PCI to ISA</DisplayString>
        <DisplayString Condition="BaseClass == 0x06 &amp;&amp; SubClass == 0x02"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Bridge / PCI to EISA</DisplayString>
        <DisplayString Condition="BaseClass == 0x06 &amp;&amp; SubClass == 0x03"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Bridge / PCI to MCA</DisplayString>
        <DisplayString Condition="BaseClass == 0x06 &amp;&amp; SubClass == 0x04"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Bridge / PCI to PCI</DisplayString>
        <DisplayString Condition="BaseClass == 0x06 &amp;&amp; SubClass == 0x05"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Bridge / PCI to PCMCIA</DisplayString>
        <DisplayString Condition="BaseClass == 0x06 &amp;&amp; SubClass == 0x06"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Bridge / PCI to NUBUS</DisplayString>
        <DisplayString Condition="BaseClass == 0x06 &amp;&amp; SubClass == 0x07"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Bridge / PCI to CardBus</DisplayString>
        <DisplayString Condition="BaseClass == 0x06 &amp;&amp; SubClass == 0x80"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Bridge / PCI to 'Other'</DisplayString>
        <DisplayString Condition="BaseClass == 0x06"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Bridge / Unknown Sub Class</DisplayString>
        <DisplayString Condition="BaseClass == 0x07 &amp;&amp; SubClass == 0x00"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Simple Serial Communications Controller / Serial Port</DisplayString>
        <DisplayString Condition="BaseClass == 0x07 &amp;&amp; SubClass == 0x01"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Simple Serial Communications Controller / Parallel Port</DisplayString>
        <DisplayString Condition="BaseClass == 0x07 &amp;&amp; SubClass == 0x80"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Simple Serial Communications Controller / 'Other'</DisplayString>
        <DisplayString Condition="BaseClass == 0x07"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Simple Serial Communications Controller / Unknown Sub Class</DisplayString>
        <DisplayString Condition="BaseClass == 0x08 &amp;&amp; SubClass == 0x00"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Base System Device / Interrupt Controller</DisplayString>
        <DisplayString Condition="BaseClass == 0x08 &amp;&amp; SubClass == 0x01"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Base System Device / DMA Controller</DisplayString>
        <DisplayString Condition="BaseClass == 0x08 &amp;&amp; SubClass == 0x02"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Base System Device / System Timer</DisplayString>
        <DisplayString Condition="BaseClass == 0x08 &amp;&amp; SubClass == 0x03"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Base System Device / Real Time Clock</DisplayString>
        <DisplayString Condition="BaseClass == 0x08 &amp;&amp; SubClass == 0x80"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Base System Device / 'Other' base system device</DisplayString>
        <DisplayString Condition="BaseClass == 0x08"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Base System Device / Unknown Sub Class</DisplayString>
        <DisplayString Condition="BaseClass == 0x09 &amp;&amp; SubClass == 0x00"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Input Device / Keyboard</DisplayString>
        <DisplayString Condition="BaseClass == 0x09 &amp;&amp; SubClass == 0x01"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Input Device / Digitizer</DisplayString>
        <DisplayString Condition="BaseClass == 0x09 &amp;&amp; SubClass == 0x02"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Input Device / Mouse</DisplayString>
        <DisplayString Condition="BaseClass == 0x09 &amp;&amp; SubClass == 0x80"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Input Device / 'Other'</DisplayString>
        <DisplayString Condition="BaseClass == 0x09"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Input Device / Unknown Sub Class</DisplayString>
        <DisplayString Condition="BaseClass == 0x0a &amp;&amp; SubClass == 0x00"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Docking Station / Generic</DisplayString>
        <DisplayString Condition="BaseClass == 0x0a &amp;&amp; SubClass == 0x80"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Docking Station / 'Other'</DisplayString>
        <DisplayString Condition="BaseClass == 0x0a"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Docking Station / Unknown Sub Class</DisplayString>
        <DisplayString Condition="BaseClass == 0x0b &amp;&amp; SubClass == 0x00"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Processor / 386</DisplayString>
        <DisplayString Condition="BaseClass == 0x0b &amp;&amp; SubClass == 0x01"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Processor / 486</DisplayString>
        <DisplayString Condition="BaseClass == 0x0b &amp;&amp; SubClass == 0x02"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Processor / Pentium</DisplayString>
        <DisplayString Condition="BaseClass == 0x0b &amp;&amp; SubClass == 0x10"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Processor / Alpha</DisplayString>
        <DisplayString Condition="BaseClass == 0x0b &amp;&amp; SubClass == 0x20"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Processor / PowerPC</DisplayString>
        <DisplayString Condition="BaseClass == 0x0b &amp;&amp; SubClass == 0x40"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Processor / CoProcessor</DisplayString>
        <DisplayString Condition="BaseClass == 0x0b"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Processor / Unknown Sub Class</DisplayString>
        <DisplayString Condition="BaseClass == 0x0c &amp;&amp; SubClass == 0x00"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Serial Bus Controller / 1394</DisplayString>
        <DisplayString Condition="BaseClass == 0x0c &amp;&amp; SubClass == 0x01"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Serial Bus Controller / Access Bus</DisplayString>
        <DisplayString Condition="BaseClass == 0x0c &amp;&amp; SubClass == 0x02"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Serial Bus Controller / SSA</DisplayString>
        <DisplayString Condition="BaseClass == 0x0c &amp;&amp; SubClass == 0x03"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Serial Bus Controller / USB</DisplayString>
        <DisplayString Condition="BaseClass == 0x0c &amp;&amp; SubClass == 0x04"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Serial Bus Controller / Fibre Channel</DisplayString>
        <DisplayString Condition="BaseClass == 0x0c"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Serial Bus Controller / Unknown Sub Class</DisplayString>
        <DisplayString Condition="BaseClass == 0xff"> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} (Explicitly) Undefined / Unknown Sub Class</DisplayString>
        <DisplayString> (d={Slot.u.bits.DeviceNumber,x} f={Slot.u.bits.FunctionNumber,x}) Vendor={VendorID,x} Device={DeviceID,x} Unknown Base Class / Unknown Sub Class</DisplayString>

        <Expand>
            <Item Name="Device">DeviceObject</Item>
            <Synthetic Name="Requirements">
                <Expand>
                    <Synthetic Name="BaseAddressRegisters" Condition="Requirements.Bars[0].Type != 0">
                        <Expand>
                            <IndexListItems>
                                <Size>6</Size>
                                <ValueNode Condition="Requirements.Bars[$i].Type != 0">Requirements.Bars[$i]</ValueNode>
                            </IndexListItems>
                        </Expand>
                    </Synthetic>

                    <Item Name="Interrupt" Condition="InterruptRequirement.LineBased.Type != 0 || InterruptRequirement.Message.Type != 0">InterruptRequirement</Item>

                    <!-- Type 0 -->

                    <Item Name="RomBar" Condition="HeaderType == 0 &amp;&amp; Requirements.type0.RomBar.Type != 0">Requirements.type0.RomBar</Item>
                    <Synthetic Name="VfBars" Condition="HeaderType == 0 &amp;&amp; Requirements.type0.VfBars[0].Type != 0">
                        <Expand>
                            <IndexListItems>
                                <Size>6</Size>
                                <ValueNode Condition="Requirements.type0.VfBars[$i].Type != 0">Requirements.type0.VfBars[$i]</ValueNode>
                            </IndexListItems>
                        </Expand>
                    </Synthetic>

                    <!-- Type 1 -->

                    <Item Name="RomBar" Condition="HeaderType == 1 &amp;&amp; Requirements.type1.RomBar.Type != 0">Requirements.type1.RomBar</Item>
                    <Item Name="MemoryWindow" Condition="HeaderType == 1 &amp;&amp; Requirements.type1.MemoryWindow.Type != 0">Requirements.type1.MemoryWindow</Item>
                    <Item Name="PrefetchWindow" Condition="HeaderType == 1 &amp;&amp; Requirements.type1.PrefetchWindow.Type != 0">Requirements.type1.PrefetchWindow</Item>
                    <Item Name="IoWindow" Condition="HeaderType == 1 &amp;&amp; Requirements.type1.IoWindow.Type != 0">Requirements.type1.IoWindow</Item>

                    <!-- Type 2 -->

                    <Item Name="SocketBar" Condition="HeaderType == 2 &amp;&amp; Requirements.type2.SocketBar.Type != 0">Requirements.type2.SocketBar</Item>
                    <Item Name="LegacyBar" Condition="HeaderType == 2 &amp;&amp; Requirements.type2.LegacyBar.Type != 0">Requirements.type2.LegacyBar</Item>
                    <Synthetic Name="MemoryWindows" Condition="HeaderType == 2 &amp;&amp; Requirements.type2.MemoryWindows[0].Type != 0">
                        <Expand>
                            <IndexListItems>
                                <Size>2</Size>
                                <ValueNode Condition="Requirements.type2.MemoryWindows[$i].Type != 0">Requirements.type2.MemoryWindows[$i]</ValueNode>
                            </IndexListItems>
                        </Expand>
                    </Synthetic>
                    <Synthetic Name="IoWindows" Condition="HeaderType == 2 &amp;&amp; Requirements.type2.IoWindows[0].Type != 0">
                        <Expand>
                            <IndexListItems>
                                <Size>2</Size>
                                <ValueNode Condition="Requirements.type2.IoWindows[$i].Type != 0">Requirements.type2.IoWindows[$i]</ValueNode>
                            </IndexListItems>
                        </Expand>
                    </Synthetic>
                </Expand>
            </Synthetic>
            <Synthetic Name="Resources">
                <Expand>
                    <Synthetic Name="BaseAddressRegisters" Condition="Resources.Bars[0].Type != 0">
                        <Expand>
                            <IndexListItems>
                                <Size>6</Size>
                                <ValueNode Condition="Resources.Bars[$i].Type != 0">Resources.Bars[$i]</ValueNode>
                            </IndexListItems>
                        </Expand>
                    </Synthetic>

                    <Item Name="Interrupt" Condition="InterruptResource.Type != 0">InterruptResource</Item>

                    <!-- Type 0 -->

                    <Item Name="RomBar" Condition="HeaderType == 0 &amp;&amp; Resources.type0.RomBar.Type != 0">Resources.type0.RomBar</Item>
                    <Synthetic Name="VfBars" Condition="HeaderType == 0 &amp;&amp; Resources.type0.VfBars[0].Type != 0">
                        <Expand>
                            <IndexListItems>
                                <Size>6</Size>
                                <ValueNode Condition="Resources.type0.VfBars[$i].Type != 0">Resources.type0.VfBars[$i]</ValueNode>
                            </IndexListItems>
                        </Expand>
                    </Synthetic>

                    <!-- Type 1 -->

                    <Item Name="RomBar" Condition="HeaderType == 1 &amp;&amp; Resources.type1.RomBar.Type != 0">Resources.type1.RomBar</Item>
                    <Item Name="MemoryWindow" Condition="HeaderType == 1 &amp;&amp; Resources.type1.MemoryWindow.Type != 0">Resources.type1.MemoryWindow</Item>
                    <Item Name="PrefetchWindow" Condition="HeaderType == 1 &amp;&amp; Resources.type1.PrefetchWindow.Type != 0">Resources.type1.PrefetchWindow</Item>
                    <Item Name="IoWindow" Condition="HeaderType == 1 &amp;&amp; Resources.type1.IoWindow.Type != 0">Resources.type1.IoWindow</Item>

                    <!-- Type 2 -->

                    <Item Name="SocketBar" Condition="HeaderType == 2 &amp;&amp; Resources.type2.SocketBar.Type != 0">Resources.type2.SocketBar</Item>
                    <Item Name="LegacyBar" Condition="HeaderType == 2 &amp;&amp; Resources.type2.LegacyBar.Type != 0">Resources.type2.LegacyBar</Item>
                    <Synthetic Name="MemoryWindows" Condition="HeaderType == 2 &amp;&amp; Resources.type2.MemoryWindows[0].Type != 0">
                        <Expand>
                            <IndexListItems>
                                <Size>2</Size>
                                <ValueNode Condition="Resources.type2.MemoryWindows[$i].Type != 0">Resources.type2.MemoryWindows[$i]</ValueNode>
                            </IndexListItems>
                        </Expand>
                    </Synthetic>
                    <Synthetic Name="IoWindows" Condition="HeaderType == 2 &amp;&amp; Resources.type2.IoWindows[0].Type != 0">
                        <Expand>
                            <IndexListItems>
                                <Size>2</Size>
                                <ValueNode Condition="Resources.type2.IoWindows[$i].Type != 0">Resources.type2.IoWindows[$i]</ValueNode>
                            </IndexListItems>
                        </Expand>
                    </Synthetic>
                </Expand>
            </Synthetic>
        </Expand>
    </Type>

</AutoVisualizer>
