王朝网络
分享
 
 
 

定制调试诊断工具和实用程序——摆脱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

如何通过 WTS APIs(Windows终端服务 APIs)获取进程信息

Windows XP 有一个新特性叫做“快速用户转换——Fast User

Switching”,这个特性允许多个用户同时在一台机器上登陆。当一个用户登陆后,另一个用户启动的进程仍然能够运行。这个神奇的特性所倚仗的是

WTS APIs。如果你想了解更多有关 WTS 的内容,可以参考 MSJ Oct99 的一篇文章:“Windows NT和 Windows 2000 终端服务APIs介绍”,作者是 Frank Kim。

Windows XP为每一个登陆用户创建一个WTS会话(Session)。每个运行进程总是与这样一个Session关联。Windows

XP的任务管理器允许你列出进程清单,不论是针对所有会话的还是仅仅针对自己的会话,任务管理器对话框的进程标签中有一个"显示所有用户的进程"复选框可以对此进行选择。(如图十一所示):

图十一 任务管理其的进程列表

如果你想了解某个进程隶属的 session ID,可以调用 kernel32.dll 输出的一个 API 函数

ProcessIdToSessionId。给定一个进程的ID,他返回相应的 session ID。有趣的是这个 API 函数不是由

wtsapi32.dll 输出的,而是出自于 kernel32.dll,前者是所有 Windows 终端服务 APIs

的输出动态库。实际上,即使 Windows 终端服务没有运行起来,Windows 2000 和 Windows XP 都将 session ID

存储在 PEB 中。

注意 Windows NT 既不在 PEB 中存储 session ID,也不从 kernel32.dll 中输出

ProcessIdToSessionId 函数。当你调用 ProcessIdToSessionId,而 WTS 又没有运行,这时其返回值总是0。

除了允许你列出打开的会话之外,WTS 还有一个 API 用于枚举运行的进程,其实现方式与 PSAPI 和 TOOLHELP32

的实现方式是不同的。我写了一个类 CWTSWrapper 来打包 WTS 中与进程和会话有关的函数,以便避免与 wtsapi32.dll

进行静态链接。这个类的实现细节请参考下载的源代码,见 common 目录的 wrappers.cpp 文件。用 CWTSWrapper

很容易构造象 ProcessXP 这样的控制台应用程序。下面是ProcessXP

程序的输出,它列出了与登陆用户对应的打开的会话以及会话项下的运行进程。ProcessXP 程序的输出如下:

3 open sessions

----------------------------

ID State Window Station

----------------------------

0 (WTSActive) Console [Administrator]

1 (WTSDisconnected) [standard]

2 (WTSDisconnected) [Player]

30 running processes

----------------------------

0 0 ?

0 4 System \\NT AUTHORITY\SYSTEM

0 388 smss.exe \\NT AUTHORITY\SYSTEM

0 600 csrss.exe \\NT AUTHORITY\SYSTEM

0 632 winlogon.exe \\NT AUTHORITY\SYSTEM

0 676 services.exe \\NT AUTHORITY\SYSTEM

0 688 lsass.exe \\NT AUTHORITY\SYSTEM

0 856 svchost.exe \\NT AUTHORITY\SYSTEM

0 968 svchost.exe \\NT AUTHORITY\SYSTEM

0 1160 svchost.exe \\NT AUTHORITY\NETWORK SERVICE

0 1192 svchost.exe \\NT AUTHORITY\LOCAL SERVICE

0 1252 spoolsv.exe \\NT AUTHORITY\SYSTEM

0 1888 explorer.exe \\MACHINE\Administrator

0 2004 msmsgs.exe \\MACHINE\Administrator

0 104 svchost.exe \\NT AUTHORITY\SYSTEM

1 1496 csrss.exe \\NT AUTHORITY\SYSTEM

1 1172 winlogon.exe \\NT AUTHORITY\SYSTEM

1 1640 explorer.exe \\MACHINE\standard

1 1900 ctfmon.exe \\MACHINE\standard

1 352 notepad.exe \\MACHINE\standard

1 1896 freecell.exe \\MACHINE\standard

2 416 csrss.exe \\NT AUTHORITY\SYSTEM

2 268 winlogon.exe \\NT AUTHORITY\SYSTEM

2 1784 explorer.exe \\MACHINE\Player

0 1820 msiexec.exe \\NT AUTHORITY\SYSTEM

2 1544 ctfmon.exe \\MACHINE\Player

2 1632 msmsgs.exe \\MACHINE\Player

2 1268 wordpad.exe \\MACHINE\Player

0 1696 wuauclt.exe \\MACHINE\Administrator

0 1996 ProcessXP.exe \\MACHINE\Administrator

从上面的输出可以看出,名为 MACHINE 的机器上打开的会话有三各。第一个会话的 ID 为0,状态为活动(WTSActive

因为它就是运行中的 ProcessXP 所在的会话),产生这个会话的登陆用户为 Administrator。第二个会话的ID是1,处于断开状态(WTSDisconnected),产生这个会话的用户为标准用户,此用户启动了

Notepad 和 Freecell 程序,用户Player打开了会话2,并运行WordPad,但目前状态是断开的。

ProcessXP 的源代码包含在本文可下载的压缩包中。WTS 有一个与注册表类似特性,那就是允许你获取另外一台机器的信息。这就是为什么WTS枚举

APIs 函数的第一个参数都是一个服务器句柄。WTS_CURRENT_SERVER_HANDLE

用于当前的机器。第二个参数是保留参数,值应该为0。第三个参数希望的版本,其值应该是1。最后两个参数用于存放返回的信息。一个用于存放会话数或进程数。另一个是结构数组的指针,结构可以是描述会话信息的结构,也可以是描述进程信息的结构。就看你是使用哪个枚举API,是枚举会话还是枚举进程。因为数组的存储空间是由

WTS 分配的,你必须要记住用 WTSFreeMemory 释放这个空间。

下面是描述会话的结构:WTS_SESSION_INFO:

typedef struct _WTS_SESSION_INFO

{

DWORD SessionId;

LPTSTR pWinStationName;

WTS_CONNECTSTATE_CLASS State;

} WTS_SESSION_INFO, * PWTS_SESSION_INFO;

结构中除了会话的 SessionId,还有会话名 pWinStationName,当前会话的名字是“console”,而其它的会话是无名的。当前的会话状态为

WTSActive,其它则为 WTSDisconnected。

下面是描述进程的结构 WTS_PROCESS_ INFO:

typedef struct _WTS_PROCESS_INFO

{

DWORD SessionId;

DWORD ProcessId;

LPTSTR pProcessName;

PSID pUserSid;

} WTS_PROCESS_INFO, * PWTS_PROCESS_INFO;

SessionId 与 ProcessIdToSessionId 所要找的值一样,ProcessId

不用说了,是进程ID。最后一个成员 pUserSid 指向安全标示符,描述用户账号,用户正是在这个账号下运行进程。使用

LookupAccountSid,你可以获得从 pUserSid 中获得用户名。这个信息已经可以通过 CProcess 类中的

GetProcessOwner 获得,但它是通过进程记号(token),而不是通过 WTS。某些情况下,即便由

WTSEnumerateProcesses 控制对它的提供,要想获得进程记号也是不可能的,这就是在 Windows XP 环境下要用 WTS

API 而不用 PSAPI 或 TOOLHELP32 的缘故。参考资料

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

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

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

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

下回我们将讨论如何枚举某个进程加载的模块。

(待续)

作者简介

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- 王朝网络 版权所有