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 挂钩以添加命令行的主要内容,如果未能解决你的问题,请参考以下文章
c ++ createprocess - 命令行参数的字符串var - 没有发生任何事情
pyinstallerexe无法createprocess调用