当前位置: 首页 > 面试题库 >

读取另一个进程的命令行参数(Win32 C代码)

公羊玉泽
2023-03-14
问题内容

我需要能够列出传递给其他正在运行的进程的命令行参数(如果有)。我已经具有系统上正在运行的进程的PID,因此基本上我需要确定传递给给定PID XXX的
进程的参数。

我正在研究用于管理流程的Python模块的核心部分。该代码使用C语言编写为Python扩展,并将由更高级别的Python库包装。该项目的目标是避免依赖第三方库(例如pywin32扩展名)或丑陋的黑客程序(例如在命令行上调用“
ps”或taskkill),因此我正在寻找一种使用C代码执行此操作的方法。

我在Google周围搜索了此内容,发现了一些使用CreateRemoteThread()将自己注入到其他进程中的简短建议,然后运行GetCommandLine(),但我希望有人可能有一些有效的代码示例和/或更好的建议。

更新
:我发现了完整的正常演示代码以及在CodeProject上使用NtQueryProcessInformation的解决方案:http
:
//www.codeproject.com/KB/threads/GetNtProcessInfo.aspx-这并不理想,因为“不支持”直接从中获取信息NTDLL结构,但我会继续使用。感谢所有的建议。

更新2 :我通过更多的谷歌搜索设法找到了一个不使用C
++代码的C版本,它更加直接/简洁地指出了这个问题。有关详细信息,请参见http://wj32.wordpress.com/2009/01/24/howto-
get-the-command-line-of-
processes/。

谢谢!


问题答案:

为了回答我自己的问题,我终于找到了一个CodeProject解决方案,该解决方案完全可以满足我的需求:

http://www.codeproject.com/KB/threads/GetNtProcessInfo.aspx

正如@Reuben已经指出的那样,您可以使用NtQueryProcessInformation检索此信息。不幸的是,这不是推荐的方法,但是鉴于唯一的其他解决方案似乎是要承担WMI查询的开销,我认为我们现在将采用这种方法。

请注意,如果在64位Windows操作系统上使用从32位Windows编译的代码,这似乎不起作用,但是由于我们的模块是从目标上的源代码编译的,因此对于我们的目的而言应该可以。我宁愿使用此现有代码,并且如果它在Windows
7或更高版本中无法使用,我们可以再次考虑使用WMI。感谢您的回复!

更新 :此处显示了同一技术的更简洁且仅C(相对于C ++)的版本:

http://wj32.wordpress.com/2009/01/24/howto-get-the-command-line-of-
processes/



 类似资料:
  • 12.4.1 os 包 os 包中有一个 string 类型的切片变量 os.Args,用来处理一些基本的命令行参数,它在程序启动后读取命令行输入的参数。来看下面的打招呼程序: 示例 12.11 os_args.go: // os_args.go package main import ( "fmt" "os" "strings" ) func main() {

  • 问题内容: 但它们似乎更复杂。 我只是想将文件复制到Linux 命令调用的每个结果中。 这是怎么了?: 谢谢 问题答案: 这就是你想要的: 细分/解释: :调用find命令 :从当前工作目录开始搜索。 由于未指定深度标记,因此将递归搜索所有子文件夹 :查找具有明确名称的文件 :对于搜索结果,对它们执行其他命令 :复制以覆盖返回到的每个结果; 想一想每个搜索结果的去向。 :用于分隔要在其后运行的不同

  • 问题内容: 所以假设我有一个Java包… 它具有main方法和main方法 然后还有很多其他的类..... 我的问题是,是否有可能从其他不属于主类但位于同一包中的其他类中获取传递给main方法的args … 问题答案: 不,不是可移植的,基于JVM的实现可能会有一些诡计,但我从未见过,即使依赖它,这也是一个非常糟糕的主意。 如果要将这些值放在其他位置,则该函数需要以某种方式使它们可用。 一个简单的

  • 问题内容: Python程序员可以通过哪些方式做到这一点? 问题答案: 标准库中的规范解决方案是: 这是一个例子: 任意顺序的多个选项。 短期和长期选择。 默认值。 生成使用帮助消息。

  • 问题内容: 我给了一个提供(日期)的字符串,该字符串的格式为Instant的本机ISO-8601,或者为自该纪元以来的整数毫秒。这工作正常,但我还需要能够支持其他日期格式(客户比较挑剔)。 为避免传统与歧义,我希望客户在请求中指定其首选格式*。例如: 传递给看起来像这样的方法: (为清楚起见,省略了时区和时区部分) 因此,我希望我能够读取该参数。 我已经能够使用设置属性和进行类似操作的过滤器的组合

  • 问题内容: 我想在我的Java程序中读取c-Application的输出流。 iremoted (可在此处获得:http : _//osxbook.com/software/iremoted/download/iremoted.c_ )是一个C应用程序,如果按下了Apple Remote遥控器上的按钮,它将显示诸如“ 0x19按下”的单独行。如果我启动改头换面的程序,那么一切都会很好,每当我按下一

  • 我总是从命令行运行程序,允许你混合参数的顺序。如果你在其中加入额外的东西,他们就会抓住你。例如: 他们是怎么做到的?有这方面的模块吗?

  • 一如之前使用 cargo new 新建一个项目。我们称之为 minigrep 以便与可能已经安装在系统上的grep工具相区别: 第一个任务是让 minigrep 能够接受两个命令行参数:文件名和要搜索的字符串。也就是说我们希望能够使用 cargo run、要搜索的字符串和被搜索的文件的路径来运行程序,像这样: $ cargo run searchstring example-filename.tx