diff -r bca81ea8f898 Doc/library/winreg.rst --- a/Doc/library/winreg.rst Mon May 23 08:41:48 2016 +0300 +++ b/Doc/library/winreg.rst Mon May 23 12:49:17 2016 +0200 @@ -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 -r bca81ea8f898 Lib/test/test_winreg.py --- a/Lib/test/test_winreg.py Mon May 23 08:41:48 2016 +0300 +++ b/Lib/test/test_winreg.py Mon May 23 12:49:17 2016 +0200 @@ -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 -r bca81ea8f898 PC/winreg.c --- a/PC/winreg.c Mon May 23 08:41:48 2016 +0300 +++ b/PC/winreg.c Mon May 23 12:49:17 2016 +0200 @@ -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);