示例 14:配置特殊池

从 Windows Vista 开始,可以将 特殊池 功能配置为内核标志设置或注册表设置。 如果将它配置为内核标志 (运行时) 设置,则无需重启计算机以使更改生效。 在早期版本的 Windows 中,特殊池仅可用作注册表设置。

此外,从 Windows Vista 开始,可以从命令行设置和配置特殊池功能。 在早期版本的 Windows 中,只能在“全局标志”对话框中设置和配置特殊池功能。

按池标记请求特殊池而不重新启动

以下命令请求使用 Tag1 池标记的所有分配的特殊池。 此设置会立即生效,但如果关闭或重启 Windows,它将丢失。

此命令使用 /k 参数指定内核标志 (运行时) 设置,并使用 +spp 缩写来设置特殊池请求。

gflags /k +spp Tag1

Gflags 通过打印做出响应:

Special Pool set to 0x31676154
PoolTagOverruns set to 0x1
Current Running Kernel Settings are: 00000000

请注意,特殊池分配请求不是内核标志设置,不会反映在内核设置值中。

此外,特殊池分配请求不会更改特殊池的溢出 (0x1) 或不足 (0x0) 设置的值。 若要从溢出更改为“溢出”,则默认使用“Gflags”对话框。如果更改为“溢出”,则使用“Gflags”对话框。 有关信息,请参阅 检测溢出和不足

无法在命令行中显示池标记。 若要验证池标记是否为内核设置,请使用 Gflags 对话框。

按注册表中的池标记请求特殊池

以下命令请求使用 Tag1 池标记的所有分配的特殊池。 由于此设置存储在注册表中,因此必须重启计算机才能使其生效,但在更改它之前,它仍然有效。

此命令使用 /r 参数指定注册表设置,并使用 +spp 缩写来设置特殊的池请求。

gflags /r +spp Tag1

Gflags 通过打印做出响应:

Special Pool set to 0x31676154
PoolTagOverruns set to 0x1
Current Boot Registry Settings are: 00000000

请注意,特殊池分配请求不是注册表标志设置,不会反映在注册表设置值中。

此外,特殊池分配请求不会更改特殊池的溢出 (0x1) 或不足 (0x0) 设置的值。 若要从溢出更改为“溢出”,则默认使用“Gflags”对话框。如果更改为“溢出”,则使用“Gflags”对话框。 有关信息,请参阅 检测溢出和不足

若要验证是否已将值添加到注册表中,请使用 Reg 或 Regedit 在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management项中显示 PoolTag 条目的值。

例如:

c:>reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" -v PoolTag
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
    PoolTag    REG_DWORD    0x31676154

在不重启的情况下按大小请求特殊池

以下命令请求在 x86 计算机上分配 1 到 8 个字节的特殊池,PAGE_SIZE为0x1000,分配粒度为 8 个字节。

此命令使用 /k 参数指定内核标志 (运行时) 设置,并使用 +spp 缩写来设置特殊池请求。 size 值前面有 0x,表示它是一个大小而不是池标记。

0x10,通过将分配粒度 (8 个字节) 添加到范围中的最大大小 (8 个字节) , (0x10) 总共 16 个字节来计算该值。 有关确定要输入的正确值的帮助,请参阅 特殊池中的“选择分配大小”。

gflags /k +spp 0x10

Gflags 通过打印做出响应:

Special Pool set to 0x10
PoolTagOverruns set to 0x1
Current Running Kernel Settings are: 00000000

同样,特殊池分配请求不是内核标志设置,也不会反映在内核设置值中。

此外,特殊池分配请求不会更改特殊池的溢出 (0x1) 或不足 (0x0) 设置的值。 若要从溢出更改为“溢出”,则默认使用“Gflags”对话框。如果更改为“溢出”,则使用“Gflags”对话框。 有关信息,请参阅 检测溢出和不足

按注册表中的大小请求特殊池

以下命令请求在 x64 计算机上分配 1024 到 1040 字节的特殊池,PAGE_SIZE为0x1000,分配粒度为 16 字节。

此命令使用 /r 参数指定系统范围的注册表设置,并使用 +spp 缩写来设置特殊的池请求。 size 值前面有 0x,表示它是一个大小而不是池标记。

0x420,通过将分配粒度 (16 个字节) 添加到 (1040 字节) 范围内的最大大小来计算 (0x420) 总共 1056 个字节。 有关确定要输入的正确值的帮助,请参阅 特殊池中的“选择分配大小”。

gflags /r +spp 0x420

Gflags 通过打印做出响应:

Special Pool set to 0x420
PoolTagOverruns set to 0x1
Current Boot Registry Settings are: 00000000

同样,特殊池分配请求不是注册表标志设置,也不会反映在注册表设置值中。

此外,特殊池分配请求不会更改特殊池的溢出 (0x1) 或不足 (0x0) 设置的值。 若要从溢出更改为“溢出”,则默认使用“Gflags”对话框。如果更改为“溢出”,则使用“Gflags”对话框。 有关信息,请参阅 检测溢出和不足

若要验证是否已将值添加到注册表中,请使用 Reg 或 Regedit 在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management项中显示 PoolTag 条目的值。

例如:

c:>reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" -v PoolTag
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
    PoolTag    REG_DWORD    0x420

取消特殊池请求

以下命令取消将特殊池作为内核标志的请求 (运行时) 设置。 命令对于按池标记或大小的请求相同。

gflags /k -spp

以下命令取消将特殊池作为注册表设置的请求。 命令对于按池标记或大小的请求相同。

gflags /r -spp

命令成功后,Gflags 会通过打印:

Special Pool value has been deleted.