NOTA: Per questo post, verrà utilizzato un BIOS ASUS come esempio. Potrebbero esserci delle lievi differenze tra modelli e/o marche, ma il concetto di base dovrebbe rimanere invariato.
Con lo spopolare dei bios AMI Aptio, è diventato molto più semplice fare piccole modifiche mirate, in quanto si è assistito ad una sorta di standardizzazione. Questi BIOS sono organizzati in moduli, e questi moduli possono essere rimpiazzati senza grande sforzo.
Ma se volessimo crearne noi uno, o modificarlo? L’esigenza è lecita, soprattutto se quelli creati dal costruttore fanno schifo (un esempio? qui).
Oggi ci occuperemo del DSDT. Ci servono: Aptio MMTool, IASL, e un hex editor.
Individuiamo innanzitutto il modulo giusto: è riconoscibile perché, dopo l’header, a 0x25, troviamo la dicitura DSDT (0x44, 0x55, 0x44, 0x54). Nel caso di ASUS, questo modulo contiene due DSDT diversi. Non ho investigato, ma suppongo sia perché uno viene utilizzato quando l’optimus è attivo, e l’altro quando la GPU è disabilitata. Normalmente non si può disabilitare l’optimus, ma col bios unlock (maggiori informazioni qui) è possibile. In questo bios il modulo giusto ha indice 0x30, e non ha nome.
Dopo il magic “DSDT”, a 0x29, troviamo 4 byte che indicano la dimensione del listato, nel mio caso 69446 bytes (0x46, 0x0f, 0x01, 0x00). Nel nostro caso, quindi, estraiamo da 0x25 a 0x25+0x10f46. (L’altro listato inizia invece a 0x12475, stessa procedura)
Il file ora estratto può essere modificato con IASL o con un editor apposito. Dopo averlo ricompilato, è molto probabile che la dimensione sia diversa dall’originale. L’importante è che non sia maggiore, perché quei famosi 4 byte fanno testo sulla dimensione. Andiamo quindi a sovrascrivere nel modulo il listato ricompilato, avendo cura di sostituire i byte, ma di lasciare li quelli che avanzano in modo che la dimensione del modulo rimanga uguale.
Finito questo, bisogna correggere il checksum del modulo a 0x11. Potete farlo tramite questo algoritmo:
public static uint Checksum(byte[] module) { uint num = 0; for(int i = 0x18; i < module.Length; i++) { num += module[i]; } return (uint)(-num & 0xff); }
Ora reinserite il modulo con MMTool.
Bene! Il nuovo BIOS col DSDT modificato è pronto!