dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync/* $Id$ */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync/** @file
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync * VBoxStubBld - VirtualBox's Windows installer stub builder.
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2009-2010 Oracle Corporation
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync *
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
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync/*******************************************************************************
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync* Header Files *
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync*******************************************************************************/
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync#include <windows.h>
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync#include <shellapi.h>
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync#include <strsafe.h>
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync#include <VBox/version.h>
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync#include "VBoxStubBld.h"
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsyncHRESULT GetFile (const char* pszFilePath,
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync HANDLE* phFile,
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync DWORD* pdwFileSize)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync{
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync HRESULT hr = S_OK;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync *phFile = ::CreateFile(pszFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (INVALID_HANDLE_VALUE == *phFile)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = HRESULT_FROM_WIN32(GetLastError());
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync else
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync *pdwFileSize = ::GetFileSize(*phFile, NULL);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (!*pdwFileSize)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = HRESULT_FROM_WIN32(GetLastError());
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync return hr;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync}
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsyncHRESULT UpdateResource(HANDLE hFile,
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync const char* pszFilePath,
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync DWORD dwFileSize,
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync HANDLE hResourceUpdate,
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync const char* szResourceType,
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync const char* szResourceId)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync{
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync HRESULT hr = S_OK;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync PVOID pvFile = NULL;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync HANDLE hMap = NULL;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
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 {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = HRESULT_FROM_WIN32(GetLastError());
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (pvFile)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync ::UnmapViewOfFile(pvFile);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync pvFile = NULL;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (hMap)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync ::CloseHandle(hMap);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hMap = NULL;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync return hr;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync}
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsyncHRESULT IntegrateFile (HANDLE hResourceUpdate,
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync const char* szResourceType,
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync const char* szResourceId,
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync const char* pszFilePath)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync{
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync HRESULT hr = S_OK;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync HANDLE hFile = INVALID_HANDLE_VALUE;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync DWORD dwFileSize = 0;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync do
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = GetFile(pszFilePath, &hFile, &dwFileSize);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (FAILED(hr))
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = HRESULT_FROM_WIN32(GetLastError());
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync break;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync else
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = UpdateResource(hFile, pszFilePath, dwFileSize,
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hResourceUpdate, szResourceType, szResourceId);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (FAILED(hr))
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("ERROR: Error updating resource for file %s!", pszFilePath);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync break;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync } while (0);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (INVALID_HANDLE_VALUE != hFile)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync ::CloseHandle(hFile);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hFile = INVALID_HANDLE_VALUE;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync return hr;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync}
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsyncstatic char * MyPathFilename(const char *pszPath)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync{
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync const char *psz = pszPath;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync const char *pszName = pszPath;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync for (;; psz++)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync switch (*psz)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync /* handle separators. */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync case ':':
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync pszName = psz + 1;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync break;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync case '\\':
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync case '/':
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync pszName = psz + 1;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync break;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync /* the end */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync case '\0':
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (*pszName)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync return (char *)(void *)pszName;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync return NULL;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync /* will never get here */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync return NULL;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync}
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsyncint main (int argc, char* argv[])
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync{
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync HRESULT hr = S_OK;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync int rc = 0;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync char szSetupStub[_MAX_PATH] = {"VBoxStub.exe"};
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync char szOutput[_MAX_PATH] = {"VirtualBox-MultiArch.exe"};
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync HANDLE hUpdate = NULL;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync do
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
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
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (argc < 2)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("WARNING: No parameters given! Using default values!\n");
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync VBOXSTUBBUILDPKG stbBuildPkg[VBOXSTUB_MAX_PACKAGES] = {0};
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync VBOXSTUBPKG stbPkg[VBOXSTUB_MAX_PACKAGES] = {0};
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync VBOXSTUBPKGHEADER stbHeader =
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync "vbox$tub", /* File magic. */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync 1, /* Version. */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync 0 /* No files yet. */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync };
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync for (int i=1; i<argc; i++)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (0 == stricmp(argv[i], "-out") && argc > i+1)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = ::StringCchCopy(szOutput, _MAX_PATH, argv[i+1]);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync i++;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync else if (0 == stricmp(argv[i], "-stub") && argc > i+1)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = ::StringCchCopy(szSetupStub, _MAX_PATH, argv[i+1]);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync i++;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync else if (0 == stricmp(argv[i], "-target-all") && argc > i+1)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = ::StringCchCopy(stbBuildPkg[stbHeader.byCntPkgs].szSourcePath, _MAX_PATH, argv[i+1]);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync stbBuildPkg[stbHeader.byCntPkgs].byArch = VBOXSTUBPKGARCH_ALL;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync stbHeader.byCntPkgs++;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync i++;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync else if (0 == stricmp(argv[i], "-target-x86") && argc > i+1)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = ::StringCchCopy(stbBuildPkg[stbHeader.byCntPkgs].szSourcePath, _MAX_PATH, argv[i+1]);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync stbBuildPkg[stbHeader.byCntPkgs].byArch = VBOXSTUBPKGARCH_X86;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync stbHeader.byCntPkgs++;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync i++;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync else if (0 == stricmp(argv[i], "-target-amd64") && argc > i+1)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = ::StringCchCopy(stbBuildPkg[stbHeader.byCntPkgs].szSourcePath, _MAX_PATH, argv[i+1]);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync stbBuildPkg[stbHeader.byCntPkgs].byArch = VBOXSTUBPKGARCH_AMD64;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync stbHeader.byCntPkgs++;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync i++;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync else
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("ERROR: Invalid parameter: %s\n", argv[i]);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync break;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (FAILED(hr))
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("ERROR: StringCchCopy failed: %#x\n", hr);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync break;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (FAILED(hr))
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync break;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (stbHeader.byCntPkgs <= 0)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("ERROR: No packages defined! Exiting.\n");
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync break;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("Stub: %s\n", szSetupStub);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("Output: %s\n", szOutput);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("# Packages: %d\n", stbHeader.byCntPkgs);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (!::CopyFile(szSetupStub, szOutput, FALSE))
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = HRESULT_FROM_WIN32(GetLastError());
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("ERROR: Could not create stub loader: 0x%08x\n", hr);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync break;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hUpdate = ::BeginUpdateResource(szOutput, FALSE);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync PVBOXSTUBPKG pPackage = stbPkg;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync char szHeaderName[_MAX_PATH] = {0};
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync size_t iLen = 0;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync for (BYTE i=0; i<stbHeader.byCntPkgs; i++)
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("Integrating (Platform %d): %s\n", stbBuildPkg[i].byArch, stbBuildPkg[i].szSourcePath);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync /* Construct resource name. */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = ::StringCchPrintf(pPackage->szResourceName, _MAX_PATH, "BIN_%02d", i);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync pPackage->byArch = stbBuildPkg[i].byArch;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync /* Construct final name used when extracting. */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = ::StringCchCopy(pPackage->szFileName, _MAX_PATH, MyPathFilename(stbBuildPkg[i].szSourcePath));
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
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
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync /* Integrate file into binary. */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = IntegrateFile(hUpdate, RT_RCDATA, pPackage->szResourceName, stbBuildPkg[i].szSourcePath);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (FAILED(hr))
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("ERROR: Could not integrate binary %s (%s): 0x%08x\n",
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync pPackage->szResourceName, pPackage->szFileName, hr);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync rc = 1;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync pPackage++;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (FAILED(hr))
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync break;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (!::UpdateResource(hUpdate, RT_RCDATA, "MANIFEST", MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), &stbHeader, sizeof(VBOXSTUBPKGHEADER)))
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = HRESULT_FROM_WIN32(GetLastError());
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync break;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (!::EndUpdateResource(hUpdate, FALSE))
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hr = HRESULT_FROM_WIN32(GetLastError());
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync break;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("Integration done!\n");
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync } while (0);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync hUpdate = NULL;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync if (FAILED(hr))
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync printf("ERROR: Building failed! Last error: %d\n", GetLastError());
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync rc = 1;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync }
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync return rc;
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync}