2

在窗口标题中,有

//
// Registry Specific Access Rights.
//

#define KEY_QUERY_VALUE         (0x0001)
#define KEY_SET_VALUE           (0x0002)
#define KEY_CREATE_SUB_KEY      (0x0004)
#define KEY_ENUMERATE_SUB_KEYS  (0x0008)
#define KEY_NOTIFY              (0x0010)
#define KEY_CREATE_LINK         (0x0020)
#define KEY_WOW64_32KEY         (0x0200)
#define KEY_WOW64_64KEY         (0x0100)
#define KEY_WOW64_RES           (0x0300)

这些都在 MSDN 文章Registry Key Security and Access Rights中有详细记录,除了 KEY_WOW64_RES. 这是什么意思?它似乎打开了矛盾的标志。

4

1 回答 1

5

KEY_WOW64_RESKEY_WOW64_32KEY和的组合KEY_WOW64_64KEY。它对于屏蔽 WOW64 位很有用,例如当您需要更改现有权限掩码但想要保留 WOW64 位时。

例如,您可以AND使用掩码KEY_WOW64_RES检索其现有的 WOW64 位,KEY_WOW64_RES从新掩码中屏蔽掉,然后OR将原始 WOW64 位放入新掩码中,例如:

REGSAM Rights = ...;
REGSAM Wow64Rights = rights & KEY_WOW64_RES;
Rights = (NewRights & ~KEY_WOW64_RES) | Wow64Rights;

我知道的一个库KEY_WOW64_RES在每次失败时尝试使用限制较少的权限打开注册表项以进行只读访问时使用:

// Preserve KEY_WOW64_XXX flags for later use
WOWFlags = FAccess & KEY_WOW64_RES;

Result = RegOpenKeyEx(..., KEY_READ | WOWFlags, ...);
if (Result == 0)
{
    ...
}
else
{
    Result = RegOpenKeyEx(..., STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | WOWFlags, ...);
    if (Result == 0)
    {
        ...
    }
    else
    {
        Result = RegOpenKeyEx(..., KEY_QUERY_VALUE | WOWFlags, ...);
        if (Result == 0)
        {
            ...
        }
    }
}
于 2013-09-04T22:54:22.797 回答