CreateProcess 挂钩以添加命令行

Posted

技术标签:

【中文标题】CreateProcess 挂钩以添加命令行【英文标题】:CreateProcess hook to add CommandLine 【发布时间】:2015-08-19 16:15:31 【问题描述】:

我有一个项目正在向 Chrome 浏览器添加一些特定的标志(命令行),问题是我是通过创建一个新的 Chrome 快捷方式来执行此操作的,其中包含我想要执行的标志。

在最后几天,这个解决方案变得过于肤浅,我被要求做一些更“深入”的事情。查看 Windows 注册表,我没有找到任何好的解决方案来 always 在有人运行 Chrome 时添加此标志,所以我开始考虑将 CreateProcess 挂钩到资源管理器中,并检查该进程是否有关要运行的是 Chrome,然后我在 lpCommandLine 属性中添加标志。

我知道 hook into explorer 是一个非常“侵入性”的解决方案,但这变得很有帮助,因为我在这个项目上还有一些其他的成就,而 hooking 将帮助我完成所有这些工作。

我的钩子工作了,我尝试了很多方法来在找到 chrome 时添加命令行,但没有成功......现在(我尝试了至少 8 种不同的解决方案)我的绕道功能是:

function InterceptCreateProcess(lpApplicationName: PChar;
            lpCommandLine: PChar;
            lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
            bInheritHandles: BOOL;
            dwCreationFlags: DWORD;
            lpEnvironment: Pointer;
            lpCurrentDirectory: PChar;
            const lpStartupInfo: STARTUPINFO;
            var lpProcessInformation: PROCESS_INFORMATION): BOOL; stdcall;
var
  Cmd: string;
begin
  Result:= CreateProcessNext(lpApplicationName,
          lpCommandLine,
          lpProcessAttributes,
          lpThreadAttributes,
          bInheritHandles,
          dwCreationFlags,
          lpEnvironment,
          lpCurrentDirectory,
          lpStartupInfo,
          lpProcessInformation);
  if (POS(Chrome, UpperCase(String(lpApplicationName))) > 0) then
  begin
    Cmd:= ' --show-fps-counter';
    lpCommandLine:= PChar(WideString(lpCommandLine + Cmd));
    ShowMessage(lpCommandLine);
  end;
end;

“--show-fps-counter”是我尝试添加但没有成功的命令行。

我的 Delphi 版本是 XE4。

【问题讨论】:

你还没有描述这是如何失败的。你做了什么调试?你期望会发生什么?会发生什么? 这对我来说就像使用大炮击落苍蝇一样 - 没有 Chrome 的 API 可以通过代码启用此功能吗? @500-InternalServerError ,我没有任何 API,至少到目前为止我没有发现这个......无论如何,就像我说的那样,我还有一些其他目标可以帮助我为了完成,这就是为什么我认为使用它可能会很有趣...... @DavidHeffernan 我没有调试,因为就像我说它被注入到资源管理器中......我只是在独立的 exe 上尝试了相同的代码并且它有效。我成功打开了 chrome,并且显示消息也出现了。我发布这个问题是因为我认为问题与字符串问题(unicode)或类似问题有关。我想要做的是 chrome 显示一个 FPS 计数器(当你使用 show-fps-counter 命令行打开它时会发生这种情况),但它只是在没有计数器的情况下打开。 我同意@500。如果 FPS 计数器可以在标志设置中永久启用,那么它也存储在某些配置中(注册表?)。我想这种方式不会再有力了,因为我认为即使您使用此参数启动 Chrome,您仍然可以关闭该仪表(例如通过这些标志设置)。 【参考方案1】:

好的,这是很明显的事情......我需要在调用 CreateProcessNext(原始函数)之前添加参数! 所以,只需这样做:

 if (POS(Chrome, UpperCase(String(lpApplicationName))) > 0) then
  begin
    lpCommandLine:= PChar(lpCommandLine + ' --show-fps-counter');
  end;
  Result:= CreateProcessNext(lpApplicationName,
          lpCommandLine,
          lpProcessAttributes,
          lpThreadAttributes,
          bInheritHandles,
          dwCreationFlags,
          lpEnvironment,
          lpCurrentDirectory,
          lpStartupInfo,
          lpProcessInformation);

有效...请注意,我只是颠倒了更改 lpCommandLine 的顺序。感谢所有参与者,我仍然会考虑这里所说的内容。

【讨论】:

您使用哪种技术添加挂钩?我在哪里可以了解更多信息?

以上是关于CreateProcess 挂钩以添加命令行的主要内容,如果未能解决你的问题,请参考以下文章

CreateProcess 命令行参数

c ++ createprocess - 命令行参数的字符串var - 没有发生任何事情

UNC 路径上的 VC++ Createprocess

pyinstallerexe无法createprocess调用

如何使用 CreateProcess 在 cmd 中执行命令?

在webservice使用者方法中插入行以添加SOAP头