2012-11-20

Spuštění existující instalace Windows XP OEM - GMC-Dell ve VirtualBoxu 4.2.4 na Xubuntu 12.04 bez nutnosti Aktivace

Na počítači Dell Optiplex 740 mám předinstalovaný systém Microsoft Windows XP (dále jen Windows na fyzickém stroji). Přidal jsem druhý pevný disk se systémem GNU/Linux, konkrétně s distribucí Xubuntu 12.04 (dále jen Linux nebo Xubuntu), který jsem se rozhodl používat jako hlavní operační systém. Protože ale některé programy pod Xubuntu (ani Wine) neběží a restartováni PC do Windows pokaždé když chci spustit některý z Windows-only programů je nepohodlné, vyvstal požadavek na spouštění Windows přímo z Linuxu.

Předpoklady

Instalace Microsoft Windows

Jako koncový uživatel můžete získat Windows prakticky se třemi různými druhy licence. Na mém počítači je předinstalovaný systém Microsoft Windows a to v licenci OEM Gold Master Copy. Co tento typ licence znamená?

  1. Retail. Jde o krabicovou verzi Windows, zakoupenou v obchodě. Nevím jak je to u ní s aktivací a smlouvou EULA, co se týče počtu instalací z "jedné krabice". Prý je možné jeden systém legálně nainstalovat vícekrát.
  2. OEM - Běžná OEM licence. Systém Windows zakoupený koncovým uživatelem v obchodě. Tato licence opravňuje uživatele provést pouze jednu instalaci systému. Během aktivace systému je tato instalace svázána s konkrétním hardware počítače na kterém je systém nainstalován.

    Svázání je řešeno tak, že při aktivaci Windows přečte vlastnosti deseti zařízení počítače, tyto vlastnosti zašifruje a uloží do souboru c:\Windows\system32\wpa.dbl. Po každém přihlášení uživatele do systému porovná nainstalovaná zařízení počítače s daty ve wpa.dbl a pokud se alespoň sedm z těchto zařízení shoduje, pokračuje v přihlášení, jinak vyžaduje opětovnou aktivaci. Od každého druhu zařízení ukládá Windows do wpa.dbl poze první nalezené zařízení, tedy pokud máte například tři síťové karty, pro kontrolu aktivace je použita pouze první, atd.
  3. OEM Gold Master Copy. Pokud zakoupíte počítač od některého z velkých výrobců (Dell, HP, Asus) s již předinstalovaným systémem obdržíte Windows v takzvané Gold Master Copy OEM licenci, což je speciální druh licence určené pro hromadnou instalaci. Tento typ Windows disponuje takzvanou System Locked Pre-Installation (dále jen SLP) kontrolou aktivace systému. Na rozdíl od běžné OEM licence, Windows po přihlášení neporovnává hardware počítače se souborem na disku, ale v paměťovém prostoru BIOSu, hledá speciální řetězec identifikující počítač daného výrobce, pro kterého je instalace Windows určena. Konkrétně tedy instalace pro Dell, hledá na různých místech paměti BIOSu řetězce, jako "Dell System", "Dell Computer" a pod. Pokud některý (alespoň jeden) z nich najde není uživatel vyzván k aktivaci a systém se normálně spustí. Toto je můj případ a více se o něm rozepíšu v kapitole Aktivace Windows a prakticky v celém tomto článku.

Pokud si nejste jistí, který typ licence máte, spusťte ve Windows nástroj Microsoft Genuie Advantage Diagnostic Tool.

Klikněte na tlačítko Continue a potom Copy, címž uložíte výsledek kontroly do clipboardu. Otevřete nějaký textový editor (například notepad) a pomocí ctrl+v vložte výsledek do editoru. Ke konci souboru by měla být vidět informace o SLP řetězcích.

OEM Activation 1.0 Data-->
BIOS string matches: yes
Marker string from BIOS: 1E840:Dell Inc|563B:Dell Inc|563B:Microsoft Corporation
Marker string from OEMBIOS.DAT: Dell System,Dell Computer,Dell System,Dell System

Pokud tam tuto informaci nemáte, nevlastníte Windows ve verzi OEM Gold Master Copy.

Zajímavá je také informace "Marker string from OEMBIOS.DAT", což je seznam SLP řetězců, které Windows hledají v BIOSu, bohužel zde není zobrazeno na kterých pozicích v paměti tyto řetězce hledá, to zjistíme později.

Předpokládejme tedy, že máte na svém PC, na jednom pevném disku (nebo oddílu disku) existující fungující legální instalaci Windows XP, service pack 3 a na druhém disku instalaci Xubuntu nebo obdobného Debian-based Linuxu.

Instalace VirtualBox

Pokud chcete v Linux spustit/virtualizovat existující instalaci Windows, máte prakticky dvě možnosti. Použít uzavřený software VMware Player nebo téměř open source VirtualBox (využívá některé uzavřené komponenty). VM Player nabízí víc konfiguračních možností, ale díky plně uzavřenému kódu není snadné jej modifikovat v případě, že potřebujete upravit něco, co konfigurace nenabízí.

Já jsem tedy volil VirtualBox a to konkrétně v aktuálně poslední verzi 4.2.4, instalované přímo z repositářů projektu VirtualBox, kde se nachází také návod k instalaci.

Ve vašem Linuxu byste tedy měli mít funkční instalaci programu VirtualBox verze 4.2.4.

Spuštění Windows ve VirtualBoxu

Protože smlouva EULA, OEM verze Windows nedovoluje instalovat systém více než jednou a to i na jednom PC, neimportoval jsem existující instalaci do virtuálního disku VirutalBoxu, ale vytvořil jsem virtuální disk jako odkaz na fyzický disk s Windows, a tato Windows následně spouštím přímo z něj.

Vytvořit odkaz na virtuální disk a nastavit VirtualBox je možné dle návodu na stránkách VirtualBoxu.

https://forums.virtualbox.org/viewtopic.php?t=9697

Návod je poměrně obsáhlý, nejdůležitější body jsou ale kapitola I. bod 1., kde i přes to, že návod výslovně zakazuje povolení volby IO APIC na kartě systém, zkuste si s touto volbou pohrát, pokud Windows ve VirtualBoxu nenastartují. DMI BIOS setting vás budou zajímat, pouze pokud máte Windows v běžné OEM licenci. Dále se pak zaměřte na kapitolu III. Partitioning, ve které je popsán proces vytvoření odkazu na fyzický disk s instalací Windows. Ve třetí kapitole je v podstatě nutné spustit jediný příkaz.

sudo VBoxManage internalcommands createrawvmdk -filename rawDiskXP.vmdk -rawdisk /dev/sda

Který vytvoří vdmk soubor s cestou k fyzickému disku. A nakonec bod IV. ve kterém je popsána konfigurace virtuálního stroje. Já jsem vytvořil virtuální stroj ve výchozím nastavení, pouze jako pevný disk jsem vybral vdmk soubor vytvořený v předchozím bodě a stroj bez problémů spustil. Bez nutnosti spuštění MergeIDE nebo vytváření alternativních hardwarových profilů Windows naběhly.

V tomto okamžiku byste tedy měli mít nakonfigurovaný virtuální stroj, se spuštěnými Windows, které po přihlášení (pokud je nutné) vyžadují aktivaci.

Spuštění Windows bez výzvy k aktivaci

Jak již bylo napsáno v předchozích kapitolách, OEM GMC verze Windows hledá při kontrole aktivace speciální řetězec v BIOSu. Samotný algoritmus vyhledávání SLP řetězců je uložen v souborech c:\Windows\system32\OEMBIOS.*. Pokud tyto soubory nahradíte soubory z instalace Windows od jiného GMC výrobce, budou Windows hledat jiné řetězce (to ovšem není cílem tohoto článku).

My tedy:

  1. Zjistíme, jakou verzi souborů OEMBIOS máme v instalaci Windows.
  2. Dle ní potom najdeme pozice SLP řetězců v BIOSu a ověříme existence SLP řetězce v BIOSu fyzického stroje.
  3. Prozkoumáme strukturu BIOSu virtuálního stroje.
  4. Vložíme SLP řetězec do BIOSu virtuálního stroje, tak abychom předešli nutnosti znovu-aktivovat Windows ve VirtualBoxu.
1. Ověření OEM licence Windows

Ke zjištění verze souborů OEMBIOS spusťte nástroj OEMBIOS.EXE v příkazové řádce Windows. Na výstupu dostanete kontrolní součty nalezených informací. Například na mém systému vidím dva součty (crc).

C:>OEMBIOS.EXE

F:Dell System OEMBIOS.CAT CRC=63875D1F
F:Dell System OEMBIOS.CAT CRC=B6F0EEFD

Tyto hodnoty si poznamenejte pro další použití.

2. Nalezení pozice SLP řetězce v BIOSu fyzického stroje

Abychom se trochu zorientovali, ověříme si umístění SLP řetězce v našem BIOSu. A aby se nám s pamětí BIOSu lépe pracovalo, začneme tím, že si ji zkopírujeme do souboru. Nabootujte do Linuxu a jako uživatel root nebo pomocí příkazu `sudo` spusťte následující příkaz.

sudo dmidecode -t0

Příkaz dmidecode čte informace o BIOSu přímo ze zařízení /dev/mem (proto nutnost mít práva uživatel root) a vypisuje je uživatelsky čitelná na standardní výstup. Přepínačem -t0 zobrazíme pouze obecné informace o BIOSu. Ve výstupu bychom měli mimo jiné vidět data obdobná jako jsou následující.

BIOS Information
   Vendor: Dell Inc.
   Version: 2.1.9
   Release Date: 12/04/2008
   Address: 0xE0000
   Runtime Size: 128 kB
   ROM Size: 512 kB

Zajímavé jsou pro nás informace Vendor identifikující výrobce BIOSu a Address společně s Runtime Size popisující umístění dat BIOSu v paměti. Následujícím příkazem z paměti od adresy 0xE0000 (hexadecimálně) přečteme 128 kB dat a uložíme je do souboru.

sudo head -c 1048576 /dev/mem | tail -c 131072 > original_bios.bin

Příkaz před pajpou přečte počáteční 1 MB dat z paměti, tedy 0xE0000 + 128 kB. Druhý příkaz potom z těchto dat vybere posledních 128 kB.

Podle kontrolních součtů zjištěných v kapitole Ověření OEM licence Windows nalezněte na tech. fóru MSFN seznam SLP řetězců, které vaše instalace Windows hledá v paměťovém prostoru BIOSu.

http://www.msfn.org/board/topic/71016-multi-manufacturer-pre-activation/page__view__findpost__p__534097

Pokud máte víc kontrolních součtů, ne všechny se musí v seznamu nacházet. Používejte jeden součet po druhém a hledejte seznam, dokud na něj nenarazíte. Tedy například mé Windows dle OEMBIOS.CAT CRC32=B6F0EEFD hledají následující řetězce.

f000,e076,0010,Dell System
f000,e840,0010,Dell Computer
f000,49a9,0010,Dell System
f000,e05e,0010,Dell System
f000,e838,0018,Dell Inc

Přičemž například hodnoty v prvním řádku znamenají f000: hledej v oblasti kódu BIOSu (nikoli SMBIOSu), e076: začni zde hledat od adresy 0xE076, 0010: hledej v následujících šestnácti bytech a hledej tam řetězec "Dell System". Tedy v mém případě Windows hledají řetězec "Dell System" v paměťovém prostoru počítače od adresy 0xFE076 až po adresu 0xFE086.

Pokud by první hodnota byla e000, znamenalo by to hledání řetězce od adresy 0xEE076. Pokud třetí hodnota 0010 chybí, znamená to že pozice řetězce musí přesně odpovídat dané adrese.

Pokuste se některý z SLP řetězců nalézt v BIOSu, který jste si v předešlém kroku zkopírovali do souboru. Protože v souboru jsou pouze samotná data BIOSu, musíme hledat první řetězec nikoli od adresy 0xFE076, ale od adresy 0x1E076 (náš soubor začíná od hodnoty 0x0, nikoli 0xE0000 jako je tomu v paměti počítače).

Pomocí následujícího příkazu zobrazte data BIOSu a prozkoumejte uvedené adresy.

hexdump -C current_bios.bin | less

V mém případě jsem SLP řetězec "Dell Computer" naše na pozici 0x1E840, kde se nacházela tato data.

0001e840   44 65 6c 6c 20 43 6f 6d   70 75 74 65 72 20 43 6f   |Dell Computer Co|

Tedy, Windows v tomto paměťovém prostoru nalezly řetězec "Dell Computer".

3. Prozkoumání BIOSu virtuálního stroje

Obdobným způsobem, kterým jsme prozkoumali BIOS fyzického stroje v kapitole 2, prozkoumáme BIOS virtuálního stroje.

Abychom se mohli do BIOSu ve virtuálním stroji podívat, spustíme si v něm nějaký operační systém, kterým budeme moci číst paměť obdobně jako jsme to udělali v kapitole 2. Já jsem pro své experimentování zvolil live distribuci Slax.

Ze stránek Slaxu si stáhněte iso obraz distribuce a uložte někam na svůj disk. Ve VirtualBoxu vytvořte nový virtuální stroj bez virtuálního disku. Po jeho vytvoření, přejděte do nastavení jednotek, u optické mechaniky zvolte stažený ISO obraz Slaxu, virtuální stroj spusťte (stačí textový režim) a přihlašte se jako uživatel root (přihlašovací údaje uvidíte po nabootování systému, přímo nad vstupem pro zadání jména a hesla).

Obdobným způsobem, jako v kapitole 2. zobrazíme základní informace o BIOSu virtuálního stroje, příkazem dmidecode.

dmidecode -t0

Ze zobrazených informací zjistíme umístění dat BIOSu v paměti.

BIOS Information
   Vendor: innotek GmbH
   Version: VirtualBox
   Release Date: 12/01/2006
   Address: 0xE0000
   Runtime Size: 128 kB
   ROM Size: 128 kB

Tedy v případě virtuálního stroje se BIOS nachází ve 128 kB paměti, počínaje adresou 0xE0000, obdobně jako v případě BIOSu fyzického stroje. Stejným způsobem tedy paměť přečteme a BIOS uložíme do souboru.

head -c 1048576 /dev/mem | tail --bytes=131072 > virtual_bios.bin

Všimněte si, že v případě příkazu tail jsem místo přepínače -c použil přepínač --bytes. Tyto dva přepínače mají stejnou funkci, pouze přepínač -c v tailu, verze 6.12, která je přítomná v distribuci Slax 6 nefunguje korektně. Vyexportovaný soubor si hexadecimálně zobrazte.

hexdump -C virtual_bios.bin | less

Jak jsme si objasnili v předchozích kapitolách OEM verze Windows hledá definované řetězce v BIOSu, najděte si proto SLP řetězce platné pro Vaši instalaci Windows viz kapitola 2. Když prohledáte data zobrazená předchozím příkazem (`hexdump virtual_bios.bin`) a prozkoumáte pozice SLP řetězců, odpovídající řetězce na nich nenajdete. Nezapomeňte na to, že SLP řetězec může být umístěn v určitém rozsahu, tedy nemusí být nutné aby byl umístěn přesně na jedné konkrétní adrese.

V následujícím kroku se tedy pokusíme SLP řetězce do BIOSu dostat. To můžeme prakticky udělat dvěma způsoby. Jednodušším, což je změnou dat SMBIOSu, popsaném v kapitole 4, anebo složitějším, což je zápis SLP řetězců přímo do programu BIOSu, popsaném v kapitole 5.

4. Vložení SLP řetězce do oblasti SMBIOSu konfigurací virtuálního stroje

System Management BIOS (SMBIOS) je datová struktura/oblast BIOSu, ve které jsou uloženy informace o počítači, jako je například typ, model, výrobce základní desky, procesoru a pod. Některé hodnoty v této oblasti je možné změnit jednoduchou úpravou konfiguračního souboru virtuálního stroje. Pokud tedy máte štěstí a Vaše OEM instalace Windows hledá SLP řetězec právě v této oblasti, můžeme této možnosti využít.

Nejdříve zjistíme, kde se v BIOSu virtuálního stroje oblast SMBIOS nachází. Zobrazte si BIOS virtuálního stroje příkazem hexdump.

hexdump -C virtual_bios.bin | less

A najděte řetězec "_DMI_", který značí začátek druhé části "vstupního bodu" struktury SMBIOS. Jinými slovy kousek za tímto řetězcem naleznete adresu na které se struktura SMBIOS nachází a její délku. Po nalezení DMI Vás bude zajímat následujících 12 bytů.

0001ff70  5f 44 4d 49 5f 65 b6 01   00 10 0e 00 09 00 25 00  |_DMI_e........%.|

Dle specifikace vstupního bodu SMBIOSu (entry point viz tabulka 1) snadno již dohledáme, že struktura SMBIOS má dle bytů 6 až 7 celkovou délku 0xB601, tedy 46 593 bytů a dle bytů 8 až 11 (na řádku, byty se dle kapitoly "Access Method Address — DWORD Layout" čtou pozpátku) nachází v paměti na adrese 0xE1000.

Jelikož můj systém hledá SLP řetězce mimo oblast SMBIOS, budeme po zbytek této kapitoly uvažovat, že máme počítač i systém od společnosti Epson, hledající SLP řetězce na následujících pozicích.

F000,0000,FFFF,EPSON
E000,0000,FFFF,EPSON

Dle druhého řádku (a dle kapitoly 2) vidíme, že systém hledá SLP řetězec "EPSON" v paměti od adresy 0xE0000, až po adresu 0xEFFFF, tedy tato oblast pokrývá oblast SMBIOSu virtuálního stroje.

V manuálu VirtualBoxu si ze seznamu nastavitelných parametrů SMBIOSu (tzv. DMI parametry) vyberte vhodný parametr, do kterého vložte požadovaný SLP řetězec. Určitě je vhodné volit parametr, typu textová hodnota, vhodný bude například "DmiBIOSVendor". Potom pomocí příkazu `VBoxManage setextradata` tomuto parametru nastavte hodnotu jako pro virtuální stroj Windows a pro ověření správnosti nastavení i pro stroj se systémem Slax (nezapomeňte virtuální stroj vypnout a za "VM name" dosadit jeho název).

VBoxManage setextradata "VM name" "VBoxInternal/Devices/pcbios/0/Config/DmiBIOSVendor" "EPSON"

Po nastavení parametru spusťte nejdříve systém Slax a z paměti si zobrazte oblast BIOSu.

head -c 1048576 /dev/mem | tail --bytes=131072 | hexdump -C | less

V zobrazených datech by jste měli být schopni dohledat řetězec "EPSON" a to zhruba na adrese 0xE1010. Tedy pokud jste si paměť zobrazili předchozím příkazem, měl by řetězec být umístěn zhruba na pozici 0x1010. Pokud se tam nachází a jste vlastníky počítače s WIndows od Epsonu, máte vyhráno. Spusťte virtuální stroj s Windows, která by se měla spustit bez nutnosti aktivace.

Pokud Windows stále vyžadují aktivaci, zkuste prověřit následující možné příčiny problémů.

  1. Ověřte, zda-li jste změnili parametr DmiBIOSVendor i pro virtuální stroj s Windows.
  2. Ověřte, zda-li je nastavený SLP řetězec, v oblasti, kde jej systém hledá/očekává. Pokud není, zkuste změnit některý z dalších parametrů SMBIOSu, který by se v dané oblasti mohl nacházet (metodou pokus-omyl).
  3. Pokud se Vám nedaří dostat SLP řetězec na správnou pozici v paměti konfigurací parametrů SMBIOS, pokračujte čtením kapitoly 5.
5. Vložení SLP řetězce do existujícího BIOSu VirtualBoxu

Pokud postup popsaný v předcházející kapitole selhal a Váš SLP řetězec se nachází mimo oblast SMBIOSu, v části od adresy 0xF0000, musíme řetězec vložit přímo do upraveného binárního kódu BIOSu VirtualBoxu a tento BIOS pomocí nezdokumentované konfigurační direktivy "BiosRom" použít ve vašem virtuálním stroji.

Použití vlastního obrazu BIOSu ve VirtualBoxu má nějaká omezení, na která je dobré myslet.

  1. Nepodařilo se mi zprovoznit jiný BIOS než ten, který je dodáván s VirtualBoxem. Zkoušel jsem zkopírovat BIOS fyzického stroje (tedy Dellu), upravit entry point SMBIOSu, ale s tímto BIOSem virtuální stroj nenastartoval.
  2. Obraz BIOSu musí mít přesně 65536 bytů. Údajně by měly fungovat i obrazy velikosti násobku této hodnoty, ale opět žádný takový obraz se mi nepodařilo zprovoznit. Z toho také vyplývá, že použitý obraz je částí kódu BIOSu od adresy 0xF0000 až po 0xFFFFF. Tedy nejedná se o tabulku SMBIOS, která je VirtualBoxem generovaná dyanmicky při spuštění virtuálního stroje, dle konfiguračních parametrů.

Pro jednoduchost příkladu budeme opět uvažovat Windows dodávaný společností Epson, tedy vložíme do BIOSu řetězec "EPSON" tentokrát někam mezi adresy 0xF0000 a 0xFFFFF. Tento rozsah nám poskytuje absolutní svobodu v editaci obrazu BIOSu.

Pod Slaxem si uložte obraz BIOSu do souboru a to od adresy paměti 0xF0000 až po adresu 0xFFFF. Soubor si zkopírujte z virtuálního stroje (Slaxu) na fyzický stroj například pomocí příkazu `scp` a otevřete si jej v hexadecimálním editoru (například ghex).

head -c 1048576 /dev/mem | tail --bytes=65536 > virtual_bios_image.bin

ghex virtual_bios_image.bin

V editoru teď najdeme místa, kde je dostatek binárních nul za sebou, do kterých bude možné vložit požadovaný řetězec aniž bychom něco rozbili. Všimněte si, že ve zkopírovaném BIOSu je řada takových míst a tato místa často končí ASCII řetězcem "XM". Tento řetězec je speciální značka použitá vývojáři VirtualBoxu k odsunutí části kódu BIOSu za určitou adresu. Například vývojáři nechtěli mít obsluhu disků nalepenou hned na obsluhu grafického výstupu a tak při kompilaci assembleru BIOSu vložili mezi tyto dva bloky prázdné místo ukončené značkou "XM". Tohoto místa můžeme beze strachu, že bychom něco rozbili, pohodlně využít.

Projděte Vaše SLP řetěze, zda-li některý z nich nebude možné vložit do jednoho z těchto prázdných míst. V našem ukázkovém případě můžeme řetězec "EPSON" vložit hned do prvního nalezeného prázdného místa v mém případě od 0xDDAA až po 0xE02D, za kterým se nachází řetězec "XM". Oblast bude po úpravě vypadat následovně (Zobrazena je pouze část oblasti).

0000e010   00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00   |................|
0000e020   45 50 53 4f 4e 00 00 00   00 00 00 00 00 00 58 4d   |EPSON.........XM|

Obdobně, jako v kapitole 4 nastavíme virtuální stroj, tak že požije upravený obraz BIOSu místo výchozího. Spusťte příkaz `VboxManage` a nastavte parametr BiosRom, jak pro virtuální stroj se Slaxem, tak i pro stroj s Windows.

VBoxManage setextradata "VM name" "VBoxInternal/Devices/pcbios/0/Config/BiosRom"   "/cesta-k-upravenemu-biosu/virtual_bios_image.bin"

Nyní spusťte virtuální stroj se systémem Slax a zkontrolujte přítomnost požadovaného SLP řetězce v BIOSu obdobně, jako v kapitole 4. Poté spusťte virtuální stroj s Windows.

Pokud se Vám nepodařilo vložit SLP řetězec na požadovanou pozici z důvodu, že se na této pozici nenacházelo prázdné místo, ale leží na ní kód BIOSu, pak pokračujte kapitolou 6.

6. Kompilace a použití vlastního BIOSu ve VirtualBoxu

Tak jak jsem zmiňoval dříve některé verze Windows hledají SLP řetězce na pozicích, na kterých se již nachází kód BIOSu virtuálního stroje a nikoli prázdná místa, do kterých by bylo možné řetězce vložit. To je i můj případ s Windows od Dellu, které hledají SLP na následujících adresách.

f000,e076,0010,Dell System
f000,e840,0010,Dell Computer
f000,49a9,0010,Dell System
f000,e05e,0010,Dell System
f000,e838,0018,Dell Inc

Nyní bude naším cílem na některé z výše uvedených pozic prázdné místo vytvořit odsunutím částí kódu BIOSu jinam a poté do tohoto místa SLP řetězec vložit. Abychom to mohli udělat, budeme muset zkompilovat VirtualBox i s jeho BIOSem, který je naprogramován v assembleru.

Dle návodu na stránkách VirtualBoxu stáhněte zdrojové kódy projektu a připravte potřebné knihovny. Ještě před samotnou kompilací (kapitola Building VirtualBox) si stáhněte, nainstalujte a nastavte nástroje a knihovny OpenWatcom, bez kterých nepůjde kód BIOSu zkompilovat.

Jděte do adresáře zdrojových kódů VirtualBoxu a v textovém editoru otevřete zdrojový kód BIOSu.

vi src/VBox/Devices/PC/BIOS/orgs.asm

Ve zdrojových kódech si všimněte funkce BIOSORG a jejího volání. Tato funkce vkládá prázdná místa a řetězec "XM" na požadované pozice ve výsledném binárním souboru BIOSu. Kód, který se nachází za voláním této funkce je potom odsunut až za tuto adresu.

My tedy upravíme parametr volání funkce BIOSORG, tak abychom kód odsunuli až za prostor, do kterého budeme chtít vložit SLP řetězec. Jelikož se může stát (a v mém případě také stalo), že odsunutý kód bude po kompilaci kolidovat s kódem následujícím, budeme muset odsunout i tento následující kód a tak dále, dokud se kolizí nezbavíme.

Prozkoumejte seznam vašich SLP řetězců a stávající binární verzi BIOSu virtuálního stroje. Ta by měla odpovídat zobrazenému zdrojovému kódu, pokud odpovídat nebude po kompilaci můžete zkoumat BIOS Vámi kompilovaný. Zvažte různé varianty posunutí kódu a případné kolize. Já jsem zvolil umístění SLP řetězce na pozici 0xE076. Pokračujme tedy v úpravách pro Windows od Dellu.

Abychom mohli řetězec na danou pozici umístit, musíme odsunout jeden z bloků kódu BIOSu. Po letmém prozkoumání zdrojového kódu vidíme, že na pozici 0xE076 se již nachází kód začínající oddělovačem na pozici 0xE05B. Najděte tedy příslušné volání funkce BIOSORG a posuňte pozici o 240 (0xF0) bytů, tedy změňte její parametr na hodnotu 0xE14B. Tím vytvoříme dostatek prostoru pro vložení SLP.

Prozkoumáním binární verze BIOSu (soubor virtual_bios_image.bin) zjistíte, že odsunutím původní sekce o 240 bytů, dojde k ke kolizi s následujícím blokem kódu, začínajícím na 0xE2C3. Totiž mezi posledním nenulovým bytem předcházejícícho a začátkem tohoto bloku jsou volné pouhé 4 byty. Tento blok tedy posuňte také o 240 bytů na pozici 0xE3B3. Tím dojde ke kolizi s následujícím blokem na pozici 0xE3FE, ten už stačí posunout o 48 (0x30) bytů na pozici 0xE42E. Změny uložte a spusťte příkaz `diff` na původní a upravený zdrojový kód BIOSu, dostanete následující výsledek.

220c220
<      BIOSORG    0E05Bh
---
>      BIOSORG    0E14Bh
506c506
<      BIOSORG    0E2C3h
---
>      BIOSORG    0E3B3h
552c552
<      BIOSORG    0E3FEh
---
>      BIOSORG    0E42Eh

Přejdeme k přípravě BIOSu ke kompilaci. Abychom mohli zkompilovat BIOS z námi upraveného souboru je nejdříve nutné zkompilovat celý projekt, potom přegenerovat nižší úroveň assembleru BIOSu a poté projekt zkompilovat znovu a vytvořit tak binární podobu obrazu BIOSu. Z upraveného souboru orgs.asm je totiž vygenerován soubor VBoxBiosAlternative.asm ("jednodušší" assembler) a až ten je potom kompilován, při kompilaci celého projektu. Toto generování "jednoduššího" assembleru obstará program, který je v podobě zdrojových kódů součástí VirtualBoxu, proto je nutná ta první kompilace.

Přejděte tedy do složky se zdrojovými kódy VirtualBoxu ověřte, že máte správně nainstalovanou a nastavenou knihovnu OpenWatcom a projekt nakonfigurujte s parametrem "--disable-hardening".

configure --disable-hardening
source env.sh

Během konfigurace, konfigurační skript vypisuje dostupnost knihoven a nástrojů potřebných ke kompilaci projektu. V tomto výpisu ověřte, že nástroj OpenWatcom je dostupný. Zůstaňte v adresáři projektu a spusťte kompilaci.

kmk all

Kompilace může trvat i přes hodinu, záleží na výkonnosti vašeho stroje a nemusí se vždy povést úplně celá. Obvykle skončí s problémy při sestavení dokumentace. To nás nemusí příliš trápit, důležité je, zda-li se zkompiloval program pro generování BIOSu a binární podoba původního neupraveného BIOSu. Proto v adresáři s výstupem kompilace ověřte přítomnost následujících dvou souborů.

out/linux.x86/release/obj/MakeAlternativeSource/MakeAlternativeSource.o
out/linux.x86/release/obj/VBoxPcBios/VBoxPcBios.rom

Nyní přejděte zpět do adresáře se zdrojovým kódem BIOSu, vygenerujte jednodušší verzi assembleru BIOSu (soubor VBoxBiosAlternative.asm bude aktualizován) a projekt znovu zkompilujte.

ghex out/linux.x86/release/obj/VBoxPcBios/VBoxPcBios.rom

Já jsem vložil řetězec "Dell System" na pozici 0xE076, výsledná oblast bude tedy vypadat následovně.

0000e070  00 00 00 00 00 00 44 65  6c 6c 20 53 79 73 74 65  |......Dell Syste|
0000e080  6d 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |m...............|

Zkopírujte si soubor BIOSu někam ke konfiguraci virtuálního stroje a nastavte virtuální stroj tak aby tento upravený BIOS používal místo výchozího, obdobně jako v předcházející kapitole.

VBoxManage setextradata "VM name" "VBoxInternal/Devices/pcbios/0/Config/BiosRom"  "/cesta-k-upravenemu-biosu/virtual_bios_image.bin"

Spusťte Slax a zknotrolujte, zda-li vše běží tak jak má, pak spusťte Windows.

Řešení možných problémů.

  1. Virtuální stroj po konfiguraci upraveného BIOSu nenastartuje. To je pravděpodobně způsobeno chybnou úpravou volání funkce BIOSORG, tedy zřejmě jste posunuli nějaký kód o příliš velký počet bytů a ten teď koliduje s kódem následujícím. Překontrolujte ještě jednou možné kolize ve výsledné binární verzi upraveného BIOSu.
  2. Windows stále vyžadují aktivaci. Ověřte správnost pozice vloženého SLP řetězce.
  3. Kompilace VirtualBoxu selhává z různých příčin. Pokud se Vám nedaří BIOS zkompilovat a snažíte se zprovoznit Windows od Dellu, můžete si stáhnou mnou kompilovaný BIOS z Google docs nebo alternativně také binární podobu původního BIOSu. Pozor tyto BIOSy v sobě nemají vložené SLP řetězce, tato úprava zůstává na Vás.

Legálnost/licence

Setkal jsem se s názorem, že spuštění Windows XP ve VirtualBoxu je proti licenčním podmínkám systému. Tento názor se podle mne nezakládá na pravdě a v následujících odstavcích se jej pokusím rozporovat.

Výchozí podmínky: Společně s počítačem (koupil jsem jej jako použitý), jsem získal i systém Windows XP Service Pack 3 OEM (GMC). Licence k systému je uložena v souboru c:\windows\system32\eula.txt. Licence (End User Agreement Licence, dále jen EULA) má na konci souboru uvedeno "EULAID:XPSP2_RM.0_PRO_OEM_CS" což navozuje dojem, že se jedná o licenci k service packu 2. Při prohledání systému jsem ovšem nikde soubor se speciální licencí pro service pack 3 nenašel. Ani na stránce seznamu licencí produktů Microsoftu není novější (než tu kterou mám ve svém systému já) licence dostupná. K počítači nebyla přiložena jiná tištěná podoba licence a licence instalovaných aktualizací systému nemění podmínky používání systému. Předpokládám tedy, že platná licence je tato.

Systém jsem získal předinstalován společně s počítačem Dell Optiplex 740 a s tímto počítačem byl systém i původně dodáván. Proto se také jedná o OEM (GMC) verzi systému.

V úvodní kapitole smlouvy nalezneme větu: "Tato licenční smlouva s koncovým uživatelem ("EULA") je smlouvou mezi vámi (fyzickou nebo právnickou osobou) a výrobcem ("Výrobce") počítačového systému nebo součásti počítačového systému ("HARDWARE"), s nímž jste získali softwarové produkty společnosti Microsoft uvedené v Certifikátu pravosti („COA“) připojeném k HARDWARU nebo v dokumentaci k příslušnému produktu ("SOFTWARE").". Ze které vyplývá, že

  1. Windows jsem získal s počítačem bez periferií, tedy bez monitoru atd. Takto se i tento model původně prodával, licenční štítek je tedy nalepen na skříni počítače. Chápu tedy, že tento počítač je HARDWAREm jako součástí počítačového systému.
  2. Smlouva je uzavřena mezi mnou, tedy koncovým uživatelem a společností Dell Inc., jakožto výrobce počítačového systému. Tedy při porušení smlouvy se zodpovídám společnosti Dell, nikoli Microsoft, jak se spousta lidí mylně domnívá.

Ke konci úvodní kapitoly je vysvětlen pojem POČÍTAČ, takto: "Pojem "POČÍTAČ", tak jak je v tomto dokumentu používán, znamená HARDWARE, pokud je HARDWARE samostatným počítačovým systémem, nebo znamená počítačový systém, s nímž HARDWARE pracuje, je-li HARDWARE součástí počítačového systému.", což si dle předcházející kapitoly vykládám tak, že POČÍTAČ = HARDWARE z předcházející kapitoly + přidané periferie.

V kapitole 1.1 se mimo jiné píše: "Na POČÍTAČI můžete instalovat, užívat, zobrazovat a spouštět pouze jednu kopii SOFTWARU a přistupovat k této jedné kopii.", z čehož vyvozuji, že

  1. Existující instalaci je možné ve VirtualBoxu spustit a to pouze tak, že Windows nabootuje do VritualBoxu přímo z disku, jelikož nedojde k vytvoření více kopií Windows. Pochopitelně VirtualBox nesmí běžet na jiném počítači (a spouštět Windows například přes síť), jelikož pak by se už nejednalo o POČÍTAČ definovaný v úvodní kapitole.
  2. Naopak není možné vytvořit kopii disku a tu naimportovat jako virtuální disk do VirtualBoxu společně s Windows, protože tím už dojde k vytvoření více kopií, což je v rozporu s tímto odstavcem.

Kapitola 1.2 potvrzuje předcházející tvrzení větami: "Tato licence nesmí být sdílena, přenášena na různé počítače nebo na nich být současně používána. K SOFTWARU se spolu s POČÍTAČEM uděluje licence jako k jednomu nedělitelnému produktu a SOFTWARE může být používán pouze s POČÍTAČEM.", tedy Windows smí být použity pouze na daném POČÍTAČi.

Další kapitoly smlouvy EULA se k problému kopírování a spouštění Windows nevyjadřují.