使用IMAPI V2 制作Boot image(启动盘)

原创 2013年12月03日 14:37:41

  好久没有更新了,最近在研究用IMAPI 来刻录启动光盘。MSDN的例子都是VB script的例子,以下是我简单写的C++例子。

 附上MSDN 对于IMAPI的链接:http://msdn.microsoft.com/en-us/library/windows/desktop/aa366450(v=vs.85).aspx


// BurnTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <imapi2.h>
#include <imapi2error.h>
#include <imapi2fs.h>
#include <imapi2fserror.h>
#include <Shlwapi.h>

#define BOOT_FILE_NAME_LEGACY _T("F:\\BootFile\\boot\\etfsboot.com") //CSM boot
#define BOOT_FILE_NAME_UEFI   _T("F:\\BootFile\\efi\\microsoft\\boot\\efisys_noprompt.bin") //UEFI boot

IFsiDirectoryItem *g_hRootDir = NULL;


int _tmain(int argc, _TCHAR* argv[])
{
	::CoInitializeEx(NULL, COINIT_MULTITHREADED); 

	HRESULT hr;
	IDiscMaster2* DiscMaster;
	IDiscRecorder2* DiscRecorder;
	IDiscFormat2Data* DataWriter;
	IDiscFormat2Data* DataWriterB;
	long totalDevices = 0;

	//create Master
	hr = CoCreateInstance(_uuidof(MsftDiscMaster2),NULL,CLSCTX_INPROC_SERVER,_uuidof(IDiscMaster2),(void**)&DiscMaster);
	if (hr != S_OK)
	{
		 std::cout<<"Create Disc Master fail... \n";  
	}else{

		std::cout<<"Create Disc Master success... \n";
	}

	//Create recorder
	hr = CoCreateInstance(__uuidof(MsftDiscRecorder2), NULL, CLSCTX_INPROC_SERVER,
		__uuidof(IDiscRecorder2), (void**)&DiscRecorder); 
	if (hr != S_OK)
	{
		std::cout<<"Create Disc Recorder fail... \n";  
	}else{

		std::cout<<"Create Disc Recorder success... \n";
	}
	
	//Get total devices and device uniqueID
	hr = DiscMaster->get_Count(&totalDevices);

	//for (long iDeviceIndex=0;iDeviceIndex<totalDevices;iDeviceIndex++)
	//{
		BSTR bstrUniqueID = NULL;
		hr = DiscMaster->get_Item(2,&bstrUniqueID);  //这里我直接指定了第三个光驱,实际中可以用循环遍历。
		hr = DiscRecorder->InitializeDiscRecorder(bstrUniqueID);

		BSTR bstrProductID = NULL;

		hr = DiscRecorder->get_ProductId(&bstrProductID);
		std::wcout<<bstrProductID<<"\n";
	//}

	hr = CoCreateInstance(__uuidof(MsftDiscFormat2Data), NULL, CLSCTX_INPROC_SERVER,
		__uuidof(IDiscFormat2Data), (void**)&DataWriter);

	hr = DataWriter->put_Recorder(DiscRecorder);
	hr = DataWriter->put_ClientName(_T("BurnTestClientName"));
	
	BSTR bstrClientName;
	hr = DataWriter->get_ClientName(&bstrClientName);
	std::wcout<<"ClientName: "<<bstrClientName<<"\n";

	//Get support Media Type
	//SAFEARRAY* pSupportMediaType;
	//hr = DataWriter->get_SupportedMediaTypes(&pSupportMediaType);

	//int i = (int)pSupportMediaType->pvData;

	//Adding Boot Image code
	IBootOptions* BootOption;
	hr = CoCreateInstance(__uuidof(BootOptions), NULL, CLSCTX_INPROC_SERVER,
		__uuidof(IBootOptions), (void**)&BootOption); 

	hr = BootOption->put_Manufacturer(_T("xxxx"));
	hr = BootOption->put_PlatformId(PlatformX86);
	hr = BootOption->put_Emulation(EmulationNone);

	IStream* pBootStream = NULL;

	hr = SHCreateStreamOnFile(BOOT_FILE_NAME_LEGACY,STGM_READ|STGM_SHARE_DENY_WRITE,&pBootStream);
	hr = BootOption->AssignBootImage(pBootStream);

	hr = SHCreateStreamOnFile(BOOT_FILE_NAME_UEFI,STGM_READ|STGM_SHARE_DENY_WRITE,&pBootStream);
	hr = BootOption->AssignBootImage(pBootStream);

	VARIANT_BOOL bIsBlank = VARIANT_TRUE;
	hr = DataWriter->get_MediaHeuristicallyBlank(&bIsBlank);
	if (bIsBlank)
	{
		std::cout<<"The disc is blank \n";  
	}else{

		std::cout<<"The disc is not blank \n";
	}


	IFileSystemImage2* FSI;
	hr = CoCreateInstance(_uuidof(MsftFileSystemImage),NULL,CLSCTX_INPROC_SERVER,
		__uuidof(IFileSystemImage2),(void**)&FSI);

	hr = FSI->ChooseImageDefaults(DiscRecorder);
	hr = FSI->ChooseImageDefaultsForMediaType(IMAPI_MEDIA_TYPE_DVDROM);
	//hr = FSI->put_FileSystemsToCreate(FsiFileSystemISO9660);
	hr = FSI->put_BootImageOptions(BootOption);
	

	hr = FSI->get_Root(&g_hRootDir);
	hr = g_hRootDir->AddTree(::SysAllocString(_T("F:\\BootFile\\boot")),VARIANT_TRUE);
	hr = g_hRootDir->AddTree(::SysAllocString(_T("F:\\BootFile\\efi")),VARIANT_TRUE);
	hr = g_hRootDir->AddTree(::SysAllocString(_T("F:\\BootFile\\Support")),VARIANT_TRUE);
	hr = g_hRootDir->AddTree(::SysAllocString(_T("F:\\BootFile\\sources")),VARIANT_TRUE);
	hr = g_hRootDir->AddTree(::SysAllocString(_T("F:\\BootFile\\autorun.inf")),VARIANT_TRUE);
	hr = g_hRootDir->AddTree(::SysAllocString(_T("F:\\BootFile\\bootmgr")),VARIANT_TRUE);
	hr = g_hRootDir->AddTree(::SysAllocString(_T("F:\\BootFile\\bootmgr.efi")),VARIANT_TRUE);
	hr = g_hRootDir->AddTree(::SysAllocString(_T("F:\\BootFile\\setup.exe")),VARIANT_TRUE);

	IFileSystemImageResult* pFileSystemImageResult;
	hr = FSI->CreateResultImage(&pFileSystemImageResult);

	IStream *ImageResultStream;
	hr = pFileSystemImageResult->get_ImageStream(&ImageResultStream);
	if (hr == S_OK)
	{
		std::cout<<"Get Image Stream success \n";
	}else{
		std::cout<<"Get Image Stream fail \n";
	}

	hr = CoCreateInstance(__uuidof(MsftDiscFormat2Data), NULL, CLSCTX_INPROC_SERVER,
		__uuidof(IDiscFormat2Data), (void**)&DataWriterB);

	hr = DataWriterB->put_Recorder(DiscRecorder);
	hr = DataWriterB->put_ClientName(_T("BurnTestClientNameB"));

	hr = DataWriterB->Write(ImageResultStream);
	if (hr == S_OK)
	{
		std::cout<<"Add Boot success \n";
	}else{
		std::cout<<"Add Boot Fail \n";
	}
	

	system( "PAUSE ");
	
	return 0;
}

这里只是简单的例子,只是一个暂时的调查结果。


关于使用IMAPI的一些问题

       工作中要求使用IMAPI写一个小的刻录测试程序,苦于资料较少,但最后大体理出一些内容,并初步测试通过,把一些心得和问题记录在此。希望交流一下。程序基于MSDN (April 2004)和...
  • zombie2000
  • zombie2000
  • 2006年02月16日 17:38
  • 1141

IMAPI刻录机:多区段(multisession)续刻

(1)什么是多区段刻录? 即MultiSession,这是多区段刻录方式。每个刻录过程只刻录并且关闭一个区段,剩余空间下次可以继续刻录下一区段。因此,往往光盘上存在多个区段,称为多区段光盘。如果光盘...
  • crystal0011
  • crystal0011
  • 2013年07月25日 11:36
  • 1789

mkisofs参数及用法详解---linux制作ISO启动盘命令

假设你想备份一个叫做 /home/joeuser/ 的目录,但是不想包括子目录 /home/joeuser/junk/,因为其中包括的都是不必要的文件。你想创建一个叫做 backup.iso 的映像,...
  • taiyang1987912
  • taiyang1987912
  • 2015年01月09日 22:20
  • 6020

发送手机短信获取验证码功能

因为移动端的方便,现在网络上很多的网站与应用都有与实现用户手机绑定的功能。这样做的好处很多,例如账号登陆、修改密码、在线支付……等功能模块都可以与手机实时获取验证码短信结合,来确保用户的安全性操作。 ...
  • qllinhongyu
  • qllinhongyu
  • 2014年05月05日 20:46
  • 5183

Hirens Boot DVD 15.2 功能恢复版 v1.1 -- 制作U盘启动盘

Hirens Boot DVD 15.2 功能恢复版 v1.1 这个版本比 Hirens Boot DVD 15.2 功能要多,在正式版本中缺少的商业工具这个版本都包含了,所以这个应用...
  • tty521
  • tty521
  • 2017年02月09日 02:24
  • 292

使用GRUB2制作U盘PE启动盘

使用GRUB2制作U盘PE启动盘的方法还是挺简单的,但是找到这个简单的方法的过程是曲折的。 直接出结果吧。和把大象装冰箱一样一样的。 第一步,制作GRUB2启动文件 第二步,制作GRUB4DOS启动文...
  • jackyyen
  • jackyyen
  • 2015年04月13日 09:39
  • 1520

u大师超级u盘启动盘制作工具V1.1.0官方使用教程

  • 2013年01月18日 11:49
  • 1022KB
  • 下载

老毛桃U盘启动盘制作工具V2013(UD+ISO超级版)-安装原版Win7或Win8教程

安装原版Win7两类方法 注:以下安装方法除了第二类中的方法1之外所有的方法均可适用于64位win7或者win8系统的安装   第一类方法: 原生U盘安装,本工具制作完的U盘启动菜单含Wind...
  • tianyazaiheruan
  • tianyazaiheruan
  • 2013年06月15日 11:51
  • 2898

用小优启动u盘启动盘制作工具v7.0安装win7系统

小优启动PE智能一键装机工具简单功能介绍: 小优启动PE智能一键装机工具可支持后缀为GHO、ISO和WIM文件系统的安装,一键操作快捷方便,可自动识别系统安装文件、自动挂载、自动提取、自动检测,安装...
  • a5780
  • a5780
  • 2014年05月23日 12:19
  • 734

推荐一款u盘启动盘制作工具"小优启动v7.0版"

小优启动超级u盘启动盘制作工具,人人都会使用u盘装系统。 小优启动超级u盘启动盘制作工具v7.0正式版更新日志: 主要程序软件更新细节: 1. 整合三大功能体系:U盘启动;ISO模式,支...
  • a5780
  • a5780
  • 2014年05月23日 12:09
  • 649
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用IMAPI V2 制作Boot image(启动盘)
举报原因:
原因补充:

(最多只允许输入30个字)