什么是KEY_WOW64_RES?

Bil*_*eal 1 winapi

在Windows标题中,有

//
// 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)
Run Code Online (Sandbox Code Playgroud)

These are all well documented in the MSDN article, Registry Key Security and Access Rights, except KEY_WOW64_RES. What does this mean? It appears to turn on contradictory flags.

Rem*_*eau 5

KEY_WOW64_RES是两者的组合KEY_WOW64_32KEYKEY_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;
Run Code Online (Sandbox Code Playgroud)

我知道一个库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)
        {
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)