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

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

ID:9408985

大小:33.50 KB

页数:7页

时间:2018-04-30

开发可以自动运行程序的u盘_第1页
开发可以自动运行程序的u盘_第2页
开发可以自动运行程序的u盘_第3页
开发可以自动运行程序的u盘_第4页
开发可以自动运行程序的u盘_第5页
资源描述:

《开发可以自动运行程序的u盘》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、开发可以自动运行程序的U盘zhengv@gmail.com一.为什么要开发这样的U盘可以自动运行程序的U盘插入电脑后U盘里面的程序会自动运行,这样的U盘可以作为软件厂商存储程序的载体,也可以作为U盘厂商扩展U盘功能的一种途径。举几个例子:有加密功能的U盘可以把加密软件存放到U盘中,插入U盘后自动运行加密管理软件,极大方便了用户,厂商也不用另外提供软件;我甚至这么想过,把温度芯片加入到U盘电路里面,U盘上的程序自动运行后,通过USB接口读出温度,显示给用户:)只要你多想,这样的U盘还可以做很多事情。二.开发思路我们知道光

2、驱插入光盘可以自动运行,所以我们可以让U盘的一个区模拟成光盘的形式。这样我们可以利用autorun.inf,让程序自动运行。三.开发步骤1.让U盘一个区显示成光盘这个对于开发过U盘的人来说应该很简单,就是在操作系统发送SCSI设备的INQUIRY指令的时候,返回的INQUIRY里面指明设备类型,我们设置为CD设备。具体指令可以参考相关资料(spc3r23.pdf)。我开发的时候INQUIRY返回数据的前几个字节如下:0x05,0x80,0x02,0x02仅供参考。2.响应操作系统对这光盘区的指令成光盘后,操作系统可能会

3、发送一些SCSI指令给这个光盘区。应该响应某些指令,有些并不需要响应。后面我会附录一个我弄过的一个U盘的BusHound监测文件,大家可以参考。最好买一个这样的U盘,然后用BusHound监测通讯过程。3.向光盘区写入文件应该可以把光盘区弄成CDRW,这样直接写入就可以了,但这样需要了解很多协议。由于时间关系,我采用了简单的方法,把需要写入光盘的文件用ISO制作工具弄成一个ISO镜像文件,编写一个小程序向这个光盘区写入ISO镜像文件。程序部分代码附在文档后面,仅供参考。写入的程序最终调用DeviceIoControl函

4、数。文件写入后,再重新拔插U盘就可以了。四.说明这里只是简单说明了原理,如果是刚接触这个,还有很多东西要弄清楚,我是在别人一个普通U盘开发板的基础上添加这个功能的,最后弄通了,感觉很不容易,以前也没有弄过硬件的固件程序。希望对新手有帮助。有什么问题,可以邮件联系交流。附录:1.WriteISO程序部分代码:UINTCWriteIsoFileDlg::ThreadWrite(LPVOIDpParam){CWriteIsoFileDlg*p=(CWriteIsoFileDlg*)pParam;CSDsksd;CString

5、str;HANDLEfh,hFind;WIN32_FIND_DATAFindFileData;ULONGLONGfSize=0;CFileFindff;DWORDstartAddr=0;DWORDnBytesRead=0;PBYTEbuf=newBYTE[20480];memset(buf,0,20480);try{if(!ff.FindFile(p->filename)){str.Format("找不到文件%s",p->filename);throw1;}ff.FindNextFile();fh=CreateFile

6、(ff.GetFilePath(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(fh==INVALID_HANDLE_VALUE){str.Format("打开文件%s失败",p->filename);throw1;}if(!sd.Open())throw0;intindex=sd.GetDevNum()-1;if(!sd.ReadCapacity(index,0,fSize))throw0;if(ff.G

7、etLength()>fSize){str="光盘空间不足,不能写入。";throw1;}fSize=ff.GetLength();if(!sd.GetFlashParam(index,0,1,buf))throw0;buf[0]&=0xBF;if(!sd.SetFlashParam(index,0,1,buf,false))throw0;while(1){if(ReadFile(fh,buf,20480,&nBytesRead,NULL)){if(nBytesRead!=0){if(!sd.Write(index,0

8、,startAddr,40,buf)){throw0;}startAddr+=40;memset(buf,0,20480);}elsebreak;}else{str="读文件错误!";throw1;}}//p->MessageBox("写入镜像文件成功!",NULL,MB_OK

9、MB_ICONINFORMATION);sd.Plu

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。