实例介绍
【实例简介】Ti Radeon BIOS Editor 是一款可以为您修改显卡BIOS项目,包括:内存类型、更新频率、核心芯片研发代号、核心芯片运作频率、内存运作频率、显示卡制作厂商代号、电视讯号规格等。
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Runtime.InteropServices; using System.Windows; using System.Linq; using System.ComponentModel; using System.Net; namespace PolarisBiosEditor { public partial class PolarisBiosEditor : Form { /* DATA */ string version = "1.6.7"; string programTitle = "PolarisBiosEditor"; string[] manufacturers = new string[] { "SAMSUNG", "ELPIDA", "HYNIX", "MICRON" }; string[] supportedDeviceID = new string[] { "67DF", "67EF", "1002", "67FF", "699F" }; string[] timings = new string[] { // FIXME Try UberMix 3.2 Timings: // 777000000000000022CC1C00CEE55C46C0590E1532CD66090060070014051420FA8900A00300000012123442C3353C19 // UberMix 3.1 "777000000000000022CC1C00AD615C41C0590E152ECC8608006007000B031420FA8900A00300000010122F3FBA354019", //"777000000000000022CC1C00AD615C41C0590E152ECCA60B006007000B031420FA8900A00300000010122F3FBA354019", // new, please test // UberMix 2.3 (less extreme) "777000000000000022CC1C00AD615B41C0570E152DCB7409006007000B031420FA8900A00300000010123A46DB354019", // 1750/2000MHz Mix Timings "777000000000000022CC1C00106A6D4DD0571016B90D060C006AE70014051420FA8900A0030000001E123A46DB354019", // 1625/2000MHz Mix Timings "777000000000000022CC1C00CE616C47D0570F15B48C250B006AE7000B031420FA8900A0030000001E123A46DB354019", // Good HYNIX_2 "777000000000000022AA1C00B56A6D46C0551017BE8E060C006AE6000C081420EA8900AB030000001B162C31C0313F17", // Good Micron //"777000000000000022AA1C0073626C41B0551016BA0D260B006AE60004061420EA8940AA030000001914292EB22E3B16", old "777000000000000022AA1C0073626C41B0551016BA0D260B0060060004061420EA8940AA030000001914292EB22E3B16", // new tested timings (much better xmr performance @ rx560 sapphire pulse) // Good Hynix_1 "999000000000000022559D0010DE5B4480551312B74C450A00400600750414206A8900A00200312010112D34A42A3816", // Good Elpida (fixed with version 1.6.4, see issue #19) "777000000000000022AA1C00315A5B36A0550F15B68C1506004082007C041420CA8980A9020004C01712262B612B3715" //"777000000000000022AA1C00AC615B3CA0550F142C8C1506006004007C041420CA8980A9020004C01712262B612B3715" // new, please test }; Dictionary<string, string> rc = new Dictionary<string, string>(); [StructLayout(LayoutKind.Explicit, Size = 96, CharSet = CharSet.Ansi)] public class VRAM_TIMING_RX { } Byte[] buffer; Int32Converter int32 = new Int32Converter(); UInt32Converter uint32 = new UInt32Converter(); string deviceID = ""; Boolean hasInternetAccess = false; int atom_rom_checksum_offset = 0x21; int atom_rom_header_ptr = 0x48; int atom_rom_header_offset; ATOM_ROM_HEADER atom_rom_header; ATOM_DATA_TABLES atom_data_table; int atom_powerplay_offset; ATOM_POWERPLAY_TABLE atom_powerplay_table; int atom_powertune_offset; ATOM_POWERTUNE_TABLE atom_powertune_table; int atom_fan_offset; ATOM_FAN_TABLE atom_fan_table; int atom_mclk_table_offset; ATOM_MCLK_TABLE atom_mclk_table; ATOM_MCLK_ENTRY[] atom_mclk_entries; int atom_sclk_table_offset; ATOM_SCLK_TABLE atom_sclk_table; ATOM_SCLK_ENTRY[] atom_sclk_entries; int atom_vddc_table_offset; ATOM_VOLTAGE_TABLE atom_vddc_table; ATOM_VOLTAGE_ENTRY[] atom_vddc_entries; int atom_vram_info_offset; ATOM_VRAM_INFO atom_vram_info; ATOM_VRAM_ENTRY[] atom_vram_entries; ATOM_VRAM_TIMING_ENTRY[] atom_vram_timing_entries; int atom_vram_index = 0; const int MAX_VRAM_ENTRIES = 48; // e.g. MSI-Armor-RX-580-4GB has 36 entries int atom_vram_timing_offset; [StructLayout(LayoutKind.Sequential, Pack = 1)] struct ATOM_COMMON_TABLE_HEADER { Int16 usStructureSize; Byte ucTableFormatRevision; Byte ucTableContentRevision; } [StructLayout(LayoutKind.Sequential, Pack = 1)] struct ATOM_ROM_HEADER { public ATOM_COMMON_TABLE_HEADER sHeader; //public UInt32 uaFirmWareSignature; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x4)] public Char[] uaFirmWareSignature; public UInt16 usBiosRuntimeSegmentAddress; public UInt16 usProtectedModeInfoOffset; public UInt16 usConfigFilenameOffset; public UInt16 usCRC_BlockOffset; public UInt16 usBIOS_BootupMessageOffset; public UInt16 usInt10Offset; public UInt16 usPciBusDevInitCode; public UInt16 usIoBaseAddress; public UInt16 usSubsystemVendorID; public UInt16 usSubsystemID; public UInt16 usPCI_InfoOffset; public UInt16 usMasterCommandTableOffset; public UInt16 usMasterDataTableOffset; public Byte ucExtendedFunctionCode; public Byte ucReserved; public UInt32 ulPSPDirTableOffset; public UInt16 usVendorID; public UInt16 usDeviceID; } String BIOS_BootupMessage; [StructLayout(LayoutKind.Sequential, Pack = 1)] struct ATOM_DATA_TABLES { public ATOM_COMMON_TABLE_HEADER sHeader; public UInt16 UtilityPipeLine; public UInt16 MultimediaCapabilityInfo; public UInt16 MultimediaConfigInfo; public UInt16 StandardVESA_Timing; public UInt16 FirmwareInfo; public UInt16 PaletteData; public UInt16 LCD_Info; public UInt16 DIGTransmitterInfo; public UInt16 SMU_Info; public UInt16 SupportedDevicesInfo; public UInt16 GPIO_I2C_Info; public UInt16 VRAM_UsageByFirmware; public UInt16 GPIO_Pin_LUT; public UInt16 VESA_ToInternalModeLUT; public UInt16 GFX_Info; public UInt16 PowerPlayInfo; public UInt16 GPUVirtualizationInfo; public UInt16 SaveRestoreInfo; public UInt16 PPLL_SS_Info; public UInt16 OemInfo; public UInt16 XTMDS_Info; public UInt16 MclkSS_Info; public UInt16 Object_Header; public UInt16 IndirectIOAccess; public UInt16 MC_InitParameter; public UInt16 ASIC_VDDC_Info; public UInt16 ASIC_InternalSS_Info; public UInt16 TV_VideoMode; public UInt16 VRAM_Info; public UInt16 MemoryTrainingInfo; public UInt16 IntegratedSystemInfo; public UInt16 ASIC_ProfilingInfo; public UInt16 VoltageObjectInfo; public UInt16 PowerSourceInfo; public UInt16 ServiceInfo; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] unsafe struct ATOM_POWERPLAY_TABLE { public ATOM_COMMON_TABLE_HEADER sHeader; public Byte ucTableRevision; public UInt16 usTableSize; public UInt32 ulGoldenPPID; public UInt32 ulGoldenRevision; public UInt16 usFormatID; public UInt16 usVoltageTime; public UInt32 ulPlatformCaps; public UInt32 ulMaxODEngineClock; public UInt32 ulMaxODMemoryClock; public UInt16 usPowerControlLimit; public UInt16 usUlvVoltageOffset; public UInt16 usStateArrayOffset; public UInt16 usFanTableOffset; public UInt16 usThermalControllerOffset; public UInt16 usReserv; public UInt16 usMclkDependencyTableOffset; public UInt16 usSclkDependencyTableOffset; public UInt16 usVddcLookupTableOffset; public UInt16 usVddgfxLookupTableOffset; public UInt16 usMMDependencyTableOffset; public UInt16 usVCEStateTableOffset; public UInt16 usPPMTableOffset; public UInt16 usPowerTuneTableOffset; public UInt16 usHardLimitTableOffset; public UInt16 usPCIETableOffset; public UInt16 usGPIOTableOffset; public fixed UInt16 usReserved[6]; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] struct ATOM_MCLK_ENTRY { public Byte ucVddcInd; public UInt16 usVddci; public UInt16 usVddgfxOffset; public UInt16 usMvdd; public UInt32 ulMclk; public UInt16 usReserved; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] struct ATOM_MCLK_TABLE { public Byte ucRevId; public Byte ucNumEntries; // public ATOM_MCLK_ENTRY entries[ucNumEntries]; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] struct ATOM_SCLK_ENTRY { public Byte ucVddInd; public UInt16 usVddcOffset; public UInt32 ulSclk; public UInt16 usEdcCurrent; public Byte ucReliabilityTemperature; public Byte ucCKSVOffsetandDisable; public UInt32 ulSclkOffset; // Polaris Only, remove for compatibility with Fiji }; [StructLayout(LayoutKind.Sequential, Pack = 1)] struct ATOM_SCLK_TABLE { public Byte ucRevId; public Byte ucNumEntries; // public ATOM_SCLK_ENTRY entries[ucNumEntries]; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] struct ATOM_VOLTAGE_ENTRY { public UInt16 usVdd; public UInt16 usCACLow; public UInt16 usCACMid; public UInt16 usCACHigh; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] struct ATOM_VOLTAGE_TABLE { public Byte ucRevId; public Byte ucNumEntries; // public ATOM_VOLTAGE_ENTRY entries[ucNumEntries]; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] struct ATOM_FAN_TABLE { public Byte ucRevId; public Byte ucTHyst; public UInt16 usTMin; public UInt16 usTMed; public UInt16 usTHigh; public UInt16 usPWMMin; public UInt16 usPWMMed; public UInt16 usPWMHigh; public UInt16 usTMax; public Byte ucFanControlMode; public UInt16 usFanPWMMax; public UInt16 usFanOutputSensitivity; public UInt16 usFanRPMMax; public UInt32 ulMinFanSCLKAcousticLimit; public Byte ucTargetTemperature; public Byte ucMinimumPWMLimit; public UInt16 usFanGainEdge; public UInt16 usFanGainHotspot; public UInt16 usFanGainLiquid; public UInt16 usFanGainVrVddc; public UInt16 usFanGainVrMvdd; public UInt16 usFanGainPlx; public UInt16 usFanGainHbm; public UInt16 usReserved; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] struct ATOM_POWERTUNE_TABLE { public Byte ucRevId; public UInt16 usTDP; public UInt16 usConfigurableTDP; public UInt16 usTDC; public UInt16 usBatteryPowerLimit; public UInt16 usSmallPowerLimit; public UInt16 usLowCACLeakage; public UInt16 usHighCACLeakage; public UInt16 usMaximumPowerDeliveryLimit; public UInt16 usTjMax; public UInt16 usPowerTuneDataSetID; public UInt16 usEDCLimit; public UInt16 usSoftwareShutdownTemp; public UInt16 usClockStretchAmount; public UInt16 usTemperatureLimitHotspot; public UInt16 usTemperatureLimitLiquid1; public UInt16 usTemperatureLimitLiquid2; public UInt16 usTemperatureLimitVrVddc; public UInt16 usTemperatureLimitVrMvdd; public UInt16 usTemperatureLimitPlx; public Byte ucLiquid1_I2C_address; public Byte ucLiquid2_I2C_address; public Byte ucLiquid_I2C_Line; public Byte ucVr_I2C_address; public Byte ucVr_I2C_Line; public Byte ucPlx_I2C_address; public Byte ucPlx_I2C_Line; public UInt16 usReserved; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] struct ATOM_VRAM_TIMING_ENTRY { public UInt32 ulClkRange; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x30)] public Byte[] ucLatency; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] struct ATOM_VRAM_ENTRY { public UInt32 ulChannelMapCfg; public UInt16 usModuleSize; public UInt16 usMcRamCfg; public UInt16 usEnableChannels; public Byte ucExtMemoryID; public Byte ucMemoryType; public Byte ucChannelNum; public Byte ucChannelWidth; public Byte ucDensity; public Byte ucBankCol; public Byte ucMisc; public Byte ucVREFI; public UInt16 usReserved; public UInt16 usMemorySize; public Byte ucMcTunningSetId; public Byte ucRowNum; public UInt16 usEMRS2Value; public UInt16 usEMRS3Value; public Byte ucMemoryVenderID; public Byte ucRefreshRateFactor; public Byte ucFIFODepth; public Byte ucCDR_Bandwidth; public UInt32 ulChannelMapCfg1; public UInt32 ulBankMapCfg; public UInt32 ulReserved; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public Byte[] strMemPNString; }; [StructLayout(LayoutKind.Sequential, Pack = 1)] struct ATOM_VRAM_INFO { public ATOM_COMMON_TABLE_HEADER sHeader; public UInt16 usMemAdjustTblOffset; public UInt16 usMemClkPatchTblOffset; public UInt16 usMcAdjustPerTileTblOffset; public UInt16 usMcPhyInitTableOffset; public UInt16 usDramDataRemapTblOffset; public UInt16 usReserved1; public Byte ucNumOfVRAMModule; public Byte ucMemoryClkPatchTblVer; public Byte ucVramModuleVer; public Byte ucMcPhyTileNum; // public ATOM_VRAM_ENTRY aVramInfo[ucNumOfVRAMModule]; } [STAThread] static void Main(string[] args) { PolarisBiosEditor pbe = new PolarisBiosEditor(); Application.Run(pbe); } static byte[] getBytes(object obj) { int size = Marshal.SizeOf(obj); byte[] arr = new byte[size]; IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(obj, ptr, true); Marshal.Copy(ptr, arr, 0, size); Marshal.FreeHGlobal(ptr); return arr; } static T fromBytes<T>(byte[] arr) { T obj = default(T); int size = Marshal.SizeOf(obj); IntPtr ptr = Marshal.AllocHGlobal(size); Marshal.Copy(arr, 0, ptr, size); obj = (T)Marshal.PtrToStructure(ptr, obj.GetType()); Marshal.FreeHGlobal(ptr); return obj; } public void setBytesAtPosition(byte[] dest, int ptr, byte[] src) { for (var i = 0; i < src.Length; i ) { dest[ptr i] = src[i]; } } private ListViewItem handler; private void listView_ChangeSelection(object sender, EventArgs e) { ListView lb = sender as ListView; String sel_name = lb.SelectedItems[0].Text; for (var i = 0; i < lb.Items.Count; i ) { ListViewItem container = lb.Items[i]; var name = container.Text; var value = container.SubItems[1].Text; if (name == sel_name) { editSubItem1.Text = name; editSubItem2.Text = value; handler = container; } } } private void apply_Click(object sender, EventArgs e) { if (handler != null) { handler.Text = editSubItem1.Text; handler.SubItems[1].Text = editSubItem2.Text; } } public PolarisBiosEditor() { InitializeComponent(); this.Text = this.programTitle " " this.version; try { WebClient myWebClient = new WebClient(); Stream myStream = myWebClient.OpenRead("https://raw.githubusercontent.com/jaschaknack/PolarisBiosEditor/master/version"); StreamReader sr = new StreamReader(myStream); string newVersion = sr.ReadToEnd().Trim(); if (!newVersion.Equals(version)) { MessageBox.Show("There is a new version available! " version " -> " newVersion); } myStream.Close(); myStream = myWebClient.OpenRead("https://raw.githubusercontent.com/jaschaknack/PolarisBiosEditor/master/notice"); sr = new StreamReader(myStream); string notice = sr.ReadToEnd().Trim(); MessageBoxButtons buttons = MessageBoxButtons.YesNo; DialogResult result; result = MessageBox.Show(notice "\n\nClick Yes button to copy to clipboard", "A message from the developer", buttons); if (result == System.Windows.Forms.DialogResult.OK) { Clipboard.SetText(notice); } myStream.Close(); hasInternetAccess = true; } catch (System.Net.WebException) { this.Text = " (offline mode)"; } rc.Add("MT51J256M3", "MICRON"); rc.Add("EDW4032BAB", "ELPIDA"); rc.Add("H5GC4H24AJ", "HYNIX_1"); rc.Add("H5GQ8H24MJ", "HYNIX_2"); rc.Add("H5GC8H24MJ", "HYNIX_2"); rc.Add("K4G80325FB", "SAMSUNG"); rc.Add("K4G41325FE", "SAMSUNG"); rc.Add("K4G41325FC", "SAMSUNG"); rc.Add("K4G41325FS", "SAMSUNG"); save.Enabled = false; boxROM.Enabled = false; boxPOWERPLAY.Enabled = false; boxPOWERTUNE.Enabled = false; boxFAN.Enabled = false; boxGPU.Enabled = false; boxMEM.Enabled = false; boxVRAM.Enabled = false; tableVRAM.MouseClick = new MouseEventHandler(listView_ChangeSelection); tableVRAM_TIMING.MouseClick = new MouseEventHandler(listView_ChangeSelection); tableMEMORY.MouseClick = new MouseEventHandler(listView_ChangeSelection); tableGPU.MouseClick = new MouseEventHandler(listView_ChangeSelection); tableFAN.MouseClick = new MouseEventHandler(listView_ChangeSelection); tablePOWERTUNE.MouseClick = new MouseEventHandler(listView_ChangeSelection); tablePOWERPLAY.MouseClick = new MouseEventHandler(listView_ChangeSelection); tableROM.MouseClick = new MouseEventHandler(listView_ChangeSelection); //MessageBox.Show("Modifying your BIOS is dangerous and could cause irreversible damage to your GPU.\nUsing a modified BIOS may void your warranty.\nThe author will not be held accountable for your actions.", "DISCLAIMER", MessageBoxButtons.OK, MessageBoxImage.Warning); } private void PolarisBiosEditor_Load(object sender, EventArgs e) { } private void editSubItem2_Click(object sender, EventArgs e) { MouseEventArgs me = (MouseEventArgs)e; if (me.Button == MouseButtons.Right) { if (editSubItem2.Text.Length == 96) { byte[] decode = StringToByteArray(editSubItem2.Text); MessageBox.Show("Decode Memory Timings " decode " / not implemented yet!"); } } } private void OpenFileDialog_Click(object sender, EventArgs e) { Console.WriteLine("OpenFileDialog"); OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "BIOS (.rom)|*.rom|All Files (*.*)|*.*"; openFileDialog.FilterIndex = 1; openFileDialog.Multiselect = false; if (openFileDialog.ShowDialog() == DialogResult.OK) { save.Enabled = false; tableROM.Items.Clear(); tablePOWERPLAY.Items.Clear(); tablePOWERTUNE.Items.Clear(); tableFAN.Items.Clear(); tableGPU.Items.Clear(); tableMEMORY.Items.Clear(); tableVRAM.Items.Clear(); tableVRAM_TIMING.Items.Clear(); System.IO.Stream fileStream = openFileDialog.OpenFile(); if ((fileStream.Length != 524288) && (fileStream.Length != 524288 / 2)) { MessageBox.Show("This BIOS is non standard size.\nFlashing this BIOS may corrupt your graphics card.", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); } using (BinaryReader br = new BinaryReader(fileStream)) { buffer = br.ReadBytes((int)fileStream.Length); atom_rom_header_offset = getValueAtPosition(16, atom_rom_header_ptr); atom_rom_header = fromBytes<ATOM_ROM_HEADER>(buffer.Skip(atom_rom_header_offset).ToArray()); deviceID = atom_rom_header.usDeviceID.ToString("X"); fixChecksum(false); String firmwareSignature = new string(atom_rom_header.uaFirmWareSignature); if (!firmwareSignature.Equals("ATOM")) { MessageBox.Show("WARNING! BIOS Signature is not valid. Only continue if you are 100% sure what you are doing!"); } DialogResult msgSuported = DialogResult.Yes; if (!supportedDeviceID.Contains(deviceID)) { msgSuported = MessageBox.Show("Unsupported DeviceID 0x" deviceID " - Continue?", "WARNING", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); } if (msgSuported == DialogResult.Yes) { StringBuilder sb = new StringBuilder(); Int32 ptr = atom_rom_header.usBIOS_BootupMessageOffset 2; while (ptr != -1) { Char c = (Char)buffer[ptr]; if (c == '\0') { ptr = -1; } else if(c == '\n' || c == '\r') { ptr ; } else { sb.Append(c); ptr ; } } BIOS_BootupMessage = sb.ToString(); txtBIOSBootupMessage.Text = BIOS_BootupMessage; txtBIOSBootupMessage.MaxLength = BIOS_BootupMessage.Length; atom_data_table = fromBytes<ATOM_DATA_TABLES>(buffer.Skip(atom_rom_header.usMasterDataTableOffset).ToArray()); atom_powerplay_offset = atom_data_table.PowerPlayInfo; atom_powerplay_table = fromBytes<ATOM_POWERPLAY_TABLE>(buffer.Skip(atom_powerplay_offset).ToArray()); atom_powertune_offset = atom_data_table.PowerPlayInfo atom_powerplay_table.usPowerTuneTableOffset; atom_powertune_table = fromBytes<ATOM_POWERTUNE_TABLE>(buffer.Skip(atom_powertune_offset).ToArray()); atom_fan_offset = atom_data_table.PowerPlayInfo atom_powerplay_table.usFanTableOffset; atom_fan_table = fromBytes<ATOM_FAN_TABLE>(buffer.Skip(atom_fan_offset).ToArray()); atom_mclk_table_offset = atom_data_table.PowerPlayInfo atom_powerplay_table.usMclkDependencyTableOffset; atom_mclk_table = fromBytes<ATOM_MCLK_TABLE>(buffer.Skip(atom_mclk_table_offset).ToArray()); atom_mclk_entries = new ATOM_MCLK_ENTRY[atom_mclk_table.ucNumEntries]; for (var i = 0; i < atom_mclk_entries.Length; i ) { atom_mclk_entries[i] = fromBytes<ATOM_MCLK_ENTRY>(buffer.Skip(atom_mclk_table_offset Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i).ToArray()); } atom_sclk_table_offset = atom_data_table.PowerPlayInfo atom_powerplay_table.usSclkDependencyTableOffset; atom_sclk_table = fromBytes<ATOM_SCLK_TABLE>(buffer.Skip(atom_sclk_table_offset).ToArray()); atom_sclk_entries = new ATOM_SCLK_ENTRY[atom_sclk_table.ucNumEntries]; for (var i = 0; i < atom_sclk_entries.Length; i ) { atom_sclk_entries[i] = fromBytes<ATOM_SCLK_ENTRY>(buffer.Skip(atom_sclk_table_offset Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i).ToArray()); } atom_vddc_table_offset = atom_data_table.PowerPlayInfo atom_powerplay_table.usVddcLookupTableOffset; atom_vddc_table = fromBytes<ATOM_VOLTAGE_TABLE>(buffer.Skip(atom_vddc_table_offset).ToArray()); atom_vddc_entries = new ATOM_VOLTAGE_ENTRY[atom_vddc_table.ucNumEntries]; for (var i = 0; i < atom_vddc_table.ucNumEntries; i ) { atom_vddc_entries[i] = fromBytes<ATOM_VOLTAGE_ENTRY>(buffer.Skip(atom_vddc_table_offset Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i).ToArray()); } atom_vram_info_offset = atom_data_table.VRAM_Info; atom_vram_info = fromBytes<ATOM_VRAM_INFO>(buffer.Skip(atom_vram_info_offset).ToArray()); atom_vram_entries = new ATOM_VRAM_ENTRY[atom_vram_info.ucNumOfVRAMModule]; var atom_vram_entry_offset = atom_vram_info_offset Marshal.SizeOf(typeof(ATOM_VRAM_INFO)); for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i ) { atom_vram_entries[i] = fromBytes<ATOM_VRAM_ENTRY>(buffer.Skip(atom_vram_entry_offset).ToArray()); atom_vram_entry_offset = atom_vram_entries[i].usModuleSize; } atom_vram_timing_offset = atom_vram_info_offset atom_vram_info.usMemClkPatchTblOffset 0x2E; atom_vram_timing_entries = new ATOM_VRAM_TIMING_ENTRY[MAX_VRAM_ENTRIES]; for (var i = 0; i < MAX_VRAM_ENTRIES; i ) { atom_vram_timing_entries[i] = fromBytes<ATOM_VRAM_TIMING_ENTRY>(buffer.Skip(atom_vram_timing_offset Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i).ToArray()); // atom_vram_timing_entries have an undetermined length // attempt to determine the last entry in the array if (atom_vram_timing_entries[i].ulClkRange == 0) { Array.Resize(ref atom_vram_timing_entries, i); break; } } tableROM.Items.Add(new ListViewItem(new string[] { "BootupMessageOffset", "0x" atom_rom_header.usBIOS_BootupMessageOffset.ToString ("X") } )); tableROM.Items.Add(new ListViewItem(new string[] { "VendorID", "0x" atom_rom_header.usVendorID.ToString ("X") } )); tableROM.Items.Add(new ListViewItem(new string[] { "DeviceID", "0x" atom_rom_header.usDeviceID.ToString ("X") } )); tableROM.Items.Add(new ListViewItem(new string[] { "Sub ID", "0x" atom_rom_header.usSubsystemID.ToString ("X") } )); tableROM.Items.Add(new ListViewItem(new string[] { "Sub VendorID", "0x" atom_rom_header.usSubsystemVendorID.ToString ("X") } )); tableROM.Items.Add(new ListViewItem(new string[] { "Firmware Signature", //"0x" atom_rom_header.uaFirmWareSignature.ToString ("X") new string(atom_rom_header.uaFirmWareSignature) } )); tablePOWERPLAY.Items.Clear(); tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { "Max GPU Freq. (MHz)", Convert.ToString (atom_powerplay_table.ulMaxODEngineClock / 100) } )); tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { "Max Memory Freq. (MHz)", Convert.ToString (atom_powerplay_table.ulMaxODMemoryClock / 100) } )); tablePOWERPLAY.Items.Add(new ListViewItem(new string[] { "Power Control Limit (%)", Convert.ToString (atom_powerplay_table.usPowerControlLimit) } )); tablePOWERTUNE.Items.Clear(); tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "TDP (W)", Convert.ToString (atom_powertune_table.usTDP) } )); tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "TDC (A)", Convert.ToString (atom_powertune_table.usTDC) } )); tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "Max Power Limit (W)", Convert.ToString (atom_powertune_table.usMaximumPowerDeliveryLimit) } )); tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "Max Temp. (C)", Convert.ToString (atom_powertune_table.usTjMax) } )); tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "Shutdown Temp. (C)", Convert.ToString (atom_powertune_table.usSoftwareShutdownTemp) } )); tablePOWERTUNE.Items.Add(new ListViewItem(new string[] { "Hotspot Temp. (C)", Convert.ToString (atom_powertune_table.usTemperatureLimitHotspot) } )); tableFAN.Items.Clear(); tableFAN.Items.Add(new ListViewItem(new string[] { "Temp. Hysteresis", Convert.ToString (atom_fan_table.ucTHyst) } )); tableFAN.Items.Add(new ListViewItem(new string[] { "Min Temp. (C)", Convert.ToString (atom_fan_table.usTMin / 100) } )); tableFAN.Items.Add(new ListViewItem(new string[] { "Med Temp. (C)", Convert.ToString (atom_fan_table.usTMed / 100) } )); tableFAN.Items.Add(new ListViewItem(new string[] { "High Temp. (C)", Convert.ToString (atom_fan_table.usTHigh / 100) } )); tableFAN.Items.Add(new ListViewItem(new string[] { "Max Temp. (C)", Convert.ToString (atom_fan_table.usTMax / 100) } )); tableFAN.Items.Add(new ListViewItem(new string[] { "Target Temp. (C)", Convert.ToString (atom_fan_table.ucTargetTemperature) } )); tableFAN.Items.Add(new ListViewItem(new string[] { "Fuzzy Fan Mode", Convert.ToString (atom_fan_table.ucFanControlMode) } )); tableFAN.Items.Add(new ListViewItem(new string[] { "Min PWM (%)", Convert.ToString (atom_fan_table.usPWMMin / 100) } )); tableFAN.Items.Add(new ListViewItem(new string[] { "Med PWM (%)", Convert.ToString (atom_fan_table.usPWMMed / 100) } )); tableFAN.Items.Add(new ListViewItem(new string[] { "High PWM (%)", Convert.ToString (atom_fan_table.usPWMHigh / 100) } )); tableFAN.Items.Add(new ListViewItem(new string[] { "Max PWM (%)", Convert.ToString (atom_fan_table.usFanPWMMax) } )); tableFAN.Items.Add(new ListViewItem(new string[] { "Max RPM", Convert.ToString (atom_fan_table.usFanRPMMax) } )); tableFAN.Items.Add(new ListViewItem(new string[] { "Sensitivity", Convert.ToString (atom_fan_table.usFanOutputSensitivity) } )); tableFAN.Items.Add(new ListViewItem(new string[] { "Acoustic Limit (MHz)", Convert.ToString (atom_fan_table.ulMinFanSCLKAcousticLimit / 100) } )); tableGPU.Items.Clear(); for (var i = 0; i < atom_sclk_table.ucNumEntries; i ) { tableGPU.Items.Add(new ListViewItem(new string[] { Convert.ToString (atom_sclk_entries [i].ulSclk / 100), Convert.ToString (atom_vddc_entries [atom_sclk_entries [i].ucVddInd].usVdd) } )); } tableMEMORY.Items.Clear(); for (var i = 0; i < atom_mclk_table.ucNumEntries; i ) { tableMEMORY.Items.Add(new ListViewItem(new string[] { Convert.ToString (atom_mclk_entries [i].ulMclk / 100), Convert.ToString (atom_mclk_entries [i].usMvdd) } )); } listVRAM.Items.Clear(); for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i ) { if (atom_vram_entries[i].strMemPNString[0] != 0) { var mem_id = Encoding.UTF8.GetString(atom_vram_entries[i].strMemPNString).Substring(0, 10); string mem_vendor; if (rc.ContainsKey(mem_id)) { mem_vendor = rc[mem_id]; } else { mem_vendor = "UNKNOWN"; } listVRAM.Items.Add(mem_id " (" mem_vendor ")"); } } listVRAM.SelectedIndex = 0; atom_vram_index = listVRAM.SelectedIndex; tableVRAM_TIMING.Items.Clear(); for (var i = 0; i < atom_vram_timing_entries.Length; i ) { uint tbl = atom_vram_timing_entries[i].ulClkRange >> 24; tableVRAM_TIMING.Items.Add(new ListViewItem(new string[] { tbl.ToString () ":" (atom_vram_timing_entries [i].ulClkRange & 0x00FFFFFF) / 100, ByteArrayToString (atom_vram_timing_entries [i].ucLatency) } )); } save.Enabled = true; boxROM.Enabled = true; boxPOWERPLAY.Enabled = true; boxPOWERTUNE.Enabled = true; boxFAN.Enabled = true; boxGPU.Enabled = true; boxMEM.Enabled = true; boxVRAM.Enabled = true; } fileStream.Close(); } } tableROM.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); tableROM.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); tableFAN.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); tableFAN.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); tablePOWERPLAY.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); tablePOWERPLAY.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); tableGPU.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); tableGPU.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); tablePOWERTUNE.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); tablePOWERTUNE.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); tableMEMORY.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); tableMEMORY.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); tableVRAM.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); tableVRAM.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); tableVRAM_TIMING.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); tableVRAM_TIMING.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); } public Int32 getValueAtPosition(int bits, int position, bool isFrequency = false) { int value = 0; if (position <= buffer.Length - 4) { switch (bits) { case 8: default: value = buffer[position]; break; case 16: value = (buffer[position 1] << 8) | buffer[position]; break; case 24: value = (buffer[position 2] << 16) | (buffer[position 1] << 8) | buffer[position]; break; case 32: value = (buffer[position 3] << 24) | (buffer[position 2] << 16) | (buffer[position 1] << 8) | buffer[position]; break; } if (isFrequency) return value / 100; return value; } return -1; } public bool setValueAtPosition(int value, int bits, int position, bool isFrequency = false) { if (isFrequency) value *= 100; if (position <= buffer.Length - 4) { switch (bits) { case 8: default: buffer[position] = (byte)value; break; case 16: buffer[position] = (byte)value; buffer[position 1] = (byte)(value >> 8); break; case 24: buffer[position] = (byte)value; buffer[position 1] = (byte)(value >> 8); buffer[position 2] = (byte)(value >> 16); break; case 32: buffer[position] = (byte)value; buffer[position 1] = (byte)(value >> 8); buffer[position 2] = (byte)(value >> 16); buffer[position 3] = (byte)(value >> 32); break; } return true; } return false; } private bool setValueAtPosition(String text, int bits, int position, bool isFrequency = false) { int value = 0; if (!int.TryParse(text, out value)) { return false; } return setValueAtPosition(value, bits, position, isFrequency); } private void SaveFileDialog_Click(object sender, EventArgs e) { SaveFileDialog SaveFileDialog = new SaveFileDialog(); SaveFileDialog.Title = "Save As"; SaveFileDialog.Filter = "BIOS (*.rom)|*.rom"; if (SaveFileDialog.ShowDialog() == DialogResult.OK) { FileStream fs = new FileStream(SaveFileDialog.FileName, FileMode.Create); BinaryWriter bw = new BinaryWriter(fs); for (var i = 0; i < tableROM.Items.Count; i ) { ListViewItem container = tableROM.Items[i]; var name = container.Text; var value = container.SubItems[1].Text; if (name == "VendorID") { var num = (int)int32.ConvertFromString(value); atom_rom_header.usVendorID = (UInt16)num; } else if (name == "DeviceID") { var num = (int)int32.ConvertFromString(value); atom_rom_header.usDeviceID = (UInt16)num; } else if (name == "Sub ID") { var num = (int)int32.ConvertFromString(value); atom_rom_header.usSubsystemID = (UInt16)num; } else if (name == "Sub VendorID") { var num = (int)int32.ConvertFromString(value); atom_rom_header.usSubsystemVendorID = (UInt16)num; } else if (name == "Firmware Signature") { atom_rom_header.uaFirmWareSignature = value.ToCharArray(); } } for (var i = 0; i < tablePOWERPLAY.Items.Count; i ) { ListViewItem container = tablePOWERPLAY.Items[i]; var name = container.Text; var value = container.SubItems[1].Text; var num = (int)int32.ConvertFromString(value); if (name == "Max GPU Freq. (MHz)") { atom_powerplay_table.ulMaxODEngineClock = (UInt32)(num * 100); } else if (name == "Max Memory Freq. (MHz)") { atom_powerplay_table.ulMaxODMemoryClock = (UInt32)(num * 100); } else if (name == "Power Control Limit (%)") { atom_powerplay_table.usPowerControlLimit = (UInt16)num; } } for (var i = 0; i < tablePOWERTUNE.Items.Count; i ) { ListViewItem container = tablePOWERTUNE.Items[i]; var name = container.Text; var value = container.SubItems[1].Text; var num = (int)int32.ConvertFromString(value); if (name == "TDP (W)") { atom_powertune_table.usTDP = (UInt16)num; } else if (name == "TDC (A)") { atom_powertune_table.usTDC = (UInt16)num; } else if (name == "Max Power Limit (W)") { atom_powertune_table.usMaximumPowerDeliveryLimit = (UInt16)num; } else if (name == "Max Temp. (C)") { atom_powertune_table.usTjMax = (UInt16)num; } else if (name == "Shutdown Temp. (C)") { atom_powertune_table.usSoftwareShutdownTemp = (UInt16)num; } else if (name == "Hotspot Temp. (C)") { atom_powertune_table.usTemperatureLimitHotspot = (UInt16)num; } } for (var i = 0; i < tableFAN.Items.Count; i ) { ListViewItem container = tableFAN.Items[i]; var name = container.Text; var value = container.SubItems[1].Text; var num = (int)int32.ConvertFromString(value); if (name == "Temp. Hysteresis") { atom_fan_table.ucTHyst = (Byte)num; } else if (name == "Min Temp. (C)") { atom_fan_table.usTMin = (UInt16)(num * 100); } else if (name == "Med Temp. (C)") { atom_fan_table.usTMed = (UInt16)(num * 100); } else if (name == "High Temp. (C)") { atom_fan_table.usTHigh = (UInt16)(num * 100); } else if (name == "Max Temp. (C)") { atom_fan_table.usTMax = (UInt16)(num * 100); } else if (name == "Target Temp. (C)") { atom_fan_table.ucTargetTemperature = (Byte)num; } else if (name == "Legacy or Fuzzy Fan Mode") { atom_fan_table.ucFanControlMode = (Byte)(num); } else if (name == "Min PWM (%)") { atom_fan_table.usPWMMin = (UInt16)(num * 100); } else if (name == "Med PWM (%)") { atom_fan_table.usPWMMed = (UInt16)(num * 100); } else if (name == "High PWM (%)") { atom_fan_table.usPWMHigh = (UInt16)(num * 100); } else if (name == "Max PWM (%)") { atom_fan_table.usFanPWMMax = (UInt16)num; } else if (name == "Max RPM") { atom_fan_table.usFanRPMMax = (UInt16)num; } else if (name == "Sensitivity") { atom_fan_table.usFanOutputSensitivity = (UInt16)num; } else if (name == "Acoustic Limit (MHz)") { atom_fan_table.ulMinFanSCLKAcousticLimit = (UInt32)(num * 100); } } for (var i = 0; i < tableGPU.Items.Count; i ) { ListViewItem container = tableGPU.Items[i]; var name = container.Text; var value = container.SubItems[1].Text; var mhz = (int)int32.ConvertFromString(name) * 100; var mv = (int)int32.ConvertFromString(value); atom_sclk_entries[i].ulSclk = (UInt32)mhz; atom_vddc_entries[atom_sclk_entries[i].ucVddInd].usVdd = (UInt16)mv; if (mv < 0xFF00) { atom_sclk_entries[i].usVddcOffset = 0; } } for (var i = 0; i < tableMEMORY.Items.Count; i ) { ListViewItem container = tableMEMORY.Items[i]; var name = container.Text; var value = container.SubItems[1].Text; var mhz = (int)int32.ConvertFromString(name) * 100; var mv = (int)int32.ConvertFromString(value); atom_mclk_entries[i].ulMclk = (UInt32)mhz; atom_mclk_entries[i].usMvdd = (UInt16)mv; } updateVRAM_entries(); for (var i = 0; i < tableVRAM_TIMING.Items.Count; i ) { ListViewItem container = tableVRAM_TIMING.Items[i]; var name = container.Text; var value = container.SubItems[1].Text; var arr = StringToByteArray(value); UInt32 mhz; if (name.IndexOf(':') > 0) { mhz = (UInt32)uint32.ConvertFromString(name.Substring(name.IndexOf(':') 1)) * 100; mhz = (UInt32)uint32.ConvertFromString(name.Substring(0, name.IndexOf(':'))) << 24; // table id } else { mhz = (UInt32)uint32.ConvertFromString(name) * 100; } atom_vram_timing_entries[i].ulClkRange = mhz; atom_vram_timing_entries[i].ucLatency = arr; } setBytesAtPosition(buffer, atom_rom_header_offset, getBytes(atom_rom_header)); setBytesAtPosition(buffer, atom_powerplay_offset, getBytes(atom_powerplay_table)); setBytesAtPosition(buffer, atom_powertune_offset, getBytes(atom_powertune_table)); setBytesAtPosition(buffer, atom_fan_offset, getBytes(atom_fan_table)); for (var i = 0; i < atom_mclk_table.ucNumEntries; i ) { setBytesAtPosition(buffer, atom_mclk_table_offset Marshal.SizeOf(typeof(ATOM_MCLK_TABLE)) Marshal.SizeOf(typeof(ATOM_MCLK_ENTRY)) * i, getBytes(atom_mclk_entries[i])); } for (var i = 0; i < atom_sclk_table.ucNumEntries; i ) { setBytesAtPosition(buffer, atom_sclk_table_offset Marshal.SizeOf(typeof(ATOM_SCLK_TABLE)) Marshal.SizeOf(typeof(ATOM_SCLK_ENTRY)) * i, getBytes(atom_sclk_entries[i])); } for (var i = 0; i < atom_vddc_table.ucNumEntries; i ) { setBytesAtPosition(buffer, atom_vddc_table_offset Marshal.SizeOf(typeof(ATOM_VOLTAGE_TABLE)) Marshal.SizeOf(typeof(ATOM_VOLTAGE_ENTRY)) * i, getBytes(atom_vddc_entries[i])); } var atom_vram_entry_offset = atom_vram_info_offset Marshal.SizeOf(typeof(ATOM_VRAM_INFO)); for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i ) { setBytesAtPosition(buffer, atom_vram_entry_offset, getBytes(atom_vram_entries[i])); atom_vram_entry_offset = atom_vram_entries[i].usModuleSize; } atom_vram_timing_offset = atom_vram_info_offset atom_vram_info.usMemClkPatchTblOffset 0x2E; for (var i = 0; i < atom_vram_timing_entries.Length; i ) { setBytesAtPosition(buffer, atom_vram_timing_offset Marshal.SizeOf(typeof(ATOM_VRAM_TIMING_ENTRY)) * i, getBytes(atom_vram_timing_entries[i])); } BIOS_BootupMessage = txtBIOSBootupMessage.Text.Substring(0, BIOS_BootupMessage.Length); setBytesAtPosition(buffer, atom_rom_header.usBIOS_BootupMessageOffset 2, Encoding.ASCII.GetBytes(BIOS_BootupMessage)); fixChecksum(true); bw.Write(buffer); fs.Close(); bw.Close(); } } private void fixChecksum(bool save) { Byte checksum = buffer[atom_rom_checksum_offset]; int size = buffer[0x02] * 512; Byte offset = 0; for (int i = 0; i < size; i ) { offset = buffer[i]; } if (checksum == (buffer[atom_rom_checksum_offset] - offset)) { txtChecksum.ForeColor = Color.Green; } else if (!save) { txtChecksum.ForeColor = Color.Red; MessageBox.Show("Invalid checksum - Save to fix!", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning); } if (save) { buffer[atom_rom_checksum_offset] -= offset; txtChecksum.ForeColor = Color.Green; } txtChecksum.Text = "0x" buffer[atom_rom_checksum_offset].ToString("X"); } public static string ByteArrayToString(byte[] ba) { string hex = BitConverter.ToString(ba); return hex.Replace("-", ""); } public static byte[] StringToByteArray(String hex) { if (hex.Length % 2 != 0) { MessageBox.Show("Invalid hex string", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); throw new InvalidDataException(); } byte[] bytes = new byte[hex.Length / 2]; for (int i = 0; i < hex.Length; i = 2) { bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16); } return bytes; } public void updateVRAM_entries() { for (var i = 0; i < tableVRAM.Items.Count; i ) { ListViewItem container = tableVRAM.Items[i]; var name = container.Text; var value = container.SubItems[1].Text; var num = (int)int32.ConvertFromString(value); if (name == "VendorID") { atom_vram_entries[atom_vram_index].ucMemoryVenderID = (Byte)num; } else if (name == "Size (MB)") { atom_vram_entries[atom_vram_index].usMemorySize = (UInt16)num; } else if (name == "Density") { atom_vram_entries[atom_vram_index].ucDensity = (Byte)num; } else if (name == "Type") { atom_vram_entries[atom_vram_index].ucMemoryType = (Byte)num; } } } private void listVRAM_SelectionChanged(object sender, EventArgs e) { updateVRAM_entries(); tableVRAM.Items.Clear(); if (listVRAM.SelectedIndex >= 0 && listVRAM.SelectedIndex < listVRAM.Items.Count) { atom_vram_index = listVRAM.SelectedIndex; tableVRAM.Items.Add(new ListViewItem(new string[] { "VendorID", "0x" atom_vram_entries [atom_vram_index].ucMemoryVenderID.ToString ("X") } )); tableVRAM.Items.Add(new ListViewItem(new string[] { "Size (MB)", Convert.ToString (atom_vram_entries [atom_vram_index].usMemorySize) } )); tableVRAM.Items.Add(new ListViewItem(new string[] { "Density", "0x" atom_vram_entries [atom_vram_index].ucDensity.ToString ("X") } )); tableVRAM.Items.Add(new ListViewItem(new string[] { "Type", "0x" atom_vram_entries [atom_vram_index].ucMemoryType.ToString ("X") } )); } } private void listVRAM_SelectedIndexChanged(object sender, EventArgs e) { } private void apply_timings(int vendor_index, int timing_index) { for (var i = 0; i < tableVRAM_TIMING.Items.Count; i ) { ListViewItem container = tableVRAM_TIMING.Items[i]; var name = container.Text; UInt32 real_mhz = 0; int mem_index = -1; if (name.IndexOf(':') > 0) { // get mem index mem_index = (Int32)int32.ConvertFromString(name.Substring(0, 1)); } else { mem_index = 32768; } real_mhz = (UInt32)uint32.ConvertFromString(name.Substring(name.IndexOf(':') 1)); if (real_mhz >= 1500 && (mem_index == vendor_index || mem_index == 32768)) { // set the timings container.SubItems[1].Text = timings[timing_index]; } } } private void button1_Click(object sender, EventArgs e) { int samsung_index = -1; int micron_index = -1; int elpida_index = -1; int hynix_1_index = -1; int hynix_2_index = -1; for (var i = 0; i < atom_vram_info.ucNumOfVRAMModule; i ) { string mem_vendor; if (atom_vram_entries[i].strMemPNString[0] != 0) { var mem_id = Encoding.UTF8.GetString(atom_vram_entries[i].strMemPNString).Substring(0, 10); if (rc.ContainsKey(mem_id)) { mem_vendor = rc[mem_id]; } else { mem_vendor = "UNKNOWN"; } switch (mem_vendor) { case "SAMSUNG": samsung_index = i; break; case "MICRON": micron_index = i; break; case "ELPIDA": elpida_index = i; break; case "HYNIX_1": hynix_1_index = i; break; case "HYNIX_2": hynix_2_index = i; break; } } } if (samsung_index != -1) { MessageBox.Show("Samsung Memory found at index #" samsung_index ", now applying UBERMIX 3.1 timings to 1500 strap(s)"); apply_timings(samsung_index, 0); } if (hynix_2_index != -1) { MessageBox.Show("Hynix (2) Memory found at index #" hynix_2_index ", now applying GOOD HYNIX MINING timings to 1500 strap(s)"); apply_timings(hynix_2_index, 4); } if (micron_index != -1) { MessageBox.Show("Micron Memory found at index #" micron_index ", now applying GOOD MICRON MINING timings to 1500 strap(s)"); apply_timings(micron_index, 5); } if (hynix_1_index != -1) { MessageBox.Show("Hynix (1) Memory found at index #" hynix_1_index ", now applying GOOD HYNIX MINING timings to 1500 strap(s)"); apply_timings(hynix_1_index, 6); } if (elpida_index != -1) { MessageBox.Show("Elpida Memory found at index #" elpida_index ", now applying GOOD ELPIDA MINING timings to 1500 strap(s)"); apply_timings(elpida_index, 7); } if (samsung_index == -1 && hynix_2_index == -1 && hynix_1_index == -1 && elpida_index == -1 && micron_index == -1) { MessageBox.Show("Sorry, no supported memory found. If you think this is an error, please file a bugreport @ github.com/jaschaknack/PolarisBiosEditor"); } } } }
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论