分享
 
 
 

定制调试诊断工具和实用程序——摆脱DLL地狱(DLL Hell)的困扰(三)

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

定制调试诊断工具和实用程序

——摆脱DLL"地狱"(DLL Hell)的困扰(三)

原著:Christophe Nasarre

编译:NorthTibet

下载源代码:Debugsrc0206.exe (583KB)

原文出处:Windows XP:Escape from DLL Hell with Custom Debugging and Instrumentation Tools and Utilities

本文假设你熟悉 Win32,DLL

如何获取进程的命令行

方法

描述

GetName

以NULL作为参数,调用

GetModuleBaseName ,最后去掉扩展名 “.EXE”

GetFileName

以NULL作为参数,调用

GetModuleFileNameEx

GetMainWindowHandle

参见GetMainWindowHandle

GetMainWindowTitle

GetParentProcessID

用ProcessBasicInformation作为参数调用NtQueryInformationProcess

GetKERNELHandleCount

用ProcessHandleCount作为参数调用NtQueryInformationProcess

GetUSERHandleCount

用GR_USEROBJECTS作为参数调用GetGuiResources

GetGDIHandleCount

用GR_GDIOBJECTS作为参数调用GetGuiResources

GetWorkingSet

调用GetProcessMemoryInfo

GetCmdLine

参见GetProcessCmdLine

GetOwner

参见GetProcessOwner的细节

GetSessionID

ProcessIdToSessionId (参见对快速用户转换的讨论部分——Windows XP的一个新特性)

GetModuleList

CModuleList是一个对EnumProcessModules

和GetModuleFileNameEx的打包类

GetChildrenCount 以及子进程清单

要获取某个进程的子进程列表,目前还没这样的API(即便有也未公开)可供使用。但是,因为某个进程的父进程是已知的,所以将某个进程加到其父进程的子进程列表中不难(参见SetChildrenList的实现)

上表列出的方法中有一个是 GetCmdLine,这个函数返回进程的命令行。实际上,它并不是真正地返回命令行,而是返回进程启动时接收的参数。例如,如果你安装了微软Power

Toys中的TweakUI程序(可以在vckbase站点下载),当你在Windows的资源管理器中的任何文件夹上单击右键,则在弹出的上下文菜单中都会有一个"Run

Command Prompt Here"菜单项。执行这个菜单命令后,会弹出命令提示窗口,并且所点击的目录为当前工作目录。

但是你怎么知道cmd.exe被调用的时候用的是什么参数呢?那么在微软的调试工具(可以在vckbase站点下载)中有一个命令行程序TLIST.EXE,用它可以知道cmd.exe运行的参数,TLIST.EXE是个控制台程序,其输出的信息包括运行进程清单以及命令行,如果用进程ID作为参数调用此程序,例如用cmd.exe的进程ID作为参数载C:盘根目录(C:\)运行TLIST:

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 的文章:CreateRemoteThread

第三种方法是代码重用,或者说得更确切一些是输出重用。你可以通过捕获TLIST程序的输出,然后解析这些输出,从而获得命令行。在本文的后面部分,我们会对这个方法进行完全的讨论。

参考资料

如何用 Win32 APIs 枚举应用程序窗口和进程

如何在 Windows NT、Windows 2000 和 Windows XP 中使用VDMDBG函数?

如何从程序中调用外壳的文件属性对话框?

Windows NT 系统中如何启动和终止 16 位 Windows 应用程序?

下回我们将讨论如何通过 WTS APIs(Windows 终端服务 APIs)获取进程信息。

(待续)

作者简介

Christophe Nasarre 是法国 Business Objects 公司的技术经理(technical

manager)。他在 Windows 平台上(3.0 以后的版本)编写了若干个低级工具。他的联系方式:cnasarre@montataire.net.

.

本文出自 MSDN Magazine

June 2002 期刊,可通过当地报摊获得,或者最好是

订阅

本文由 VCKBASE MTT 翻译

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有