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

文章翻译 文章翻译
文章编号: 188831 - 查看本文应用于的产品
展开全部 | 关闭全部

概要

池损坏可能会导致许多最在内核模式下时,被导致 Windows NT。 池损坏的躲避问题组件写入内存分配的池区之外。通过写入其已分配的区域的边界以外的内存,则很可能另已分配的内存,可能是由另一个组件,所拥有的区域将被覆盖。这种损坏可能导致问题 (如蓝屏,显示在完全不相关的代码区域。可以读取超出其已分配区域的内核模式组件也会引起问题。

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

现在可以标识池损坏的源在导致池损坏的指令。新的内存管理实用程序它是指定的特殊池是包含在 Windows NT 4.0 Service Pack 4 (SP4),Windows 2000 中,Windows XP、 Windows 服务器 2003年,Windows Vista 和 Windows 服务器 2008年。特殊池实用程序标识将损坏池数据写入由内核模式组件其已分配的区域之外的内存。

注意内存调整不适用于对 Windows Vista 和 Windows Server 2008。但是特殊池功能不会适用于这些产品中。

更多信息

重要此部分、方法或任务包含告诉您如何修改注册表的步骤。但是,如果不正确地修改了注册表,可能会出现严重问题。因此,请确保仔细按这些步骤操作。为增加保护,先备份注册表再对其进行修改。然后,您可以在出现问题时还原注册表。有关如何备份和还原注册表的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
322756 如何在 Windows XP 中备份和还原注册表


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

超限检测是可能最常用的。进行溢出检测请求分配通过备份定位在第一页的结尾从页的结尾的请求大小。达舍入的分配大小8 字节的边界。模式键、 大小,和池标记信息写入到的第一页的前八个字节的标头。该模式此外在页上传播。由于分配器定位在最接近的 8 位界限,可能有多达七个其后的溢出字节分配。模式也被写入以下的溢出字节数分配。

第二页是的监护页。保护页包含,但不访问标记为特殊页表项 (PTE)保护。通过将标记为禁止访问保护,任何代码与此第二个页尝试读取或写入的以后的第一个结束页立即导致一个停止 0x0000000A 或 Stop 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 small
Shared 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 00000000

8057afd8 nt!MiSpecialPoolFirstPte = 0xc022af78
8057afd4 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
基: 十六进制

注意后在此进行任何所介绍的注册表更改文章,请重新启动计算机以使所做的更改才会生效。

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

属性

文章编号: 188831 - 最后修改: 2013年4月19日 - 修订: 0.1
这篇文章中的信息适用于:
  • 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
机器翻译
重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。
点击这里察看该文章的英文版: 188831
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com