Op Mon, 5 Sep 2005 11:31:28 +0100 schreef Dave Korn in <[EMAIL PROTECTED]>: : ----Original Message---- : > From: Buzz [Dave Korn:] : >> To me this is the even more important reason. Some registry strings : >> do include the trailing zero, some don't; : > : > I don't see how this could be. : : Because internally (native API) the registry stores NT-style : UNICODE_STRING structures, which have an explicit length count. See also
I see. : http://www.sysinternals.com/Information/TipsAndTrivia.html#HiddenKeys [Names of registry-strings can contain \0.] This is not relevant, as it concerns the names of registry-keys, not their value. As we're using RegQueryValueEx, we won't be seeing those hidden entries. : http://blogs.msdn.com/oldnewthing/archive/2004/08/24/219444.aspx [Actually anything in the registery turns out to be a counted array of bytes, and the type-indicator is just a hint... :-( ] This, however is to the point, and another reason to regret ever using MS software. Patch retracted. Regtool may need fixing, though, if I understand the above correctly... ...Yes, it does. utils/ChangeLog entry: 2005-09-07 Bas van Gompel <[EMAIL PROTECTED]> * regtool.cc: Extend copyright-years. (print_version): Ditto. (cmd_list): Don't depend on terminating '\0' being present on string-values. (cmd_get): Don't attempt to read more than present, but keep extra space for terminating '\0'. Really output REG_BINARY. Don't leak memory. (cmd_set): Include trailing '\0' in string's length. --- src/winsup/utils/regtool.cc 27 Feb 2005 17:55:54 -0000 1.17 +++ src/winsup/utils/regtool.cc 7 Sep 2005 19:54:41 -0000 @@ -1,6 +1,6 @@ /* regtool.cc - Copyright 2000, 2001, 2002, 2003, 2004 Red Hat Inc. + Copyright 2000, 2001, 2002, 2003, 2004, 2005 Red Hat Inc. This file is part of Cygwin. @@ -138,7 +138,7 @@ print_version () printf ("\ %s (cygwin) %.*s\n\ Registry Tool\n\ -Copyright 2000, 2001, 2002 Red Hat, Inc.\n\ +Copyright 2000, 2001, 2002, 2003, 2004, 2005 Red Hat, Inc.\n\ Compiled on %s\n\ ", prog_name, len, v, __DATE__); } @@ -398,6 +398,7 @@ cmd_list () m = maxvalnamelen + 1; n = maxvaluelen + 1; RegEnumValue (key, i, value_name, &m, 0, &t, (BYTE *) value_data, &n); + value_data[n] = 0; if (!verbose) printf ("%s\n", value_name); else @@ -515,11 +516,11 @@ cmd_set () sizeof (v)); break; case KT_STRING: - rv = RegSetValueEx (key, value, 0, REG_SZ, (const BYTE *) a, strlen (a)); + rv = RegSetValueEx (key, value, 0, REG_SZ, (const BYTE *) a, strlen (a) + 1); break; case KT_EXPAND: rv = RegSetValueEx (key, value, 0, REG_EXPAND_SZ, (const BYTE *) a, - strlen (a)); + strlen (a) + 1); break; case KT_MULTI: for (i = 1, n = 1; argv[i]; i++) @@ -569,15 +570,14 @@ cmd_get () rv = RegQueryValueEx (key, value, 0, &vtype, 0, &dsize); if (rv != ERROR_SUCCESS) Fail (rv); - dsize++; - data = (char *) malloc (dsize); + data = (char *) malloc (dsize + 1); rv = RegQueryValueEx (key, value, 0, &vtype, (BYTE *) data, &dsize); if (rv != ERROR_SUCCESS) Fail (rv); switch (vtype) { case REG_BINARY: - fwrite (data, dsize, 0, stdout); + fwrite (data, dsize, 1, stdout); break; case REG_DWORD: printf ("%lu\n", *(DWORD *) data); @@ -593,6 +593,7 @@ cmd_get () bufsize = ExpandEnvironmentStrings (data, 0, 0); buf = (char *) malloc (bufsize + 1); ExpandEnvironmentStrings (data, buf, bufsize + 1); + free (data); data = buf; } printf ("%s\n", data); [I suppose other types should be checked for correct size as well...] L8r, Buzz. -- ) | | ---/ ---/ Yes, this | This message consists of true | I do not -- | | / / really is | and false bits entirely. | mail for ) | | / / a 72 by 4 +-------------------------------+ any1 but -- \--| /--- /--- .sigfile. | |perl -pe "s.u(z)\1.as." | me. 4^re
