4 Windows Registry access module for Python.
6 * Simple registry access written by Mark Hammond in win32api
8 * Bill Tutt expanded the support significantly not long after.
9 * Numerous other people have submitted patches since then.
10 * Ripped from win32api module 03-Feb-2000 by Mark Hammond, and
11 basic Unicode support added.
16 #include "structmember.h"
19 static BOOL
PyHKEY_AsHKEY(PyObject
*ob
, HKEY
*pRes
, BOOL bNoneOK
);
20 static PyObject
*PyHKEY_FromHKEY(HKEY h
);
21 static BOOL
PyHKEY_Close(PyObject
*obHandle
);
23 static char errNotAHandle
[] = "Object is not a handle";
25 /* The win32api module reports the function name that failed,
26 but this concept is not in the Python core.
27 Hopefully it will one day, and in the meantime I dont
28 want to lose this info...
30 #define PyErr_SetFromWindowsErrWithFunction(rc, fnname) \
31 PyErr_SetFromWindowsErr(rc)
33 /* Forward declares */
36 PyDoc_STRVAR(module_doc
,
37 "This module provides access to the Windows registry API.\n"
41 "CloseKey() - Closes a registry key.\n"
42 "ConnectRegistry() - Establishes a connection to a predefined registry handle\n"
43 " on another computer.\n"
44 "CreateKey() - Creates the specified key, or opens it if it already exists.\n"
45 "DeleteKey() - Deletes the specified key.\n"
46 "DeleteValue() - Removes a named value from the specified registry key.\n"
47 "EnumKey() - Enumerates subkeys of the specified open registry key.\n"
48 "EnumValue() - Enumerates values of the specified open registry key.\n"
49 "ExpandEnvironmentStrings() - Expand the env strings in a REG_EXPAND_SZ string.\n"
50 "FlushKey() - Writes all the attributes of the specified key to the registry.\n"
51 "LoadKey() - Creates a subkey under HKEY_USER or HKEY_LOCAL_MACHINE and stores\n"
52 " registration information from a specified file into that subkey.\n"
53 "OpenKey() - Alias for <om win32api.RegOpenKeyEx>\n"
54 "OpenKeyEx() - Opens the specified key.\n"
55 "QueryValue() - Retrieves the value associated with the unnamed value for a\n"
56 " specified key in the registry.\n"
57 "QueryValueEx() - Retrieves the type and data for a specified value name\n"
58 " associated with an open registry key.\n"
59 "QueryInfoKey() - Returns information about the specified key.\n"
60 "SaveKey() - Saves the specified key, and all its subkeys a file.\n"
61 "SetValue() - Associates a value with a specified key.\n"
62 "SetValueEx() - Stores data in the value field of an open registry key.\n"
66 "HKEYType -- type object for HKEY objects\n"
67 "error -- exception raised for Win32 errors\n"
69 "Integer constants:\n"
70 "Many constants are defined - see the documentation for each function\n"
71 "to see what constants are used, and where.");
74 PyDoc_STRVAR(CloseKey_doc
,
75 "CloseKey(hkey) - Closes a previously opened registry key.\n"
77 "The hkey argument specifies a previously opened key.\n"
79 "Note that if the key is not closed using this method, it will be\n"
80 "closed when the hkey object is destroyed by Python.");
82 PyDoc_STRVAR(ConnectRegistry_doc
,
83 "key = ConnectRegistry(computer_name, key) - "
84 "Establishes a connection to a predefined registry handle on another computer.\n"
86 "computer_name is the name of the remote computer, of the form \\\\computername.\n"
87 " If None, the local computer is used.\n"
88 "key is the predefined handle to connect to.\n"
90 "The return value is the handle of the opened key.\n"
91 "If the function fails, an EnvironmentError exception is raised.");
93 PyDoc_STRVAR(CreateKey_doc
,
94 "key = CreateKey(key, sub_key) - Creates or opens the specified key.\n"
96 "key is an already open key, or one of the predefined HKEY_* constants\n"
97 "sub_key is a string that names the key this method opens or creates.\n"
98 " If key is one of the predefined keys, sub_key may be None. In that case,\n"
99 " the handle returned is the same key handle passed in to the function.\n"
101 "If the key already exists, this function opens the existing key\n"
103 "The return value is the handle of the opened key.\n"
104 "If the function fails, an exception is raised.");
106 PyDoc_STRVAR(DeleteKey_doc
,
107 "DeleteKey(key, sub_key) - Deletes the specified key.\n"
109 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
110 "sub_key is a string that must be a subkey of the key identified by the key parameter.\n"
111 " This value must not be None, and the key may not have subkeys.\n"
113 "This method can not delete keys with subkeys.\n"
115 "If the method succeeds, the entire key, including all of its values,\n"
116 "is removed. If the method fails, an EnvironmentError exception is raised.");
118 PyDoc_STRVAR(DeleteValue_doc
,
119 "DeleteValue(key, value) - Removes a named value from a registry key.\n"
121 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
122 "value is a string that identifies the value to remove.");
124 PyDoc_STRVAR(EnumKey_doc
,
125 "string = EnumKey(key, index) - Enumerates subkeys of an open registry key.\n"
127 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
128 "index is an integer that identifies the index of the key to retrieve.\n"
130 "The function retrieves the name of one subkey each time it is called.\n"
131 "It is typically called repeatedly until an EnvironmentError exception is\n"
132 "raised, indicating no more values are available.");
134 PyDoc_STRVAR(EnumValue_doc
,
135 "tuple = EnumValue(key, index) - Enumerates values of an open registry key.\n"
136 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
137 "index is an integer that identifies the index of the value to retrieve.\n"
139 "The function retrieves the name of one subkey each time it is called.\n"
140 "It is typically called repeatedly, until an EnvironmentError exception\n"
141 "is raised, indicating no more values.\n"
143 "The result is a tuple of 3 items:\n"
144 "value_name is a string that identifies the value.\n"
145 "value_data is an object that holds the value data, and whose type depends\n"
146 " on the underlying registry type.\n"
147 "data_type is an integer that identifies the type of the value data.");
149 PyDoc_STRVAR(ExpandEnvironmentStrings_doc
,
150 "string = ExpandEnvironmentStrings(string) - Expand environment vars.\n");
152 PyDoc_STRVAR(FlushKey_doc
,
153 "FlushKey(key) - Writes all the attributes of a key to the registry.\n"
155 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
157 "It is not necessary to call RegFlushKey to change a key.\n"
158 "Registry changes are flushed to disk by the registry using its lazy flusher.\n"
159 "Registry changes are also flushed to disk at system shutdown.\n"
160 "Unlike CloseKey(), the FlushKey() method returns only when all the data has\n"
161 "been written to the registry.\n"
162 "An application should only call FlushKey() if it requires absolute certainty that registry changes are on disk.\n"
163 "If you don't know whether a FlushKey() call is required, it probably isn't.");
165 PyDoc_STRVAR(LoadKey_doc
,
166 "LoadKey(key, sub_key, file_name) - Creates a subkey under the specified key\n"
167 "and stores registration information from a specified file into that subkey.\n"
169 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
170 "sub_key is a string that identifies the sub_key to load\n"
171 "file_name is the name of the file to load registry data from.\n"
172 " This file must have been created with the SaveKey() function.\n"
173 " Under the file allocation table (FAT) file system, the filename may not\n"
174 "have an extension.\n"
176 "A call to LoadKey() fails if the calling process does not have the\n"
177 "SE_RESTORE_PRIVILEGE privilege.\n"
179 "If key is a handle returned by ConnectRegistry(), then the path specified\n"
180 "in fileName is relative to the remote computer.\n"
182 "The docs imply key must be in the HKEY_USER or HKEY_LOCAL_MACHINE tree");
184 PyDoc_STRVAR(OpenKey_doc
,
185 "key = OpenKey(key, sub_key, res = 0, sam = KEY_READ) - Opens the specified key.\n"
187 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
188 "sub_key is a string that identifies the sub_key to open\n"
189 "res is a reserved integer, and must be zero. Default is zero.\n"
190 "sam is an integer that specifies an access mask that describes the desired\n"
191 " security access for the key. Default is KEY_READ\n"
193 "The result is a new handle to the specified key\n"
194 "If the function fails, an EnvironmentError exception is raised.");
196 PyDoc_STRVAR(OpenKeyEx_doc
, "See OpenKey()");
198 PyDoc_STRVAR(QueryInfoKey_doc
,
199 "tuple = QueryInfoKey(key) - Returns information about a key.\n"
201 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
203 "The result is a tuple of 3 items:"
204 "An integer that identifies the number of sub keys this key has.\n"
205 "An integer that identifies the number of values this key has.\n"
206 "A long integer that identifies when the key was last modified (if available)\n"
207 " as 100's of nanoseconds since Jan 1, 1600.");
209 PyDoc_STRVAR(QueryValue_doc
,
210 "string = QueryValue(key, sub_key) - retrieves the unnamed value for a key.\n"
212 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
213 "sub_key is a string that holds the name of the subkey with which the value\n"
214 " is associated. If this parameter is None or empty, the function retrieves\n"
215 " the value set by the SetValue() method for the key identified by key."
217 "Values in the registry have name, type, and data components. This method\n"
218 "retrieves the data for a key's first value that has a NULL name.\n"
219 "But the underlying API call doesn't return the type, Lame Lame Lame, DONT USE THIS!!!");
221 PyDoc_STRVAR(QueryValueEx_doc
,
222 "value,type_id = QueryValueEx(key, value_name) - Retrieves the type and data for a specified value name associated with an open registry key.\n"
224 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
225 "value_name is a string indicating the value to query");
227 PyDoc_STRVAR(SaveKey_doc
,
228 "SaveKey(key, file_name) - Saves the specified key, and all its subkeys to the specified file.\n"
230 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
231 "file_name is the name of the file to save registry data to.\n"
232 " This file cannot already exist. If this filename includes an extension,\n"
233 " it cannot be used on file allocation table (FAT) file systems by the\n"
234 " LoadKey(), ReplaceKey() or RestoreKey() methods.\n"
236 "If key represents a key on a remote computer, the path described by\n"
237 "file_name is relative to the remote computer.\n"
238 "The caller of this method must possess the SeBackupPrivilege security privilege.\n"
239 "This function passes NULL for security_attributes to the API.");
241 PyDoc_STRVAR(SetValue_doc
,
242 "SetValue(key, sub_key, type, value) - Associates a value with a specified key.\n"
244 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
245 "sub_key is a string that names the subkey with which the value is associated.\n"
246 "type is an integer that specifies the type of the data. Currently this\n"
247 " must be REG_SZ, meaning only strings are supported.\n"
248 "value is a string that specifies the new value.\n"
250 "If the key specified by the sub_key parameter does not exist, the SetValue\n"
251 "function creates it.\n"
253 "Value lengths are limited by available memory. Long values (more than\n"
254 "2048 bytes) should be stored as files with the filenames stored in \n"
255 "the configuration registry. This helps the registry perform efficiently.\n"
257 "The key identified by the key parameter must have been opened with\n"
258 "KEY_SET_VALUE access.");
260 PyDoc_STRVAR(SetValueEx_doc
,
261 "SetValueEx(key, value_name, reserved, type, value) - Stores data in the value field of an open registry key.\n"
263 "key is an already open key, or any one of the predefined HKEY_* constants.\n"
264 "value_name is a string containing the name of the value to set, or None\n"
265 "type is an integer that specifies the type of the data. This should be one of:\n"
266 " REG_BINARY -- Binary data in any form.\n"
267 " REG_DWORD -- A 32-bit number.\n"
268 " REG_DWORD_LITTLE_ENDIAN -- A 32-bit number in little-endian format.\n"
269 " REG_DWORD_BIG_ENDIAN -- A 32-bit number in big-endian format.\n"
270 " REG_EXPAND_SZ -- A null-terminated string that contains unexpanded references\n"
271 " to environment variables (for example, %PATH%).\n"
272 " REG_LINK -- A Unicode symbolic link.\n"
273 " REG_MULTI_SZ -- An sequence of null-terminated strings, terminated by\n"
274 " two null characters. Note that Python handles this\n"
275 " termination automatically.\n"
276 " REG_NONE -- No defined value type.\n"
277 " REG_RESOURCE_LIST -- A device-driver resource list.\n"
278 " REG_SZ -- A null-terminated string.\n"
279 "reserved can be anything - zero is always passed to the API.\n"
280 "value is a string that specifies the new value.\n"
282 "This method can also set additional value and type information for the\n"
283 "specified key. The key identified by the key parameter must have been\n"
284 "opened with KEY_SET_VALUE access.\n"
286 "To open the key, use the CreateKeyEx() or OpenKeyEx() methods.\n"
288 "Value lengths are limited by available memory. Long values (more than\n"
289 "2048 bytes) should be stored as files with the filenames stored in \n"
290 "the configuration registry. This helps the registry perform efficiently.");
292 PyDoc_STRVAR(DisableReflectionKey_doc
,
293 "Disables registry reflection for 32-bit processes running on a 64-bit\n"
294 "Operating System. Will generally raise NotImplemented if executed on\n"
295 "a 32-bit Operating System.\n"
296 "If the key is not on the reflection list, the function succeeds but has no effect.\n"
297 "Disabling reflection for a key does not affect reflection of any subkeys.");
299 PyDoc_STRVAR(EnableReflectionKey_doc
,
300 "Restores registry reflection for the specified disabled key.\n"
301 "Will generally raise NotImplemented if executed on a 32-bit Operating System.\n"
302 "Restoring reflection for a key does not affect reflection of any subkeys.");
304 PyDoc_STRVAR(QueryReflectionKey_doc
,
305 "bool = QueryReflectionKey(hkey) - Determines the reflection state for the specified key.\n"
306 "Will generally raise NotImplemented if executed on a 32-bit Operating System.\n");
308 /* PyHKEY docstrings */
309 PyDoc_STRVAR(PyHKEY_doc
,
310 "PyHKEY Object - A Python object, representing a win32 registry key.\n"
312 "This object wraps a Windows HKEY object, automatically closing it when\n"
313 "the object is destroyed. To guarantee cleanup, you can call either\n"
314 "the Close() method on the PyHKEY, or the CloseKey() method.\n"
316 "All functions which accept a handle object also accept an integer - \n"
317 "however, use of the handle object is encouraged.\n"
320 "Close() - Closes the underlying handle.\n"
321 "Detach() - Returns the integer Win32 handle, detaching it from the object\n"
324 "handle - The integer Win32 handle.\n"
327 "__bool__ - Handles with an open object return true, otherwise false.\n"
328 "__int__ - Converting a handle to an integer returns the Win32 handle.\n"
329 "rich comparison - Handle objects are compared using the handle value.");
332 PyDoc_STRVAR(PyHKEY_Close_doc
,
333 "key.Close() - Closes the underlying Windows handle.\n"
335 "If the handle is already closed, no error is raised.");
337 PyDoc_STRVAR(PyHKEY_Detach_doc
,
338 "int = key.Detach() - Detaches the Windows handle from the handle object.\n"
340 "The result is the value of the handle before it is detached. If the\n"
341 "handle is already detached, this will return zero.\n"
343 "After calling this function, the handle is effectively invalidated,\n"
344 "but the handle is not closed. You would call this function when you\n"
345 "need the underlying win32 handle to exist beyond the lifetime of the\n"
347 "On 64 bit windows, the result of this function is a long integer");
350 /************************************************************************
352 The PyHKEY object definition
354 ************************************************************************/
360 #define PyHKEY_Check(op) ((op)->ob_type == &PyHKEY_Type)
362 static char *failMsg
= "bad operand type";
365 PyHKEY_unaryFailureFunc(PyObject
*ob
)
367 PyErr_SetString(PyExc_TypeError
, failMsg
);
371 PyHKEY_binaryFailureFunc(PyObject
*ob1
, PyObject
*ob2
)
373 PyErr_SetString(PyExc_TypeError
, failMsg
);
377 PyHKEY_ternaryFailureFunc(PyObject
*ob1
, PyObject
*ob2
, PyObject
*ob3
)
379 PyErr_SetString(PyExc_TypeError
, failMsg
);
384 PyHKEY_deallocFunc(PyObject
*ob
)
386 /* Can not call PyHKEY_Close, as the ob->tp_type
387 has already been cleared, thus causing the type
390 PyHKEYObject
*obkey
= (PyHKEYObject
*)ob
;
392 RegCloseKey((HKEY
)obkey
->hkey
);
397 PyHKEY_boolFunc(PyObject
*ob
)
399 return ((PyHKEYObject
*)ob
)->hkey
!= 0;
403 PyHKEY_intFunc(PyObject
*ob
)
405 PyHKEYObject
*pyhkey
= (PyHKEYObject
*)ob
;
406 return PyLong_FromVoidPtr(pyhkey
->hkey
);
410 PyHKEY_strFunc(PyObject
*ob
)
412 PyHKEYObject
*pyhkey
= (PyHKEYObject
*)ob
;
413 return PyUnicode_FromFormat("<PyHKEY:%p>", pyhkey
->hkey
);
417 PyHKEY_compareFunc(PyObject
*ob1
, PyObject
*ob2
)
419 PyHKEYObject
*pyhkey1
= (PyHKEYObject
*)ob1
;
420 PyHKEYObject
*pyhkey2
= (PyHKEYObject
*)ob2
;
421 return pyhkey1
== pyhkey2
? 0 :
422 (pyhkey1
< pyhkey2
? -1 : 1);
426 PyHKEY_hashFunc(PyObject
*ob
)
428 /* Just use the address.
429 XXX - should we use the handle value?
431 return _Py_HashPointer(ob
);
435 static PyNumberMethods PyHKEY_NumberMethods
=
437 PyHKEY_binaryFailureFunc
, /* nb_add */
438 PyHKEY_binaryFailureFunc
, /* nb_subtract */
439 PyHKEY_binaryFailureFunc
, /* nb_multiply */
440 PyHKEY_binaryFailureFunc
, /* nb_remainder */
441 PyHKEY_binaryFailureFunc
, /* nb_divmod */
442 PyHKEY_ternaryFailureFunc
, /* nb_power */
443 PyHKEY_unaryFailureFunc
, /* nb_negative */
444 PyHKEY_unaryFailureFunc
, /* nb_positive */
445 PyHKEY_unaryFailureFunc
, /* nb_absolute */
446 PyHKEY_boolFunc
, /* nb_bool */
447 PyHKEY_unaryFailureFunc
, /* nb_invert */
448 PyHKEY_binaryFailureFunc
, /* nb_lshift */
449 PyHKEY_binaryFailureFunc
, /* nb_rshift */
450 PyHKEY_binaryFailureFunc
, /* nb_and */
451 PyHKEY_binaryFailureFunc
, /* nb_xor */
452 PyHKEY_binaryFailureFunc
, /* nb_or */
453 PyHKEY_intFunc
, /* nb_int */
455 PyHKEY_unaryFailureFunc
, /* nb_float */
458 static PyObject
*PyHKEY_CloseMethod(PyObject
*self
, PyObject
*args
);
459 static PyObject
*PyHKEY_DetachMethod(PyObject
*self
, PyObject
*args
);
460 static PyObject
*PyHKEY_Enter(PyObject
*self
);
461 static PyObject
*PyHKEY_Exit(PyObject
*self
, PyObject
*args
);
463 static struct PyMethodDef PyHKEY_methods
[] = {
464 {"Close", PyHKEY_CloseMethod
, METH_VARARGS
, PyHKEY_Close_doc
},
465 {"Detach", PyHKEY_DetachMethod
, METH_VARARGS
, PyHKEY_Detach_doc
},
466 {"__enter__", (PyCFunction
)PyHKEY_Enter
, METH_NOARGS
, NULL
},
467 {"__exit__", PyHKEY_Exit
, METH_VARARGS
, NULL
},
471 #define OFF(e) offsetof(PyHKEYObject, e)
472 static PyMemberDef PyHKEY_memberlist
[] = {
473 {"handle", T_INT
, OFF(hkey
), READONLY
},
474 {NULL
} /* Sentinel */
477 /* The type itself */
478 PyTypeObject PyHKEY_Type
=
480 PyVarObject_HEAD_INIT(0, 0) /* fill in type at module init */
482 sizeof(PyHKEYObject
),
484 PyHKEY_deallocFunc
, /* tp_dealloc */
490 &PyHKEY_NumberMethods
, /* tp_as_number */
491 0, /* tp_as_sequence */
492 0, /* tp_as_mapping */
493 PyHKEY_hashFunc
, /* tp_hash */
495 PyHKEY_strFunc
, /* tp_str */
498 0, /* tp_as_buffer */
500 PyHKEY_doc
, /* tp_doc */
503 0, /*tp_richcompare*/
504 0, /*tp_weaklistoffset*/
507 PyHKEY_methods
, /*tp_methods*/
508 PyHKEY_memberlist
, /*tp_members*/
511 /************************************************************************
513 The PyHKEY object methods
515 ************************************************************************/
517 PyHKEY_CloseMethod(PyObject
*self
, PyObject
*args
)
519 if (!PyArg_ParseTuple(args
, ":Close"))
521 if (!PyHKEY_Close(self
))
528 PyHKEY_DetachMethod(PyObject
*self
, PyObject
*args
)
531 PyHKEYObject
*pThis
= (PyHKEYObject
*)self
;
532 if (!PyArg_ParseTuple(args
, ":Detach"))
534 ret
= (void*)pThis
->hkey
;
536 return PyLong_FromVoidPtr(ret
);
540 PyHKEY_Enter(PyObject
*self
)
547 PyHKEY_Exit(PyObject
*self
, PyObject
*args
)
549 if (!PyHKEY_Close(self
))
555 /************************************************************************
556 The public PyHKEY API (well, not public yet :-)
557 ************************************************************************/
559 PyHKEY_New(HKEY hInit
)
561 PyHKEYObject
*key
= PyObject_NEW(PyHKEYObject
, &PyHKEY_Type
);
564 return (PyObject
*)key
;
568 PyHKEY_Close(PyObject
*ob_handle
)
573 if (!PyHKEY_Check(ob_handle
)) {
574 PyErr_SetString(PyExc_TypeError
, "bad operand type");
577 key
= (PyHKEYObject
*)ob_handle
;
578 rc
= key
->hkey
? RegCloseKey((HKEY
)key
->hkey
) : ERROR_SUCCESS
;
580 if (rc
!= ERROR_SUCCESS
)
581 PyErr_SetFromWindowsErrWithFunction(rc
, "RegCloseKey");
582 return rc
== ERROR_SUCCESS
;
586 PyHKEY_AsHKEY(PyObject
*ob
, HKEY
*pHANDLE
, BOOL bNoneOK
)
592 "None is not a valid HKEY in this context");
597 else if (PyHKEY_Check(ob
)) {
598 PyHKEYObject
*pH
= (PyHKEYObject
*)ob
;
601 else if (PyLong_Check(ob
)) {
602 /* We also support integers */
604 *pHANDLE
= (HKEY
)PyLong_AsVoidPtr(ob
);
605 if (PyErr_Occurred())
611 "The object is not a PyHKEY object");
618 PyHKEY_FromHKEY(HKEY h
)
622 /* Inline PyObject_New */
623 op
= (PyHKEYObject
*) PyObject_MALLOC(sizeof(PyHKEYObject
));
625 return PyErr_NoMemory();
626 PyObject_INIT(op
, &PyHKEY_Type
);
628 return (PyObject
*)op
;
632 /************************************************************************
634 ************************************************************************/
636 PyWinObject_CloseHKEY(PyObject
*obHandle
)
639 if (PyHKEY_Check(obHandle
)) {
640 ok
= PyHKEY_Close(obHandle
);
642 #if SIZEOF_LONG >= SIZEOF_HKEY
643 else if (PyLong_Check(obHandle
)) {
644 long rc
= RegCloseKey((HKEY
)PyLong_AsLong(obHandle
));
645 ok
= (rc
== ERROR_SUCCESS
);
647 PyErr_SetFromWindowsErrWithFunction(rc
, "RegCloseKey");
650 else if (PyLong_Check(obHandle
)) {
651 long rc
= RegCloseKey((HKEY
)PyLong_AsVoidPtr(obHandle
));
652 ok
= (rc
== ERROR_SUCCESS
);
654 PyErr_SetFromWindowsErrWithFunction(rc
, "RegCloseKey");
660 "A handle must be a HKEY object or an integer");
668 Private Helper functions for the registry interfaces
670 ** Note that fixupMultiSZ and countString have both had changes
671 ** made to support "incorrect strings". The registry specification
672 ** calls for strings to be terminated with 2 null bytes. It seems
673 ** some commercial packages install strings which dont conform,
674 ** causing this code to fail - however, "regedit" etc still work
675 ** with these strings (ie only we dont!).
678 fixupMultiSZ(wchar_t **str
, wchar_t *data
, int len
)
685 for (P
= data
, i
= 0; P
< Q
&& *P
!= '\0'; P
++, i
++) {
687 for(; *P
!= '\0'; P
++)
693 countStrings(wchar_t *data
, int len
)
697 wchar_t *Q
= data
+ len
;
699 for (P
= data
, strings
= 0; P
< Q
&& *P
!= '\0'; P
++, strings
++)
700 for (; P
< Q
&& *P
!= '\0'; P
++)
705 /* Convert PyObject into Registry data.
706 Allocates space as needed. */
708 Py2Reg(PyObject
*value
, DWORD typ
, BYTE
**retDataBuf
, DWORD
*retDataSize
)
713 if (value
!= Py_None
&& !PyLong_Check(value
))
715 *retDataBuf
= (BYTE
*)PyMem_NEW(DWORD
, 1);
716 if (*retDataBuf
==NULL
){
720 *retDataSize
= sizeof(DWORD
);
721 if (value
== Py_None
) {
723 memcpy(*retDataBuf
, &zero
, sizeof(DWORD
));
726 DWORD d
= PyLong_AsLong(value
);
727 memcpy(*retDataBuf
, &d
, sizeof(DWORD
));
733 if (value
== Py_None
)
736 if (!PyUnicode_Check(value
))
739 *retDataSize
= 2 + PyUnicode_GET_DATA_SIZE(value
);
741 *retDataBuf
= (BYTE
*)PyMem_NEW(DWORD
, *retDataSize
);
742 if (*retDataBuf
==NULL
){
746 if (value
== Py_None
)
747 wcscpy((wchar_t *)*retDataBuf
, L
"");
749 wcscpy((wchar_t *)*retDataBuf
,
750 PyUnicode_AS_UNICODE(value
));
758 if (value
== Py_None
)
761 if (!PyList_Check(value
))
763 i
= PyList_Size(value
);
765 for (j
= 0; j
< i
; j
++)
768 t
= PyList_GET_ITEM(value
, j
);
769 if (!PyUnicode_Check(t
))
771 size
+= 2 + PyUnicode_GET_DATA_SIZE(t
);
774 *retDataSize
= size
+ 2;
775 *retDataBuf
= (BYTE
*)PyMem_NEW(char,
777 if (*retDataBuf
==NULL
){
781 P
= (wchar_t *)*retDataBuf
;
783 for (j
= 0; j
< i
; j
++)
786 t
= PyList_GET_ITEM(value
, j
);
787 wcscpy(P
, PyUnicode_AS_UNICODE(t
));
789 PyUnicode_AS_UNICODE(t
));
791 /* And doubly-terminate the list... */
796 /* ALSO handle ALL unknown data types here. Even if we can't
797 support it natively, we should handle the bits. */
799 if (value
== Py_None
)
804 if (!PyObject_CheckBuffer(value
)) {
805 PyErr_Format(PyExc_TypeError
,
806 "Objects of type '%s' can not "
807 "be used as binary registry values",
808 value
->ob_type
->tp_name
);
812 if (PyObject_GetBuffer(value
, &view
, PyBUF_SIMPLE
) < 0)
815 *retDataBuf
= (BYTE
*)PyMem_NEW(char, view
.len
);
816 if (*retDataBuf
==NULL
){
817 PyBuffer_Release(&view
);
821 *retDataSize
= view
.len
;
822 memcpy(*retDataBuf
, view
.buf
, view
.len
);
823 PyBuffer_Release(&view
);
830 /* Convert Registry data into PyObject*/
832 Reg2Py(BYTE
*retDataBuf
, DWORD retDataSize
, DWORD typ
)
838 if (retDataSize
== 0)
839 obData
= PyLong_FromLong(0);
841 obData
= PyLong_FromLong(*(int *)retDataBuf
);
846 /* the buffer may or may not have a trailing NULL */
847 wchar_t *data
= (wchar_t *)retDataBuf
;
848 int len
= retDataSize
/ 2;
849 if (retDataSize
&& data
[len
-1] == '\0')
851 if (retDataSize
<= 0)
853 obData
= PyUnicode_FromUnicode(data
, retDataSize
/2);
857 if (retDataSize
== 0)
858 obData
= PyList_New(0);
862 wchar_t *data
= (wchar_t *)retDataBuf
;
863 int len
= retDataSize
/ 2;
864 int s
= countStrings(data
, len
);
865 wchar_t **str
= (wchar_t **)malloc(sizeof(wchar_t *)*s
);
867 return PyErr_NoMemory();
869 fixupMultiSZ(str
, data
, len
);
870 obData
= PyList_New(s
);
873 for (index
= 0; index
< s
; index
++)
875 size_t len
= wcslen(str
[index
]);
877 PyErr_SetString(PyExc_OverflowError
,
878 "registry string is too long for a Python string");
882 PyList_SetItem(obData
,
884 PyUnicode_FromUnicode(str
[index
], len
));
891 /* ALSO handle ALL unknown data types here. Even if we can't
892 support it natively, we should handle the bits. */
894 if (retDataSize
== 0) {
899 obData
= PyBytes_FromStringAndSize(
900 (char *)retDataBuf
, retDataSize
);
906 /* The Python methods */
909 PyCloseKey(PyObject
*self
, PyObject
*args
)
912 if (!PyArg_ParseTuple(args
, "O:CloseKey", &obKey
))
914 if (!PyHKEY_Close(obKey
))
921 PyConnectRegistry(PyObject
*self
, PyObject
*args
)
925 wchar_t *szCompName
= NULL
;
928 if (!PyArg_ParseTuple(args
, "ZO:ConnectRegistry", &szCompName
, &obKey
))
930 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
932 Py_BEGIN_ALLOW_THREADS
933 rc
= RegConnectRegistryW(szCompName
, hKey
, &retKey
);
935 if (rc
!= ERROR_SUCCESS
)
936 return PyErr_SetFromWindowsErrWithFunction(rc
,
938 return PyHKEY_FromHKEY(retKey
);
942 PyCreateKey(PyObject
*self
, PyObject
*args
)
949 if (!PyArg_ParseTuple(args
, "OZ:CreateKey", &obKey
, &subKey
))
951 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
953 rc
= RegCreateKeyW(hKey
, subKey
, &retKey
);
954 if (rc
!= ERROR_SUCCESS
)
955 return PyErr_SetFromWindowsErrWithFunction(rc
, "CreateKey");
956 return PyHKEY_FromHKEY(retKey
);
960 PyDeleteKey(PyObject
*self
, PyObject
*args
)
966 if (!PyArg_ParseTuple(args
, "Ou:DeleteKey", &obKey
, &subKey
))
968 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
970 rc
= RegDeleteKeyW(hKey
, subKey
);
971 if (rc
!= ERROR_SUCCESS
)
972 return PyErr_SetFromWindowsErrWithFunction(rc
, "RegDeleteKey");
978 PyDeleteValue(PyObject
*self
, PyObject
*args
)
984 if (!PyArg_ParseTuple(args
, "OZ:DeleteValue", &obKey
, &subKey
))
986 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
988 Py_BEGIN_ALLOW_THREADS
989 rc
= RegDeleteValueW(hKey
, subKey
);
991 if (rc
!=ERROR_SUCCESS
)
992 return PyErr_SetFromWindowsErrWithFunction(rc
,
999 PyEnumKey(PyObject
*self
, PyObject
*args
)
1007 /* The Windows docs claim that the max key name length is 255
1008 * characters, plus a terminating nul character. However,
1009 * empirical testing demonstrates that it is possible to
1010 * create a 256 character key that is missing the terminating
1011 * nul. RegEnumKeyEx requires a 257 character buffer to
1012 * retrieve such a key name. */
1013 wchar_t tmpbuf
[257];
1014 DWORD len
= sizeof(tmpbuf
); /* includes NULL terminator */
1016 if (!PyArg_ParseTuple(args
, "Oi:EnumKey", &obKey
, &index
))
1018 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
1021 Py_BEGIN_ALLOW_THREADS
1022 rc
= RegEnumKeyExW(hKey
, index
, tmpbuf
, &len
, NULL
, NULL
, NULL
, NULL
);
1023 Py_END_ALLOW_THREADS
1024 if (rc
!= ERROR_SUCCESS
)
1025 return PyErr_SetFromWindowsErrWithFunction(rc
, "RegEnumKeyEx");
1027 retStr
= PyUnicode_FromUnicode(tmpbuf
, len
);
1028 return retStr
; /* can be NULL */
1032 PyEnumValue(PyObject
*self
, PyObject
*args
)
1038 wchar_t *retValueBuf
;
1041 DWORD retValueSize
, bufValueSize
;
1042 DWORD retDataSize
, bufDataSize
;
1047 if (!PyArg_ParseTuple(args
, "Oi:EnumValue", &obKey
, &index
))
1049 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
1052 if ((rc
= RegQueryInfoKeyW(hKey
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
1054 &retValueSize
, &retDataSize
, NULL
, NULL
))
1056 return PyErr_SetFromWindowsErrWithFunction(rc
,
1058 ++retValueSize
; /* include null terminators */
1060 bufDataSize
= retDataSize
;
1061 bufValueSize
= retValueSize
;
1062 retValueBuf
= (wchar_t *)PyMem_Malloc(sizeof(wchar_t) * retValueSize
);
1063 if (retValueBuf
== NULL
)
1064 return PyErr_NoMemory();
1065 retDataBuf
= (BYTE
*)PyMem_Malloc(retDataSize
);
1066 if (retDataBuf
== NULL
) {
1067 PyMem_Free(retValueBuf
);
1068 return PyErr_NoMemory();
1072 Py_BEGIN_ALLOW_THREADS
1073 rc
= RegEnumValueW(hKey
,
1081 Py_END_ALLOW_THREADS
1083 if (rc
!= ERROR_MORE_DATA
)
1087 tmpBuf
= (wchar_t *)PyMem_Realloc(retDataBuf
, bufDataSize
);
1088 if (tmpBuf
== NULL
) {
1093 retDataBuf
= tmpBuf
;
1094 retDataSize
= bufDataSize
;
1095 retValueSize
= bufValueSize
;
1098 if (rc
!= ERROR_SUCCESS
) {
1099 retVal
= PyErr_SetFromWindowsErrWithFunction(rc
,
1103 obData
= Reg2Py(retDataBuf
, retDataSize
, typ
);
1104 if (obData
== NULL
) {
1108 retVal
= Py_BuildValue("uOi", retValueBuf
, obData
, typ
);
1111 PyMem_Free(retValueBuf
);
1112 PyMem_Free(retDataBuf
);
1117 PyExpandEnvironmentStrings(PyObject
*self
, PyObject
*args
)
1119 Py_UNICODE
*retValue
= NULL
;
1125 if (!PyArg_ParseTuple(args
, "u:ExpandEnvironmentStrings", &src
))
1128 retValueSize
= ExpandEnvironmentStringsW(src
, retValue
, 0);
1129 if (retValueSize
== 0) {
1130 return PyErr_SetFromWindowsErrWithFunction(retValueSize
,
1131 "ExpandEnvironmentStrings");
1133 retValue
= (Py_UNICODE
*)PyMem_Malloc(retValueSize
* sizeof(Py_UNICODE
));
1134 if (retValue
== NULL
) {
1135 return PyErr_NoMemory();
1138 rc
= ExpandEnvironmentStringsW(src
, retValue
, retValueSize
);
1140 PyMem_Free(retValue
);
1141 return PyErr_SetFromWindowsErrWithFunction(retValueSize
,
1142 "ExpandEnvironmentStrings");
1144 o
= PyUnicode_FromUnicode(retValue
, wcslen(retValue
));
1145 PyMem_Free(retValue
);
1150 PyFlushKey(PyObject
*self
, PyObject
*args
)
1155 if (!PyArg_ParseTuple(args
, "O:FlushKey", &obKey
))
1157 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
1159 Py_BEGIN_ALLOW_THREADS
1160 rc
= RegFlushKey(hKey
);
1161 Py_END_ALLOW_THREADS
1162 if (rc
!= ERROR_SUCCESS
)
1163 return PyErr_SetFromWindowsErrWithFunction(rc
, "RegFlushKey");
1168 PyLoadKey(PyObject
*self
, PyObject
*args
)
1176 if (!PyArg_ParseTuple(args
, "Ouu:LoadKey", &obKey
, &subKey
, &fileName
))
1178 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
1180 Py_BEGIN_ALLOW_THREADS
1181 rc
= RegLoadKeyW(hKey
, subKey
, fileName
);
1182 Py_END_ALLOW_THREADS
1183 if (rc
!= ERROR_SUCCESS
)
1184 return PyErr_SetFromWindowsErrWithFunction(rc
, "RegLoadKey");
1190 PyOpenKey(PyObject
*self
, PyObject
*args
)
1199 REGSAM sam
= KEY_READ
;
1200 if (!PyArg_ParseTuple(args
, "OZ|ii:OpenKey", &obKey
, &subKey
,
1203 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
1206 Py_BEGIN_ALLOW_THREADS
1207 rc
= RegOpenKeyExW(hKey
, subKey
, res
, sam
, &retKey
);
1208 Py_END_ALLOW_THREADS
1209 if (rc
!= ERROR_SUCCESS
)
1210 return PyErr_SetFromWindowsErrWithFunction(rc
, "RegOpenKeyEx");
1211 return PyHKEY_FromHKEY(retKey
);
1216 PyQueryInfoKey(PyObject
*self
, PyObject
*args
)
1221 DWORD nSubKeys
, nValues
;
1226 if (!PyArg_ParseTuple(args
, "O:QueryInfoKey", &obKey
))
1228 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
1230 if ((rc
= RegQueryInfoKey(hKey
, NULL
, NULL
, 0, &nSubKeys
, NULL
, NULL
,
1231 &nValues
, NULL
, NULL
, NULL
, &ft
))
1233 return PyErr_SetFromWindowsErrWithFunction(rc
, "RegQueryInfoKey");
1234 li
.LowPart
= ft
.dwLowDateTime
;
1235 li
.HighPart
= ft
.dwHighDateTime
;
1236 l
= PyLong_FromLongLong(li
.QuadPart
);
1239 ret
= Py_BuildValue("iiO", nSubKeys
, nValues
, l
);
1245 PyQueryValue(PyObject
*self
, PyObject
*args
)
1257 if (!PyArg_ParseTuple(args
, "OZ:QueryValue", &obKey
, &subKey
))
1260 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
1263 rc
= RegQueryValueW(hKey
, subKey
, NULL
, &retSize
);
1264 if (rc
== ERROR_MORE_DATA
)
1266 else if (rc
!= ERROR_SUCCESS
)
1267 return PyErr_SetFromWindowsErrWithFunction(rc
,
1271 retBuf
= (wchar_t *) PyMem_Malloc(bufSize
);
1273 return PyErr_NoMemory();
1277 rc
= RegQueryValueW(hKey
, subKey
, retBuf
, &retSize
);
1278 if (rc
!= ERROR_MORE_DATA
)
1282 tmp
= (wchar_t *) PyMem_Realloc(retBuf
, bufSize
);
1285 return PyErr_NoMemory();
1290 if (rc
!= ERROR_SUCCESS
) {
1292 return PyErr_SetFromWindowsErrWithFunction(rc
,
1296 retStr
= PyUnicode_FromUnicode(retBuf
, wcslen(retBuf
));
1302 PyQueryValueEx(PyObject
*self
, PyObject
*args
)
1310 DWORD bufSize
= 0, retSize
;
1315 if (!PyArg_ParseTuple(args
, "OZ:QueryValueEx", &obKey
, &valueName
))
1318 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
1321 rc
= RegQueryValueExW(hKey
, valueName
, NULL
, NULL
, NULL
, &bufSize
);
1322 if (rc
== ERROR_MORE_DATA
)
1324 else if (rc
!= ERROR_SUCCESS
)
1325 return PyErr_SetFromWindowsErrWithFunction(rc
,
1327 retBuf
= (BYTE
*)PyMem_Malloc(bufSize
);
1329 return PyErr_NoMemory();
1333 rc
= RegQueryValueExW(hKey
, valueName
, NULL
, &typ
,
1334 (BYTE
*)retBuf
, &retSize
);
1335 if (rc
!= ERROR_MORE_DATA
)
1339 tmp
= (char *) PyMem_Realloc(retBuf
, bufSize
);
1342 return PyErr_NoMemory();
1347 if (rc
!= ERROR_SUCCESS
) {
1349 return PyErr_SetFromWindowsErrWithFunction(rc
,
1352 obData
= Reg2Py(retBuf
, bufSize
, typ
);
1356 result
= Py_BuildValue("Oi", obData
, typ
);
1363 PySaveKey(PyObject
*self
, PyObject
*args
)
1368 LPSECURITY_ATTRIBUTES pSA
= NULL
;
1371 if (!PyArg_ParseTuple(args
, "Ou:SaveKey", &obKey
, &fileName
))
1373 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
1375 /* One day we may get security into the core?
1376 if (!PyWinObject_AsSECURITY_ATTRIBUTES(obSA, &pSA, TRUE))
1379 Py_BEGIN_ALLOW_THREADS
1380 rc
= RegSaveKeyW(hKey
, fileName
, pSA
);
1381 Py_END_ALLOW_THREADS
1382 if (rc
!= ERROR_SUCCESS
)
1383 return PyErr_SetFromWindowsErrWithFunction(rc
, "RegSaveKey");
1389 PySetValue(PyObject
*self
, PyObject
*args
)
1398 if (!PyArg_ParseTuple(args
, "OZiu#:SetValue",
1405 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
1407 if (typ
!= REG_SZ
) {
1408 PyErr_SetString(PyExc_TypeError
,
1409 "Type must be winreg.REG_SZ");
1413 Py_BEGIN_ALLOW_THREADS
1414 rc
= RegSetValueW(hKey
, subKey
, REG_SZ
, str
, len
+1);
1415 Py_END_ALLOW_THREADS
1416 if (rc
!= ERROR_SUCCESS
)
1417 return PyErr_SetFromWindowsErrWithFunction(rc
, "RegSetValue");
1423 PySetValueEx(PyObject
*self
, PyObject
*args
)
1427 Py_UNICODE
*valueName
;
1436 if (!PyArg_ParseTuple(args
, "OZOiO:SetValueEx",
1443 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
1445 if (!Py2Reg(value
, typ
, &data
, &len
))
1447 if (!PyErr_Occurred())
1448 PyErr_SetString(PyExc_ValueError
,
1449 "Could not convert the data to the specified type.");
1452 Py_BEGIN_ALLOW_THREADS
1453 rc
= RegSetValueExW(hKey
, valueName
, 0, typ
, data
, len
);
1454 Py_END_ALLOW_THREADS
1456 if (rc
!= ERROR_SUCCESS
)
1457 return PyErr_SetFromWindowsErrWithFunction(rc
,
1464 PyDisableReflectionKey(PyObject
*self
, PyObject
*args
)
1469 typedef LONG (WINAPI
*RDRKFunc
)(HKEY
);
1470 RDRKFunc pfn
= NULL
;
1473 if (!PyArg_ParseTuple(args
, "O:DisableReflectionKey", &obKey
))
1475 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
1478 // Only available on 64bit platforms, so we must load it
1480 hMod
= GetModuleHandle("advapi32.dll");
1482 pfn
= (RDRKFunc
)GetProcAddress(hMod
,
1483 "RegDisableReflectionKey");
1485 PyErr_SetString(PyExc_NotImplementedError
,
1486 "not implemented on this platform");
1489 Py_BEGIN_ALLOW_THREADS
1491 Py_END_ALLOW_THREADS
1492 if (rc
!= ERROR_SUCCESS
)
1493 return PyErr_SetFromWindowsErrWithFunction(rc
,
1494 "RegDisableReflectionKey");
1500 PyEnableReflectionKey(PyObject
*self
, PyObject
*args
)
1505 typedef LONG (WINAPI
*RERKFunc
)(HKEY
);
1506 RERKFunc pfn
= NULL
;
1509 if (!PyArg_ParseTuple(args
, "O:EnableReflectionKey", &obKey
))
1511 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
1514 // Only available on 64bit platforms, so we must load it
1516 hMod
= GetModuleHandle("advapi32.dll");
1518 pfn
= (RERKFunc
)GetProcAddress(hMod
,
1519 "RegEnableReflectionKey");
1521 PyErr_SetString(PyExc_NotImplementedError
,
1522 "not implemented on this platform");
1525 Py_BEGIN_ALLOW_THREADS
1527 Py_END_ALLOW_THREADS
1528 if (rc
!= ERROR_SUCCESS
)
1529 return PyErr_SetFromWindowsErrWithFunction(rc
,
1530 "RegEnableReflectionKey");
1536 PyQueryReflectionKey(PyObject
*self
, PyObject
*args
)
1541 typedef LONG (WINAPI
*RQRKFunc
)(HKEY
, BOOL
*);
1542 RQRKFunc pfn
= NULL
;
1546 if (!PyArg_ParseTuple(args
, "O:QueryReflectionKey", &obKey
))
1548 if (!PyHKEY_AsHKEY(obKey
, &hKey
, FALSE
))
1551 // Only available on 64bit platforms, so we must load it
1553 hMod
= GetModuleHandle("advapi32.dll");
1555 pfn
= (RQRKFunc
)GetProcAddress(hMod
,
1556 "RegQueryReflectionKey");
1558 PyErr_SetString(PyExc_NotImplementedError
,
1559 "not implemented on this platform");
1562 Py_BEGIN_ALLOW_THREADS
1563 rc
= (*pfn
)(hKey
, &result
);
1564 Py_END_ALLOW_THREADS
1565 if (rc
!= ERROR_SUCCESS
)
1566 return PyErr_SetFromWindowsErrWithFunction(rc
,
1567 "RegQueryReflectionKey");
1568 return PyBool_FromLong(rc
);
1571 static struct PyMethodDef winreg_methods
[] = {
1572 {"CloseKey", PyCloseKey
, METH_VARARGS
, CloseKey_doc
},
1573 {"ConnectRegistry", PyConnectRegistry
, METH_VARARGS
, ConnectRegistry_doc
},
1574 {"CreateKey", PyCreateKey
, METH_VARARGS
, CreateKey_doc
},
1575 {"DeleteKey", PyDeleteKey
, METH_VARARGS
, DeleteKey_doc
},
1576 {"DeleteValue", PyDeleteValue
, METH_VARARGS
, DeleteValue_doc
},
1577 {"DisableReflectionKey", PyDisableReflectionKey
, METH_VARARGS
, DisableReflectionKey_doc
},
1578 {"EnableReflectionKey", PyEnableReflectionKey
, METH_VARARGS
, EnableReflectionKey_doc
},
1579 {"EnumKey", PyEnumKey
, METH_VARARGS
, EnumKey_doc
},
1580 {"EnumValue", PyEnumValue
, METH_VARARGS
, EnumValue_doc
},
1581 {"ExpandEnvironmentStrings", PyExpandEnvironmentStrings
, METH_VARARGS
,
1582 ExpandEnvironmentStrings_doc
},
1583 {"FlushKey", PyFlushKey
, METH_VARARGS
, FlushKey_doc
},
1584 {"LoadKey", PyLoadKey
, METH_VARARGS
, LoadKey_doc
},
1585 {"OpenKey", PyOpenKey
, METH_VARARGS
, OpenKey_doc
},
1586 {"OpenKeyEx", PyOpenKey
, METH_VARARGS
, OpenKeyEx_doc
},
1587 {"QueryValue", PyQueryValue
, METH_VARARGS
, QueryValue_doc
},
1588 {"QueryValueEx", PyQueryValueEx
, METH_VARARGS
, QueryValueEx_doc
},
1589 {"QueryInfoKey", PyQueryInfoKey
, METH_VARARGS
, QueryInfoKey_doc
},
1590 {"QueryReflectionKey",PyQueryReflectionKey
,METH_VARARGS
, QueryReflectionKey_doc
},
1591 {"SaveKey", PySaveKey
, METH_VARARGS
, SaveKey_doc
},
1592 {"SetValue", PySetValue
, METH_VARARGS
, SetValue_doc
},
1593 {"SetValueEx", PySetValueEx
, METH_VARARGS
, SetValueEx_doc
},
1598 insint(PyObject
* d
, char * name
, long value
)
1600 PyObject
*v
= PyLong_FromLong(value
);
1601 if (!v
|| PyDict_SetItemString(d
, name
, v
))
1606 #define ADD_INT(val) insint(d, #val, val)
1609 inskey(PyObject
* d
, char * name
, HKEY key
)
1611 PyObject
*v
= PyLong_FromVoidPtr(key
);
1612 if (!v
|| PyDict_SetItemString(d
, name
, v
))
1617 #define ADD_KEY(val) inskey(d, #val, val)
1620 static struct PyModuleDef winregmodule
= {
1621 PyModuleDef_HEAD_INIT
,
1632 PyMODINIT_FUNC
PyInit_winreg(void)
1635 m
= PyModule_Create(&winregmodule
);
1638 d
= PyModule_GetDict(m
);
1639 PyHKEY_Type
.tp_doc
= PyHKEY_doc
;
1640 if (PyType_Ready(&PyHKEY_Type
) < 0)
1642 Py_INCREF(&PyHKEY_Type
);
1643 if (PyDict_SetItemString(d
, "HKEYType",
1644 (PyObject
*)&PyHKEY_Type
) != 0)
1646 Py_INCREF(PyExc_WindowsError
);
1647 if (PyDict_SetItemString(d
, "error",
1648 PyExc_WindowsError
) != 0)
1651 /* Add the relevant constants */
1652 ADD_KEY(HKEY_CLASSES_ROOT
);
1653 ADD_KEY(HKEY_CURRENT_USER
);
1654 ADD_KEY(HKEY_LOCAL_MACHINE
);
1655 ADD_KEY(HKEY_USERS
);
1656 ADD_KEY(HKEY_PERFORMANCE_DATA
);
1657 #ifdef HKEY_CURRENT_CONFIG
1658 ADD_KEY(HKEY_CURRENT_CONFIG
);
1660 #ifdef HKEY_DYN_DATA
1661 ADD_KEY(HKEY_DYN_DATA
);
1663 ADD_INT(KEY_QUERY_VALUE
);
1664 ADD_INT(KEY_SET_VALUE
);
1665 ADD_INT(KEY_CREATE_SUB_KEY
);
1666 ADD_INT(KEY_ENUMERATE_SUB_KEYS
);
1667 ADD_INT(KEY_NOTIFY
);
1668 ADD_INT(KEY_CREATE_LINK
);
1671 ADD_INT(KEY_EXECUTE
);
1672 ADD_INT(KEY_ALL_ACCESS
);
1673 #ifdef KEY_WOW64_64KEY
1674 ADD_INT(KEY_WOW64_64KEY
);
1676 #ifdef KEY_WOW64_32KEY
1677 ADD_INT(KEY_WOW64_32KEY
);
1679 ADD_INT(REG_OPTION_RESERVED
);
1680 ADD_INT(REG_OPTION_NON_VOLATILE
);
1681 ADD_INT(REG_OPTION_VOLATILE
);
1682 ADD_INT(REG_OPTION_CREATE_LINK
);
1683 ADD_INT(REG_OPTION_BACKUP_RESTORE
);
1684 ADD_INT(REG_OPTION_OPEN_LINK
);
1685 ADD_INT(REG_LEGAL_OPTION
);
1686 ADD_INT(REG_CREATED_NEW_KEY
);
1687 ADD_INT(REG_OPENED_EXISTING_KEY
);
1688 ADD_INT(REG_WHOLE_HIVE_VOLATILE
);
1689 ADD_INT(REG_REFRESH_HIVE
);
1690 ADD_INT(REG_NO_LAZY_FLUSH
);
1691 ADD_INT(REG_NOTIFY_CHANGE_NAME
);
1692 ADD_INT(REG_NOTIFY_CHANGE_ATTRIBUTES
);
1693 ADD_INT(REG_NOTIFY_CHANGE_LAST_SET
);
1694 ADD_INT(REG_NOTIFY_CHANGE_SECURITY
);
1695 ADD_INT(REG_LEGAL_CHANGE_FILTER
);
1698 ADD_INT(REG_EXPAND_SZ
);
1699 ADD_INT(REG_BINARY
);
1701 ADD_INT(REG_DWORD_LITTLE_ENDIAN
);
1702 ADD_INT(REG_DWORD_BIG_ENDIAN
);
1704 ADD_INT(REG_MULTI_SZ
);
1705 ADD_INT(REG_RESOURCE_LIST
);
1706 ADD_INT(REG_FULL_RESOURCE_DESCRIPTOR
);
1707 ADD_INT(REG_RESOURCE_REQUIREMENTS_LIST
);