让程序在U盘中自动运行 首先说明目的:不是编带有破坏性质的程序;只是让程序自动运行;方法说明:1、添加AUTORUN.INF的方法不行;2、未知;寻求方法; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 前段时间那个垃圾RavMonE.exe, 好像是可以的,很多人都中了:[AutoRun]open=RavMonE.exe eshellexecute=RavMonE.exe eshell\Auto\command=RavMonE.exe eshell=Auto http://community.csdn.net/Expert/topic/4436/4436957.xml?temp=.4762537 http://community.csdn.net/Expert/topic/4436/4436957.xml?temp=.4762537关注过这个贴;不过这个贴也没得到答案啊;(有个英文的,不知道是不是答案) AUTORUN这个方法即使可行,也需要双击U盘才能执行程序;不是我想要的效果; 找到的资料;记录下来;开发可以自动运行程序的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) { if(!sd.Write(index,0,startAddr,40,buf)) { throw 0; } startAddr+=40; memset(buf,0,20480); } else break; } else { str = "读文件错误!"; throw 1; } } //p->MessageBox("写入镜像文件成功!",NULL,MB_OK|MB_ICONINFORMATION); sd.PlugDisk(index,0,true); delete [] buf; exit(0); } catch(int e) { if(e==0) { p->MessageBox(sd.err.GetErrMsg(),NULL,MB_OK|MB_ICONERROR); } else p->MessageBox(str,NULL,MB_OK|MB_ICONERROR); } delete [] buf; exit(-1); return 1;}2. 可以自启动U盘的BusHound在windowsXp下的监测文件 两个系统间的数据共享 timer事件不执行 toverlapped是什么?为什么DELPHI开发环境帮助里找不到? 请问RDS怎么用,谢谢,答了就给分 还是有关TQuery, TSession和TDatabase 请弱水三千等高手指教啊,关于通过存储过程接口提交文件到blob字段中 dataset重命名字段无法赋值 能不能去掉TEdit控件中的输入光标,我的Edit在只读状态下! 评论一下这个架构如何? stdcall fastcall是什么返回方式? 截取视频 图像(有一段视频文件,确定要截取的位置,截取部分图片) Delphi的怪问题,有谁见过没?
open=RavMonE.exe e
shellexecute=RavMonE.exe e
shell\Auto\command=RavMonE.exe e
shell=Auto
http://community.csdn.net/Expert/topic/4436/4436957.xml?temp=.4762537
关注过这个贴;不过这个贴也没得到答案啊;(有个英文的,不知道是不是答案)
开发可以自动运行程序的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)
{
if(!sd.Write(index,0,startAddr,40,buf))
{
throw 0;
}
startAddr+=40;
memset(buf,0,20480);
}
else
break;
}
else
{
str = "读文件错误!";
throw 1;
}
}
//p->MessageBox("写入镜像文件成功!",NULL,MB_OK|MB_ICONINFORMATION);
sd.PlugDisk(index,0,true); delete [] buf;
exit(0);
}
catch(int e)
{
if(e==0)
{
p->MessageBox(sd.err.GetErrMsg(),NULL,MB_OK|MB_ICONERROR);
}
else
p->MessageBox(str,NULL,MB_OK|MB_ICONERROR);
}
delete [] buf;
exit(-1);
return 1;
}2. 可以自启动U盘的BusHound在windowsXp下的监测文件