From eeb7eef453c0dcc07f7a1d8565ca48916fe1bbec Mon Sep 17 00:00:00 2001 From: Pete Batard Date: Fri, 22 Apr 2016 17:50:55 +0200 Subject: [PATCH] use uefi_main as entry point and use UEFI arch designations * Also finx additional ARM compilation issues with gcc and enable ARM debugging with Visual Studio --- .msvc/debug.vbs | 15 ++++++-- .msvc/gnu-efi.vcxproj | 8 ++-- .msvc/uefi-ntfs.vcxproj | 20 +++++----- .msvc/uefi-ntfs.vcxproj.user | 12 +++--- Makefile | 74 ++++++++++++++++++++++-------------- boot.c | 9 +++-- uefi-ntfs.sln | 40 +++++++++---------- 7 files changed, 101 insertions(+), 77 deletions(-) diff --git a/.msvc/debug.vbs b/.msvc/debug.vbs index 979c4ec..bc19d8d 100644 --- a/.msvc/debug.vbs +++ b/.msvc/debug.vbs @@ -8,8 +8,9 @@ ' Modify these variables as needed QEMU_PATH = "C:\Program Files\qemu\" +' You can add something like "-S -gdb tcp:127.0.0.1:1234" if you plan to use gdb to debug +QEMU_OPTS = "-net none -monitor none -parallel none" OVMF_DIR = "http://efi.akeo.ie/OVMF/" -OVMF_REV = "r15214" ' Set to True if you need to download a file that might be cached locally NO_CACHE = False @@ -24,13 +25,19 @@ If (TARGET = "x86") Then ElseIf (TARGET = "x64") Then UEFI_EXT = "x64" QEMU_ARCH = "x86_64" +ElseIf (TARGET = "ARM") Then + UEFI_EXT = "arm" + QEMU_ARCH = "arm" + ' You can also add '-device VGA' to the options below, to get graphics output. + ' But if you do, be mindful that the keyboard input may not work... :( + QEMU_OPTS = "-M virt -cpu cortex-a15 " & QEMU_OPTS Else MsgBox("Unsupported debug target: " & TARGET) Call WScript.Quit(1) End If BOOT_NAME = "boot" & UEFI_EXT & ".efi" OVMF_ARCH = UCase(UEFI_EXT) -OVMF_ZIP = "OVMF-" & OVMF_ARCH & "-" & OVMF_REV & ".zip" +OVMF_ZIP = "OVMF-" & OVMF_ARCH & ".zip" OVMF_BIOS = "OVMF_" & OVMF_ARCH & ".fd" OVMF_URL = OVMF_DIR & OVMF_ZIP QEMU_EXE = "qemu-system-" & QEMU_ARCH & "w.exe" @@ -38,7 +45,7 @@ VHD_ZIP = "ntfs.zip" VHD_IMG = "ntfs.vhd" VHD_URL = "http://efi.akeo.ie/test/" & VHD_ZIP DRV = "ntfs_" & UEFI_EXT & ".efi" -DRV_URL = "http://efi.akeo.ie/downloads/efifs-0.8/" & UEFI_EXT & "/" & DRV +DRV_URL = "http://efi.akeo.ie/downloads/efifs-0.9/" & UEFI_EXT & "/" & DRV ' Globals Set fso = CreateObject("Scripting.FileSystemObject") @@ -147,4 +154,4 @@ Call shell.Run("%COMSPEC% /c mkdir ""image\efi\boot""", 0, True) Call fso.CopyFile(BIN, "image\efi\boot\" & BOOT_NAME, True) Call shell.Run("%COMSPEC% /c mkdir ""image\efi\rufus""", 0, True) Call fso.CopyFile(DRV, "image\efi\rufus\" & DRV, True) -Call shell.Run("""" & QEMU_PATH & QEMU_EXE & """ -L . -bios " & OVMF_BIOS & " -net none -hda fat:image -hdb ntfs.vhd", 1, True) +Call shell.Run("""" & QEMU_PATH & QEMU_EXE & """ " & QEMU_OPTS & " -L . -bios " & OVMF_BIOS & " -hda fat:image -hdb ntfs.vhd", 1, True) diff --git a/.msvc/gnu-efi.vcxproj b/.msvc/gnu-efi.vcxproj index f76bf36..94c62be 100644 --- a/.msvc/gnu-efi.vcxproj +++ b/.msvc/gnu-efi.vcxproj @@ -93,11 +93,11 @@ - $(SolutionDir)x86_64\$(Configuration)\ + $(SolutionDir)x64\$(Configuration)\ $(OutDir)$(ProjectName)\ - $(SolutionDir)x86_32\$(Configuration)\ + $(SolutionDir)ia32\$(Configuration)\ $(OutDir)$(ProjectName)\ @@ -105,11 +105,11 @@ $(OutDir)$(ProjectName)\ - $(SolutionDir)x86_64\$(Configuration)\ + $(SolutionDir)x64\$(Configuration)\ $(OutDir)$(ProjectName)\ - $(SolutionDir)x86_32\$(Configuration)\ + $(SolutionDir)ia32\$(Configuration)\ $(OutDir)$(ProjectName)\ diff --git a/.msvc/uefi-ntfs.vcxproj b/.msvc/uefi-ntfs.vcxproj index e110d8a..30e6ad7 100644 --- a/.msvc/uefi-ntfs.vcxproj +++ b/.msvc/uefi-ntfs.vcxproj @@ -93,7 +93,7 @@ .efi false false - $(SolutionDir)x86_64\$(Configuration)\ + $(SolutionDir)x64\$(Configuration)\ $(OutDir)$(ProjectName)\ bootx64 @@ -101,7 +101,7 @@ .efi false false - $(SolutionDir)x86_32\$(Configuration)\ + $(SolutionDir)ia32\$(Configuration)\ $(OutDir)$(ProjectName)\ bootia32 @@ -117,7 +117,7 @@ .efi false false - $(SolutionDir)x86_64\$(Configuration)\ + $(SolutionDir)x64\$(Configuration)\ $(OutDir)$(ProjectName)\ bootx64 @@ -125,7 +125,7 @@ .efi false false - $(SolutionDir)x86_32\$(Configuration)\ + $(SolutionDir)ia32\$(Configuration)\ $(OutDir)$(ProjectName)\ bootia32 @@ -159,7 +159,7 @@ false false true - EfiMain + efi_main EFI Application $(OutDir);%(AdditionalLibraryDirectories) /IGNORE:4210 @@ -188,7 +188,7 @@ false false true - EfiMain + efi_main EFI Application $(OutDir);%(AdditionalLibraryDirectories) /IGNORE:4210 @@ -218,7 +218,7 @@ false true - EfiMain + efi_main EFI Application $(OutDir);%(AdditionalLibraryDirectories) /IGNORE:4210 @@ -246,7 +246,7 @@ false true - EfiMain + efi_main EFI Application gnu-efi.lib;libcmt.lib;%(AdditionalDependencies) $(OutDir);%(AdditionalLibraryDirectories) @@ -275,7 +275,7 @@ false true - EfiMain + efi_main EFI Application gnu-efi.lib;libcmt.lib;%(AdditionalDependencies) $(OutDir);%(AdditionalLibraryDirectories) @@ -305,7 +305,7 @@ false true - EfiMain + efi_main EFI Application gnu-efi.lib;libcmt.lib;%(AdditionalDependencies) $(OutDir);%(AdditionalLibraryDirectories) diff --git a/.msvc/uefi-ntfs.vcxproj.user b/.msvc/uefi-ntfs.vcxproj.user index 8f06017..93dbf1c 100644 --- a/.msvc/uefi-ntfs.vcxproj.user +++ b/.msvc/uefi-ntfs.vcxproj.user @@ -2,37 +2,37 @@ $(SystemRoot)\System32\wscript - //d .msvc\debug.vbs $(Configuration) $(TargetPath) $(PlatformShortName) + //d .msvc\debug.vbs "$(Configuration)" "$(TargetPath)" "$(PlatformShortName)" WindowsLocalDebugger $(SolutionDir) $(SystemRoot)\System32\wscript - //d .msvc\debug.vbs $(Configuration) $(TargetPath) $(PlatformShortName) + //d .msvc\debug.vbs "$(Configuration)" "$(TargetPath)" "$(PlatformShortName)" WindowsLocalDebugger $(SolutionDir) $(SystemRoot)\System32\wscript - //d .msvc\debug.vbs $(Configuration) $(TargetPath) $(PlatformShortName) + //d .msvc\debug.vbs "$(Configuration)" "$(TargetPath)" "$(PlatformShortName)" WindowsLocalDebugger $(SolutionDir) $(SystemRoot)\System32\wscript - //d .msvc\debug.vbs $(Configuration) $(TargetPath) $(PlatformShortName) + //d .msvc\debug.vbs "$(Configuration)" "$(TargetPath)" "$(PlatformShortName)" WindowsLocalDebugger $(SolutionDir) $(SystemRoot)\System32\wscript - //d .msvc\debug.vbs $(Configuration) $(TargetPath) $(PlatformShortName) + //d .msvc\debug.vbs "$(Configuration)" "$(TargetPath)" "$(PlatformShortName)" WindowsLocalDebugger $(SolutionDir) $(SystemRoot)\System32\wscript - //d .msvc\debug.vbs $(Configuration) $(TargetPath) $(PlatformShortName) + //d .msvc\debug.vbs "$(Configuration)" "$(TargetPath)" "$(PlatformShortName)" WindowsLocalDebugger $(SolutionDir) diff --git a/Makefile b/Makefile index 1edc7b0..8516dd6 100644 --- a/Makefile +++ b/Makefile @@ -3,8 +3,8 @@ SUBSYSTEM = 10 # 10 = EFI application # Try to auto-detect the target ARCH ifeq ($(shell uname -o),Msys) - IS_MINGW32 = $(findstring MINGW32,$(shell uname -s)) - IS_MINGW64 = $(findstring MINGW64,$(shell uname -s)) + IS_MINGW32 = $(findstring MINGW32,$(shell uname -s)) + IS_MINGW64 = $(findstring MINGW64,$(shell uname -s)) ifeq ($(IS_MINGW32),MINGW32) ARCH = ia32 endif @@ -36,7 +36,7 @@ ifeq ($(ARCH),x64) CROSS_COMPILE = $(GCC_ARCH)-$(MINGW_HOST)-mingw32- EP_PREFIX = CFLAGS = -m64 -mno-red-zone - LDFLAGS = -Wl,-dll + LDFLAGS = -Wl,-dll -Wl,--subsystem,$(SUBSYSTEM) else ifeq ($(ARCH),ia32) GNUEFI_ARCH = ia32 GCC_ARCH = i686 @@ -44,17 +44,29 @@ else ifeq ($(ARCH),ia32) CROSS_COMPILE = $(GCC_ARCH)-$(MINGW_HOST)-mingw32- EP_PREFIX = _ CFLAGS = -m32 -mno-red-zone - LDFLAGS = -Wl,-dll + LDFLAGS = -Wl,-dll -Wl,--subsystem,$(SUBSYSTEM) else ifeq ($(ARCH),arm) GNUEFI_ARCH = arm GCC_ARCH = arm QEMU_ARCH = arm - CROSS_COMPILE = $(GCC_ARCH)-linux-gnueabi- + QEMU_OPTS = -M virt -cpu cortex-a15 + CROSS_COMPILE = $(GCC_ARCH)-linux-gnueabihf- EP_PREFIX = CFLAGS = -marm -fpic -fshort-wchar - LDFLAGS = -Wl,--no-wchar-size-warning + LDFLAGS = -Wl,--no-wchar-size-warning -Wl,--defsym=EFI_SUBSYSTEM=$(SUBSYSTEM) + CRT0_LIBS = -lgnuefi endif OVMF_ARCH = $(shell echo $(ARCH) | tr a-z A-Z) +OVMF_ZIP = OVMF-$(OVMF_ARCH).zip +GNUEFI_DIR = $(CURDIR)/gnu-efi +GNUEFI_LIBS = lib + +# If the compiler produces an elf binary, we need to fiddle with a PE crt0 +ifneq ($(CRT0_LIBS),) + CRT0_DIR = $(GNUEFI_DIR)/$(GNUEFI_ARCH)/gnuefi + LDFLAGS += -L$(CRT0_DIR) -T $(GNUEFI_DIR)/gnuefi/elf_$(ARCH)_efi.lds $(CRT0_DIR)/crt0-efi-$(ARCH).o + GNUEFI_LIBS += gnuefi +endif # SYSTEMROOT is only defined on Windows systems ifneq ($(SYSTEMROOT),) @@ -65,26 +77,26 @@ ifneq ($(SYSTEMROOT),) else QEMU = qemu-system-$(QEMU_ARCH) -nographic endif -GNUEFI_DIR = $(CURDIR)/gnu-efi - -CC := $(CROSS_COMPILE)gcc -CFLAGS += -fno-stack-protector -Wshadow -Wall -Wunused -Werror-implicit-function-declaration -CFLAGS += -I$(GNUEFI_DIR)/inc -I$(GNUEFI_DIR)/inc/$(GNUEFI_ARCH) -I$(GNUEFI_DIR)/inc/protocol -LDFLAGS+= -Wl,--subsystem,$(SUBSYSTEM) -nostdlib -shared -e $(EP_PREFIX)EfiMain -LIBS := -L$(GNUEFI_DIR)/$(GNUEFI_ARCH)/lib -lefi -OVMF_ZIP = OVMF-$(OVMF_ARCH)-r15214.zip +CC := $(CROSS_COMPILE)gcc +OBJCOPY := $(CROSS_COMPILE)objcopy +CFLAGS += -fno-stack-protector -Wshadow -Wall -Wunused -Werror-implicit-function-declaration +CFLAGS += -I$(GNUEFI_DIR)/inc -I$(GNUEFI_DIR)/inc/$(GNUEFI_ARCH) -I$(GNUEFI_DIR)/inc/protocol +CFLAGS += -DCONFIG_$(GNUEFI_ARCH) -D__MAKEWITH_GNUEFI -DGNU_EFI_USE_MS_ABI +LDFLAGS += -L$(GNUEFI_DIR)/$(GNUEFI_ARCH)/lib -e $(EP_PREFIX)efi_main +LDFLAGS += -s -Wl,-Bsymbolic -nostdlib -shared +LIBS = -lefi $(CRT0_LIBS) ifeq (, $(shell which $(CC))) $(error The selected compiler ($(CC)) was not found) endif -GCCVERSION := $(shell $(CC) -dumpversion | cut -f1 -d.) -GCCMINOR := $(shell $(CC) -dumpversion | cut -f2 -d.) -GCCMACHINE := $(shell $(CC) -dumpmachine) -GCCNEWENOUGH := $(shell ( [ $(GCCVERSION) -gt "4" ] \ - || ( [ $(GCCVERSION) -eq "4" ] \ - && [ $(GCCMINOR) -ge "7" ] ) ) \ +GCCVERSION := $(shell $(CC) -dumpversion | cut -f1 -d.) +GCCMINOR := $(shell $(CC) -dumpversion | cut -f2 -d.) +GCCMACHINE := $(shell $(CC) -dumpmachine) +GCCNEWENOUGH := $(shell ( [ $(GCCVERSION) -gt "4" ] \ + || ( [ $(GCCVERSION) -eq "4" ] \ + && [ $(GCCMINOR) -ge "7" ] ) ) \ && echo 1) ifneq ($(GCCNEWENOUGH),1) $(error You need GCC 4.7 or later) @@ -94,24 +106,30 @@ ifneq ($(GCC_ARCH),$(findstring $(GCC_ARCH), $(GCCMACHINE))) $(error The selected compiler ($(CC)) is not set for $(TARGET)) endif - .PHONY: all clean superclean -all: boot.efi +all: $(GNUEFI_DIR)/$(GNUEFI_ARCH)/lib/libefi.a boot.efi $(GNUEFI_DIR)/$(GNUEFI_ARCH)/lib/libefi.a: - $(MAKE) -C$(GNUEFI_DIR) CROSS_COMPILE=$(CROSS_COMPILE) ARCH=$(GNUEFI_ARCH) lib + $(MAKE) -C$(GNUEFI_DIR) CROSS_COMPILE=$(CROSS_COMPILE) ARCH=$(GNUEFI_ARCH) $(GNUEFI_LIBS) -%.efi: %.o $(GNUEFI_DIR)/$(GNUEFI_ARCH)/lib/libefi.a +%.efi: %.o @echo [LD] $(notdir $@) +ifeq ($(CRT0_LIBS),) @$(CC) $(LDFLAGS) $< -o $@ $(LIBS) +else + @$(CC) $(LDFLAGS) $< -o $*.elf $(LIBS) + @$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel* \ + -j .rela* -j .reloc -j .eh_frame -O binary $*.elf $@ + @rm -f $*.elf +endif %.o: %.c @echo [CC] $(notdir $@) @$(CC) $(CFLAGS) -ffreestanding -c $< qemu: CFLAGS += -D_DEBUG -qemu: boot.efi OVMF_$(OVMF_ARCH).fd ntfs.vhd image/efi/boot/boot$(ARCH).efi image/efi/rufus/ntfs_$(ARCH).efi - $(QEMU) -bios ./OVMF_$(OVMF_ARCH).fd -net none -hda fat:image -hdb ntfs.vhd +qemu: all OVMF_$(OVMF_ARCH).fd ntfs.vhd image/efi/boot/boot$(ARCH).efi image/efi/rufus/ntfs_$(ARCH).efi + $(QEMU) $(QEMU_OPTS) -bios ./OVMF_$(OVMF_ARCH).fd -net none -hda fat:image -hdb ntfs.vhd image/efi/boot/boot$(ARCH).efi: boot.efi mkdir -p image/efi/boot @@ -119,7 +137,7 @@ image/efi/boot/boot$(ARCH).efi: boot.efi # NTFS driver ntfs_$(ARCH).efi: - wget http://efi.akeo.ie/downloads/efifs-0.8/$(ARCH)/ntfs_$(ARCH).efi + wget http://efi.akeo.ie/downloads/efifs-0.9/$(ARCH)/ntfs_$(ARCH).efi image/efi/rufus/ntfs_$(ARCH).efi: ntfs_$(ARCH).efi mkdir -p image/efi/rufus @@ -132,14 +150,12 @@ ntfs.vhd: rm ntfs.zip OVMF_$(OVMF_ARCH).fd: - # Use our own mirror, since SourceForge are being such ASSES about direct downloads... wget http://efi.akeo.ie/OVMF/$(OVMF_ZIP) unzip $(OVMF_ZIP) OVMF.fd mv OVMF.fd OVMF_$(OVMF_ARCH).fd rm $(OVMF_ZIP) clean: - $(MAKE) -C$(GNUEFI_DIR) clean rm -f boot.efi *.o rm -rf image diff --git a/boot.c b/boot.c index 2e0969c..88a3e80 100644 --- a/boot.c +++ b/boot.c @@ -51,11 +51,11 @@ EFI_HANDLE EfiImageHandle = NULL; #endif // Always good to know the arch we're running #if defined(_M_X64) || defined(__x86_64__) - static CHAR16* Arch = L"x86_64"; + static CHAR16* Arch = L"x64"; #elif defined(_M_IX86) || defined(__i386__) - static CHAR16* Arch = L"x86_32"; + static CHAR16* Arch = L"ia32"; #elif defined (_M_ARM) || defined(__arm__) - static CHAR16* Arch = L"ARM"; + static CHAR16* Arch = L"arm"; #endif /* @@ -320,8 +320,9 @@ static VOID DisconnectBlockingDrivers(VOID) { /* * Application entry-point + * NB: This must be set to 'efi_main' for gnu-efi crt0 compatibility */ -EFI_STATUS EfiMain(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) +EFI_STATUS efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) { EFI_LOADED_IMAGE *LoadedImage; EFI_STATUS Status; diff --git a/uefi-ntfs.sln b/uefi-ntfs.sln index 91e0831..6320441 100644 --- a/uefi-ntfs.sln +++ b/uefi-ntfs.sln @@ -13,37 +13,37 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|arm = Debug|arm - Debug|x86_32 = Debug|x86_32 - Debug|x86_64 = Debug|x86_64 + Debug|ia32 = Debug|ia32 + Debug|x64 = Debug|x64 Release|arm = Release|arm - Release|x86_32 = Release|x86_32 - Release|x86_64 = Release|x86_64 + Release|ia32 = Release|ia32 + Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|arm.ActiveCfg = Debug|ARM {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|arm.Build.0 = Debug|ARM - {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|x86_32.ActiveCfg = Debug|Win32 - {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|x86_32.Build.0 = Debug|Win32 - {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|x86_64.ActiveCfg = Debug|x64 - {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|x86_64.Build.0 = Debug|x64 + {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|ia32.ActiveCfg = Debug|Win32 + {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|ia32.Build.0 = Debug|Win32 + {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|x64.ActiveCfg = Debug|x64 + {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Debug|x64.Build.0 = Debug|x64 {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|arm.ActiveCfg = Release|ARM {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|arm.Build.0 = Release|ARM - {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|x86_32.ActiveCfg = Release|Win32 - {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|x86_32.Build.0 = Release|Win32 - {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|x86_64.ActiveCfg = Release|x64 - {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|x86_64.Build.0 = Release|x64 + {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|ia32.ActiveCfg = Release|Win32 + {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|ia32.Build.0 = Release|Win32 + {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|x64.ActiveCfg = Release|x64 + {DFA0BA98-D0BA-4176-9A34-B5BA6355B1DE}.Release|x64.Build.0 = Release|x64 {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|arm.ActiveCfg = Debug|ARM {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|arm.Build.0 = Debug|ARM - {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|x86_32.ActiveCfg = Debug|Win32 - {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|x86_32.Build.0 = Debug|Win32 - {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|x86_64.ActiveCfg = Debug|x64 - {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|x86_64.Build.0 = Debug|x64 + {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|ia32.ActiveCfg = Debug|Win32 + {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|ia32.Build.0 = Debug|Win32 + {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|x64.ActiveCfg = Debug|x64 + {3135D563-9596-4584-9ED6-616ADEC52974}.Debug|x64.Build.0 = Debug|x64 {3135D563-9596-4584-9ED6-616ADEC52974}.Release|arm.ActiveCfg = Release|ARM {3135D563-9596-4584-9ED6-616ADEC52974}.Release|arm.Build.0 = Release|ARM - {3135D563-9596-4584-9ED6-616ADEC52974}.Release|x86_32.ActiveCfg = Release|Win32 - {3135D563-9596-4584-9ED6-616ADEC52974}.Release|x86_32.Build.0 = Release|Win32 - {3135D563-9596-4584-9ED6-616ADEC52974}.Release|x86_64.ActiveCfg = Release|x64 - {3135D563-9596-4584-9ED6-616ADEC52974}.Release|x86_64.Build.0 = Release|x64 + {3135D563-9596-4584-9ED6-616ADEC52974}.Release|ia32.ActiveCfg = Release|Win32 + {3135D563-9596-4584-9ED6-616ADEC52974}.Release|ia32.Build.0 = Release|Win32 + {3135D563-9596-4584-9ED6-616ADEC52974}.Release|x64.ActiveCfg = Release|x64 + {3135D563-9596-4584-9ED6-616ADEC52974}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE