AMI Aptio BIOS DSDT Editing

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!

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *