Anyone who wants to run Windows 7 natively on Apple MacBook Air (Early 2015) models. Could also work for other Apple and non-Apple machines that do away with legacy loaders and legacy VGA ROM. Was originally devised for a MacBookAir7,2 13" (Early 2015).
Windows 7, even the x64 version booting in EFI mode, insists on using old VGA/VESA graphics configuration routines with the 10h interrupt. This used to work on older Apple machines because they had a legacy loader and/or an apropriate VGA ROM that provided that support. In newer computers they decided to remove that legacy compatibility layer and go pure EFI.
This program attempts to:
- Unlock the (unused but locked for writing)
C0000:CFFFF
memory area where VGA ROM would normally reside usingEFI_LEGACY_REGION_PROTOCOL
,EFI_LEGACY_REGION2_PROTOCOL
or Memory Type Range Registers depending on which method is available. - Install an int10h handler in the
C0000:CFFFF
memory area which handles the most important calls Windows 7 makes and announces lack of support for others. - Fill in and make available to Windows VESA video mode information compatible with the display adapter present that should enable Windows to write directly to the framebuffer before a more robust display driver takes over from vgapnp.sys.
- Lock the
C0000:CFFFF
memory area to prevent further possibly unauthorized writes. - Adjust the Interrupt Vector Table entry for the 10h interrupt handler to point to the shim entry point.
- Display the Windows wavy flag (or any other animation of choice).
- Chainload
\efi\microsoft\boot\bootmgfw.efi
if present on the same volume so that Windows can continue loading.
The shim needs to run before the Windows Boot Manager. For more information on how to get a dual booting setup working please see this MacRumors thread.
I used a virtual Lubuntu 15.04 install with GCC 4.9. Edit Conf/target.txt
after make
-ing BaseTools if you have a different version of GCC.
sudo apt-get install uuid-dev nasm tofrodos
git clone https://github.com/davidcie/VgaShim
cd VgaShim
source edksetup.sh BaseTools
make -C BaseTools/Source/C
build
You will find the binary in Build/MdeModule/RELEASE_GCC49/X64/VgaShim.efi
(or a similar folder if using GCC != 4.9).
The actual source lives under MdeModulePkg/Applications/VgaShim
.
- This solution is based on a VBE shim prepared by the OVMF project (
QemuVideoDxe/VbeShim
). - My wife for her patience over many coding evenings.
- Several people at MacRumors Forums who helped me understand graphics configuration.
- ReactOS for sharing code that helped me understand what Windows is trying to do.
- The EDK II project (and wider Tianocore) for making EFI app development possible at all.
- Microsoft and Apple for for making this enjoyable journey necessary.