[新闻稿存档 ^][< 第 1 卷第 5 号][第 2 卷第 2 号 >]

Systems Internals 通讯第 2 卷,第 1 号

http://www.sysinternals.com

版权所有 (C) 2000 Mark Russinovich


2000 年 1 月 6 日 - 本期内容:

  1. SYSTEMS INTERNALS 新内容

    • PsKill v1.0
    • PsList v1.1
    • WinObj v2.1
    • Contig v1.3
    • NTFSCHK v1.0
    • HandleEx v2.1
    • Ctrl2cap v2.0
    • Filemon v4.26
    • Bluescreen v2.1
    • Fundelete v2.01
    • Openlist v1.11
    • 12 月 NT 内部
  2. INTERNALS 新闻

    • Win2K DDK 已发布
    • 击键时 Win2K 发生故障
    • 写保护的系统内存更新
    • Win2K API 大小极具增加
    • David Solomon 研讨会
  3. 即将推出

    • Microsoft NT-Related 专利

赞助商: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。

Winternals Software 的 NTFSDOS Professional 和 NTFS for Win98 提供对 DOS、Windows 95 和 Windows 98 中 NTFS 驱动器的完全读写访问权限。 NTFSDOS Pro 为 Windows NT/2K 带来了单软盘“启动磁盘”功能。 使用 NTFSDOS Pro,可以通过 DOS 启动软盘删除 NTFS 驱动器上的错误驱动程序、刷新文件并执行一般的文件系统维护。 NTFS for Win98 提供对 Windows 95 和 Windows 98 中的 NTFS 驱动器的透明访问。 在双启动环境中,NTFS 驱动器上的 NT 和 Win9x 之间可轻松共享应用程序和文件。 这两个实用程序甚至都具有内置的 NTFS Chkdsk 功能。 NTFSDOS Pro 的免费只读版本在 http://www.sysinternals.com/ntfspro.htm 上提供,NTFS for Win98 的免费只读版本位于 http://www.sysinternals.com/ntfs98.htm.

大家好,

欢迎查看 Systems Internals 新闻稿。 该新闻稿目前有 14,000 名订阅者。

正如你所见,Win2K 位于磁盘复制器中。 Win2K 发布到生产 (RTM) 版本的最终内部版本为 2195。 RC3 是 2128,正如我在前面的新闻稿中所介绍的那样,Microsoft 在编译当前源树时,会每晚递增内部版本号(包括周末和节假日)。

我 11 月在 Microsoft 出差(具体原因请见新闻稿中 Filemon 之后的更新),内核团队一名成员带我参观了 Microsoft 园区的 26 号大楼。 那里既是 Windows NT/2K 基础内核团队的办公地点,也是 Windows NT/2K 内部版本和测试实验室的所在地。 虽然内部版本和测试实验室的面积大致相当(大约有 30×60 英尺那么大),不过测试实验室里的机架上塞满了电脑,而内部版本实验室则为内部版本工程师提供了空间来放置办公桌和座椅。 内部版本工程师每晚都会将源树提取到多个四核处理器系统上运行编译。 如果谁的代码在签入时不巧导致内部版本出现故障(但愿不要发生这种事),那这个人无论花费多少时间都要把这个问题给修复好。 到 11 月中旬,Win2K 已处于代码冻结状态,即专注于修复“影响正常使用”的 bug,只有经过委员会批准才允许修改代码。

每当有新的内部版本生成,测试人员会将其同时安装到实验室中的所有电脑上。 测试实验室的系统机架上摆满了各种各样的设备,从小型掌上电脑到每家主流 PC 供应商推出的像洗碗机一样大的多处理器服务器。 Win2K 完成安装后,系统会运行大量压力测试脚本。 在开发后期,Win2K 以超过 90% 的比率通过了压力测试。 在引入多项 Win2K 可靠性增强措施(例如,可帮助开发人员自己在进行测试的过程中找出问题的驱动程序验证工具)之前,该比率要低得多。

内部版本无论是否通过全部测试项目,都会上传到 Microsoft 内部分发服务器,供 Microsoft 员工进行下载和安装。 如果哪名开发人员引入一个重大问题,则在接下来的一周内会收到几百名内部员工发来的电子邮件,反馈遇到了此问题。 只有当出现影响到大量用户的严重问题时,测试团队才会向整个公司发送电子邮件进行提醒(向 25,000 多人群发电子邮件可不是开玩笑的)。

当时我还见到了 Windows NT 的首席架构师 Dave Cutler。 他最近在忙些什么呢? 11 月,内核团队已经在努力开发 Win2K 继任者(内部代号为 NT 6 或 Neptune),而 Dave 则在努力改进 64 位版 Win2K 的安装体验。 Dave 当时主管 64 位的开发工作,而如今 64 位 Win2K 的开发进度一切顺利,即将完成。 截至 11 月,内核团队仍在忙着 64 位 Alpha 版的工作,因为英特尔才刚刚开始生产 Merced 处理器的样品,园区内只有一块。

像往常一样,请将通讯发给你认为可能对其感兴趣的朋友。

谢谢!

-Mark

SYSTEMS INTERNALS 新内容

PSKILL V1.0

Windows NT 和 Win2K 资源工具包附带命令行“终止”实用工具,因为 Windows NT 和 Win2K 都缺少这样一款工具。 可以使用资源工具包“终止”来终止本地进程,但不能终止远程进程。 所以我决定编写一个免费的“终止”工具,像 PsList 一样提供远程功能。 PsKill 采用进程 ID 或名称以及可选的计算机名称,可以终止本地系统或指定的远程系统上的匹配进程。 你甚至不需要在远程电脑上安装客户端组件。 如果你正在运行的帐户没有远程电脑的管理权限,则可以登录到远程系统,通过向 PsKill 命令行添加帐户名和密码来执行终止。

在 http://www.sysinternals.com/pskill.htm. 处下载 PsKill v1.0

PSLIST V1.1

不久前,我将 PsList 发布为 UNIX ps 样式进程和线程查看器。 与 Windows NT 和 Win2K 资源工具包中的类似工具不同,PsList 允许你查看远程系统和本地系统上的进程和线程信息。 与 Perfmon 的工作原理类似,PsList 也会读取 Win NT/2K 的性能 API 信息。 这次的 PsList 修订版中新增了支持用户通过在其命令行中指定帐户名和密码,来登录到远程系统。 此选项允许你访问你运行的帐户没有管理权限的远程电脑。

在 http://www.sysinternals.com/pslist.htm. 处下载 PsList v1.1

WINOBJ V2.1

WinObj 是面向 Windows NT/2K 开发的一款对象管理器命名空间查看器。 对象管理器命名空间一般对用户不可见,但所有已命名 Win32(\BaseNamedObjects\??),以及已命名内核对象都在此命名空间中。 此外,它还充当系统文件命名空间(通过 \?? 下的驱动字母符号链接)以及注册表命名空间(通过项对象 \Key)的入口点。

WinObj 与 Win32 软件开发工具包 (SDK) 中的一款工具同名,但却拥有比 Microsoft 版本更丰富的功能。 例如,在 WinObj 查看某个对象的属性时,会看到引用和句柄计数而非属性编号(SDK WinObj 存在一些重大 bug)。 此外,我们的 WinObj 还会显示同步对象的状态以及对象安全信息。

本次 WinObj 最新更新修复了阻止正确显示 Win2K 命名空间中呈现的一些长符号链接值的 bug。 此外,在 Win2K 上运行时,还使用更加简单易用的全新 Win2K 安全编辑器对话框(在 NT 4 上使用的是 ACLEDIT.DLL 提供的未记录安全编辑器界面)。 用户界面增强功能包括调回上次离开时正在查看的目录,以便下次启动 WinObj 时选中相应目录,并且能够对目录内容列表视图窗口进行排序。

在 http://www.sysinternals.com/winobj.htm. 处下载 WinObj v2.1

CONTIG V1.3

Microsoft 在发布 NT 4 时包含了内置的文件碎片整理 API。 我在 http://www.sysinternals.com/defrag.htm. 处记录下这些 API 并提供使用这些 API 的示例代码 借助这些 API,我实现了 Contig 这款命令行碎片整理工具,可用于对单个文件或目录进行碎片整理。 自初版 Contig 发布以来,我收到了许多请求,希望能增加一个碎片分析选项,最终我实现了这一需求。 Contig v1.3 允许查看指定的文件的碎片化程度,以便确定是否需要执行成本更高的碎片整理进程。

说到文件碎片整理,Symantec 发布了迄今为止最先进的碎片整理程序 Speedisk 5.0。 为了在一片竞品之中脱颖而出,这款程序绕过碎片整理 API,而是采用手动移动磁盘周围的块,这样当系统处于在线状态时可以对目录甚至是 MFT 进行碎片整理。 与 Executive Software 在 http://www.execsoft.com/diskeeper/infosheet.asp#Q9 所述的相反,其推出的 Diskeeper 产品(4.0 和 5.0 版)也会绕过碎片整理 API(不过其碎片整理的先进程度不如 Norton),尤其是在执行启动时间目录合并时。 另外,由于 Executive 喜欢在营销上夸大其辞,因此对其宣传的内容不能全信。

在 http://www.sysinternals.com/contig.htm. 处下载 Contig v1.3

在 http://www.sysinternals.com/pagedfrg.htm. 处下载 PageDefrag、注册表和分页文件碎片整理器

NTFSCHK V1.0

高级用户经常抱怨在将 Win2K 和 NT 4 一起安装在电脑上时,Win2K 自动将任何 NTFS 驱动器升级到 NTFS v5,导致 NT 4 Chkdsk 无法检查这些驱动器。 此时,NT 4 Chkdsk 只是告诉用户它无法在使用更新版本的 NTFS 创建的驱动器上运行,然后退出,而不会扫描 NTFS v5 驱动器,也不会纠正错误。 至少到目前为止,当遇到这种情况时,每当你想要检查这些驱动器时,都要引导到 Win2K 中。

借助 NTFSCHK,可以从 NT 4 运行 Chkdsk 的 Win2K 版本。 如何操作? NTFSCHK 采用为 NTFSDOS 专业版和 NTFSDOS for Win98 开发的,用于从 DOS 和 Windows 9x 执行 NT 的本地 Chkdsk 的同一技术,可将 Win2K Chkdsk 封装在类似于 Win2K 的环境内。

在 http://www.sysinternals.com/ntfschk.htm. 处下载 NTFSCHK v1.0

HANDLEEX V2.1

HandleEx 是面向 Windows NT/2K 开发的一款多功能诊断实用工具,可显示已加载的 DLL 进程以及它们打开了哪些对象(其句柄)。 HandleEx 可用于跟踪 DLL 版本控制问题、句柄泄漏以及确定哪个应用程序正在访问特定文件、目录或注册表项。

HandleEx 版本 2.1 允许查看进程已打开的对象的属性,包括引用计数和同步对象的状态。 还可以使用 NT 的安全编辑器查看和修改对象安全属性。

在 http://www.sysinternals.com/handleex.htm. 处下载 HandleEx v2.1

CTRL2CAP V2.0

凡是拥有 UNIX 开发背景的人都会同意我的观点,即 PC 键盘上的 Control 键安排的位置不对:它应该放在现在大写锁定键的位置。 可现在谁还使用大写锁定键呢? Ctrl2cap 是一款键盘筛选器驱动程序,可将大写锁定改为左 Control 键。作为副作用,会失去大写锁定功能(我在玩《半条命》时使用标准的左 Control 键作为开火键)。

尽管 Ctrl2cap v1.0 可在 Win2K 上运行,但使用它会禁用 Win2K 的电源管理功能,这对笔记本电脑用户而言有些恼火。 因此我更新了 Ctrl2cap,使其符合 Windows 驱动程序模型 (WDM),其中包括支持电源管理。 我提供 NT 4 和 Win2K 两种版本的完整源代码以及相同的源文件内部版本。

在 http://www.sysinternals.com/ctrl2cap.htm. 处下载包含源代码的 Ctrl2cap v2.0

FILEMON V4.26

我在 11 月前往 Microsoft 出差的原因是去参加 Microsoft 举行的“文件系统筛选器 Plugfest 开放技术年会”(内部代号“Irp-olooza”)。 此次年会汇集了以 Windows NT/2K 文件系统筛选器驱动程序为基础构建的所有主要产品,轮换着将这些产品一一进行配对,然后对不同配对运行压力测试。 具有代表性的产品包含约 9 款不同的病毒扫描程序、多款文件加密工具,以及一款磁盘配额管理器。 此次年会旨在识别与不同筛选器组合相关的互操作性问题,帮助寻找和识别主流筛选器产品中存在的 bug,甚至在 Win2K 中找出可能存在的 bug。 由于 Filemon 是世界上使用最广泛的筛选器之一,并且许多 Microsoft 工作组都依赖它来进行开发和故障排除工作,于是组织方便邀请我作为代表来参加本次活动。

不出意外,Filemon 通过了几乎所有压力测试,除了一项测试。 由于 Filemon 是一款动态加载的筛选器,因此其层级位于本次活动的所有产品之上,除了一款产品。 这款层级位于 Filemon 之上的产品是一款同样采用动态加载的病毒扫描程序,实际上是一款基于 Filemon 打造的产品。 由于此病毒扫描程序采用动态加载,我们尝试了两种分层序列,其中一种 Filemon 位于底层,导致病毒扫描程序发生故障。 当 Filemon 的 GUI 退出其驱动程序时,会删除其筛选器设备对象。 筛选器驱动程序删除筛选器设备对象实际上属于非法操作,除非其获得 I/O 管理员的命令,要求它这样做(文件系统筛选器中的 FastIoDetach 和 WDM 中的 IRP_MJ_PNP 与 IRP_MN_REMOVE_DEVICE)。 不出意外,Filemon 设备对象意外消失导致这款病毒扫描程序访问未分配的内存,进而发生故障。

不过所幸,Filemon 在年会最后一场活动上发生的故障,这让我显得不那么尴尬,并且由于测试在每一款产品中都至少发现了一个严重 bug 或互操作性问题,所以尴尬的人并不只有我一个。 Filemon v4.26 版本纠正了本次活动中发现的 bug。

甚至在我参加 plugfest 之前,我就在 Filemon 中发现了一个错误,而 NT 设备与文件系统驱动程序开发人员可能会对此感兴趣。 我最近将 Filemon 修改为使用记录不完整的 Executive Resource (E-Resource) 同步机制。 Microsoft 的文件系统驱动程序广泛使用 E-Resource,因此我认为将其用在 Filemon 源代码中会颇有教育意义。 已禁用必须由拥有异步过程调用 (APC) 的线程获取 E-Resource。 大家需要“知道”这一点,因为 DDK 文档不会告诉你。 遗憾的是,由于实现得过于匆忙,我省略了需要调用函数才能禁用和重新启用需要 APC 才能获取 Filemon 的 E-Resource。 此 bug 只在极少数情况下才会导致问题,所以直到 Win2K 的驱动程序验证工具发现它之前,我都没有发现。 为了修复此问题,我添加了在获取 E-Resource 和 KeLeaveCriticalSection 以及发布 E-Resource 之后需要调用 KeEnterCriticalSectio。

在 http://www.sysinternals.com/filemon.htm. 处下载 Filemon v4.26

BLUESCREEN V2.1

Bluescreen 屏幕保护是我编写的一款屏幕保护程序,用于模拟可怕的 Windows NT 蓝屏死机 (BSOD)。 在 Win2K 版本发布之前,我编写了原始版本来模拟 NT 4 蓝屏死机然后重启,最后出现 Chkdsk 检测磁盘错误。 我提供了两个版本:一个执行磁盘 I/O 来增加真实感,另一个则不执行。 Win2K Beta 3 发布后,我更新了 Bluescreen 以模拟新的 Win2K 蓝屏死机和系统重启。 在 RC3 中,重启屏幕发生了变化,因此我必须再次更新 Bluescreen。 同时,我将磁盘 I/O 调整为可在 Bluescreen 的屏幕保护属性中进行配置的一个选项,不再提供两个版本。

在 http://www.sysinternals.com/bluescrn.htm. 处下载 Bluescreen v2.1

FUNDELETE V2.01

让大家久等了!Windows NT 的“Undelete”功能更名为“Fundelete”回归 Windows NT。 Fundelete 是一款实用工具,能够增强 Windows NT/2K 回归站捕获从程序和命令行中删除的文件,以及从资源管理器中删除的文件的能力。 为什么更改名称? 在 Bryce 和我发布了 Windows NT 的“Undelete”功能几个月后,Executive Software 便发布了一款名为“Network Undelete”的类似的实用工具。 一年后,相比自己的名称,他们发现更喜欢我们这款实用工具的名称,所以就将他们的产品更名为“Undelete for Windows NT”。 与此同时,他们让律师给我们发送了一封“警告函”,说我们侵犯了他们自 1987 以来对“undelete”一词一直拥有的注册商标权。 与其在法庭上唇枪舌战,我们选择更改名称。

开发人员可以将源代码下载到 Fundelete 设备驱动器的核心,其中有演示一些功能强大的驱动器技巧,包括如何从驱动器获取用户的 SID、枚举驱动器中某个目录中的内容,以及新建 IRP。

在 http://www.sysinternals.com/fundelete.htm. 处下载适用于 Windows NT v2.01 的 Fundelete

OPENLIST V1.11

Openlist 是一款 Windows 9x 实用工具,可显示系统上打开的所有文件。 版本 1.11 添加了查看有关文件的详细信息(包括 DLL 的版本信息)的功能。

在 http://www.sysinternals.com/openlist.htm. 处下载 Openlist v1.11

12 月“NT 内部”

我在 Windows NT 杂志 12 月版中的“NT Internals”栏目是“内部 Win2K 可伸缩性增强功能第 2 部分”。 这是 2 个部分系列中的第 2 部分,旨在介绍 Microsoft 在 Win2K 中为多处理器可伸缩性增强了哪些方面,其中包括作业对象、全新量程控件、全新排程类,以及用户模式线程池。

去年 8 月,Windows NT 杂志将其在线文章浏览政策更改为仅允许订阅者才能访问。 上个月,他们将政策放宽,重新回到去年 8 月之前的政策。 现在,非订阅者可以自由查看超过四期杂志之前的文章。

请在 http://www.sysinternals.com/publ.htm. 处参阅我们的出版物的完整列表

INTERNALS 新闻

WIN2K DDK 已发布

Microsoft Win2K 设备驱动程序开发工具包的最终版本 (DDK) 现已发布,可在 http://www.microsoft.com/ddk. 处获取 可以免费下载工具包,或在线浏览文档。

击键时 WIN2K 发生故障

这不是 bug。 《Inside Windows NT》第 2 版的作者 David Solomon 给了我一条很棒的提示。 如果添加DWORD注册表值HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\i8042prt\Parameters\CrashOnCtrlScroll,将其设置为“1”然后重启,就能够使用键盘让 Win2K 发生故障。 按住右 Control 键,并连按两下滚动键。 第二次按下滚动键时,系统会出现蓝屏并显示消息“最终用户手动生成了故障转储”。

当内核或设备驱动程序已锁死且电脑不再响应时,能够手动让系统出现故障非常有用。 存在锁死情况时生成的故障转储可为发开人员提供指出锁死原因的相关信息。 此选项的引入非常低调,就连 Win2K 的核心内核开发人员都不知道,直到我在参加 Plugfest 年会时告诉其他人。

写保护的系统内存更新

在前面的新闻稿中,我谈到写保护的系统内存目前是 Win2K 中一项新的可靠性功能。 事实证明,许多配置中默认并不提供完全的写保护。 如果一台电脑至少拥有 128MB 物理内存,则 Win2K 使用 4MB“大页”来映射内核内存。 使用 4MB 而不是 4KB 页面可节省页面转译的数量,因此可以提高性能。 由于只读代码和读/写数据可能都驻留在同一个 4MB 页面中,因此禁用写保护,除非用户使用驱动程序验证工具请求写保护。 如果驱动程序验证工具强制实施写保护,则 Win2K 使用速度更慢的 4KB 页面来映射不同内存区域保持分页一致的内核内存,这意味着可以将单个代码页面标记为只读。

因此,写保护只在内存容量小于 128MB 以及在驱动程序验证工具中启用了写保护的系统上处于活动状态。 在未启用写保护的系统上,Microsoft 正在考虑提供监视器设备 Win2K 服务包来校验系统内存之和,然后以校验和为标准定期验证内存。 验证操作虽然不像硬件辅助写保护那样精确,但也会检测对应该是只读的区域进行的错误写入。

WIN2K API 大小极具增加

毫无疑问,Win2K 比 NT 4 要大得多。 诚然,许多新服务和集成功能的加入都要算在 Win2K 的大小之内(Active Directory、MMC、COM+ 等),但即使是它的核心操作系统也在一直变大。 操作系统大小增加的原因之一是其为应用程序导出的 API 数量在增加。 Win2K 核心 OS 包括 KERNEL32.DLL、GDI32.DLL、USER32.DLL 和 ADVAPI32.DLL(NTDLL.DLL 还是核心 OS DLL,但 KERNEL32 依赖于 Win32 API 的 NTDLL)。 让我们来快速看看每个 API 的飞速膨胀。 下面是原始数字:

LIBRARY NT 4 SP5 WIN2K GROWTH
KERNEL32 681 823 21%
GDI32 401 553 38%
USER32 629 695 10%
ADVAPI32 401 557 39%

请注意,某些情况下,人为带来的增幅可达到 30% 之多,这是因为一些 API 同时提供 ANSI 和宽字符串两种格式,因此在上述数据中计数两次。

KERNEL32 是用于导出名为“基础 OS”功能的 DLL,包括进程、内存、文件 I/O,以及区域设置管理 API。 Win2K 新增的 API 包括新语言函数(如 EnumUILanguages)、作业对象函数(如 AssignProcessToJobObject)、内存管理函数(如 AllocateUserPhysicalPages)、文件函数(如 FindFirstVolume),以及 ToolHelp32 API(如 Process32First)。

GDI32 提供与绘图和位图相关的例程。 其大小的增加是由于大多数各式各样的新函数中都包含新的字体管理 API(如 CreateFontIndirectEx)、alpha 混合,以及路径对象函数。

USER32 实现窗口化函数,其大小增加的很大一部分是由于使用新的多监视器 API。 其他新的 USER32 API 包括一系列信息函数(如 GetWindowInfoGetTitleBarInfo)。

最后,ADVAPI32 是提供高级 Win32 API 的 DLL。 非常多新的 API 组导致其大小增加:EFS(如 DecryptFile)、CryptoAPI(如 CryptEnumProviders)、安全(如 CheckTokenMembership)、事件跟踪(如 StartTrace),以及组成大部分新函数的 Windows 管理接口 (WMI)(如 WmiOpenBlock)。

David Solomon 研讨会

David Solomon 专家研讨会 1 月 21 日到 25 号前往圣选戈。 由 Microsoft 授课老师主讲的开发人员培训。

  • Win32 编程,主讲人:Jeffrey Richter
  • 电源调试,主讲人:John Robbins
  • Windows 2000 设备驱动程序,主讲人:Jamie Hanrahan
  • Windows CE 设备驱动程序和应用程序,主讲人:Doug Boling

有关详细信息,请参阅 http://www.solsem.com

即将推出

为软件申请专利已成为想要利用自身知识产权的公司的常规手段。 Microsoft 对专利战并不陌生,NT 的内核拥有的几套机制已经获得了美国专利商标局颁发的专利证书。 Microsoft 已获得专利的内核领域包括 I/O 管理器和对象管理器。 下次,我将为大家分享一份列表,汇总我能在 NT 内核上挖掘到的所有专利。


感谢阅读 Systems Internals 新闻稿。

发布于 2000 年 1 月 6 日,星期四,下午 7:09,ottoh

[新闻稿存档 ^][< 第 1 卷第 5 号][第 2 卷第 2 号 >]