01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync/* $Id$ */
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync/** @file
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync * IPRT - Change the OS and SubSystem version to 4.0 (VS2010 trick).
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync */
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync/*
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync * Copyright (C) 2012 Oracle Corporation
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync *
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync * available from http://www.virtualbox.org. This file is free software;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync * you can redistribute it and/or modify it under the terms of the GNU
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync * General Public License (GPL) as published by the Free Software
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync */
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync/*******************************************************************************
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync* Header Files *
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync*******************************************************************************/
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync#include <Windows.h>
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync#include <stdio.h>
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync#include <string.h>
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync/** @todo Rewrite this so it can take options and print out error messages. */
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsyncint main(int argc, char **argv)
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync{
a274a7670efb4a6f3f226c854972d7dd140c526bvboxsync if (argc != 2)
a274a7670efb4a6f3f226c854972d7dd140c526bvboxsync return 30;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync FILE *pFile = fopen(argv[1], "r+b");
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync if (!pFile)
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync return 1;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync IMAGE_DOS_HEADER MzHdr;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync if (fread(&MzHdr, sizeof(MzHdr), 1, pFile) != 1)
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync return 2;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync if (fseek(pFile, MzHdr.e_lfanew, SEEK_SET) != 0)
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync return 3;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync IMAGE_NT_HEADERS32 NtHdrs;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync if (fread(&NtHdrs, sizeof(NtHdrs), 1, pFile) != 1)
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync return 4;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync if (NtHdrs.Signature != IMAGE_NT_SIGNATURE)
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync return 5;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync if (NtHdrs.FileHeader.Machine != IMAGE_FILE_MACHINE_I386)
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync return 6;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync if (NtHdrs.OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC)
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync return 7;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync if (NtHdrs.OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC)
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync return 7;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync IMAGE_NT_HEADERS32 NtHdrsNew = NtHdrs;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync if (NtHdrsNew.OptionalHeader.MajorOperatingSystemVersion > 4)
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync {
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync NtHdrsNew.OptionalHeader.MajorOperatingSystemVersion = 4;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync NtHdrsNew.OptionalHeader.MinorOperatingSystemVersion = 0;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync }
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync if (NtHdrsNew.OptionalHeader.MajorSubsystemVersion > 4)
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync {
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync NtHdrsNew.OptionalHeader.MajorSubsystemVersion = 4;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync NtHdrsNew.OptionalHeader.MinorSubsystemVersion = 0;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync }
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync if (memcmp(&NtHdrsNew, &NtHdrs, sizeof(NtHdrs)))
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync {
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync /** @todo calc checksum. */
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync NtHdrsNew.OptionalHeader.CheckSum = 0;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync if (fseek(pFile, MzHdr.e_lfanew, SEEK_SET) != 0)
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync return 10;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync if (fwrite(&NtHdrsNew, sizeof(NtHdrsNew), 1, pFile) != 1)
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync return 11;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync }
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync if (fclose(pFile) != 0)
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync return 29;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync return 0;
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync}
01b927bd5e6f4ed282b59586dbadeb7739e5fa37vboxsync