dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync * VBoxStubBld - VirtualBox's Windows installer stub builder.
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2009-2010 Oracle Corporation
78f327ee942771169c65c91baf789fd10e72b01avboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
78f327ee942771169c65c91baf789fd10e72b01avboxsync * available from http://www.virtualbox.org. This file is free software;
78f327ee942771169c65c91baf789fd10e72b01avboxsync * you can redistribute it and/or modify it under the terms of the GNU
78f327ee942771169c65c91baf789fd10e72b01avboxsync * General Public License (GPL) as published by the Free Software
78f327ee942771169c65c91baf789fd10e72b01avboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
78f327ee942771169c65c91baf789fd10e72b01avboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
78f327ee942771169c65c91baf789fd10e72b01avboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync/*******************************************************************************
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync* Header Files *
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync*******************************************************************************/
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync *phFile = ::CreateFile(pszFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync pvFile = ::MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, dwFileSize);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (!::UpdateResourceA(hResourceUpdate, szResourceType, szResourceId,
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), pvFile, dwFileSize))
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = UpdateResource(hFile, pszFilePath, dwFileSize,
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("ERROR: Error updating resource for file %s!", pszFilePath);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync } while (0);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync /* handle separators. */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync /* the end */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync return (char *)(void *)pszName;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync /* will never get here */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync char szOutput[_MAX_PATH] = {"VirtualBox-MultiArch.exe"};
2291faee92ebb5cc9722cd3f22e499900a5a411fvboxsync printf(VBOX_PRODUCT " Stub Builder v%d.%d.%d.%d\n",
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync VBOX_VERSION_MAJOR, VBOX_VERSION_MINOR, VBOX_VERSION_BUILD, VBOX_SVN_REV);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("WARNING: No parameters given! Using default values!\n");
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync VBOXSTUBBUILDPKG stbBuildPkg[VBOXSTUB_MAX_PACKAGES] = {0};
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync 0 /* No files yet. */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = ::StringCchCopy(szOutput, _MAX_PATH, argv[i+1]);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync else if (0 == stricmp(argv[i], "-stub") && argc > i+1)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = ::StringCchCopy(szSetupStub, _MAX_PATH, argv[i+1]);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync else if (0 == stricmp(argv[i], "-target-all") && argc > i+1)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = ::StringCchCopy(stbBuildPkg[stbHeader.byCntPkgs].szSourcePath, _MAX_PATH, argv[i+1]);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync stbBuildPkg[stbHeader.byCntPkgs].byArch = VBOXSTUBPKGARCH_ALL;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync else if (0 == stricmp(argv[i], "-target-x86") && argc > i+1)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = ::StringCchCopy(stbBuildPkg[stbHeader.byCntPkgs].szSourcePath, _MAX_PATH, argv[i+1]);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync stbBuildPkg[stbHeader.byCntPkgs].byArch = VBOXSTUBPKGARCH_X86;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync else if (0 == stricmp(argv[i], "-target-amd64") && argc > i+1)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = ::StringCchCopy(stbBuildPkg[stbHeader.byCntPkgs].szSourcePath, _MAX_PATH, argv[i+1]);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync stbBuildPkg[stbHeader.byCntPkgs].byArch = VBOXSTUBPKGARCH_AMD64;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("ERROR: Could not create stub loader: 0x%08x\n", hr);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("Integrating (Platform %d): %s\n", stbBuildPkg[i].byArch, stbBuildPkg[i].szSourcePath);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync /* Construct resource name. */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = ::StringCchPrintf(pPackage->szResourceName, _MAX_PATH, "BIN_%02d", i);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync /* Construct final name used when extracting. */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = ::StringCchCopy(pPackage->szFileName, _MAX_PATH, MyPathFilename(stbBuildPkg[i].szSourcePath));
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync /* Integrate header into binary. */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = ::StringCchPrintf(szHeaderName, _MAX_PATH, "HDR_%02d", i);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = UpdateResource(hUpdate, RT_RCDATA, szHeaderName, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), pPackage, sizeof(VBOXSTUBPKG));
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync /* Integrate file into binary. */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = IntegrateFile(hUpdate, RT_RCDATA, pPackage->szResourceName, stbBuildPkg[i].szSourcePath);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("ERROR: Could not integrate binary %s (%s): 0x%08x\n",
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync pPackage->szResourceName, pPackage->szFileName, hr);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (!::UpdateResource(hUpdate, RT_RCDATA, "MANIFEST", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), &stbHeader, sizeof(VBOXSTUBPKGHEADER)))
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync } while (0);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("ERROR: Building failed! Last error: %d\n", GetLastError());