搜索
查看: 31456|回复: 10

[教程] 如何开发一款USB启动盘制作工具 [复制链接]
跳转到指定楼层
复制 

Rank: 7Rank: 7Rank: 7

UID
2913412
帖子
1099
PB币
241
贡献
0
技术
34
活跃
781
楼主
发表于 2013-11-2 22:10:20 |只看该作者 |倒序浏览
快御云安全
其实,完全不需要大白菜之类的工具,我们就可以制作USB启动盘。首先你得有一个解压缩软件,事实上U盘和磁盘一样,你并不需要像光盘难以添加可引导文件,只需要用bootsect.exe修复引导即可,当然,最主要的问题是你的Bois支持USB启动。
当然,你完全可以根据ISO镜像格式自己写释放模块,研究ISO格式确实有点麻烦,所以我们直接用7z替代。
这里准备的工具有:
7z
bootsect
format(系统自带)
开发语言 C++
开发工具 VisualStudio 2012 Express for Desktop
纯Win32 API
先上图一张
QQ图片20131102212608.jpg
由于扩展函数效果更好我建议用后缀名Ex的扩展函数。
我的思路是 先把UI做出来,CreateWindowEx 创建一个窗口,并且在Window上CreateWindowEx 若干个控件,static button edit combobox msctls_progress32,在主窗口WM_CREATE(创建)消息内创建这些控件,如果主窗口是个Dialog,那么就得在WM_INITDIALOG消息,你最好在CreateWindowEx 的HMENU hMenu 绑定一个ID,方便后面的额操作。
自己CreateWindowEx创建的Window上的字是丑陋的,所以你必须对字体进行一个简单的处理
  1. HFONT hFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT);
  2.         LOGFONT logFont={0};
  3.         GetObject(hFont,sizeof(logFont),&logFont);
  4.         DeleteObject(hFont);
  5.         hFont=NULL;
  6.         logFont.lfHeight=19;
  7.         wcscpy_s(logFont.lfFaceName,TEXT("微软雅黑"));
  8.         //wcscpy_s(logFont.lfFaceName,TEXT("MS Shell Dlg"));
  9.         hFont=CreateFontIndirect(&logFont);
复制代码
这段代码的含义就是获取系统默认的绘图风格 设置一个字体的句柄,在WM_CREATE消息末尾还要SendMessage 发送WM_SETFONT消息修改控件字体。
界面基本就是这样了。接下来的就是重点了。
ComBobox的功能就是选择U盘,封装一个函数:uInt  FindUSBDisk();这里涉及到一个重要的API GetDriveType,U盘的返回值是DRIVE_REMOVABLE,GetLogicalDrives的功能是获取逻辑磁盘信息,所以,我们先用GetLogicalDrives 获取磁盘个数,再来用从'C'盘开始判断是否是可移动磁盘,循环下去,用GetVolumeInformation确认是否是有效的驱动器,在确认是U盘时用GetDiskFreeSpaceEx 获取磁盘容量。将获得的数据保存在UsbDevice DefUsbDevice[26];结构体数组中;头文件中定义如下
  1. typedef struct _UsbDevice
  2. {
  3.         uInt Id;
  4.         wchar_t deviceLetter[10];
  5.         wchar_t RootPath[20];
  6.         wchar_t Info[260];
  7. }UsbDevice;
  8. uInt FindUSBDisk();

  9. extern UsbDevice DefUsbDevice[26];
复制代码
初始化时WM_CREATE 调用一次FindUSBDisk 初始化Combobox的项,在拔出或插入USB盘时有一个消息WM_DEVICECHANGE,这时我们要清除掉ComboBox的项并且用FindUSBDisk重新获取USB磁盘信息。而浏览按钮则是获取ISO镜像。涉及到打开文件对话框,比较简单。当用户选取了USB磁盘并且Edit 内的ISO镜像路径正确,则开始制作USB启动盘,iBurn 将启动Format 程序等待格式化正确并退出,再启动7z解压并等待退出 最后启动bootsect 等待退出。
参数分别是:
format X:  /FS:NTFS /v:UsbInstall /q /x /A:4096
7z x filename -o X:
bootsect /NT60 X:
X: 指选择的驱动器

所有的代码都已经开源
地址为 http://git.oschina.net/ipvb/iBurn 可以自己去分析 相互学习,有更多的问题可以给我发邮件 ipvb@qq.com
再上一图:
QQ图片20131102215125.jpg
3

查看全部评分

Rank: 1

UID
4207693
帖子
5
PB币
0
贡献
0
技术
0
活跃
2
沙发
发表于 2013-11-4 17:29:58 |只看该作者
网上应该有一键下载安装的吧

高级学生

Rank: 5Rank: 5Rank: 5

UID
1203698
帖子
199
PB币
484
贡献
0
技术
15
活跃
402

7周年庆典勋章 应用界 8周年庆典勋章

板凳
发表于 2013-11-13 12:35:33 |只看该作者
不错 GOOD 学习了..

Rank: 2Rank: 2

UID
1678303
帖子
184
PB币
2456
贡献
0
技术
0
活跃
480
4F
发表于 2013-11-18 08:58:46 来自手机 |只看该作者
谢谢分享

机佬

Rank: 7Rank: 7Rank: 7

UID
4812243
帖子
1290
PB币
693
贡献
0
技术
0
活跃
816
5F
发表于 2017-10-4 13:58:36 |只看该作者
学习了,谢谢分享。

Rank: 7Rank: 7Rank: 7

UID
4880327
帖子
1214
PB币
21
贡献
0
技术
0
活跃
146
6F
发表于 2021-7-22 17:36:29 来自手机 |只看该作者
路过并怀念一下子

Rank: 15Rank: 15Rank: 15

UID
609560
帖子
17580
PB币
484
贡献
0
技术
0
活跃
1016
7F
发表于 2021-8-30 21:33:20 |只看该作者
嗯。辛苦了。

Rank: 5Rank: 5Rank: 5

UID
4880298
帖子
545
PB币
45
贡献
0
技术
0
活跃
196
8F
发表于 2021-10-13 18:40:09 |只看该作者
666参考下先.改天试试.感谢分享

不懂不懂

Rank: 5Rank: 5Rank: 5

UID
671342
帖子
349
PB币
39
贡献
0
技术
5
活跃
151
9F
发表于 2021-10-24 16:09:03 |只看该作者
想自己搞一款 做论文吗?

Rank: 2Rank: 2

UID
4629014
帖子
51
PB币
90
贡献
0
技术
0
活跃
80
10F
发表于 2021-11-6 00:47:57 |只看该作者
这才是高手玩的东西,学习了

Rank: 5Rank: 5Rank: 5

UID
938794
帖子
467
PB币
71
贡献
0
技术
0
活跃
225
11F
发表于 2021-11-27 15:27:02 |只看该作者
学习一下,感谢楼主
回顶部
Copyright (C) 2005-2021 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛