注册表运行时库例程

若要操作注册表项,驱动程序可以调用 RtlXxxRegistryXxx 例程,该例程提供比 ZwXxxKey 例程更简单的接口。 执行此操作时,驱动程序不需要打开和关闭句柄;相反,驱动程序按名称引用密钥。

RelativeToPath 参数传递给每个 RtlXxx注册表Xxx 例程。 如果 RelativeTo 是RTL_REGISTRY_ABSOLUTE, 则 Path 指定项的完整路径,从 \Registry 根目录开始。 如果 RelativeTo 是RTL_REGISTRY_HANDLE, 则 Path 实际上是一个打开的句柄。 Relative 的其他 RTL_REGISTRY_XXX指定 键的公共根路径;在这些情况下, Path 指定相对于该根的路径。 例如,RTL_REGISTRY_USER要求 Path 相对于当前用户的注册表设置。 (此值等效于在用户模式应用程序中指定HKEY_CURRENT_USER。) 有关所有RTL_REGISTRY_XXX 值的说明,请参阅 RtlCheckRegistryKey

下表列出了驱动程序可以通过调用 RtlXxx注册表Xxx 例程执行的操作。

Operation 要调用Rtl Xxx 注册表Xxx 例程

创建注册表项

RtlCreateRegistryKey

检查是否存在注册表项

RtlCheckRegistryKey

检查一个或多个注册表项值

RtlQueryRegistryValues

编写注册表项值

RtlWriteRegistryValue

删除注册表项值

RtlDeleteRegistryValue

下面的代码示例演示如何将 \Registry\Machine\System\KeyNameValueName 设置为 ULONG 值0xFF。 将此示例与 注册表项对象例程 部分中的相应示例进行比较。

NTSTATUS status;
ULONG data = 0xFF;

status = RtlWriteRegistryValue(RTL_REGISTRY_ABSOLUTE,
                               (PWCSTR)L"\\Registry\\Machine\\System\\KeyName",
                               (PWCSTR)L"ValueName",
                               REG_DWORD,
                               &data,
                               sizeof(ULONG));

尽管使用 RtlXxxRegistryXxx 例程(而不是 Zw Xxx Key 例程)时写入的代码行更少,但执行某些操作需要后一行代码。 例如,不存在与 ZwEnumerateKey 对应的 RtlXxxRegistryXxx 例程。

如果对同一键执行多个操作, 则 ZwXxx密钥 例程会更高效—你可以对每个操作使用相同的打开句柄。 相比之下, RtlXxx注册表Xxx 例程打开和关闭每个操作的新句柄。