diff options
author | Steve Dower <steve.dower@microsoft.com> | 2016-05-24 22:42:04 (GMT) |
---|---|---|
committer | Steve Dower <steve.dower@microsoft.com> | 2016-05-24 22:42:04 (GMT) |
commit | 80ac11d01e2ede7116e03f195ed254c0fde543fa (patch) | |
tree | cf97f6863fe3769cee69ded7100eb1c5bad5e7e0 | |
parent | b0f80b0312a99ca46323efc0e4d09b567553ed46 (diff) | |
download | cpython-80ac11d01e2ede7116e03f195ed254c0fde543fa.zip cpython-80ac11d01e2ede7116e03f195ed254c0fde543fa.tar.gz cpython-80ac11d01e2ede7116e03f195ed254c0fde543fa.tar.bz2 |
Issue #23026: winreg.QueryValueEx() now return an integer for REG_QWORD type. (Patch by hakril)
-rw-r--r-- | Doc/library/winreg.rst | 10 | ||||
-rw-r--r-- | Doc/whatsnew/3.6.rst | 8 | ||||
-rw-r--r-- | Lib/test/test_winreg.py | 1 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | PC/winreg.c | 32 |
5 files changed, 50 insertions, 3 deletions
diff --git a/Doc/library/winreg.rst b/Doc/library/winreg.rst index 94378b2..adac775 100644 --- a/Doc/library/winreg.rst +++ b/Doc/library/winreg.rst @@ -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. diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index f829e4a..93402a3 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -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 ------- diff --git a/Lib/test/test_winreg.py b/Lib/test/test_winreg.py index 2c4ac08..ef40e8b 100644 --- a/Lib/test/test_winreg.py +++ b/Lib/test/test_winreg.py @@ -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), @@ -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. diff --git a/PC/winreg.c b/PC/winreg.c index d1c3f39..49e1cd7 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -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); |