你目前正处于脱机状态,正在等待 Internet 重新连接

如何使用特殊池功能隔离池损坏

针对 Windows XP 的支持已终止

Microsoft 已于 2014 年 4 月 8 日终止了针对 Windows XP 的支持。该更改已影响到您的软件更新和安全选项。 了解这一措施对于您的含义以及如何继续保持受保护状态。

针对 Windows Server 2003 的支持已于 2015 年 7 月 14 日终止。

Microsoft 已于 2015 年 7 月 14 日终止了对于 Windows Server 2003 的支持。该更改已影响到您的软件更新和安全选项。 了解这一措施对于您的含义以及如何继续保持受保护状态。

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 188831
概要
池损坏可能导致许多最躲避的问题与 Windows NT。 池损坏由于内核模式组件写入内存分配的池区域之外时。通过编写的内存超出其分配区域的边界,则很可能另一个区域分配内存,可能是由另一个组件,被覆盖。此损坏会导致完全不相关的代码区域问题 (如蓝屏。读取超出其分配区域的内核模式组件也会引起问题。

它由原始设备制造商 (OEM) 驱动程序或 Windows 中的问题,无论池损坏问题都是一些最难发现。通常,所有的可以看到崩溃转储分析中的实际问题,如数据区域的症状变得完全不相关的代码块中的损坏而导致的问题。到目前为止,它是代码的几乎不可能找到的损坏内存段。

现在可以在导致池损坏的指令识别池损坏的来源。一个新的内存管理实用程序,名为特殊池是包含在 Windows NT 4.0 Service Pack 4 (SP4)、 Windows 2000、 Windows XP、 Windows Server 2003,Windows Vista 和 Windows Server 2008。特殊池实用程序确定破坏池数据写入其已分配的区域之外的内存的内核模式组件。

注意:内存调整不适用于对 Windows Vista 和 Windows Server 2008。但是特殊池功能不适用的产品。
更多信息
重要:此部分、 方法或任务包含一些介绍如何修改注册表的步骤。但是,如果不正确地修改了注册表,可能会出现严重的问题。因此,请确保仔细按照下列步骤操作。为增加保护,对其进行修改之前备份注册表。然后,您可以在出现问题时还原注册表。有关如何备份和还原注册表的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
322756 如何在 Windows 中备份和还原注册表


特殊池实用程序通过符合以下条件的 ExAllocatePoolWithTag 请求时每个池分配的分配虚拟内存的两个页面:
  • 分配请求必须小于池页中能容纳的最大分配。
  • 该请求必须符合 PoolTag 规范在注册表中。
池溢出检测的第一页用于包含在页的末尾分配。第二页是保护页。池不足检测的第一页是保护页。它被跟包含页面的开头分配的页。

超限检测是可能最常用的。超限检测为所请求的分配定位在第一页的结尾通过备份请求的大小,从该页的末尾。分配大小是向上舍入到一个 8 字节边界。模式键、 大小和池标记信息将写入的第一页的第一个 8 字节的标头。此外会在页上整个传播模式。由于分配定位在最接近的 8 字节边界上,可能有多达七种溢出字节在分配之后。该模式也会写入到溢出字节在分配之后。

第二页是临界页。保护页包含标记为禁止访问保护特殊的页表项 (PTE)。通过将标记该否访问保护的第二页,尝试读取或立即编写的第一页的末尾之外的任何代码会导致访问冲突会导致停止 0x0000000A 或停止 0x0000001E 错误。这使某人调试系统,以查找导致池损坏的确切指令。

作为一种备份的检查,以捕捉超出分配的末尾,但不是超出页面的末尾写入的违反者,在分配的结尾溢出字节空闲池请求 (ExFreePoolWithTag) 过程中验证。溢出字节数与分配头以确定是否任何覆盖在溢出区域中字节中的模式进行比较。如果验证检查不起作用,则会发生 Stop 0x00000001A 错误。

这种检查不一定找到确切的导致池损坏的代码块。但是,它可以帮助识别导致的损坏的组件。

若要启用特殊池实用程序,请向注册表中添加下列注册表项和值:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management


值名称: PoolTag
数据类型: REG_DWORD
数据: 池标记掩码 |分配大小掩码 |0
池标记掩码是包含掩码字符,您要在其中放入特殊池的池的池标记 ID。此掩码必须以十六进制格式按相反的顺序指定。此掩码还可能包含"吗?"屏蔽的单个字符或"*"到掩码从这里到标记的结尾。例如,若要监视所有池与池标记开头"Nt",指定"2A744E"(不带引号),它表示"* tN"。

下表列出的更多示例。
   Pool to monitor   Character representation   Pool tag mask   ----------------------------------------------------------                  All pools         "*"                        0x2A   N??s              "s??N"                     0x733F3F4E				
分配大小掩码规范将所有池分配一个指定大小的都放到特殊池。这也是以十六进制形式指定的。例如,如果为 32 字节的所有分配都定位在了特殊池,则指定 0x20。

当指定为零 (0x0) 时,特殊池实用程序未初始化。此外,如果在注册表中未定义的 PoolTag 注册表值,则未初始化特殊池实用程序。
值名称: PoolTagOverruns
数据类型: REG_DWORD
数据: 1 |0
1 表示池分配溢出检测到指定的标记。分配位于页面的结尾处,保护页后面。

0 指示标记检测到池分配不足。分配是位于页面的开始处,保护页位于包含分配的页之前。

常见的使用示例,可以创建以下两个注册表项应如下所示:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\ Memory Management


值名称: PoolTag
数据类型: REG_DWORD
数据: 0x2A

值名称: PoolTagOverruns
数据类型: REG_DWORD
数据: 1


注意:有关 Windows NT 终端服务器 4.0 版,您必须禁用 KStackPool,当您使用特殊池。若要执行此操作,添加以下注册表值:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management


值名称: EnableKStackPool
数据类型: REG_DWORD
数据: 0

1 -KStack 池始终处于启用状态
2 -KStack 池启用的计算机具有 256 MB 或更多的内存 (默认值)
如果您没有具有 256 MB 或更多内存的终端服务器计算机上进行此更改,您可能会收到"STOP 0x00000078 (PHASE0_EXCEPTION)"错误消息。


注意:特殊池功能可能无法工作在 Windows Server 2003 中,如果有足够的特殊页表项 (Pte)。单用户终端服务器包含 1 GB 以上的 RAM 和具有内存管理优化值设置为默认值的计算机上,通常会发生此问题。在 64 位版本的 Windows Server 2003 中不会出现此问题。

存储器转储文件分析的问题都可能包含以下信息:
*** Virtual Memory Usage *** Physical Memory: 1015660 ( 4062640 Kb) Page File: \??\C:\Pagefile1\pagefile.sys Current: 4193280Kb Free Space: 4180856Kb Minimum: 4193280Kb Maximum: 4193280Kb Available Pages: 552680 ( 2210720 Kb) ResAvail Pages: 932179 ( 3728716 Kb) Locked IO Pages: 347 ( 1388 Kb) Free System PTEs: 187166 ( 748664 Kb) Free NP PTEs: 32765 ( 131060 Kb) Free Special NP: 117228 ( 468912 Kb) Modified Pages: 106 ( 424 Kb) Modified PF Pages: 98 ( 392 Kb) NonPagedPool Usage: 6599 ( 26396 Kb) NonPagedPool Max: 65536 ( 262144 Kb) PagedPool 0 Usage: 10697 ( 42788 Kb) PagedPool 1 Usage: 1240 ( 4960 Kb) PagedPool 2 Usage: 1239 ( 4956 Kb) PagedPool 3 Usage: 1265 ( 5060 Kb) PagedPool 4 Usage: 1231 ( 4924 Kb) PagedPool Usage: 15672 ( 62688 Kb) PagedPool Maximum: 90112 ( 360448 Kb) Shared Commit: 3866 ( 15464 Kb) Special Pool: 511 ( 2044 Kb) <-- very smallShared Process: 5205 ( 20820 Kb) PagedPool Commit: 15672 ( 62688 Kb) Driver Commit: 2091 ( 8364 Kb) Committed pages: 439832 ( 1759328 Kb) Commit limit: 2023823 ( 8095292 Kb)0: kd> dd nt!MmSpecialPoolRejected l8 8057afe0 00000000 00000000 00b2e59a 00000000 <-- A DWORD value of 3 causes special pool PTE's shortage.8057aff0 00000000 00000000 00000000 000000008057afd8 nt!MiSpecialPoolFirstPte = 0xc022af788057afd4 nt!MiSpecialPoolLastPte = 0xc022af78
通过分析从分配特殊池的大小,可以验证问题。在这种情况下,出现问题,因为下列特殊池 PTE 值相等:
  • MiSpecialPoolFirstPte
  • MiSpecialPoolLastPte
如果 MmSpecialPoolRejected 注册表项的值是三个,也可能发生此问题或更大。

若要变通解决此问题,请配置为小于所允许的页面缓冲的池大小的值的 PagedPoolSize 注册表项的值。例如,将 PagedPoolSize 注册表项设置值为 256 MB。如果您想要配置的较大值,使用性能监视器实用程序来确定计算机的需求较大的页面缓冲的池大小。

PagedPoolSize 注册表项,您可以使用以下值:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
对于 Windows Server 2003,而无需服务包:

值名称: PagedPoolSize
数据类型: REG_DWORD
数据: 10000000
基: 十六进制

对于安装 Service Pack 1 (SP1) 与 Windows Server 2003:

值名称: PagedPoolSize
数据类型: REG_DWORD
数据: FFFFFFFF
基: 十六进制

注意:在这篇文章中进行任何所介绍的注册表更改之后,重新启动计算机以使更改生效。

如果您启用特殊池功能后,计算机将停止响应 (挂起),并且您在启动过程中收到错误消息在蓝色屏幕上的,使用最后一次正确的配置选项重新启动计算机。启用特殊池功能不会写入到最后一次正确的配置项成功登录之后直到注册表中。
池损坏

警告:本文已自动翻译

属性

文章 ID:188831 - 上次审阅时间:05/23/2015 15:54:00 - 修订版本: 1.0

Microsoft Windows 2000 Server, Microsoft Windows 2000 Advanced Server, Microsoft Windows XP Professional Edition, Microsoft Windows Server 2003 Standard Edition, Microsoft Windows Server 2003 Enterprise Edition, Microsoft Windows Server 2003 Service Pack 2, Windows Vista Home Premium, Windows Vista Enterprise, Windows Vista Ultimate, Windows Vista Service Pack 2, Windows Server 2008 Standard, Windows Server 2008 Enterprise, Windows Server 2008 Datacenter, Windows Server 2008 Service Pack 2, Windows 7 Home Premium, Windows 7 Enterprise, Windows 7 Professional, Windows 7 Ultimate, Windows 7 Service Pack 1, Windows Server 2008 R2 Standard, Windows Server 2008 R2 Enterprise, Windows Server 2008 R2 Datacenter, Windows Server 2008 R2 Service Pack 1

  • kbenv kbhowto kbqfe kbmt KB188831 KbMtzh
反馈