使用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 v2 WinXP CHS

  • 2012-01-19 23:59
  • 757KB
  • 下载

usb boot v1.7,DOS启动盘

  • 2011-07-28 18:21
  • 345KB
  • 下载

极速PEu盘启动盘制作工具(2003内核)V06.6官方版

修改美化启动菜单 极速PEu盘启动盘制作工具(2003内核)

用小优启动u盘启动盘制作工具v7.0安装windows8.1原生系统

WinXP已经和我们说再见了,你升级到Win7/Win8系统了吗? 目前有许多用户存在疑问,怎么安装Win8系统,小优启动能步能安装win8系统?今天小优启动小编就告诉大家答案:小优启动可以支持wi...
  • a5780
  • a5780
  • 2014-05-23 12:15
  • 366

u大师u盘启动u盘工具制作启动盘(V1.1.0版)

1.在U大师官网下载最新的U大师U盘启动盘制作工具V1.1.0 2.下载后,在存放目录中双击”U大师-U盘启动制作.exe“运行,如果在运行工具前未插上U盘,在软件界面的“选择U盘”是一片空白的...

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

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

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

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

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

小优启动超级u盘启动盘制作工具,人人都会使用u盘装系统。 小优启动超级u盘启动盘制作工具v7.0正式版更新日志: 主要程序软件更新细节: 1. 整合三大功能体系:U盘启动;ISO模式,支...
  • a5780
  • a5780
  • 2014-05-23 12:09
  • 574

使用JLink烧写u-boot(基于JZ2440v2的ARM板子)

本文对象:使用笔记本的同志没有JTAG                  需要在Nor-Flash中重新烧写u-boot的 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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