开发可以自动运行序程的盘.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
开发可以自动运行序程的盘

开发可以自动运行程序的U盘 zhengv@ 一. 为什么要开发这样的U盘 可以自动运行程序的U盘插入电脑后U盘里面的程序会自动运行,这样的U盘可以作为软件厂商存储程序的载体,也可以作为U盘厂商扩展U盘功能的一种途径。举 几个例子:有加密功能的U盘可以把加密软件存放到U盘中,插入U盘后自动运行加密管理软件,极大方便了用户,厂商也不用另外提供软件;我甚至这么想过,把 温度芯片加入到U盘电路里面,U盘上的程序自动运行后,通过USB接口读出温度,显示给用户:)只要你多想,这样的U盘还可以做很多事情。 二. 开发思路 我们知道光驱插入光盘可以自动运行,所以我们可以让U盘的一个区模拟成光盘的形式。这样我们可以利用autorun.inf,让程序自动运行。 三. 开发步骤 1. 让U盘一个区显示成光盘 这个对于开发过U盘的人来说应该很简单,就是在操作系统发送SCSI设备的 INQUIRY 指令的时候,返回的INQUIRY里面指明设备类型,我们设置为CD设备。具体指令可以参考相关资料(spc3r23.pdf)。我开发的时候 INQUIRY返回数据的前几个字节如下:0x05,0x80,0x02,0x02仅供参考。 2. 响应操作系统对这光盘区的指令 成光盘后,操作系统可能会发送一些SCSI指令给这个光盘区。应该响应某些指令,有些并不需要响应。后面我会附录一个我弄过的一个U盘的BusHound监测文件,大家可以参考。最好买一个这样的U盘,然后用BusHound监测通讯过程。 3. 向光盘区写入文件 应该可以把光盘区弄成CDRW,这样直接写入就可以了,但这样需要了解很多协议。由于时间关系,我采用了简单的方法,把需要写入光盘的文件用ISO制作工 具弄成一个ISO镜像文件,编写一个小程序向这个光盘区写入ISO镜像文件。程序部分代码附在文档后面,仅供参考。写入的程序最终调用 DeviceIoControl函数。文件写入后,再重新拔插U盘就可以了。 四. 说明 这里只是简单说明了原理,如果是刚接触这个,还有很多东西要弄清楚,我是在别人一个普通U盘开发板的基础上添加这个功能的,最后弄通了,感觉很不容易,以前也没有弄过硬件的固件程序。希望对新手有帮助。有什么问题,可以邮件联系交流。 附录: 1. Write ISO程序部分代码: UINT CWriteIsoFileDlg::ThreadWrite(LPVOID pParam) { CWriteIsoFileDlg * p = (CWriteIsoFileDlg*)pParam; CSDsk sd; CString str; HANDLE fh,hFind; WIN32_FIND_DATA FindFileData; ULONGLONG fSize = 0; CFileFind ff; DWORD startAddr = 0; DWORD nBytesRead = 0; PBYTE buf = new BYTE[20480]; memset(buf,0,20480); try { if(!ff.FindFile(p-filename)) { str.Format(找不到文件 %s ,p-filename); throw 1; } ff.FindNextFile(); fh = CreateFile(ff.GetFilePath(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(fh==INVALID_HANDLE_VALUE) { str.Format(打开文件 %s 失败,p-filename); throw 1; } if(!sd.Open()) throw 0; int index = sd.GetDevNum()-1; if(!sd.ReadCapacity(index,0,fSize)) throw 0; if(ff.GetLength()fSize) { str = 光盘空间不足,不能写入。; throw 1; } fSize = ff.GetLength(); if(!sd.GetFlashParam(index,0,1,buf)) throw 0; buf[0]=0xBF; if(!sd.SetFlashParam(index,0,1,buf,false)) throw 0; while(1) { if(ReadFile(fh,buf,20480,nBytesRead,NULL)) { if(nBytesRead!=0

文档评论(0)

sfd38 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档