我有一个产品安装程序可执行文件,可以将一些文件复制到用户的硬盘上.它不是正常意义上的典型安装程序(它不会向"开始"菜单或"程序文件"文件夹添加任何内容).
每次在Vista上运行安装程序时,在exe终止后,Vista会生成一个任务对话框:
是否有一个函数我需要从exe或注册表项调用来设置,以指示操作系统正确安装程序(或至少压制此消息)?
相关问题: Windows 7 RC中的"此程序可能未正确安装"消息(适用于Windows 7特定问题)
为什么64位Windows在异常期间不能展开堆栈,如果堆栈跨越内核边界 - 当32位Windows可以?
整个问题的背景来自:
消失的OnLoad异常 - x64中的用户模式回调异常的情况
在32位Windows中,如果我在我的用户模式代码中抛出异常,那是从内核模式代码调用的,这是从我的用户模式代码调用的,例如:
User mode Kernel Mode
------------------ -------------------
CreateWindow(...); ------> NtCreateWindow(...)
|
WindowProc <---------------------+
Run Code Online (Sandbox Code Playgroud)
Windows中的结构化异常处理(SEH)可以展开堆栈,通过内核模式展开回到我的用户代码,在那里我可以处理异常,并且我看到有效的堆栈跟踪.
64位版本的Windows无法执行此操作:
由于复杂的原因,我们无法在64位操作系统(amd64和IA64)上传播异常.自从Server 2003的第一个64位版本发布以来,情况一直如此.在x86上,情况并非如此 - 异常通过内核边界传播,并最终将帧移回
由于在这种情况下无法回溯可靠的堆栈跟踪,因此必须做出决定:让您看到非荒谬的异常,或者完全隐藏它:
当时的内核架构师决定采用保守的AppCompat友好方法 - 隐藏异常,并希望最好.
本文接着讨论了所有64位Windows操作系统的表现如何:
但是从Windows 7(和Windows Server 2008)开始,架构师改变了主意 - 有点像.对于仅 64位应用程序(不是32位应用程序),它们(默认情况下)会停止抑制这些用户内核用户异常.所以,默认情况下,在:
所有64位应用程序都会看到这些异常,他们从来没有看到它们.
在Windows 7中,当本机x64应用程序以这种方式崩溃时,将通知 …
windows 64-bit structured-exception windows64 windows-appcompat-platform
我表示我的可执行文件需要管理员:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<!-- Disable Windows Vista UAC compatability heuristics -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
Run Code Online (Sandbox Code Playgroud)
然后我对它进行了数字签名.
但是当我运行可执行文件时,我注意到一些奇怪的东西:Consent对话框上的可执行文件的名称从更改PingWarning.exe为pinxxxx.tmp; 好像是临时副本,正在运行:
替代文字http://i42.tinypic.com/nmkppz.jpg
我挖出了Process Montior,看看是否有人在我启动可执行文件时创建一个*.tmp文件,并且:
alt text http://i42.tinypic.com/10o1b8g.jpg
此特定容器中的Application Information服务有意将我的可执行文件复制到Windows临时文件夹,并从那里请求用户"同意"; 提供无效的文件名.svchost
一旦获得同意,可执行文件将从其原始位置运行: 链接文本http://i43.tinypic.com/104noub.jpg
如果我没有对其进行数字签名,则不会将该文件复制到临时文件夹:
alt text http://i43.tinypic.com/14kvevd.jpg
所以我的问题是当我对我的可执行文件进行数字签名时出现在同意对话框中的无效文件名已经表现为.requireAdministrator
做什么?
更新:
我能找到的最接近解释的内容来自Uninformed.org(http://uninformed.org/index.cgi?v=8&a=6&p=3):
对于请求uiaccess的程序的启动请求,调用 appinfo!RAiLaunchAdminProcess来为请求提供服务.然后,该过程被appinfo!AiCheckSecureApplicationDirectory验证为在(硬编码的)允许目录集内 .在验证程序是从允许的目录中启动之后,控制最终会传递给appinfo!AiLaunchProcess …