aboutsummaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2006-10-16 18:00:06 +0000
committerCorinna Vinschen <corinna@vinschen.de>2006-10-16 18:00:06 +0000
commit40c60b89d5d424c3ebb577c07807c48ecc2b3759 (patch)
tree0cd4025a1631f44f42994b994067478d8d7cc144 /winsup
parent0b8affca5ebbecf4cab62ae49cc10613dcbd3466 (diff)
downloadnewlib-40c60b89d5d424c3ebb577c07807c48ecc2b3759.zip
newlib-40c60b89d5d424c3ebb577c07807c48ecc2b3759.tar.gz
newlib-40c60b89d5d424c3ebb577c07807c48ecc2b3759.tar.bz2
* regtool.cc (KEY_WOW64_64KEY): Define.
(longopts): Add --wow64 option. (opts): Add -w option. (wow64): New variable to control usage of KEY_WOW64_64KEY access flag. (usage): Add text for --wow64/-w option. (print_version): Fix copyright. (find_key): Use wow64 value in calls to RegOpenKeyEx and RegCreateKeyEx. (cmd_add): Use wow64 value in call to RegCreateKeyEx. (regDeleteKeyEx): New function pointer to load RegDeleteKeyEx function dynamically. (cmd_remove): Load and use regDeleteKeyEx when wow64 is set. (main): Handle --wow64/-w option. * utils.sgml: Document the new -w option.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/utils/ChangeLog16
-rw-r--r--winsup/utils/regtool.cc37
-rw-r--r--winsup/utils/utils.sgml10
3 files changed, 57 insertions, 6 deletions
diff --git a/winsup/utils/ChangeLog b/winsup/utils/ChangeLog
index a0c3057..bf88001 100644
--- a/winsup/utils/ChangeLog
+++ b/winsup/utils/ChangeLog
@@ -1,3 +1,19 @@
+2006-10-16 Corinna Vinschen <corinna@vinschen.de>
+
+ * regtool.cc (KEY_WOW64_64KEY): Define.
+ (longopts): Add --wow64 option.
+ (opts): Add -w option.
+ (wow64): New variable to control usage of KEY_WOW64_64KEY access flag.
+ (usage): Add text for --wow64/-w option.
+ (print_version): Fix copyright.
+ (find_key): Use wow64 value in calls to RegOpenKeyEx and RegCreateKeyEx.
+ (cmd_add): Use wow64 value in call to RegCreateKeyEx.
+ (regDeleteKeyEx): New function pointer to load RegDeleteKeyEx function
+ dynamically.
+ (cmd_remove): Load and use regDeleteKeyEx when wow64 is set.
+ (main): Handle --wow64/-w option.
+ * utils.sgml: Document the new -w option.
+
2006-10-05 Igor Peshansky <pechtcha@cs.nyu.edu>
* cygcheck.cc (get_word, get_dword): Move to path.cc.
diff --git a/winsup/utils/regtool.cc b/winsup/utils/regtool.cc
index f46fc7e..d128cbc 100644
--- a/winsup/utils/regtool.cc
+++ b/winsup/utils/regtool.cc
@@ -18,6 +18,10 @@ details. */
#define DEFAULT_KEY_SEPARATOR '\\'
+#ifndef KEY_WOW64_64KEY
+#define KEY_WOW64_64KEY 0x100
+#endif
+
enum
{
KT_AUTO, KT_BINARY, KT_INT, KT_STRING, KT_EXPAND, KT_MULTI
@@ -46,16 +50,18 @@ static struct option longopts[] =
{"string", no_argument, NULL, 's'},
{"verbose", no_argument, NULL, 'v'},
{"version", no_argument, NULL, 'V'},
+ {"wow64", no_argument, NULL, 'w'},
{"key-separator", required_argument, NULL, 'K'},
{NULL, 0, NULL, 0}
};
-static char opts[] = "behiklmpqsvVK:";
+static char opts[] = "behiklmpqsvVwK:";
int listwhat = 0;
int postfix = 0;
int verbose = 0;
int quiet = 0;
+DWORD wow64 = 0;
char **argv;
HKEY key;
@@ -106,6 +112,7 @@ usage (FILE *where = stderr)
" -h, --help output usage information and exit\n"
" -q, --quiet no error output, just nonzero return if KEY/VALUE missing\n"
" -v, --verbose verbose output, including VALUE contents when applicable\n"
+ " -w, --wow64 access 64 bit registry view (ignored on 32 bit Windows)\n"
" -V, --version output version information and exit\n"
"\n");
if (where == stdout)
@@ -148,7 +155,7 @@ print_version ()
printf ("\
%s (cygwin) %.*s\n\
Registry Tool\n\
-Copyright 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc.\n\
+Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc.\n\
Compiled on %s\n\
", prog_name, len, v, __DATE__);
}
@@ -360,13 +367,13 @@ find_key (int howmanyparts, REGSAM access, int option = 0)
{
if (access)
{
- rv = RegOpenKeyEx (base, n, 0, access, &key);
+ rv = RegOpenKeyEx (base, n, 0, access | wow64, &key);
if (option && (rv == ERROR_SUCCESS || rv == ERROR_ACCESS_DENIED))
{
/* reopen with desired option due to missing option support in RegOpenKeyE */
/* FIXME: may create the key in rare cases (e.g. access denied in parent) */
HKEY key2;
- if (RegCreateKeyEx (base, n, 0, NULL, option, access, NULL, &key2, NULL)
+ if (RegCreateKeyEx (base, n, 0, NULL, option, access | wow64, NULL, &key2, NULL)
== ERROR_SUCCESS)
{
if (rv == ERROR_SUCCESS)
@@ -496,7 +503,7 @@ cmd_add ()
HKEY newkey;
DWORD newtype;
int rv = RegCreateKeyEx (key, value, 0, (char *) "", REG_OPTION_NON_VOLATILE,
- KEY_ALL_ACCESS, 0, &newkey, &newtype);
+ KEY_ALL_ACCESS | wow64, 0, &newkey, &newtype);
if (rv != ERROR_SUCCESS)
Fail (rv);
@@ -510,11 +517,26 @@ cmd_add ()
return 0;
}
+extern "C" {
+WINADVAPI LONG WINAPI (*regDeleteKeyEx)(HKEY, LPCSTR, REGSAM, DWORD);
+}
+
int
cmd_remove ()
{
+ DWORD rv;
+
find_key (2, KEY_ALL_ACCESS);
- DWORD rv = RegDeleteKey (key, value);
+ if (wow64)
+ {
+ HMODULE mod = LoadLibrary ("advapi32.dll");
+ if (mod)
+ regDeleteKeyEx = (WINADVAPI LONG WINAPI (*)(HKEY, LPCSTR, REGSAM, DWORD)) GetProcAddress (mod, "RegDeleteKeyExA");
+ }
+ if (regDeleteKeyEx)
+ rv = (*regDeleteKeyEx) (key, value, wow64, 0);
+ else
+ rv = RegDeleteKey (key, value);
if (rv != ERROR_SUCCESS)
Fail (rv);
if (verbose)
@@ -838,6 +860,9 @@ main (int argc, char **_argv)
case 'V':
print_version ();
exit (0);
+ case 'w':
+ wow64 = KEY_WOW64_64KEY;
+ break;
case 'K':
key_sep = *optarg;
break;
diff --git a/winsup/utils/utils.sgml b/winsup/utils/utils.sgml
index 371bad6..1279bda 100644
--- a/winsup/utils/utils.sgml
+++ b/winsup/utils/utils.sgml
@@ -1060,6 +1060,7 @@ Other Options:
-h, --help output usage information and exit
-q, --quiet no error output, just nonzero return if KEY/VALUE missing
-v, --verbose verbose output, including VALUE contents when applicable
+ -w, --wow64 access 64 bit registry view (ignored on 32 bit Windows)
-V, --version output version information and exit
KEY is in the format [host]\prefix\KEY\KEY\VALUE, where host is optional
@@ -1086,6 +1087,15 @@ Conversely, the <literal>-q</literal> option supresses error messages,
so you can use the exit status of the program to detect if a key
exists or not (for example).</para>
+<para>The <literal>-w</literal> option allows to access the 64 bit view
+on the registry. Several subkeys exist in a 32 bit and a 64 bit version
+when running on Windows 64. Since Cygwin is running in 32 bit mode, it
+has only access to the 32 bit view of these registry keys. When using
+the <literal>-w</literal> the 64 bit view is used and
+<command>regtool</command> can access the entire registry.
+This option is simply ignored when running on 32 bit Windows versions.
+</para>
+
<para>You must provide <command>regtool</command> with an
<emphasis>action</emphasis> following options (if any). Currently,
the action must be <literal>add</literal>, <literal>set</literal>,