Systems Internals 新闻稿第 1 卷第 1 号
1999 年 4 月 14 日 - 本期内容:
SYSTEMS INTERNALS 新内容
- VolumeID for Windows 9x
- EFSDump
- ListDLLs for Compaq Alpha
- “Boot Process 洞察,第二部分”
- 我 4 月在 Windows NT Magazine 上发表的文章
- 丑闻曝光
- 旧事重提
INTERNALS 新闻
- Win2K 驱动程序验证程序
- 使用 Boot.ini 进行 Y2K 测试
即将推出
- Win2K 中的排队自旋锁
- Tokenmon
赞助商: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 的启动磁盘功能)以及 NTRecover。
大家好,
欢迎阅读 Systems Internals 新闻稿第一期内容。 我很高兴宣布,自从新闻稿在一周多前发布以来,该已经收获了 1000 名订阅者。
在新闻稿中,我想要及时告知你 Systems Internals 中新出现的实用工具和文章,我还想要给你讲讲 Windows internals 中的一些趣闻;Systems Internals 网站上没有相应的论坛来讲这些趣闻。 如果你对新闻稿有任何意见或建议,请随时通过 mark@... 将它们发送给我。此外,请将这篇新闻稿传递给你认为可能对该内容感兴趣的任何人。 在新闻稿的结尾,有关于订阅、取消订阅或修改订阅的说明。
谢谢!
-Mark
SYSTEMS INTERNALS 新内容
VOLUMEID FOR WINDOWS 9X
虽然 Windows NT 和 Windows 9x 允许你使用“label”命令更改逻辑驱动器或软盘上的标签,但它们无法让你在格式化驱动器时更改它们任意分配的卷 ID。 Systems Internals 网站上已经向 Windows NT 提供了 VolumeID 程序一年多,该程序现在刚刚移植到 Windows 9x。 使用这个小程序,你可以将硬盘驱动器和软盘上的卷 ID 更改为你想要的任何内容。
VolumeID 使用允许应用程序直接在逻辑驱动器上进行读取和写入的 API,而在 Win9x 上,则是物理驱动器(软盘),这会绕过文件系统。 在 Windows NT/2K 上,VolumeID 使用常规的 ReadFile 和 WriteFile 来访问原始驱动器数据 - 诀窍在于它如何指定要访问的卷的名称。 你可以在 Microsoft 知识库文章 Q100027 中,了解如何通过 Windows NT/2K 下的应用程序来访问物理或逻辑驱动器。 若要通过 Windows 9x 访问逻辑驱动器,你可以基于 Microsoft 知识库文章 Q174569 中提供的示例代码创建你的代码。 如果需要通过 Windows 9x 上的应用程序直接访问软盘驱动器,请使用 MSDN 中记录的 Win32 IOCTL VWIN32_DIOC_DOS_INT13。
若要下载 VolumeID,请访问 http://www.sysinternals.com/misc.htm.
EFSDUMP
Windows 2000 将首次推出的 Microsoft 内置文件加密技术,称为“加密文件系统”。 EFS 附带了许多用于操作加密文件的新 API,包括一个 QueryUsersOnEncryptedFile,它用于查看哪些用户已注册获取了访问加密文件的文件,以及哪些用户注册为这些文件的恢复代理。 我编写了一个名为 EFSDump 的小程序,通过它可以在系统上轻松查看加密文件的这个信息。
虽然我的主题是 EFS API,但截至 4 月 MSDN,有很多新的 API 没有被记录下来,这在 Windows 2000 发布周期的最后这个阶段相当令人不安。 最值得注意的是,OpenEncryptedFileRaw、ReadFileEncryptedRaw、WriteFileEncryptedRaw 和 CloseEncryptedFileRaw(都由 Win2K 的 ADVAPI32.DLL 导出)目前都没有被记录。 任何希望备份加密文件的应用程序都需要使用这些 API,这意味着,要么 Microsoft 仅向特选合作伙伴传递有关它们的信息,要么当 Microsoft 最终公开记录它们时,备份软件公司将不得不争相将他们的产品推向市场。 有一点是肯定的,Windows 2000 NTBACKUP 程序的开发人员已经有权访问 API 文档:Win2K Beta 3 的 NTBACKUP 正在积极使用这些 API。
如果你对 EFS internals 感兴趣,请一定要在 Windows NT Magazine 中的“NT Internals”专栏中阅读我即将发表的关于 EFS 的 6 月/7 月文章(有两个部分的内容)。 在文章中,我将详细介绍 FEK(文件加密密钥)和用户 EFS 密钥的存储位置,NTFS、EFS 驱动程序和 LSASRV(本地安全机构子系统服务器)执行加密过程的方式,当然还有解密的工作原理。
若要下载包含完整源代码的 EFSDump,请访问 http://www.sysinternals.com/misc.htm.
LISTDLLS FOR COMPAQ ALPHA
在 Systems Internals 中,Alpha 可使用的实用工具不断增多。 最新添加的是 ListDLLs,这是一款命令行实用工具,可用于查看正在运行的进程的 DLL 信息。 使用我的 HandleEx 工具,你你查看这个信息,还可查看进程已打开的句柄(文件、进程、线程、同步对象)的相关信息,但 HandleEx 是一种 GUI 工具,因此它有时使用起来不方便(例如,它不能在批处理文件中运行)。
你是否有兴趣了解 Systems Internals 典型实用工具的 x86 版本与它相应的 Alpha 版本的下载比率? 两者之比大约是 20:1,这与在行业估计的已安装 Alpha NT 的用户群人数(占 NT 总市场的 5%)密切相关。
若要下载 ListDLLs 和其他 Alpha 端口(包括 HandleEx),可访问 http://www.sysinternals.com/alpha.htm.
“Boot Process 洞察,第二部分”
我 1 月在 Windows NT Magazine 上发表的“NT Internals”专栏现在可以通过 Windows NT Magazine 网站在线提供。 您可以在 Systems Internals 的“出版物”页面上找到文章链接,以及第一部分内容和更早的“NT Internals”专栏内容,网址为 http://www.sysinternals.com/publ.htm.
我 4 月在 Windows NT Magazine 上发表的文章
此外,请一定要看看我在 Windows NT Magazine 上 4 月期发表的专题文章,标题是“Linux 和企业”。 我揭示了关于 Linux 2.2 内核和网络服务器应用程序(“企业”应用程序)的几个重要问题,这些问题最终将导致这个版本的 Linux 内核没法在性能方面与 NT 和其他 UNIX 变体直接竞争。
丑闻曝光
与这相关的是,你可以听到过,D.H. Brown(一家分析公司)最近发布的关于 Linux 作为企业操作系统的能力的报告。 事实证明,这份报告的作者在很大程度上“借鉴”了我的一封电子邮件中的内容,有人在 1 月将这封邮件公开发布给了 Linux kernel Usenet 新闻小组。 如果你可以访问这份报告并阅读讨论 Linux 和多处理器的页面(第 44 和 45 页)(这份报告没有公开提供,你必须花一大笔钱购买它),然后读读我在 Deja News 上发表的电子邮件,你会看到直观的相似内容,一直到小细节都一样。
旧事重提
在新闻稿的这个部分,我将谈一下你可能不知道的 Systems Internals 网站最新变化,并且/或者在实用工具方面,提供比网站的内容更多的信息。 比如,几周前,我们发布了 Filemon v4.1。 这个版本的 Filemon 能够监视 Windows NT/2K 下的命名管道和邮件槽活动。 支持这一点所需的代码增强相对较小,因为命名管道和邮件槽是作为文件系统驱动程序实现的。 困难(繁琐)的是找出找出这些特定文件系统支持的专用 IOCTL(I/O 控制命令),以便 Filemon 可以显示它们。 若要下载 Filemon(它适用于 Windows NT/2K 和 Windows 9x),可访问 http://www.sysinternals.com/filemon.htm.
如果你想要更多地了解 Filemon 的内部工作原理,请查看我 2 月在 Windows NT Magazine 的“NT Internals”专栏中发表的文章,标题是“NT 实用工具洞察”。 这篇文章描述了如何使用 Filemon、Regmon、NTFSDOS、NewSID 和 HandleEx,还稍微介绍了它们的工作原理。
INTERNALS 新闻
WINDOWS 2000 驱动程序验证程序
Windows 2000 Beta 3 引入了一种非常强大的设备驱动程序开发辅助工具,称为“驱动程序验证程序”。 该工具与内核中的代码相结合,便于控制你的驱动程序,并用一种以前不可能的方式来执行它,以遵守内核模式规则。 到目前为止,存在 bug 的设备驱动程序是导致很多人认为 NT 是不可靠的操作系统的最大原因,而这款工具的目的是帮助驱动程序编写者先于用户找到它们的 bug,从而挽回这一声誉。
存在几种类型的细微问题时,它可以通过临时驱动程序测试(这是在严格的上市时间限制下执行的最常见类型的测试),甚至通过严格的压力测试。 一种常见的驱动程序问题是,驱动程序以“提升的 IRQL”(高中断优先级)访问分页内存。 如果驱动程序访问的内存在访问时恰好实际存在(它尚未分页到分页文件),那么非法访问将不会被注意到。 将违反这个规则的驱动程序发布给大量的用户,那么这种情况必然会出现,导致蓝屏崩溃。
另一种常见的驱动程序编程错误是,开发人员编写代码时假设分页内存和/或非分页内存将始终可用,也就是说,他们没有检查分配的返回值。 如果池耗尽,并且驱动程序收到 NULL 缓冲区地址,驱动程序会愉悦地取消引用系统,使其进入蓝屏。 尽管池耗尽的情况很少见,但不应该让系统管理员看到蓝屏。 相关的内存 bug 是缓冲区溢出或欠载,其中驱动程序在它已分配的缓冲区之外进行读取或写入。
驱动程序验证程序解决 IRQL 问题的方式是,替换将在驱动程序中操作 IRQL 的所有函数(例如KeRaiseIrql
KeAcquireSpinLock
)的调用替换为在驱动程序加载时的相应验证程序内核函数(VerifierKeRaiseIrql
、VerifierKeAcquireSpinLock
)。 每当 IRQL 提升到 DISPATCH_LEVEL
或更高级别时,验证程序代码都会调用内部内存管理器函数 MmTrimAllPageableSystemMemory()
,强制所有分页数据从物理内存中取出。 因此,一旦驱动程序违反不从 DISPATCH_LEVEL
或更高级别访问可分页的数据或代码这一 IRQL 规则,内存管理器就将检查对不存在的页面的访问尝试,并引发蓝屏。 这样,开发人员就可以在驱动程序发布之前快速捕获这些类型的 bug,因为他们能够对崩溃进行调试,看到他们的驱动程序位于存在故障的堆栈上。
驱动程序验证程序在内存使用情况测试的最后会修补要验证的驱动程序的导入表,以便驱动程序调用验证程序内存函数而不是标准内核版本。 例如,对 ExAllocatePool
的调用替换为对 VerifierAllocatePool
的调用。 验证程序使用两种方法来帮助开发人员快速查找内存 bug。 第一种方法是,它使用一个特殊的内存池,其中保护页(即无效页面)放置在缓冲区的末尾。 此外,分配了缓冲区的页面中放在缓冲区前面的部分会填充一个签名。 会立即检测到页面中超出缓冲区末端的溢出,因为这些溢出会导致保护页上出现非法页面错误。 当驱动程序解除分配内存时,验证程序会检测到涉及修改放在缓冲区前面的数据的欠载,因为签名会发生更改。
始终预期非空池的驱动程序会被验证程序使用其“内存故障注入”欺骗而产生崩溃。 你可以将验证程序配置为使驱动程序的池分配随机失败。
驱动程序验证程序还会检查其他几种其他错误类型,例如 IRP(I/O 请求数据包)一致性,以及系统和驱动程序代码页的只读保护。
如果你是设备驱动程序开发人员,那么使用验证程序进行测试,对于你自己、你的公司和 NT 社区来说都有好处。 请注意,一旦你有权访问驱动程序验证程序,你还应该测试与 Win2K 兼容的 NT 4.0 驱动程序(大多数开发人员将在 4 月末或 5 月通过 Win2K Beta 3 的 MSDN 发货来获取该验证程序)。
有关详细信息,请参阅驱动程序验证程序。
使用 BOOT.INI 进行 Y2K 测试
如果你经常查看 Systems Internals 网站,那么你可能已经知道新的 Win2K 没有记录 BOOT.INI 开关 /YEAR。 我没有在网站上提到 NT 4.0 Service Pack 4 也支持该开关。 通过这个开关,你可以欺骗 NT 和 NT 系统上的所有软件,让它们误以为今年是其他年份。 例如,/YEAR=2001 会使系统认为它是 2001 年而不是 1999 年。 因此,这个开关非常适合用于测试任何软件级别的 Y2K 问题,使用它而不是手动重置 BIOS 时钟(例如,通过时钟小程序)的好处是,更改是临时的,仅在你引导到其 BOOT.INI 行中具有该开关的安装时才有效。 这样就能轻松创建特殊的 Y2K 安装,只需要从 BOOT.INI 获取一个现有的引导行,复制该行,再添加 /YEAR 开关。
即将推出
预期几周后会发布下一篇新闻稿。 我下次将提供的 Internals 技巧是关于排队自旋锁的,这是 Windows 2000 对它的全局自旋锁使用的一种新的自旋锁。 下面是 Windows 2000 中存在的全局自旋锁:
- KiDispatcherLock:计划程序数据库锁
- KiContext-SwapLock:线程交换锁
- MmPfnLock:物理页帧数据库锁
- MmSystemSpaceLock:内核模式地址空间锁
- CcMasterSpinLock:缓存管理器的全局自旋锁
- CcVacbSpinLock:缓存管理器的映射数组锁
Windows 2000 内核使用排队自旋锁(KeAcquireQueuedSpinLock、KeReleaseQueuedSpinLock),而不是像 NT 4.0 一样对这些全局锁使用常规内核自旋锁(KeAcquireSpinLock、KeReleaseSpinLock)。 这些锁有一些有趣的属性,可最大程度地减少 SMP 上的总线活动。 下次我会告诉你如何实现排队自旋锁。
Systems Internals 上即将发布的是 Tokenmon,它也是一种监视工具。 Tokenmon 将显示系统上所有与令牌相关的活动的详细信息,包括登录、注销、特权的使用和模拟。
感谢阅读 Systems Internals 新闻稿。
发布时间:1999 年 4 月 14 日星期三晚上 7:16,发布者:ottoh