ENH: Added WOW64 key view support to KWSys SystemTools' windows registry API.

- Add an argument to registry read/write/delete methods to specify
    a 32-bit or 64-bit view.
  - Default is the bit-ness of the running program.
  - See issue #7095.
This commit is contained in:
Brad King 2008-05-27 14:47:00 -04:00
parent 73d5fd31ab
commit cea66664c5
4 changed files with 54 additions and 16 deletions

View File

@ -130,7 +130,7 @@ void* cmSystemTools::s_StdoutCallbackClientData = 0;
// replace replace with with as many times as it shows up in source. // replace replace with with as many times as it shows up in source.
// write the result into source. // write the result into source.
#if defined(_WIN32) && !defined(__CYGWIN__) #if defined(_WIN32) && !defined(__CYGWIN__)
void cmSystemTools::ExpandRegistryValues(std::string& source) void cmSystemTools::ExpandRegistryValues(std::string& source, KeyWOW64 view)
{ {
// Regular expression to match anything inside [...] that begins in HKEY. // Regular expression to match anything inside [...] that begins in HKEY.
// Note that there is a special rule for regular expressions to match a // Note that there is a special rule for regular expressions to match a
@ -146,7 +146,7 @@ void cmSystemTools::ExpandRegistryValues(std::string& source)
// the arguments are the second match // the arguments are the second match
std::string key = regEntry.match(1); std::string key = regEntry.match(1);
std::string val; std::string val;
if (ReadRegistryValue(key.c_str(), val)) if (ReadRegistryValue(key.c_str(), val, view))
{ {
std::string reg = "["; std::string reg = "[";
reg += key + "]"; reg += key + "]";
@ -161,7 +161,7 @@ void cmSystemTools::ExpandRegistryValues(std::string& source)
} }
} }
#else #else
void cmSystemTools::ExpandRegistryValues(std::string& source) void cmSystemTools::ExpandRegistryValues(std::string& source, KeyWOW64)
{ {
cmsys::RegularExpression regEntry("\\[(HKEY[^]]*)\\]"); cmsys::RegularExpression regEntry("\\[(HKEY[^]]*)\\]");
while (regEntry.find(source)) while (regEntry.find(source))

View File

@ -48,7 +48,8 @@ public:
/** /**
* Look for and replace registry values in a string * Look for and replace registry values in a string
*/ */
static void ExpandRegistryValues(std::string& source); static void ExpandRegistryValues(std::string& source,
KeyWOW64 view = KeyWOW64_Default);
/** /**
* Platform independent escape spaces, unix uses backslash, * Platform independent escape spaces, unix uses backslash,

View File

@ -493,6 +493,30 @@ void SystemTools::ReplaceString(kwsys_stl::string& source,
free(orig); free(orig);
} }
#if defined(KEY_WOW64_32KEY) && defined(KEY_WOW64_64KEY)
# define KWSYS_ST_KEY_WOW64_32KEY KEY_WOW64_32KEY
# define KWSYS_ST_KEY_WOW64_64KEY KEY_WOW64_64KEY
#else
# define KWSYS_ST_KEY_WOW64_32KEY 0x0200
# define KWSYS_ST_KEY_WOW64_64KEY 0x0100
#endif
#if defined(_WIN32) && !defined(__CYGWIN__)
static DWORD SystemToolsMakeRegistryMode(DWORD mode,
SystemTools::KeyWOW64 view)
{
if(view == SystemTools::KeyWOW64_32)
{
return mode | KWSYS_ST_KEY_WOW64_32KEY;
}
else if(view == SystemTools::KeyWOW64_64)
{
return mode | KWSYS_ST_KEY_WOW64_64KEY;
}
return mode;
}
#endif
// Read a registry value. // Read a registry value.
// Example : // Example :
// HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.1\InstallPath // HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.1\InstallPath
@ -501,7 +525,8 @@ void SystemTools::ReplaceString(kwsys_stl::string& source,
// => will return the data of the "Root" value of the key // => will return the data of the "Root" value of the key
#if defined(_WIN32) && !defined(__CYGWIN__) #if defined(_WIN32) && !defined(__CYGWIN__)
bool SystemTools::ReadRegistryValue(const char *key, kwsys_stl::string &value) bool SystemTools::ReadRegistryValue(const char *key, kwsys_stl::string &value,
KeyWOW64 view)
{ {
bool valueset = false; bool valueset = false;
kwsys_stl::string primary = key; kwsys_stl::string primary = key;
@ -549,7 +574,7 @@ bool SystemTools::ReadRegistryValue(const char *key, kwsys_stl::string &value)
if(RegOpenKeyEx(primaryKey, if(RegOpenKeyEx(primaryKey,
second.c_str(), second.c_str(),
0, 0,
KEY_READ, SystemToolsMakeRegistryMode(KEY_READ, view),
&hKey) != ERROR_SUCCESS) &hKey) != ERROR_SUCCESS)
{ {
return false; return false;
@ -589,7 +614,8 @@ bool SystemTools::ReadRegistryValue(const char *key, kwsys_stl::string &value)
return valueset; return valueset;
} }
#else #else
bool SystemTools::ReadRegistryValue(const char *, kwsys_stl::string &) bool SystemTools::ReadRegistryValue(const char *, kwsys_stl::string &,
KeyWOW64)
{ {
return false; return false;
} }
@ -604,7 +630,8 @@ bool SystemTools::ReadRegistryValue(const char *, kwsys_stl::string &)
// => will set the data of the "Root" value of the key // => will set the data of the "Root" value of the key
#if defined(_WIN32) && !defined(__CYGWIN__) #if defined(_WIN32) && !defined(__CYGWIN__)
bool SystemTools::WriteRegistryValue(const char *key, const char *value) bool SystemTools::WriteRegistryValue(const char *key, const char *value,
KeyWOW64 view)
{ {
kwsys_stl::string primary = key; kwsys_stl::string primary = key;
kwsys_stl::string second; kwsys_stl::string second;
@ -654,7 +681,7 @@ bool SystemTools::WriteRegistryValue(const char *key, const char *value)
0, 0,
"", "",
REG_OPTION_NON_VOLATILE, REG_OPTION_NON_VOLATILE,
KEY_WRITE, SystemToolsMakeRegistryMode(KEY_WRITE, view),
NULL, NULL,
&hKey, &hKey,
&dwDummy) != ERROR_SUCCESS) &dwDummy) != ERROR_SUCCESS)
@ -674,7 +701,7 @@ bool SystemTools::WriteRegistryValue(const char *key, const char *value)
return false; return false;
} }
#else #else
bool SystemTools::WriteRegistryValue(const char *, const char *) bool SystemTools::WriteRegistryValue(const char *, const char *, KeyWOW64)
{ {
return false; return false;
} }
@ -688,7 +715,7 @@ bool SystemTools::WriteRegistryValue(const char *, const char *)
// => will delete the data of the "Root" value of the key // => will delete the data of the "Root" value of the key
#if defined(_WIN32) && !defined(__CYGWIN__) #if defined(_WIN32) && !defined(__CYGWIN__)
bool SystemTools::DeleteRegistryValue(const char *key) bool SystemTools::DeleteRegistryValue(const char *key, KeyWOW64 view)
{ {
kwsys_stl::string primary = key; kwsys_stl::string primary = key;
kwsys_stl::string second; kwsys_stl::string second;
@ -735,7 +762,7 @@ bool SystemTools::DeleteRegistryValue(const char *key)
if(RegOpenKeyEx(primaryKey, if(RegOpenKeyEx(primaryKey,
second.c_str(), second.c_str(),
0, 0,
KEY_WRITE, SystemToolsMakeRegistryMode(KEY_WRITE, view),
&hKey) != ERROR_SUCCESS) &hKey) != ERROR_SUCCESS)
{ {
return false; return false;
@ -752,7 +779,7 @@ bool SystemTools::DeleteRegistryValue(const char *key)
return false; return false;
} }
#else #else
bool SystemTools::DeleteRegistryValue(const char *) bool SystemTools::DeleteRegistryValue(const char *, KeyWOW64)
{ {
return false; return false;
} }

View File

@ -707,20 +707,30 @@ public:
* ----------------------------------------------------------------- * -----------------------------------------------------------------
*/ */
/**
* Specify access to the 32-bit or 64-bit application view of
* registry values. The default is to match the currently running
* binary type.
*/
enum KeyWOW64 { KeyWOW64_Default, KeyWOW64_32, KeyWOW64_64 };
/** /**
* Read a registry value * Read a registry value
*/ */
static bool ReadRegistryValue(const char *key, kwsys_stl::string &value); static bool ReadRegistryValue(const char *key, kwsys_stl::string &value,
KeyWOW64 view = KeyWOW64_Default);
/** /**
* Write a registry value * Write a registry value
*/ */
static bool WriteRegistryValue(const char *key, const char *value); static bool WriteRegistryValue(const char *key, const char *value,
KeyWOW64 view = KeyWOW64_Default);
/** /**
* Delete a registry value * Delete a registry value
*/ */
static bool DeleteRegistryValue(const char *key); static bool DeleteRegistryValue(const char *key,
KeyWOW64 view = KeyWOW64_Default);
/** ----------------------------------------------------------------- /** -----------------------------------------------------------------
* Environment Manipulation Routines * Environment Manipulation Routines