Skip to content

Instantly share code, notes, and snippets.

@noorus
Forked from daaximus/create_iso.cpp
Created July 28, 2022 00:32
Show Gist options
  • Select an option

  • Save noorus/26be2a136b6c87a140c55af73b5978b9 to your computer and use it in GitHub Desktop.

Select an option

Save noorus/26be2a136b6c87a140c55af73b5978b9 to your computer and use it in GitHub Desktop.

Revisions

  1. @daaximus daaximus revised this gist Jul 1, 2022. No changes.
  2. @daaximus daaximus revised this gist Jul 1, 2022. 1 changed file with 46 additions and 46 deletions.
    92 changes: 46 additions & 46 deletions create_iso.cpp
    Original file line number Diff line number Diff line change
    @@ -4,52 +4,52 @@

    void create_iso( std::wstring_view src, std::wstring_view iso_path )
    {
    HRESULT hr;
    IFileSystemImage* fsimg;
    IFsiDirectoryItem* fsdir;
    IFileSystemImageResult* fsresult;
    IStream* img;
    IStream* filestream;

    hr = CoCreateInstance( __uuidof( MsftFileSystemImage ),
    NULL,
    CLSCTX_INPROC_SERVER,
    __uuidof( IFileSystemImage ),
    ( LPVOID* ) &fsimg );
    if ( SUCCEEDED( hr ) )
    {
    fsimg->get_Root( &fsdir );

    fsdir->AddTree( CComBSTR( src.data() ), VARIANT_TRUE );

    hr = fsimg->CreateResultImage( &fsresult );
    if ( SUCCEEDED( hr ) )
    {
    fsresult->get_ImageStream( &img );
    if ( SUCCEEDED( hr ) )
    {
    STATSTG statstg;
    ULARGE_INTEGER rd;
    ULARGE_INTEGER wr;

    SHCreateStreamOnFileEx( iso_path.data(),
    STGM_READWRITE,
    FILE_ATTRIBUTE_NORMAL,
    TRUE,
    NULL,
    &filestream );

    img->Stat( &statstg, STATFLAG_DEFAULT );
    img->CopyTo( filestream, statstg.cbSize, &rd, &wr );
    filestream->Release();
    img->Release();
    }

    fsresult->Release();
    }

    fsimg->Release();
    }
    HRESULT hr;
    IFileSystemImage* fsimg;
    IFsiDirectoryItem* fsdir;
    IFileSystemImageResult* fsresult;
    IStream* img;
    IStream* filestream;

    hr = CoCreateInstance( __uuidof( MsftFileSystemImage ),
    NULL,
    CLSCTX_INPROC_SERVER,
    __uuidof( IFileSystemImage ),
    ( LPVOID* ) &fsimg );
    if ( SUCCEEDED( hr ) )
    {
    fsimg->get_Root( &fsdir );

    fsdir->AddTree( CComBSTR( src.data() ), VARIANT_TRUE );

    hr = fsimg->CreateResultImage( &fsresult );
    if ( SUCCEEDED( hr ) )
    {
    fsresult->get_ImageStream( &img );
    if ( SUCCEEDED( hr ) )
    {
    STATSTG statstg;
    ULARGE_INTEGER rd;
    ULARGE_INTEGER wr;

    SHCreateStreamOnFileEx( iso_path.data(),
    STGM_READWRITE,
    FILE_ATTRIBUTE_NORMAL,
    TRUE,
    NULL,
    &filestream );

    img->Stat( &statstg, STATFLAG_DEFAULT );
    img->CopyTo( filestream, statstg.cbSize, &rd, &wr );
    filestream->Release();
    img->Release();
    }

    fsresult->Release();
    }

    fsimg->Release();
    }
    }

    CoInitializeEx(0);
  3. @daaximus daaximus created this gist Jul 1, 2022.
    61 changes: 61 additions & 0 deletions create_iso.cpp
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,61 @@
    #include <string>
    #include <atlbase.h>
    #include <imapi2fs.h>

    void create_iso( std::wstring_view src, std::wstring_view iso_path )
    {
    HRESULT hr;
    IFileSystemImage* fsimg;
    IFsiDirectoryItem* fsdir;
    IFileSystemImageResult* fsresult;
    IStream* img;
    IStream* filestream;

    hr = CoCreateInstance( __uuidof( MsftFileSystemImage ),
    NULL,
    CLSCTX_INPROC_SERVER,
    __uuidof( IFileSystemImage ),
    ( LPVOID* ) &fsimg );
    if ( SUCCEEDED( hr ) )
    {
    fsimg->get_Root( &fsdir );

    fsdir->AddTree( CComBSTR( src.data() ), VARIANT_TRUE );

    hr = fsimg->CreateResultImage( &fsresult );
    if ( SUCCEEDED( hr ) )
    {
    fsresult->get_ImageStream( &img );
    if ( SUCCEEDED( hr ) )
    {
    STATSTG statstg;
    ULARGE_INTEGER rd;
    ULARGE_INTEGER wr;

    SHCreateStreamOnFileEx( iso_path.data(),
    STGM_READWRITE,
    FILE_ATTRIBUTE_NORMAL,
    TRUE,
    NULL,
    &filestream );

    img->Stat( &statstg, STATFLAG_DEFAULT );
    img->CopyTo( filestream, statstg.cbSize, &rd, &wr );
    filestream->Release();
    img->Release();
    }

    fsresult->Release();
    }

    fsimg->Release();
    }
    }

    CoInitializeEx(0);
    create_iso(R("d:\in\testdir"), R("d:\out\test.iso"));
    //
    // OR...
    //
    create_iso(R("d:\in\testfile.ext"), R("d:\out\test.iso"));
    CoUninitialize();