在"Function system() failed"中,提到了如果通过lpCommandLine(第二个参数)来传递命令给函数CreateProcess,字符串“c:/program files/sub dir/program name”会被解释成:
c:/program.exe files/sub dir/program name
c:/program files/sub.exe dir/program name
c:/program files/sub dir/program.exe name
c:/program files/sub dir/program name.exe
如果在C:/下,存在着一个名为program.exe的程序,事情会怎么样?在这种情况下,这个名为program.exe的程序就会被执行,这几乎不是程序员想要得到的结果。如果这个program.exe是一个恶意程序(如果它真的存在,则几乎就一定是),就会由于程序员的疏忽而导致它的执行。
MS认为他们有责任防止类似事情的发生。在MSDN中,MS强调应该在lpCommandLine使用引号(")来避免CreateProcess错误地解析这个参数,即应该使用:
"/"c:/program files/subdir/program name/" your params to the program"
除此以外,他们还在Explorer.exe中加入了检查。当Windows启动时,Explorer.exe会检查C:/和其它一些目录,以确定这些目录下不存在类似于program.*的文件和目录存在。如果存在的话,Exploerer.exe会弹出一个对话框(应该说这个对话框非常不友好,当我第一次见到它的时候,我无法理解它给出的提示,也完全不知道应该如何操作,甚至不知道这个对话框属于哪个应用程序),这个对话框是:
用VC以资源方式打开Explorer.exe,在资源>Dialog目录下可以找到这个对话框模板。