diff -r 154ae3af0317 Doc/library/winreg.rst --- a/Doc/library/winreg.rst Fri Jan 09 16:40:38 2015 -0600 +++ b/Doc/library/winreg.rst Thu Jan 22 16:21:28 2015 -0700 @@ -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 154ae3af0317 PC/winreg.c --- a/PC/winreg.c Fri Jan 09 16:40:38 2015 -0600 +++ b/PC/winreg.c Thu Jan 22 16:21:28 2015 -0700 @@ -324,7 +324,7 @@ "type is an integer that specifies the type of the data. This should be one of:\n" " REG_BINARY -- Binary data in any form.\n" " REG_DWORD -- A 32-bit number.\n" -" REG_DWORD_LITTLE_ENDIAN -- A 32-bit number in little-endian format.\n" +" REG_DWORD_LITTLE_ENDIAN -- A 32-bit number in little-endian format. Equivalent to REG_DWORD.\n" " REG_DWORD_BIG_ENDIAN -- A 32-bit number in big-endian format.\n" " REG_EXPAND_SZ -- A null-terminated string that contains unexpanded references\n" " to environment variables (for example, %PATH%).\n" @@ -333,6 +333,8 @@ " two null characters. Note that Python handles this\n" " termination automatically.\n" " REG_NONE -- No defined value type.\n" +" REG_QWORD -- A 64-bit number." +" REG_QWORD_LITTLE_ENDIAN -- A 64-bit number in little-endian format. Equivalent to REG_QWORD.\n" " REG_RESOURCE_LIST -- A device-driver resource list.\n" " REG_SZ -- A null-terminated string.\n" "value is a string that specifies the new value.\n" @@ -788,6 +790,24 @@ memcpy(*retDataBuf, &d, sizeof(DWORD)); } break; + case REG_QWORD: + if (value != Py_None && !PyLong_Check(value)) + return FALSE; + *retDataBuf = (BYTE *)PyMem_NEW(QWORD, 1); + if (*retDataBuf==NULL){ + PyErr_NoMemory(); + return FALSE; + } + *retDataSize = sizeof(QWORD); + if (value == Py_None) { + QWORD zero = 0; + memcpy(*retDataBuf, &zero, sizeof(QWORD)); + } + else { + QWORD d = PyLong_AsUnsignedLongLong(value); + memcpy(*retDataBuf, &d, sizeof(QWORD)); + } + break; case REG_SZ: case REG_EXPAND_SZ: { @@ -917,6 +937,12 @@ else obData = PyLong_FromUnsignedLong(*(int *)retDataBuf); break; + case REG_QWORD: + if (retDataSize == 0) + obData = PyLong_FromUnsignedLongLong(0); + else + obData = PyLong_FromUnsignedLongLong(*(int *)retDataBuf); + break; case REG_SZ: case REG_EXPAND_SZ: { @@ -1855,6 +1881,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);