如何通过WPF调用ChangeWindowMessageFilterEx实现UIPI消息筛选器用户界面特权隔离的修改?

摘要:一、回顾 上一篇博客:记录一下 WPF进程 SendMessage 发送窗口消息进行进程间通信,存在进程权限无法接受消息的问题 - wuty007 - 博客园 说到了 发送端是普通权限的窗体 给 接收端是 管理员权
一、回顾 上一篇博客:记录一下 WPF进程 SendMessage 发送窗口消息进行进程间通信,存在进程权限无法接受消息的问题 - wuty007 - 博客园 说到了发送端是普通权限的窗体 给 接收端是 管理员权限的窗体,通过 Win32 API的方式调用 SendMessage 发送窗口消息,管理员权限的窗体的钩子消息回传接受不到发送端的数据。 如下图所示: 这是由于 Windows系统在Windows NT6.0 开始,引入了受保护模式,阻止进程将所选窗口消息和其他 USER API 发送到运行完整性较高的进程 详情请看微软的详细说明: 受保护的模式 - Win32 apps | Microsoft Learn Windows 完整性机制设计 | Microsoft Learn 二、函数说明 针对于以上的问题,微软也提供了相对应的接口来规避:ChangeWindowMessageFilterEx ChangeWindowMessageFilterEx 函数 (winuser.h) 修改指定窗口 (UIPI) 消息筛选器的用户界面特权隔离。 语法 BOOL ChangeWindowMessageFilterEx( [in] HWND hwnd, [in] UINT message, [in] DWORD action, [in, out, optional] PCHANGEFILTERSTRUCT pChangeFilterStruct ); 参数 [in] hwnd 类型:HWND 要修改其 UIPI 消息筛选器的窗口的句柄。 [in] message 类型:UINT 消息筛选器允许通过 或 阻止的消息。 [in] action 类型:DWORD 要执行的操作,可以采用以下值之一: 值含义 MSGFLT_ALLOW1 允许消息通过筛选器。 这使hWnd能够接收消息,无论消息的来源如何,即使消息来自较低特权进程也是如此。 MSGFLT_DISALLOW2 阻止消息从较低特权进程传递到hWnd,除非使用ChangeWindowMessageFilter函数或全局允许该消息在进程范围内传递。 MSGFLT_RESET0 将hWnd的窗口消息筛选器重置为默认值。 允许全局或进程范围内的任何消息都将通过,但任何未包含在这两个类别中以及来自较低特权进程的消息都将被阻止。 [in, out, optional] pChangeFilterStruct 类型:PCHANGEFILTERSTRUCT 指向CHANGEFILTERSTRUCT结构的可选指针。 返回值 类型:BOOL 如果函数成功,则返回TRUE;否则,它将返回FALSE。 要获得更多的错误信息,请调用 GetLastError。 注解 UIPI 是一项安全功能,可防止从较低完整性级别的发件人接收消息。 可以使用此函数允许将特定消息传递到窗口,即使消息源自较低完整性级别的进程也是如此。 与控制进程消息筛选器的ChangeWindowMessageFilter函数不同,ChangeWindowMessageFilterEx函数控制窗口消息筛选器。 应用程序可以使用ChangeWindowMessageFilter函数以进程范围的方式允许或阻止消息。 如果进程消息筛选器或窗口消息筛选器允许该消息,则会将其传递到窗口。 请注意,不允许SECURITY_MANDATORY_LOW_RID或以下的进程更改消息筛选器。 如果这些进程调用此函数,它将失败并生成扩展错误代码,ERROR_ACCESS_DENIED。 无论筛选器设置如何,值小于WM_USER的某些消息都需要通过筛选器传递。 尝试使用此函数允许或阻止此类消息时,将不起作用。
阅读全文