/* Licensed under the terms of the New BSD License. * * Authors: * Gero Landmann (gero_dev) */ using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cosmos.Hardware.SMBIOS { public class SMBIOS { public uint SMBBIOSAddress; public bool HasSMBIOS; public uint Signature; public SMBIOS_Data SMBIOS_Data; public List TableList; //private Dictionary> TypeBasedList; //private Dictionary HandleBasedList; public List HardwareList; public bool CheckSMBIOS() { HasSMBIOS = false; //0x000F0000 Start //0x000F69E0 VMWare //0x000FFF30 VirtualBox //0x000FFFFF End SMBBIOSAddress = 0x000F0000; Cosmos.Kernel.MemoryAddressSpace Memory = new Cosmos.Kernel.MemoryAddressSpace( 0, 0 ); while( SMBBIOSAddress <= 0x000FFFFF ) { //if( Memory.Get32( SMBBIOSAddress ) == ( uint )0x5F534D5F || // "_SM_" // Memory.Get32( SMBBIOSAddress ) == ( uint )0x5F4D535F ) // "_MS_" indianess if( Memory.Read8Unchecked( SMBBIOSAddress ) == ( byte )0x5F ) // if( Memory.Read8Unchecked( SMBBIOSAddress + 1 ) == ( byte )0x53 ) if( Memory.Read8Unchecked( SMBBIOSAddress + 2 ) == ( byte )0x4D ) if( Memory.Read8Unchecked( SMBBIOSAddress + 3 ) == ( byte )0x5F ) { Signature = Memory.Read32Unchecked( SMBBIOSAddress ); HasSMBIOS = true; break; } SMBBIOSAddress++; } return HasSMBIOS; } public int ReadTables() { if( TableList == null ) TableList = new List(); else if( TableList.Count > 0 ) return TableList.Count; if( SMBIOS_Data.NumberOfSMBIOSStructures == 0 ) return 0; BaseTable bsd; uint NextAddress = SMBIOS_Data.StructureTableAddress; for( int i = 0; i < SMBIOS_Data.NumberOfSMBIOSStructures; i++ ) { bsd = new BaseTable( NextAddress, SMBIOS_Data.SMBIOSMinorVersion ); if( bsd.ReadData() == false || bsd.TableType == 127) { //Something went wrong or we finished break; } NextAddress = bsd.EndAddress; TableList.Add( bsd ); } return SMBIOS_Data.NumberOfSMBIOSStructures; } //public T GetInterface() where T : IHardwareType //{ // Console.WriteLine( " [GetInterface] Start" ); // BaseInfo ht; // for( int i = 0; i < HardwareList.Count; i++ ) // { // ht = HardwareList[ i ]; // if( ht is T ) // return (T)((object)ht); // } // Console.WriteLine( " [GetInterface] End" ); // throw new Exception( "Interface not found" ); //} //public List GetHardwareDescriptorByType( byte Type ) //{ // return TypeBasedList[ Type ]; //} //public IHardwareType GetHardwareDescriptorByHandle( ushort Handle ) //{ // return HandleBasedList[ Handle ]; //} public List GetHardwareDescriptorByType( TableTypes Type ) { //Console.WriteLine( " [GetHardwareDescriptorByType] Start" ); List tmp = new List(); BaseInfo ht; for( int i = 0; i < HardwareList.Count; i++ ) { ht = HardwareList[ i ]; if( ht.HardwareType == (byte)Type ) tmp.Add( ht ); } //Console.WriteLine( " [GetHardwareDescriptorByType] End" ); return tmp; } public IHardwareType GetHardwareDescriptorByHandle( ushort Handle ) { //Console.WriteLine( " [GetHardwareDescriptorByHandle] Start" ); BaseInfo ht; for( int i = 0; i < HardwareList.Count; i++ ) { ht = HardwareList[ i ]; if( ht.Handle == Handle ) return ht; } //Console.WriteLine( " [GetHardwareDescriptorByHandle] End" ); return null; } public void InterpretData() { //if( TypeBasedList == null ) // TypeBasedList = new Dictionary>(); //if( HandleBasedList == null ) // HandleBasedList = new Dictionary(); if( HardwareList == null ) HardwareList = new List(); BaseTable bt; BaseInfo ht; for( int i = 0; i < TableList.Count; i++ ) { bt = TableList[ i ]; ht = TableFactory.CreateTable( bt ); if( ht == null ) continue; HardwareList.Add( ht ); //if( TypeBasedList.ContainsKey( ht.HardwareType ) == false ) // TypeBasedList.Add( ht.HardwareType, new List() ); //TypeBasedList[ ht.HardwareType ].Add( ht ); //HandleBasedList.Add( bt.Handle, ht ); } } public bool GetSMBIOS_Data() { if( HasSMBIOS == false && CheckSMBIOS() == false ) return false; Cosmos.Kernel.MemoryAddressSpace Memory = new Cosmos.Kernel.MemoryAddressSpace( SMBBIOSAddress, 32 ); SMBIOS_Data = new SMBIOS_Data(); //4 Byte array SMBIOS_Data.AnchorString[ 0 ] = Memory.Read8Unchecked( 0 ); SMBIOS_Data.AnchorString[ 1 ] = Memory.Read8Unchecked( 1 ); SMBIOS_Data.AnchorString[ 2 ] = Memory.Read8Unchecked( 2 ); SMBIOS_Data.AnchorString[ 3 ] = Memory.Read8Unchecked( 3 ); SMBIOS_Data.EntryPointStructureChecksum = Memory.Read8Unchecked( 4 ); SMBIOS_Data.EntryPointLength = Memory.Read8Unchecked( 5 ); SMBIOS_Data.SMBIOSMajorVersion = Memory.Read8Unchecked( 6 ); SMBIOS_Data.SMBIOSMinorVersion = Memory.Read8Unchecked( 7 ); SMBIOS_Data.MaximumStructureSize = Memory.Read16Unchecked( 8 ); SMBIOS_Data.EntryPointRevision = Memory.Read8Unchecked( 10 ); //5 Byte array SMBIOS_Data.FormattedArea[ 0 ] = Memory.Read8Unchecked( 11 ); SMBIOS_Data.FormattedArea[ 1 ] = Memory.Read8Unchecked( 12 ); SMBIOS_Data.FormattedArea[ 2 ] = Memory.Read8Unchecked( 13 ); SMBIOS_Data.FormattedArea[ 3 ] = Memory.Read8Unchecked( 14 ); SMBIOS_Data.FormattedArea[ 4 ] = Memory.Read8Unchecked( 15 ); //5 Byte array SMBIOS_Data.IntermediateAnchorString[ 0 ] = Memory.Read8Unchecked( 16 ); SMBIOS_Data.IntermediateAnchorString[ 1 ] = Memory.Read8Unchecked( 17 ); SMBIOS_Data.IntermediateAnchorString[ 2 ] = Memory.Read8Unchecked( 18 ); SMBIOS_Data.IntermediateAnchorString[ 3 ] = Memory.Read8Unchecked( 19 ); SMBIOS_Data.IntermediateAnchorString[ 4 ] = Memory.Read8Unchecked( 20 ); SMBIOS_Data.IntermediateChecksum = Memory.Read8Unchecked( 21 ); SMBIOS_Data.StructureTableLength = Memory.Read16Unchecked( 22 ); SMBIOS_Data.StructureTableAddress = Memory.Read32Unchecked( 24 ); SMBIOS_Data.NumberOfSMBIOSStructures = Memory.Read16Unchecked( 28 ); SMBIOS_Data.SMBIOSBCDRevision = Memory.Read8Unchecked( 30 ); return true; } } }