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:CFFFFmemory area where VGA ROM would normally reside usingEFI_LEGACY_REGION_PROTOCOL,EFI_LEGACY_REGION2_PROTOCOLor Memory Type Range Registers depending on which method is available. - Install an int10h handler in the
C0000:CFFFFmemory 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:CFFFFmemory 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.efiif 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.