CoCreateIsoForMounting

Creates an ISO file and inserts a file into it.

Example:

HRESULT Result = S_OK;

Result = CoCreateIsoForMounting((PWCHAR)L"MyFile.txt", //test.txt name inside of iso
                               (PWCHAR)L"C:\\Users\\User\\Desktop\\test.txt", 
                               (PWCHAR)L"C:\\Users\\User\\Desktop\\MyIso.iso", 
                               (PWCHAR)L"NewVolume");
#include <imapi2fs.h>
#include <shlwapi.h>

#pragma comment(lib, "shlwapi.lib")

HRESULT CoCreateIsoForMounting(_In_ PWCHAR FileDisplayName, _In_ PWCHAR FullPathToFile ,_In_ PWCHAR FullIsoPath, _In_ PWCHAR VolumeName)
{
    HRESULT Result = S_OK;

    IFileSystemImage* Fsi = NULL;
    IFsiDirectoryItem* Root = NULL;
    IFileSystemImageResult* ImageResult = NULL;
    IStream* Stream = NULL;
    IStream* ImageStream = NULL;

    BSTR bpFileDisplayName = NULL;
    BSTR bpFullIsoPath = NULL;
    BSTR bpVolumeName = NULL;

    HANDLE hHandle = INVALID_HANDLE_VALUE;
    ULARGE_INTEGER LargeInteger = { 0 };
    DWORD BytesWritten = 0;
    BYTE Buffer[4096] = { 0 };
    ULONG BytesRead = 0;

    STATSTG Stat = { 0 };

    Result = CoInitialize(NULL);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = CoCreateInstance(__uuidof(MsftFileSystemImage), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&Fsi));
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = Fsi->put_FileSystemsToCreate(FsiFileSystemISO9660);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    bpVolumeName = SysAllocString(VolumeName);
    if (bpVolumeName == NULL)
        goto EXIT_ROUTINE;

    Result = Fsi->put_VolumeName(bpVolumeName);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = Fsi->get_Root(&Root);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    bpFileDisplayName = SysAllocString(FileDisplayName);
    if(bpFileDisplayName == NULL)
        goto EXIT_ROUTINE;

    Result = SHCreateStreamOnFileEx(FullPathToFile, STGM_READ | STGM_SHARE_DENY_WRITE, FILE_ATTRIBUTE_NORMAL, FALSE, NULL, &Stream);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = Root->AddFile(bpFileDisplayName, Stream);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = Fsi->CreateResultImage(&ImageResult);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = ImageResult->get_ImageStream(&ImageStream);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    hHandle = CreateFileW(FullIsoPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hHandle == INVALID_HANDLE_VALUE)
        goto EXIT_ROUTINE;

    Result = ImageStream->Stat(&Stat, STATFLAG_NONAME);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = ImageStream->Seek({ 0 }, STREAM_SEEK_END, &LargeInteger);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    Result = ImageStream->Seek({ 0 }, STREAM_SEEK_SET, NULL);
    if (!SUCCEEDED(Result))
        goto EXIT_ROUTINE;

    while (ImageStream->Read(Buffer, sizeof(Buffer), &BytesRead) == S_OK && BytesRead > 0)
    {
        if (!WriteFile(hHandle, Buffer, BytesRead, &BytesWritten, NULL))
                goto EXIT_ROUTINE;
    }

EXIT_ROUTINE:

    if (bpVolumeName)
        SysFreeString(bpVolumeName);

    if (bpFileDisplayName)
        SysFreeString(bpFileDisplayName);

    if (hHandle)
        CloseHandle(hHandle);

    if (Stream)
        Stream->Release();

    if (ImageStream)
        ImageStream->Release();

    if (ImageResult)
        ImageResult->Release();

    if (Root)
        Root->Release();

    if (Fsi)
        Fsi->Release();

    CoUninitialize();

    return Result;
}

Last updated