分类: C/C++
2008-03-14 14:54:51
如何获取进程的命令行
上表列出的方法中有一个是 GetCmdLine,这个函数返回进程的命令行。实际上,它并不是真正地返回命令行,而是返回进程启动时接收的参数。例如,如果你安装了微软Power Toys中的TweakUI程序(可以在vckbase站点下载),当你在Windows的资源管理器中的任何文件夹上单击右键,则在弹出的上下文菜单中都会有一个"Run Command Prompt Here"菜单项。执行这个菜单命令后,会弹出命令提示窗口,并且所点击的目录为当前工作目录。 C:\>tlist 632 632 CMD.EXE C:\WINNT\System32\cmd.exe - tlist 632 CWD: C:\ CmdLine: C:\WINNT\System32\cmd.exe /k cd "C:\" VirtualSize: 13408 KB PeakVirtualSize: 13412 KB WorkingSetSize: 948 KB PeakWorkingSetSize: 952 KB NumberOfThreads: 1 968 Win32StartAddr:0x4ad1a420 LastErr:0x000000cb State:Waiting 5.0.2195.1600 shp 0x4ad00000 cmd.exe 5.0.2195.1600 shp 0x77f80000 ntdll.dll 5.0.2195.1600 shp 0x77e80000 KERNEL32.dll 5.0.2195.1600 shp 0x77e10000 USER32.dll 5.0.2195.1340 shp 0x77f40000 GDI32.DLL 5.0.2195.1600 shp 0x77db0000 ADVAPI32.dll 5.0.2195.1615 shp 0x77d40000 RPCRT4.DLL 6.1.8637.0 shp 0x78000000 MSVCRT.dll第三行的参数/k cd "C:\"用于外壳调用cmd.exe。如果指定了/k,则cmd.exe执行指定的命令,但是不退出。由于这时调用的应用程序,所以在你构造的工具中这样使用行不通的,必须通过API函数调用。 TLIST工具的源代码可以在MSDN中找到,也可以在vckbase站点下载。可惜用这个代码只能得到进程的ID,名称和主窗口。可以用三种不同的途径来获取某个进程的命令行。第一种是比较猛的一种方法:那就是在汇编一级钻研TLIST程序。Process.cpp文件中的GetProcessCmdLine 就是钻研的成果,这个函数可以在特定的进程的地址空间中找到进程的命令行。指向命令行(Unicode字符)的指针存储在一个内存块中,这个内存块就是进程环境块--Process Environment Block(PEB)中的一个域所指的地址。有关PEB结构的详细内容将在下一部分讨论。 第二种方法是在Web上搜索,看看是否有人已经解决了这个问题!GetCommandLine可以得到命令行,但仅用于调用进程。最好是用CreateRemoteThread在另一个进程上下文中执行这个调用。此方法的细节请参考 Felix Kasza 的文章:。 第三种方法是代码重用,或者说得更确切一些是输出重用。你可以通过捕获TLIST程序的输出,然后解析这些输出,从而获得命令行。在本文的后面部分,我们会对这个方法进行完全的讨论。 下回我们将讨论如何通过 WTS APIs(Windows 终端服务 APIs)获取进程信息。 | |||||||||||||||||||||||||||||
作者简介 Christophe Nasarre 是法国 Business Objects 公司的技术经理(technical manager)。他在 Windows 平台上(3.0 以后的版本)编写了若干个低级工具。他的联系方式:cnasarre@montataire.net. . | |||||||||||||||||||||||||||||
本文出自 的 期刊,可通过当地报摊获得,或者最好是 |