You can use something like NSIS to complete the download and MSI. You need to write a simple NSIS script, for example:
!define PRODUCT_NAME "YourProductNameHere" Name "${PRODUCT_NAME}" OutFile "SetupWrapper.exe" Icon "Setup.ico" BrandingText " " SilentInstall silent Section SetOutPath "$TEMP\${PRODUCT_NAME}" ; Add all files that your installer needs here File "setup.exe" File "product.msi" ExecWait "$TEMP\${PRODUCT_NAME}\setup.exe" RMDir /r /REBOOTOK "$TEMP\${PRODUCT_NAME}" SectionEnd
Save this to a file called SetupWrapper.nsi and edit the product name and paths to setup.exe and your MSI file. Now you can create this file to get one EXE file containing the bootloader and MSI.
When this EXE is launched, it will not have its own user interface - it will simply extract your boot block and MSI into a temporary folder, then launch the bootloader and clean it later.
You can also add a post-build step to your project to create this shell, which will automatically create a unified EXE shell. To do this, you can add the following command:
path-to-NSIS\nsis-2.46\makensis.exe /V2 your-project-path\SetupWrapper.nsi
source share