使用IMAPI2刻录系统盘(包含隐藏的可引导文件)

[软件开发] 季雨林 2022/10/12 11:17:28

最近接触到一个项目,就是要刻录系统镜像光盘,然而实际验证发现,iso文件加载后,实际上是看不到被隐藏的引导文件的。看不到的原因也很简单,就是我们平常使用的光盘(包含虚拟镜像文件iso的打开效果)都并不是直接显示的真正根目录,而是显示了第一轨道的公开路径中的一个,而可引导文件偏偏位于跟这个路径平级的另一个路径下,所以才出现了,操作系统文件,直接拷贝出来不能用的现象。


我的代码是使用C#编写,自然也就从微软官方找了最新的相关资料(居然没有C#版本,只能用C++语言版本作为参考),还从codeproject找了大牛分享的源代码。最后问题来了,刻录数据文件没问题,但是刻录带引导的就难了。办法也不是没有,只是非常非常的难找,被我找来了一个码客的页面,看其内容似乎是从某些地方爬取来的,但却非常贴合的解决了我的问题。内容如下:

首先你需要包含以下名称空间:


using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;

然后为了能够使用IStream。 然后你需要从shlwapi.dll导入SHCreateStreamOnFIle来打开到该iso的“读取流”:

private const uint STGM_SHARE_DENY_WRITE = 0x00000020;
private const uint STGM_SHARE_DENY_NONE = 0x00000040;
private const uint STGM_READ = 0x00000000;
private const uint STGM_WRITE = 0x00000001;
private const uint STGM_READWRITE = 0x00000002;
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true,    PreserveSig = false, EntryPoint = "SHCreateStreamOnFileW")]
static extern void SHCreateStreamOnFile(string fileName, uint mode, ref IStream stream);

最后的写入之前,使用这个方法读取的流代替原来的流传入

IStream stream = null;
SHCreateStreamOnFile(path2iso, STGM_READ | STGM_SHARE_DENY_WRITE, ref stream);
discFormatData.Write(stream);

这里stream原本是通过CreateMediaFileSystem方法,从文件目录或者文件创建的。但是现在可以改用SHCreateStreamOnFile支持从iso文件获取流,从而达到我的目标。



原文地址: https://www.opengps.cn/Blog/View.aspx?id=996 文章的更新编辑依此链接为准。欢迎关注源站原创文章!

评论

暂无评论!

发表评论:

用于接收作者回复信息
点击更换验证码 - openGPS提示