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

Leo*_*rdo 6 delphi ipc

我在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);
    ...
Run Code Online (Sandbox Code Playgroud)

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

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, 0, LPARAM(@CopyData));
  end;
end;
Run Code Online (Sandbox Code Playgroud)

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

小智 2

用于本地计算机进程间通信的邮槽是您最好的选择,因为它们很简单,并且它们是通过 Windows 中的驱动程序(如管道)实现的。在基于 NT 的系统上,此驱动程序是 msfs.sys。您不需要启用任何特殊权限来创建邮槽、读/写邮件等,并且它们适用于任何进程类型、应用程序级别和任何外部会话。

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

WM_COPYDATA 不太好的另一个原因是......假设您正在另一个不是“交互式”进程的进程(例如 csrss 等系统进程)的上下文中运行可执行代码。也许您已经注入了一个 DLL,并且想要使用 WM_COPYDATA 发送 IPC 消息...您可能会预期进程会崩溃,或者根据进程的严重性,预计会出现 BSOD。发生这种情况是因为这些进程不喜欢 user32.dll API 调用,例如 WM_COPYDATA 作为 IPC 系统所依赖的 SendMessage。

坚持使用邮筒。