加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi – 较低级别和较高级别流程之间的进程间通信

发布时间:2020-12-15 09:51:20 所属栏目:大数据 来源:网络整理
导读:我在delphi中有一个使用管理员权限运行的小vcl应用程序,这个应用程序只接收消息和戳鼠标事件. 第二个应用程序使用普通用户priveleges(低于第一个)运行,此应用程序无法向第一个应用程序发送消息. 我确定原因是特权级别,更高和更低,因为如果我以更低或更高的价
我在delphi中有一个使用管理员权限运行的小vcl应用程序,这个应用程序只接收消息和戳鼠标事件.
第二个应用程序使用普通用户priveleges(低于第一个)运行,此应用程序无法向第一个应用程序发送消息.
我确定原因是特权级别,更高和更低,因为如果我以更低或更高的价格运行它们,它们就会成功通信.
我如何能够在IPC中从最低级别的应用程序向更高级别的应用程序发送消息?
还是不可能?

这是我用来发送消息的方式:

较高的应用程序使用此代码来处理winapi.messages:

procedure TfrMouseDriver.WMCopyData(var Message: TWMCopyData);
var
  S: WideString;
  cmd,sX,sY: String;
  s2,F: String;
  WParam: WideString;
  i,z,X,Y: integer;
begin
  X := 1;
  Y := 1;
  if true then
  begin
    s:=  PWideChar(Message.CopyDataStruct.lpData);
    s2:=  PChar(Message.CopyDataStruct.lpData);
    ...

最低级别的应用程序以这种方式发送消息:

procedure TfrPenDriver.btnIPCClick(Sender: TObject);
var
  CopyData: CopyDataStruct;
  hMouse : HWND;
  Msg : WideString;
begin

  Msg := 'CM_MOVE:000500:000230';

  hMouse := FindWindow(PCHAR('TfrMouseDriver'),nil);

  if hMouse > 0 then
  begin
    CopyData.dwData := 0;
    CopyData.lpData := PWideChar(Msg);
    CopyData.cbData := (1 + Length(Msg))*SizeOf(WideChar);
    Winapi.Windows.SendMessage(hMouse,WM_COPYDATA,LPARAM(@CopyData));
  end;
end;

我正在寻找在这些具有不同用户级别的应用程序之间进行IPC的方法,其中最低级别需要发送到更高级别的应用程序.

解决方法

用于本地机器进程间通信的Mailslots是最好的选择,因为它们简单,并且通过Windows中的驱动程序(如管道)实现.这个驱动程序是基于NT的系统上的msfs.sys.您不需要启用任何特殊权限,以便创建邮件槽,读取/写入等等,并且它们可以与任何流程类型,应用程序级别以及任何外部会话一起使用.

窗口句柄(HWND)是特定于会话的,不能在其他用户会话中工作,因此在这种情况下,您使用WM_COPYDATA会遇到问题,因为它依赖于窗口句柄,并且如前所述,对更现代的Windows操作系统的UIPI限制可以是问题.

WM_COPYDATA不太好的另一个原因是这个…假设您在另一个进程(比如csrss之类的系统进程)的上下文中运行可执行代码,这不是一个“交互”进程.也许你注入了一个DLL,想要发送带有WM_COPYDATA的IPC消息……你可以期待这个过程崩溃或者取决于过程的重要性,期望一个BSOD.发生这种情况是因为这些进程不了解user32.dll API调用,例如作为IPC系统的WM_COPYDATA所依赖的SendMessage.

坚持mailslots.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读