AutoRun是Microsoft Windows 操作系统的特点之一,它需要Windows 95和NT 4.0以上版本支持,用于基于Windows和DOS的应用程序,创建自动运行的应用程序需要建立两个文件,其中一个是AutoRun.inf,另一个为启动应用程序。
当设备(光盘)插入到一个支持AutoPlay的计算机中时,系统会检测插入设备上是否有有效的文件系统,如果有的话,它会搜索一个文件名为AutoRun.inf的配置文件,从这个文件找到安装程序和各种可选的配置,然后加载这个应用程序。
AutoRun.inf文件由若干节组成,下面是一个典型的AutoRun.inf文件,“;”及其后的语句为注释说明语句,建立文件时不要输入。
〔AutoRun〕
Open=MyDemo.exe
;启动程序的文件名,一般位于根目录,可以有路径,但不要带驱动器,因为各个微机的配置不一样,驱动器符不固定,注意你最好在这里加载一个小程序,以照顾一下不喜欢自动播放而且没有耐心等待的朋友,因为他们对付大的自动运行程序的第一反应是按下Ctrl+Alt+Del。为自动启动设计的程序,应该启动另外一个线程,以缩短用户感受的加载时间。对于已经安装的程序,启动程序应能自动检测环境是否安装,能够自动退出,避免重复安装造成用户不耐烦。
Icon=MyDemo.exe,1
;为驱动器指定一个应用程序的特定图标,这里的1为资源标识
DefaultIcon=iconFile.Ico
;指定应用程序的缺省图标。这两种指定图标的方法可以互换,即可以来自一个Exe或Dll文件内部资源,也可以是一个图标或位图文件。
Label=“My Drive Label”
;自动运行的驱动器显示标签,它显示在图标的下面。
ShellExecute=〔FilePath/〕fileName [Param1,[Param2]…]
;指定AutoPlay用来调用ShellExecuteEx的应用程序或数据文件,若文件名为一个可执行文件,它将被启动,若文件为数据文件,系统将调用ShellExecuteEx启动与该数据文件相关的缺省命令。这个命令与Open相似,但它可以利用文件的关联信息运行程序。
Shell=Explorer
;为驱动器的右击菜单指定一个缺省命令
Shell/ReadIt=”&ReadMe”;菜单上显示的字符串,你可以通过&定义菜单快捷键。
Shell/ReadIt/Command=”notepad abc/readme.txt “;菜单执行的命令
Shell/Explorer=“资源管理器”
Shell/Explorer/Command=Explorer.exe
后面这些语句用于对驱动器鼠标右击菜单进行定制。
二、禁止AutoRun
手工禁止AutoRun 比较简单,只需用户在插入光盘的同时,按下Shift键即可。但有的时候需要通过程序设计禁止自动运行。
对于Shell 4.7或更高版本的系统中,Microsoft Windows 能够向前台应用程序窗口发送“QueryCancelAutoPlay”通过响应这条消息,你的应用程序可以禁止AutoRun。在应用程序的前台窗口的窗口过程中,应用程序在响应该消息时,应该返回TRUE,以示取消AutoPlay。
UINT g_uQueryCancelAutoPlay = 0;
LRESULT WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ switch (uMsg) {
...
default:
if (!g_uQueryCancelAutoPlay)
{
g_uQueryCancelAutoPlay =
RegisterWindowMessage(TEXT("QueryCancelAutoPlay“));
}
if (uMsg && uMsg == g_uQueryCancelAutoPlay)
{
return TRUE; // 取消AutoPlay
}
}
}
如果你的应用程序使用的是一个对话框,你还需要作一些额外的工作,即在返回TRUE之前,调用SetWindowLong(hDlg, DWL_MSGRESULT, TRUE);设置消息返回结果,TRUE表示禁止播放, FALSE,则允许自动播放。Return TRUE 此时不起作用,可以返回1。特别注意使用前要注册"QueryCancelAutoPlay“消息。
另外一种禁止AutoRun 的方法是通过修改注册编辑表:
有两种方法用于永远地禁止自动播放,控制面板中光盘的自动播放设置也是通过修改注册编辑表实现的。注册编辑表中有两个项专门负责自动播放禁止,它们是NoDriveAutoRun和NoDriveTypeAutoRun,前者规定某一指定驱动器盘符禁止自动播放;后者规定某一类特定设备禁止自动播放。
下面是注册编辑表导出的结果
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Policies/Explorer]“NoDriveAutoRun”=hex:05,00,00,00
"NoDriveTypeAutoRun"=hex:91,00,00,00
在尝试修改的时候,建议用户把它原来存储的值记下来,因为没有更好的办法能够恢复它的原始值。NoDriveAutoRun值存储一个双字,从最低位到最高位依次对应A:、B:、C:,依次类推,上面的值将禁止A: ,C:。 NoDriveTypeAutoRun也存储一个双字,它的各位对应驱动器类型如下,注意Windows NT /2000系统重启或注销后重新登录方能生效:
位号 位屏蔽常量 描述
0x04 DRIVE_REMOVEABLE 对应软盘
0x08 DRIVE_FIXED 硬盘
0x10 DRIVE_REMOTE 网络驱动器
0x20 DRIVE_CDROM 光盘
0x40 DRIVE_RAMDISK Ram虚拟盘
三、其它存储设备的AutoRun
通过上面的描述可以看出,AutoRun不光支持光盘载体,同时它还支持其它载体,这使得AutoRun的调试非常方便。对于一个可移动存储载体,如USB移动存储器,AutoRun如果实现AutoRun.inf的加载必须满足下列条件:
(1)设备驱动必须兼容AutoRun驱动,即载体插入时必须向系统发送WM_DEVICECHANGE消息
(2)根目录下必须有一个有效的AutoRun.inf文件
(3)注册表不能禁止该设备的自动运行
(4)前台应用程序没有阻止AutoRun
注意这种方法不应该用来发布基于软盘的应用程序,因为实现软盘的自动运行会给病毒的传播提供一条有效的途径,用户会对任何含有AutoRun.inf文件的软盘保持怀疑。
AutoRun不仅可以手动禁止,也可以手工启动,你只需右击满足AutoRun条件的驱动器图标,选中AutoPlay项也可以激活AutoRun 命令。