public struct PCI_COMMON_CONFIG
{
public ushort VendorID;
public ushort DeviceID;
public ushort Command;
public ushort Status;
public byte RevisionID;
public byte ProgIf;
public byte SubClass;
public byte BaseClass;
public byte CacheLineSize;
public byte LatencyTimer;
public byte HeaderType;
public byte BIST;
public u u;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 192)]
public byte DeviceSpecific;
}
[StructLayout(LayoutKind.Explicit)]
public struct u
{
[FieldOffset(0)]
public PCI_HEADER_TYPE_0 type0;
[FieldOffset(0)]
public PCI_HEADER_TYPE_1 type1;
[FieldOffset(0)]
public PCI_HEADER_TYPE_2 type2;
}
const int PCI_TYPE0_ADDRESSES = 6;
public struct PCI_HEADER_TYPE_0
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = PCI_TYPE0_ADDRESSES)]
public uint[] BaseAddresses;
public uint CIS; // scum
public ushort SubVendorID;
public ushort SubSystemID;
public uint RomBaseAddress;
public byte CapabilitiesPtr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] Reserved1;
public uint Reserved2;
public byte InterruptLine;
public byte InterruptPin;
public byte MinimumGrant;
public byte MaximumLatency;
}
const int PCI_TYPE1_ADDRESSES = 2;
// PCI to PCI Bridge
public struct PCI_HEADER_TYPE_1
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = PCI_TYPE1_ADDRESSES)]
public uint[] BaseAddresses;
public byte PrimaryBus;
public byte SecondaryBus;
public byte SubordinateBus;
public byte SecondaryLatency;
public byte IOBase;
public byte IOLimit;
public ushort SecondaryStatus;
public ushort MemoryBase;
public ushort MemoryLimit;
public ushort PrefetchBase;
public ushort PrefetchLimit;
public uint PrefetchBaseUpper32;
public uint PrefetchLimitUpper32;
public ushort IOBaseUpper16;
public ushort IOLimitUpper16;
public byte CapabilitiesPtr;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] Reserved1;
public uint ROMBaseAddress;
public byte InterruptLine;
public byte InterruptPin;
public ushort BridgeControl;
}
const int PCI_TYPE2_ADDRESSES = 5;
// PCI to CARDBUS Bridge
public struct PCI_HEADER_TYPE_2
{
public uint SocketRegistersBaseAddress;
public byte CapabilitiesPtr;
public byte Reserved;
public ushort SecondaryStatus;
public byte PrimaryBus;
public byte SecondaryBus;
public byte SubordinateBus;
public byte SecondaryLatency;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = PCI_TYPE2_ADDRESSES - 1)]
RANGE[] Range;
public byte InterruptLine;
public byte InterruptPin;
public ushort BridgeControl;
}
public struct RANGE
{
public uint Base;
public uint Limit;
}
Structure PCI_COMMON_CONFIG
Public TODO
End Structure
None.
Untested code, just a straight conversion from the header in the DDK