RFC: HKCR merge implementation

André Hentschel nerv at dawncrow.de
Wed Sep 11 13:42:54 CDT 2013

Am 11.09.2013 01:15, schrieb Juan Lang:
> Hi George,
> On Tue, Sep 10, 2013 at 3:55 PM, George Stephanos <gaf.stephanos at gmail.com <mailto:gaf.stephanos at gmail.com>> wrote:
>     I'm proposing my HKEY_CLASSES_ROOT implementation patches for review. Feel free to comment.
>     So far, I've written code for all functions except for the RegEnum family.
>     General description:
>     HKCR handles are special. All wine handles have the two lowest bits zero'd. HKCR handles are masked. 10b specifically.
>     They have their own table separate from the generic handle table.
>     An HKCR handle has an HKCU handle and an HKLM handle below it. Access mask and a string representing the path are also needed
>     since the handle has to attempt to reopen previously failed openings at certain stages.
>     First patch: specially handles HKCR handles WITHOUT affecting the general behavior. The end result is still the exact same. Patch provides a foundation for the rest.
>     Second patch: added path management
>     Third patch: added HKCU
>     Here's a quick description of each function:
>     create_hkcr_struct: allocates the memory needed for the struct, adds it to the table and gives back a pointer to it
>     get_hkcr_path: given an HKCR handle and a subkey string, prepares a subkey string representing the same subkey rooted at HKLM/HKCU.
>     create_hkcr: RegCreateKeyEx
>     open_hkcr: RegOpenKeyEx
>     resolve_hkcr: checks the HKCR handle, tries to reopen previously failed internal handles, gives back HKCU first if available then HKLM
>     close_hkcr: deallocates path and struct, removes struct from table.
>     http://pastie.org/8314658
> a couple bitwise nits in your first patch:
> +#define HKCR_MASK 2
> +#define IS_HKCR(hk) ((UINT_PTR)hk > 0 && ((UINT_PTR)hk & 3) == HKCR_MASK)
> Typically a mask would define all the bits that could be set, and a flag would be the particular bit you want to test. Something like:
> #define HKCR_FLAG 2
> Also, in the following expression:
> ((UINT_PTR)hk > 0 && ((UINT_PTR)hk & 3)
> The second can never be true when the first is false, so you can just drop the first. These suggestions yield:
> #define IS_HKCR(hk) (((UINT_PTR)(hk) & SPECIAL_HKEY_MASK) == HKCR_FLAG)
> --Juan

Wouldn't it be better than to include the sign in the mask? like
#define SPECIAL_HKEY_MASK 0x80000003

More information about the wine-devel mailing list