首页 > 解决方案 > 有效的 HKEY 可以为 NULL 吗?

问题描述

可以RegOpenKeyEx/作为有效值RegCreateKeyEx返回吗?NULLHKEY

我正在分析QSettingshttps://code.woboq.org/qt5/qtbase/src/corelib/io/qsettings_win.cpp.html#_ZL15createOrOpenKeyiiRK7QStringi)的源代码。

如果NULL是 的可能有效值HKEY,则QSettings' 在 Windows 下的实现存在错误。

标签: qtwinapi

解决方案


可以RegOpenKeyEx/RegCreateKeyEx返回 NULL 作为有效的 HKEY 值吗?

不,有效的打开 HKEY永远不会为 NULL。

另一方面,如果这些函数失败,返回的值HKEY不确定的。Win32 API 文档没有说明是否HKEY在失败时将其设置为 NULL,因此在调用这些函数时不能依靠检查返回HKEY的 NULL 与非 NULL,例如:

HKEY hKey; // uninitialized
RegOpenKeyEx(..., &hKey, ...);
if (hKey) {
    // use hKey as needed - undefined behavior!
    RegCloseKey(hKey);
}

这些函数在成功时返回 0,在失败时返回非零。调用者必须查看它以确定它是否HKEY有效,例如:

HKEY hKey;
LONG res = RegOpenKeyEx(..., &hKey, ...);
if (res == ERROR_SUCCESS) {
    // use hKey as needed - OK!
    RegCloseKey(hKey);
}

而 AFAICSQSettings正是这样做的,HKEY在显式检测故障时将其变量显式设置为 NULL,这非常好。

如果 NULL 是 HKEY 的可能有效值

NULL 不是这些函数输出的有效打开值,因此 NULL 可用于应用程序HKEY在表示未打开的键时将其 s 设置为。就像大多数其他 Win32 句柄/指针类型一样。

thenQSettings在 Windows 下的实现有 bug。

我在您链接到的代码中没有看到任何此类错误。RegOpeKeyEx()/的所有使用RegCreateKeyEx()都是正确的,他们在使用返回之前检查错误代码HKEYHKEY变量被设置为 NULL未打开的键,并且没有对 NULL 执行读/写操作HKEY。那么漏洞在哪里呢?


推荐阅读