[PATCH 3/7] reg: Add path/key conversion functions

Stefan Dösinger stefandoesinger at gmail.com
Tue Nov 4 15:48:02 CST 2014


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Am 2014-11-04 21:15, schrieb Jonathan Vollebregt:
> +typedef struct
> +{
> +    HKEY key;
> +    const WCHAR *short_name;
> +    const WCHAR *long_name;
> +} hkey_rel;
Style suggestion: you can make this an anonymous structure:

struct
{
    HKEY key;
    const WCHAR *short_name;
    const WCHAR *long_name;
}
root_rels[] =
{
    {HKEY_LOCAL_MACHINE, short_hklm, long_hklm},
    {HKEY_CURRENT_USER, short_hkcu, long_hkcu},
    {HKEY_CLASSES_ROOT, short_hkcr, long_hkcr},
    {HKEY_USERS, short_hku, long_hku},
    {HKEY_CURRENT_CONFIG, short_hkcc, long_hkcc},
};

Unless of course you need the structure definition elsewhere.

> +static LSTATUS path_get_rootkey(const WCHAR *path, HKEY *out)
Since you're only returning two possible values (ERROR_SUCCESS or ERROR_BADKEY) you can make this return a HKEY *.

> +static LSTATUS path_get_key(const WCHAR *path, HKEY *out)
> +{
> +    HKEY k;
> +    LONG err = path_get_rootkey(path, &k);
> +    if (err != ERROR_SUCCESS)
> +        return err;
> +
> +    path = strchrW(path, '\\');
> +    if (path)
> +        path++;
> +
> +    err = RegOpenKeyW(k, path, &k);
> +    if (err != ERROR_SUCCESS)
> +        return err;
> +
> +    *out = k;
> +    return ERROR_SUCCESS;
>  }
What do you think about this:

static LSTATUS path_get_key(const WCHAR *path, HKEY *out)
{
    *out = path_get_rootkey(path);
    path = strchrW(path, '\\');
    if (path)
        path++;
    return RegOpenKeyW(*out, path, out);
}

If my understanding of RegOpenKeyW is right this will give you ERROR_INVALID_HANDLE (winnt+) or ERROR_BADKEY (win9x) if the root key is invalid, ERROR_PATH_NOT_FOUND if the path is invalid, and ERROR_SUCCESS otherwise. So pretty much the behavior of your code in 1/3rd of the lines of code.

I think path_open would be a better name for this function.

You could also consider an additional BOOL create parameter to call RegCreateKeyW instead of RegOpenKeyW so you can reuse this code in reg_add.

> +    err = path_get_key(key_name, &subkey);
> +    if (err != ERROR_SUCCESS)
>      {
> -        reg_message(STRING_INVALID_KEY);
> -        return 1;
> -    }
> -    p++;
> -
> -    root = get_rootkey(key_name);
> -    if (!root)
> -    {
> -        reg_message(STRING_INVALID_KEY);
> +        reg_print_error(err);
>          return 1;
>      }
>  
> @@ -306,21 +341,19 @@ static int reg_delete(WCHAR *key_name, WCHAR *value_name, BOOL value_empty,
>      /* Delete subtree only if no /v* option is given */
>      if (!value_name && !value_empty && !value_all)
>      {
> -        if (RegDeleteTreeW(root,p)!=ERROR_SUCCESS)
> +        HKEY root;
> +        err = path_get_rootkey(key_name, &root);
> +        err = RegDeleteTreeW(root, strchrW(key_name, '\\') + 1);
My reading comprehension may be lacking again, but can't you just call RegDeleteTree(subkey, NULL)? You're also assuming the caller isn't trying to nuke HKEY_LOCAL_MACHINE :-) .

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQIcBAEBAgAGBQJUWUmSAAoJEN0/YqbEcdMwjmQP/iuYzlfloARtQOxq6zCyHAsT
bBFIHVwZoiB3/e4UvDcnRvcdJGvTM/LNu2LBczsFhOEfidSGsMYbbPAm2bEP5cJE
FAcy2bMTpiaPJx957dbimhEQuSreRx1OOdzH6jK74g+d/WJ3fHy0RHh9QXY0Rpe+
JLsPDOpau2gDs6HoKNvF9yVPM32sa/BWJGtLqGFhQngmzIye9WmBEVMX+c6w9q9N
gxc7uiDBYXMSi4D2rGE5HwQJq3AM6InTOKkyAkDZv6EObvUeZ0JQKtFlC6tW3z0x
aXTzs9RjvzS2er5ULPyxYV3QxBynRzI80VoWq5p3Z4M34dIaSsJeuWlhTWiIktzl
U+M7G1Ukk3owmmXtYC0nBOIBq2IEzRzL28nXwbz3h8EUp1kYzwsZ9VpP6NitOP+6
E2yywBEDIrJL22RNSt79GLKlnLKpBNitWq5xCoWdXE625pBDSEH4cKlE5Afwi7j7
/jNGjxRv4Rre6+PcgrPLq3JSaEDHAs+tKuBvkJWgCKCc45KkaGiiwS5Tp32odqdA
Q75F+8Epolx00aA948PwJ827VMtMT6U6z79ypluI5tgHuldhS73pmg9PvLtVfYG6
TlexSFUC1eq0FJWwS8yxY2HO20ZbQpOjpmrxR0mu2ACcFfdH8Ut6dspB5g2ttrGU
XgXrPCumoV8HxXzwDcMu
=B2eH
-----END PGP SIGNATURE-----



More information about the wine-devel mailing list