WEB开发网
开发学院软件开发VC 定制调试诊断工具和实用程序(4) 阅读

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

 2006-07-20 11:42:31 来源:WEB开发网   
核心提示: ProcessXP 的源代码包含在本文可下载的压缩包中,WTS 有一个与注册表类似特性,定制调试诊断工具和实用程序(4)(3),那就是允许你获取另外一台机器的信息,这就是为什么WTS枚举 APIs 函数的第一个参数都是一个服务器句柄,要想获得进程记号也是不可能的,这就是在 Windows

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 应用程序?

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

(待续)

上一页  1 2 3 

Tags:定制 调试 诊断

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接