标签: windows-appcompat-platform

如何防止Vista上的"此程序可能没有正确安装"消息

我有一个产品安装程序可执行文件,可以将一些文件复制到用户的硬盘上.它不是正常意义上的典型安装程序(它不会向"开始"菜单或"程序文件"文件夹添加任何内容).

每次在Vista上运行安装程序时,在exe终止后,Vista会生成一个任务对话框:

  • 此程序可能未正确安装
  • 使用推荐配置重新安装
  • 这个程序正确地安装了

是否有一个函数我需要从exe或注册表项调用来设置,以指示操作系统正确安装程序(或至少压制此消息)?

相关问题: Windows 7 RC中的"此程序可能未正确安装"消息(适用于Windows 7特定问题)

installer windows-installer uac windows-appcompat-platform

49
推荐指数
2
解决办法
5万
查看次数

为什么64位Windows无法解除用户内核用户异常?

为什么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位版本的Windows无法执行此操作:

由于复杂的原因,我们无法在64位操作系统(amd64和IA64)上传播异常.自从Server 2003的第一个64位版本发布以来,情况一直如此.在x86上,情况并非如此 - 异常通过内核边界传播,并最终将帧移回

由于在这种情况下无法回溯可靠的堆栈跟踪,因此必须做出决定:让您看到非荒谬的异常,或者完全隐藏它:

当时的内核架构师决定采用保守的AppCompat友好方法 - 隐藏异常,并希望最好.

本文接着讨论了所有64位Windows操作系统的表现如何:

  • Windows XP 64位
  • Windows Server 2003 64位
  • Windows Vista 64位
  • Windows Server 2008 64位

但是从Windows 7(和Windows Server 2008)开始,架构师改变了主意 - 有点像.对于 64位应用程序(不是32位应用程序),它们(默认情况下)会停止抑制这些用户内核用户异常.所以,默认情况下,在:

  • Windows 7 64位
  • Windows Server 2008

所有64位应用程序都会看到这些异常,他们从来没有看到它们.

在Windows 7中,当本机x64应用程序以这种方式崩溃时,将通知 …

windows 64-bit structured-exception windows64 windows-appcompat-platform

37
推荐指数
2
解决办法
4410
查看次数

从temp文件夹运行Signed和RequireAdministrator可执行文件?

我表示我的可执行文件需要管理员:

<?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.exepinxxxx.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 …

windows uac elevation windows-appcompat-platform

5
推荐指数
0
解决办法
1267
查看次数