[Python-checkins] cpython: Issue #23026: winreg.QueryValueEx() now return an integer for REG_QWORD type.

steve.dower python-checkins at python.org
Tue May 24 18:43:28 EDT 2016


https://hg.python.org/cpython/rev/ac2a2534f793
changeset:   101487:ac2a2534f793
user:        Steve Dower <steve.dower at microsoft.com>
date:        Tue May 24 15:42:04 2016 -0700
summary:
  Issue #23026: winreg.QueryValueEx() now return an integer for REG_QWORD type. (Patch by hakril)

files:
  Doc/library/winreg.rst  |  10 ++++++++-
  Doc/whatsnew/3.6.rst    |   8 +++++++
  Lib/test/test_winreg.py |   1 +
  Misc/NEWS               |   2 +
  PC/winreg.c             |  32 +++++++++++++++++++++++++++-
  5 files changed, 50 insertions(+), 3 deletions(-)


diff --git a/Doc/library/winreg.rst b/Doc/library/winreg.rst
--- a/Doc/library/winreg.rst
+++ b/Doc/library/winreg.rst
@@ -633,7 +633,7 @@
 
 .. data:: REG_DWORD_LITTLE_ENDIAN
 
-   A 32-bit number in little-endian format.
+   A 32-bit number in little-endian format. Equivalent to :const:`REG_DWORD`.
 
 .. data:: REG_DWORD_BIG_ENDIAN
 
@@ -657,6 +657,14 @@
 
    No defined value type.
 
+.. data:: REG_QWORD
+
+   A 64-bit number.
+
+.. data:: REG_QWORD_LITTLE_ENDIAN
+
+   A 64-bit number in little-endian format. Equivalent to :const:`REG_QWORD`.
+
 .. data:: REG_RESOURCE_LIST
 
    A device-driver resource list.
diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst
--- a/Doc/whatsnew/3.6.rst
+++ b/Doc/whatsnew/3.6.rst
@@ -421,6 +421,14 @@
 :mod:`warnings` was already imported.
 
 
+winreg
+------
+
+The :func:`QueryValueEx <winreg.QueryValueEx>` function now returns
+integer values for registry type ``REG_QWORD``.
+(Contributed by Clement Rouault in :issue:`23026`.)
+
+
 zipfile
 -------
 
diff --git a/Lib/test/test_winreg.py b/Lib/test/test_winreg.py
--- a/Lib/test/test_winreg.py
+++ b/Lib/test/test_winreg.py
@@ -37,6 +37,7 @@
 
 test_data = [
     ("Int Value",     45,                                      REG_DWORD),
+    ("Qword Value",   0x1122334455667788,                      REG_QWORD),
     ("String Val",    "A string value",                        REG_SZ),
     ("StringExpand",  "The path is %path%",                    REG_EXPAND_SZ),
     ("Multi-string",  ["Lots", "of", "string", "values"],      REG_MULTI_SZ),
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -19,6 +19,8 @@
 Library
 -------
 
+- Issue #23026: winreg.QueryValueEx() now return an integer for REG_QWORD type.
+
 - Issue #26741: subprocess.Popen destructor now emits a ResourceWarning warning
   if the child process is still running.
 
diff --git a/PC/winreg.c b/PC/winreg.c
--- a/PC/winreg.c
+++ b/PC/winreg.c
@@ -563,6 +563,24 @@
                 memcpy(*retDataBuf, &d, sizeof(DWORD));
             }
             break;
+        case REG_QWORD:
+          if (value != Py_None && !PyLong_Check(value))
+                return FALSE;
+            *retDataBuf = (BYTE *)PyMem_NEW(DWORD64, 1);
+            if (*retDataBuf==NULL){
+                PyErr_NoMemory();
+                return FALSE;
+            }
+            *retDataSize = sizeof(DWORD64);
+            if (value == Py_None) {
+                DWORD64 zero = 0;
+                memcpy(*retDataBuf, &zero, sizeof(DWORD64));
+            }
+            else {
+                DWORD64 d = PyLong_AsUnsignedLongLong(value);
+                memcpy(*retDataBuf, &d, sizeof(DWORD64));
+            }
+            break;
         case REG_SZ:
         case REG_EXPAND_SZ:
             {
@@ -690,7 +708,13 @@
             if (retDataSize == 0)
                 obData = PyLong_FromUnsignedLong(0);
             else
-                obData = PyLong_FromUnsignedLong(*(int *)retDataBuf);
+                obData = PyLong_FromUnsignedLong(*(DWORD *)retDataBuf);
+            break;
+        case REG_QWORD:
+            if (retDataSize == 0)
+                obData = PyLong_FromUnsignedLongLong(0);
+            else
+                obData = PyLong_FromUnsignedLongLong(*(DWORD64 *)retDataBuf);
             break;
         case REG_SZ:
         case REG_EXPAND_SZ:
@@ -1599,7 +1623,7 @@
         An integer that specifies the type of the data, one of:
         REG_BINARY -- Binary data in any form.
         REG_DWORD -- A 32-bit number.
-        REG_DWORD_LITTLE_ENDIAN -- A 32-bit number in little-endian format.
+        REG_DWORD_LITTLE_ENDIAN -- A 32-bit number in little-endian format. Equivalent to REG_DWORD
         REG_DWORD_BIG_ENDIAN -- A 32-bit number in big-endian format.
         REG_EXPAND_SZ -- A null-terminated string that contains unexpanded
                          references to environment variables (for example,
@@ -1609,6 +1633,8 @@
                         by two null characters.  Note that Python handles
                         this termination automatically.
         REG_NONE -- No defined value type.
+        REG_QWORD -- A 64-bit number.
+        REG_QWORD_LITTLE_ENDIAN -- A 64-bit number in little-endian format. Equivalent to REG_QWORD.
         REG_RESOURCE_LIST -- A device-driver resource list.
         REG_SZ -- A null-terminated string.
     value: object
@@ -1918,6 +1944,8 @@
     ADD_INT(REG_DWORD);
     ADD_INT(REG_DWORD_LITTLE_ENDIAN);
     ADD_INT(REG_DWORD_BIG_ENDIAN);
+    ADD_INT(REG_QWORD);
+    ADD_INT(REG_QWORD_LITTLE_ENDIAN);
     ADD_INT(REG_LINK);
     ADD_INT(REG_MULTI_SZ);
     ADD_INT(REG_RESOURCE_LIST);

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list