]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #23026: winreg.QueryValueEx() now return an integer for REG_QWORD type. (Patch...
authorSteve Dower <steve.dower@microsoft.com>
Tue, 24 May 2016 22:42:04 +0000 (15:42 -0700)
committerSteve Dower <steve.dower@microsoft.com>
Tue, 24 May 2016 22:42:04 +0000 (15:42 -0700)
Doc/library/winreg.rst
Doc/whatsnew/3.6.rst
Lib/test/test_winreg.py
Misc/NEWS
PC/winreg.c

index 94378b21d580c26895703f433ec71d395f99e379..adac77555620e2b9c37f77f7208c18476ad8fd85 100644 (file)
@@ -633,7 +633,7 @@ For more information, see `Registry Value Types
 
 .. 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 @@ For more information, see `Registry Value Types
 
    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.
index f829e4a9175c92b2ba90bc9eaee24f6fa9c00a3c..93402a384d54b22b2537e48b2323de47f0087206 100644 (file)
@@ -421,6 +421,14 @@ The "Object allocated at" traceback is new and only displayed if
 :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
 -------
 
index 2c4ac08f390eddde05cf19e0b18c688ebaf18723..ef40e8bc379aef4e286efe70e32eefcb67b40c10 100644 (file)
@@ -37,6 +37,7 @@ test_reflect_key_name = "SOFTWARE\\Classes\\" + test_key_base
 
 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),
index d044bef5e789a744041f731ac4689b88cfd82217..a76c5a50905700c973a16d5f4bf0debc15d23dee 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -19,6 +19,8 @@ Core and Builtins
 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.
 
index d1c3f39525b5c24723e8a1f18067b9eb6fdc5535..49e1cd7eebdc1e123cc5953f7b382d5e9bba219c 100644 (file)
@@ -563,6 +563,24 @@ Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
                 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 @@ Reg2Py(BYTE *retDataBuf, DWORD retDataSize, DWORD typ)
             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 @@ winreg.SetValueEx
         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 @@ winreg.SetValueEx
                         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 @@ PyMODINIT_FUNC PyInit_winreg(void)
     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);