[新闻稿存档 ^] [< 第 2 卷第 2 号] [第 2 卷第 4 号 >]
Systems Internals 通讯第 2 卷,第 3 号
http://www.sysinternals.com
版权所有 (C) 2000 Mark Russinovich
2000 年 6 月 14 日 - 本期内容:
编辑
SYSINTERNALS 的新增功能
- Regmon v4.25
- ListDlls v2.22
- TDImon v1.0
- AutoRuns v1.1
- LDMDump v1.0
- 四月/六月内部专栏
内部信息
- Windows NT 生成历史记录
- Windows NT/2000 计时器精确度
- 重新映射键盘
- 安全系统内存映射
- 隐藏的 Windows 98 文件系统日志记录
- WinDev '00 West
即将推出
- “安全的”Windows 98 注册表项
赞助商:WINTERNALS SOFTWARE
Systems Internals 通讯由 Winternals Software 赞助,网址为 http://www.winternals.com. Winternals Software 是 Windows NT/2K 高级系统工具的领先开发者和提供商。 Winternals Software 产品包括适用于 Windows NT 4.0 的 FAT32、ERD Commander 专业版(Windows NT 的高级启动磁盘功能)以及 Remote Recover。
通过新发布的 TCPView 专业版,你可以监视 Windows NT 4.0、Windows 2000 和 Windows 95/98 系统上的 TCP/IP 活动。 与 Windows 附带的内置 TCP/IP 监视工具(如 netstat)不同,TCPView Pro 会显示与每个 TCP/IP 地址关联的进程,从而轻松确定哪个应用程序负责特定的连接和活动。 TCPView Pro 提供了动态视图和静态视图。 静态视图显示当前打开的本地 IP 地址、与每个终结点关联的进程,以及终结点连接到的远程 IP 地址。 动态视图不可用于任何其他实用工具,它使你能够实时按进程查看 TCP/IP 活动。
在 http://www.winternals.com/products/tcpview.shtml. 获取定价信息并下载 14 天试用版
大家好,
欢迎查看 Systems Internals 新闻稿。 该新闻稿目前有 22,000 名订阅者。
Dave Solomon 和我正在收尾“Inside Windows 2000,第三版”的最后阶段,这意味着这本书将在 8 月中旬而不是 7 月下旬推出(如果发货日期没有推迟,那它就不是 Microsoft 的产品了)。 现在这本书已经定稿了,我可以给你介绍一下它的内容。 首先,它的内容比上一版本增加了约 50%,包含四个全新的章节。 下面是目录:
- 介绍
- 体系结构
- 系统机制
- 启动和关闭
- 管理机制
- 进程和线程
- 内存管理
- 安全性
- I/O 系统
- 存储
- 缓存管理器
- 文件系统
- 网络
与第 2 版一样,这本书充满了演示我们所描述的概念的试验。 该书还附带一张 CD,其中包含整个 SysInternals 网站的副本,以及我们在试验中使用的一些工具。
我专门为这本书写的两个工具受到了书评者的欢迎。 第一个程序名为 LiveKD,它允许你在实时系统上 (i386kd、kd、WinDbg) 运行任何 Windows 2000 内核调试器。 这意味着,你可以启动 LiveKd,指定要托管哪个调试器,然后输入调试器,就可以使用调试故障转储时可用的所有调试器命令了。 书中几乎所有基于调试器的试验都可以使用 LiveKD 运行,这意味着无需使用第二个系统或串行电缆来执行它们。
第二个工具是性能监视器扩展,可用于查看任何内核变量的实时值。 例如,如果要监视与 PerfMon 一起使用的非分页池的数量,可以选择 MmAllocatedNonPagedPool 变量。
当这本书出版时,我会在新闻稿中通知你,你也可以通过 www.sysinternals.com/links.htm 处的 Amazon.com 链接预购。 像往常一样,请将这篇新闻稿发给你认为可能对它感兴趣的朋友。
谢谢!
-Mark
SYSTEMS INTERNALS 新内容
REGMON V4.25
这项对 Regmon 注册表监视工具的最新更新包括在 ZwEnumerateKey
和 ZwQuerykey
系统服务中对 Windows 2000 的新 KeyNameInformation
查询类型的支持。 此功能不输出给 Win32 应用程序使用,但 ADVAPI32 中的注册表函数在系统使用每用户类注册注册表配置单元时会使用此功能。
Windows 2000 上的 Win32 应用程序通过两种方式打开注册表的类注册部分:可以指定 HKEY_CLASS_ROOT
或指定 HKLM\Software\Classes
。 第一个选项会返回与全局类别键组合的每用户类别键的句柄,第二个选项仅返回全局信息的句柄。 ADVAPI32 注册表函数只能通过检查用户传入的注册表项句柄的基础名称来确定用户指定了哪一个,因此需要新的查询类型。 有关详细信息,请参阅 RegOpenKeyEx
处的 SDK 文档。
在 http:www.sysinternals.com/regmon.htm. 下载 Regmon v4.25。
LISTDLLS V2.22
当开发人员创建动态链接库 (DLL) 时,他们会告诉链接器 DLL 的“基址”,即链接器在 DLL 的映像文件中为其创建相对地址信息的地址。 如果 DLL 加载的地址与其基址不同,则加载程序必须修复加载的 DLL 映像中的所有相对地址,以考虑差异。
这些修复或重新定位可能会增加应用程序的启动时间,因此开发人员显然希望防止重定位发生。 但是,浏览 ListDLLs 等程序的输出,比较负载地址和基址,是很繁琐的过程。 因此,我让 2.22 版的 ListDLLs 采用一个新选项:-r
,该选项会在输出中记下重定位的 DLL。
在 http://www.sysinternals.com/listdlls.htm. 下载 ListDLLs v2.22
TDIMON V1.0
TDImon 是功能强大的 SysInternals 监视工具套件中的最新工具,可显示系统上发生的 TCP 和 UDP 活动。 该工具的名称取自以下事实:它会在 TCP/IP 堆栈的接口上监视 TCP 和 UDP 活动,而该接口称为传输驱动程序接口 (TDI)。 所有应用程序和驱动程序的 TCP 和 UDP 活动都必须通过此接口,这意味着 TDImon 不会检测到任何 TCP 或 UDP 活动。
TDIMon 与其表亲 Filemon、Regmon、Portmon 和 DebugView 有着相同的 GUI,与其他监视工具一样,它会显示执行活动的进程的名称、时间戳,并具有筛选和突出显示功能。 这使得 TDIMon 成为理想的管理员网络故障排除工具,以及面向应用程序开发人员的 TCP/IP 调试工具。 TDImon 适用于 Windows 95、98、NT 4 和 Windows 2000。
在 http://www.sysinternals.com/tdimon.htm. 下载 TDImon v1.0
LDMDUMP V1.0
Windows 2000 包含一种称为软分区的新分区格式,它克服了所有 Windows 操作系统到目前为止都使用的 MS-DOS 样式分区的某些缺点。 称为逻辑磁盘管理器的组件 (LDM) 会管理使用软分区格式化的磁盘上的卷,这些磁盘称为动态磁盘(采用 MS-DOS 样式分区的磁盘称为基本磁盘)。 动态磁盘由于它们实现的分区镜像而更加可靠,除此之外,它们还具有一个优势,即无需重启系统即可创建多分区卷,以便文件系统驱动程序识别和装载这些卷。
Microsoft 尚未记录 LDM 分区数据库的格式 - 事实上,由于他们从 Veritas 获得了该技术的许可,Veritas 在其 UNIX 卷管理软件中使用了相同的数据库,因此许可协议可能会阻止 Microsoft 记录它。 最终可能存在 LDM 的 Win32 IOCTL 接口,但与此同时,我已搞定格式并编写了一个名为 LDMDump 的工具,可用于在动态磁盘的数据库内对等互连。 LDMDump 提供的信息与 Windows 2000 资源工具包的 DmDiag 工具大致相同,但 LDMDump 以(我觉得)更简洁的方式提供这些信息。 目前我不提供此工具的源代码,但如果你有兴趣为自己的应用程序获得许可,请与我联系。
在 http://www.sysinternals.com/publ.htm. 处我的 Windows 2000 杂志“Inside Storage,第 2 部分”专栏中阅读有关 LDM 数据库的信息
在 http://www.sysinternals.com/ldmdump.htm. 下载 LDMDump v1.0
AUTORUNS V1.1
你可能已经熟悉我们在过去两个月内发布的 AutoRuns。 AutoRuns 显示注册表中的每个位置的自动运行设置以及指定了这些信息的 .INI 文件(或我们认为)。 用户反馈引导我们了解了 AutoRuns 缺少的几个位置,此最新版本现在会显示它们。
在 http://www.sysinternals.com/misc.htm. 下载 AutoRuns v1.1
6 月/7 月 INTERNALS 专栏
你是否曾想过 Win32 服务与标准 Win32 应用程序的具体区别? 或者,你可能一直想知道是什么使 NT 启动或关闭过程要花费这么长时间。 我在 Windows 2000 杂志中就 Win32 服务的两部分 6 月/7 月系列中回答了这些问题和其他问题。
第 1 部分介绍了 Win32 服务的结构,说明它们如何接受来自客户端应用程序的命令。 然后,我开始描述服务控制管理器 (SCM),它负责管理 Win32 服务,包括它的启动和关闭。 在第 2 部分中,我结束了对在系统启动期间发生的服务启动过程的描述,然后告诉你 SCM 如何关闭服务。 我还谈到了 Microsoft 在 Windows 2000 中对 SCM 的改进,并介绍了 SrvAny 资源工具包工具。
Windows 2000 杂志订阅者可以在 http://www.sysinternals.com/publ.htm. 处在线阅读专栏
内部信息
WINDOWS NT 生成历史记录
正如你从过去的新闻稿中了解到的,当生成团队使用当天的代码签入生成新版本时,Windows NT(现在是 Windows 2000)的内部生成号每天都在递增。利用我的旧 beta 版和候选版本 CD,以及其他比我使用 Windows NT 时间更长的人的帮助,我编制了一份与公开发布版本相对应的生成号列表(beta、候选版本和完整版本)。 请注意,日期是生成日期,而不是生成的发布日期。 例如,Win2K 的最终生成 2195 是在 12 月完成的,但于 2 月向公众发布。
构建 | 发布 | Date |
---|---|---|
297 | PDC | 1992 |
340 | NT 3.1 Beta 1 | 1992 年 10 月 |
397 | NT 3.1 Beta 2 | 1993 年 3 月 |
511 | NT 3.1 | 1993 年 7 月 |
611 | NT 3.5 Beta 1 | 1994 年 4 月 |
683 | NT 3.5 Beta 2 | 1994 年 6 月 |
756 | NT 3.5 RC 1 | 1994 年 8 月 |
807 | NT 3.5 | 1994 年 9 月 |
944 | NT 3.51 Beta 1 | 1995 年 2 月 |
1057 | NT 3.51 | 1995 年 5 月 |
1234 | NT 4.0 Beta 1 | 1996 年 1 月 |
1314 | NT 4.0 Beta 2 | 1996 年 5 月 |
1381 | NT 4.0 | 1996 年 7 月 |
1671 | NT 5.0 Beta 1 | 1997 年 9 月 |
1877 | NT 5.0 Beta 2 | 1998 年 9 月 |
1946 | Beta 3 的 Win2K RC0 | 1998 年 12 月 |
2000.3 | Beta 3 的 Win2K RC1 | 1999 年 3 月 |
2031 | Win2K Beta 3 | 1999 年 4 月 |
2072 | Win2K RC1 | 1999 年 7 月 |
2128 | Win2K RC2 | 1999 年 9 月 |
2183 | Win2K RC3 | 1999 年 11 月 |
2195 | Win2K | 1999 年 12 月 |
WINDOWS NT/2000 计时器精确度
虽然 Windows NT/2000 提供可让你测量时间的服务(包括 QueryPerformanceCounter
),可达到 Pentium 周期计数器的精确度,但其间隔计时服务的精确度略低。 事实上,默认的计时器精确度与系统时钟间隔相同,即单处理器 x86 系统上为 10 毫秒(在 SMP 系统上通常为 7.5 毫秒或 15 毫秒)。 应用程序可以使用用户空间中的多媒体计时器函数将精确度提高到 1 毫秒,但如果需要更高的精确度,驱动程序就无能为力了–在 Windows 2000 之前是这样。
Windows 2000 推出了新的 DDK 函数 ExSetTimerResolution
,驱动程序可以使用它将系统计时器的间隔缩短到 1 毫秒。 想知道多媒体计时器和 ExSetTimerResolution
的背后发生了什么吗? 请参阅 http://www.sysinternals.com/timer.htm. 处的“Inside Windows NT 高精确度计时器”
安全系统内存映射
虽然我们讨论的是面向驱动程序开发人员的新 Windows 2000 内核函数,但 MmGetSystemAddressForMdlSafe
值得一提。 在早期版本的 Windows NT 中,想要获取用户缓冲区或物理内存段的系统地址空间指针的驱动程序开发人员必须传递将此物理缓冲区描述到 MmGetSystemAddressForMdl
的 MDL(内存描述符列表)。
在系统的地址空间中创建虚拟映射时,会使用称为系统页表条目(系统 PTE)的资源,其中映射的每个物理页都需要一个系统 PTE。 遗憾的是,系统 PTE 资源有限,如果驱动程序映射大量内存,可能会使其耗尽。 如果 MmGetSystemAddressForMdl
无法获取所需的系统 PTE,会发生什么情况? 你会认为它会执行一些有用的操作,例如将 NULL
作为映射的虚拟地址返回。 但是并不会,它会放弃,然后系统出现蓝屏。 此类行为会在发出请求的驱动程序上造成不良影响。
Windows 2000 的 MmGetSystemAddressForMdlSafe
会执行 MmGetSystemAddressForMdl
应该执行的操作:如果没有足够的系统 PTE 来为缓冲区创建映射,它将返回 NULL
。 使用此函数可避免指向驱动程序的尴尬转储。 如果你有一个在 NT 4 和 Windows 2000 上运行的驱动程序,则值得发布两个不同的版本,每个平台一个版本,以便你可以在 Windows 2000 上利用此新 API。
重新映射键盘
如果你和我一样,最初用的是 UNIX 键盘,其中 Ctrl 键位于电脑键盘上 caps-lock 键的位置。 为了提高我的输入效率,并了解 Windows 9x 和 Windows NT 上的设备驱动程序开发,我在这两个操作系统上的首批驱动程序项目之一就是实现键盘重新映射驱动程序。 你可以在 http://www.sysinternals.com/c2cap95.htm 找到 Windows 9x 版本,在 http://www.sysinternals.com/ctrl2cap.htm. 找到 Windows NT/2K 版本
在 Windows NT/2K 上,有一种使用键盘筛选器驱动程序的替代方法。 通过在注册表中定义扫描代码重新映射条目,可以完全重新编程键盘的行为。 事实上,Windows 2000 资源工具包内有一个名为 RemapKey 的工具,可用于使用键盘的图形表示形式来交换键。 Microsoft 网站上的这篇文章介绍了键盘重映射器及其工作原理:http://www.microsoft.com/HWDEV/input/W2kscan-map.htm. 请注意,该工具也适用于 NT 4。
因此,假设你没有 Windows 2000 资源工具包,并且不想花钱买它(我建议你买一下,它充满了各种很酷的工具和文档)。 如果是这样的话,你可以手动重新映射键盘。 我刚才引用的 Microsoft 文章介绍了键盘驱动程序查找重新映射代码 (HKLM\ SYSTEM\CurrentControlSet\Control\Keyboard Layout\Scancode Map
) 的注册表项的格式,本文(也可从 Microsoft 获取)会告诉你对应于键的扫描代码:http://www.microsoft.com/hwdev/download/desinit/scancode.zip.
如果你只想交换 caps-lock 和 control(注意,我的键盘筛选器完全没有 caps-lock 键,因为我从不使用它),你可以复制以下文本(不包括“----”分隔符)到文件(将它命名为类似于 swapcaps.reg),然后双击该文件。 设置将导入注册表,并在重启后生效。
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,03,00,00,00,3a,00,1d,00,1d,00,3a,00,\
00,00,00,00
如果要撤消映射,只需从注册表中删除 Scancode Map 值并重启即可。
隐藏的 WINDOWS 98 文件系统日志记录
你是否浏览过 Windows 98 系统目录,并注意到一个名为 \Windows\Applog
的子目录? 在此目录中,你可能会看到名称与你最近运行的应用程序相匹配的文件,以及扩展名,如 .LGC 和 .LGD。 在记事本中打开其中一个文件,你将清楚地看到文件系统活动跟踪,其中包含文件名、偏移量以及打开和关闭调用。 是某个病毒生成了这些日志,还是 Windows 98 附带了会向 Microsoft 报告你的应用程序使用模式的机密实用工具? 两个都不是(如果是的话,你会在行业媒体上读到它,而不是在SysInternals 新闻稿中)。 它属于 Windows 98 的“以 36% 更快的速度加载你最常用的应用程序”功能。
由于 HKLM\Software\Microsoft\Windows\CurrentVersion\Run
中的 Taskmon 条目,Windows 98 会在启动期间启动名为 Taskmon 的服务程序。 Taskmon 会加载名为 FioLog (\Windows\System\FioLog.Vxd
) 的 VxD 来安装文件系统活动挂钩,以便它可以在应用程序启动期间查看文件使用情况。 Taskmon 监视所有应用程序在启动时执行的文件系统活动,但 HKLM\Software\Microsoft\Windows\CurrentVersion\Taskmon\ExcludeApps
中列出的应用程序除外。 FioLog 会在 Applog 目录中记录应用程序启动文件系统活动。 它创建的日志文件以扩展名 .LGA 开头。 目前还不清楚它如何确定何时删除日志以及何时为具有新扩展名且最后一个字母递增的应用程序创建新日志。 下面是示例日志文件的一部分:
{
o da3034d0 d000 "C:\WINDOWS\NOTEPAD.EXE"
R da3034d0 0 40
R da3034d0 80 f8
R da3034d0 80 1c0
R da3034d0 7000 1000
R da3034d0 6000 e00
o da2b2610 156000 "C:\WINDOWS\SYSTEM\SHELL32.DLL"
R da2b2610 83000 1000
o da2b2f40 45110 "C:\WINDOWS\SYSTEM\SHLWAPI.DLL"
R da2b2f40 3c000 1000
R da2b2f40 3c000 1000
...
行分为四个字段:第一个是操作代码,其中 o
是打开,R
是读取,C
是关闭。 你不会看到 W
(写入),因为 FioLog 仅在应用程序启动期间记录读取操作,以便优化应用程序启动。 第二个字段是内部文件指针。 必须根据行的操作代码解释第三个和第四个字段。 如果操作代码为 R
,则第三个字段是文件偏移量,第四个字段是读取的长度。 但是,如果操作代码为 o
,则第三个字段为打开标志,第四个字段是打开的文件的名称。 在示例中,跟踪打开的 notepad.exe 会返回文件指针 da3034d0,可以看到该指针正在后续读取操作中使用。
启动碎片整理操作时,Defrag.Exe 程序会执行名为 CvtApLog (\Windows\System\Cvtaplog.exe
) 的程序来处理日志文件。 CvtApLog 使用名为 ClusAlgo.Dll (\Windows\System\Clusalgo.dll
) 的 DLL 来根据读取的日志文件确定最佳群集位置,并将此信息记录在指导碎片整理过程的名为 \Windows\Applog\Applog.d*
的文件中。 CvtApLog 还会生成一个名为 \Windows\Applog\Optlog.txt
的文件,该文件汇总了日志文件规定的应用程序启动优化。 下面是 Optlog.txt 文件的部分内容:
Program Launch Optimization Log - Created Tue Jun 13 11:42:52 2000
Programs Eligible for Optimization:
Ord Flag ProgName Uses LastExecDate Program Path
1 RUNDLL32 65 2000.06.13 C:\WINDOWS\RUNDLL32.EXE
2 ATIPTAAB 31 2000.06.13 C:\WINDOWS\SYSTEM\ATIPTAAB.EXE
3 NOTEPAD 22 2000.06.13 C:\WINDOWS\NOTEPAD.EXE
4 PING 9 2000.06.10 C:\WINDOWS\PING.EXE
…
17 IEXPLORE 2 2000.06.01 C:\PROGRAM FILES\INTERNET EXPLORER\IEXPLORE.EXE
Programs Ineligible for Optimization:
Ord Flag ProgName Uses LastExecDate Program Path
18 S GREP 5 2000.06.13 C:\BIN\GREP.EXE
19 S STRINGS 12 2000.06.13 C:\BIN\STRINGS.EXE
20 S ATI2CWXX 31 2000.06.13 C:\WINDOWS\SYSTEM\ATI2CWXX.EXE
Control Parameters:
Use app profile = Yes
Minimum log size = 1000
Maximum no use days = 90
Maximum apps = 50
Flags for Ineligible Programs:
S = Log size smaller than <Minimum log size>
U = Program not used for more than <Maximum no use days>
P = No profile for program
E = Associated program no longer exists
D = Log deleted (may be combined with one of the above)
Windows 98 能够将启动应用程序期间使用的文件部分移动到磁盘上的连续区域,这是 Microsoft 从 Intel 获得授权的技术(要查看它,请手动执行 Defrag.exe,然后你会看到文本“Intel Application Launch Accelerator”。
WINDEV '00 WEST
WinDev '00 East 上周举办,有创纪录的 660 人出席(这是所有酒店的容量了)。 与会的演讲者代表了 Windows 开发每个领域的重要人物,包括从 COM-god Don Box 到驱动程序专家 Jamie Hanrahan 和 Brian Catlin 的每个人。 我的活动包括“Windows 2000 Internals”、“高级驱动程序”、“Windows NT/2000 文件系统驱动程序”和“群集服务器”。
如果你错过了,你很幸运,因为你有第二次机会。 WinDev '00 West 将于 9 月 11 日至 15 日在加州圣克拉拉举行,所有相同的演讲者都将出席。 我将参与相同的活动,就像在 WinDev East 一样,我会向回答我的问题或提出特别有见地问题的与会者赠送免费的 SysInternals T 恤。 可在 http://www.butrain.com/windev/west/default.htm. 中查看详细信息
即将推出
“安全的”Windows 98 注册表项
虽然 Windows 98 注册表不支持安全性,但 Microsoft 实现了一种用于定义隐藏注册表项的机制。 哪个应用程序利用了这种隐形技术? 当然是 Internet Explorer。 下次我会告诉你 IE 隐藏了哪些键以及 Windows 98 如何实现它们。
感谢阅读 Systems Internals 新闻稿。
发布于 2000 年 6 月 14 日,星期三,晚上 7:08,ottoh