blob: 5efdc5e0efec6c8aed78434bdb7b9297e887c41d [file] [log] [blame]
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001/*
Georg Brandl38feaf02008-05-25 07:45:51 +00002 winreg.c
Guido van Rossum9f3712c2000-03-28 20:37:15 +00003
4 Windows Registry access module for Python.
5
6 * Simple registry access written by Mark Hammond in win32api
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007 module circa 1995.
Guido van Rossum9f3712c2000-03-28 20:37:15 +00008 * 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.
12
13*/
14
Guido van Rossum9f3712c2000-03-28 20:37:15 +000015#include "Python.h"
16#include "structmember.h"
Guido van Rossume7ba4952007-06-06 23:52:48 +000017#include "windows.h"
Guido van Rossum9f3712c2000-03-28 20:37:15 +000018
19static BOOL PyHKEY_AsHKEY(PyObject *ob, HKEY *pRes, BOOL bNoneOK);
Zachary Warefd2d4822015-05-13 01:21:57 -050020static BOOL clinic_HKEY_converter(PyObject *ob, void *p);
Guido van Rossum9f3712c2000-03-28 20:37:15 +000021static PyObject *PyHKEY_FromHKEY(HKEY h);
22static BOOL PyHKEY_Close(PyObject *obHandle);
23
24static char errNotAHandle[] = "Object is not a handle";
25
26/* The win32api module reports the function name that failed,
27 but this concept is not in the Python core.
28 Hopefully it will one day, and in the meantime I dont
29 want to lose this info...
30*/
31#define PyErr_SetFromWindowsErrWithFunction(rc, fnname) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000032 PyErr_SetFromWindowsErr(rc)
Guido van Rossum9f3712c2000-03-28 20:37:15 +000033
34/* Forward declares */
35
36/* Doc strings */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000037PyDoc_STRVAR(module_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +000038"This module provides access to the Windows registry API.\n"
39"\n"
40"Functions:\n"
41"\n"
42"CloseKey() - Closes a registry key.\n"
43"ConnectRegistry() - Establishes a connection to a predefined registry handle\n"
44" on another computer.\n"
45"CreateKey() - Creates the specified key, or opens it if it already exists.\n"
46"DeleteKey() - Deletes the specified key.\n"
47"DeleteValue() - Removes a named value from the specified registry key.\n"
48"EnumKey() - Enumerates subkeys of the specified open registry key.\n"
49"EnumValue() - Enumerates values of the specified open registry key.\n"
Zachary Warefd2d4822015-05-13 01:21:57 -050050"ExpandEnvironmentStrings() - Expand the env strings in a REG_EXPAND_SZ\n"
51" string.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +000052"FlushKey() - Writes all the attributes of the specified key to the registry.\n"
Zachary Warefd2d4822015-05-13 01:21:57 -050053"LoadKey() - Creates a subkey under HKEY_USER or HKEY_LOCAL_MACHINE and\n"
54" stores registration information from a specified file into that\n"
55" subkey.\n"
Brian Curtine9aeca72012-10-29 18:16:39 -050056"OpenKey() - Opens the specified key.\n"
57"OpenKeyEx() - Alias of OpenKey().\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +000058"QueryValue() - Retrieves the value associated with the unnamed value for a\n"
59" specified key in the registry.\n"
60"QueryValueEx() - Retrieves the type and data for a specified value name\n"
61" associated with an open registry key.\n"
62"QueryInfoKey() - Returns information about the specified key.\n"
63"SaveKey() - Saves the specified key, and all its subkeys a file.\n"
64"SetValue() - Associates a value with a specified key.\n"
65"SetValueEx() - Stores data in the value field of an open registry key.\n"
66"\n"
67"Special objects:\n"
68"\n"
69"HKEYType -- type object for HKEY objects\n"
70"error -- exception raised for Win32 errors\n"
71"\n"
72"Integer constants:\n"
73"Many constants are defined - see the documentation for each function\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000074"to see what constants are used, and where.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +000075
76
Martin v. Löwisd218dc12008-04-07 03:17:54 +000077
Guido van Rossum9f3712c2000-03-28 20:37:15 +000078/* PyHKEY docstrings */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000079PyDoc_STRVAR(PyHKEY_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +000080"PyHKEY Object - A Python object, representing a win32 registry key.\n"
81"\n"
Mark Hammondb422f952000-06-09 06:01:47 +000082"This object wraps a Windows HKEY object, automatically closing it when\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +000083"the object is destroyed. To guarantee cleanup, you can call either\n"
84"the Close() method on the PyHKEY, or the CloseKey() method.\n"
85"\n"
86"All functions which accept a handle object also accept an integer - \n"
87"however, use of the handle object is encouraged.\n"
88"\n"
89"Functions:\n"
90"Close() - Closes the underlying handle.\n"
91"Detach() - Returns the integer Win32 handle, detaching it from the object\n"
92"\n"
93"Properties:\n"
94"handle - The integer Win32 handle.\n"
95"\n"
96"Operations:\n"
Jack Diederich4dafcc42006-11-28 19:15:13 +000097"__bool__ - Handles with an open object return true, otherwise false.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +000098"__int__ - Converting a handle to an integer returns the Win32 handle.\n"
Mark Dickinson211c6252009-02-01 10:28:51 +000099"rich comparison - Handle objects are compared using the handle value.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000100
101
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000102
103/************************************************************************
104
105 The PyHKEY object definition
106
107************************************************************************/
108typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 PyObject_VAR_HEAD
110 HKEY hkey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000111} PyHKEYObject;
112
113#define PyHKEY_Check(op) ((op)->ob_type == &PyHKEY_Type)
114
115static char *failMsg = "bad operand type";
116
117static PyObject *
118PyHKEY_unaryFailureFunc(PyObject *ob)
119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000120 PyErr_SetString(PyExc_TypeError, failMsg);
121 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000122}
123static PyObject *
124PyHKEY_binaryFailureFunc(PyObject *ob1, PyObject *ob2)
125{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126 PyErr_SetString(PyExc_TypeError, failMsg);
127 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000128}
129static PyObject *
130PyHKEY_ternaryFailureFunc(PyObject *ob1, PyObject *ob2, PyObject *ob3)
131{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132 PyErr_SetString(PyExc_TypeError, failMsg);
133 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000134}
135
136static void
137PyHKEY_deallocFunc(PyObject *ob)
138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000139 /* Can not call PyHKEY_Close, as the ob->tp_type
140 has already been cleared, thus causing the type
141 check to fail!
142 */
143 PyHKEYObject *obkey = (PyHKEYObject *)ob;
144 if (obkey->hkey)
145 RegCloseKey((HKEY)obkey->hkey);
146 PyObject_DEL(ob);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000147}
148
149static int
Jack Diederich4dafcc42006-11-28 19:15:13 +0000150PyHKEY_boolFunc(PyObject *ob)
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 return ((PyHKEYObject *)ob)->hkey != 0;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000153}
154
155static PyObject *
156PyHKEY_intFunc(PyObject *ob)
157{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
159 return PyLong_FromVoidPtr(pyhkey->hkey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000160}
161
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000162static PyObject *
163PyHKEY_strFunc(PyObject *ob)
164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
166 return PyUnicode_FromFormat("<PyHKEY:%p>", pyhkey->hkey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000167}
168
169static int
170PyHKEY_compareFunc(PyObject *ob1, PyObject *ob2)
171{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000172 PyHKEYObject *pyhkey1 = (PyHKEYObject *)ob1;
173 PyHKEYObject *pyhkey2 = (PyHKEYObject *)ob2;
174 return pyhkey1 == pyhkey2 ? 0 :
175 (pyhkey1 < pyhkey2 ? -1 : 1);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000176}
177
Antoine Pitroufbb1c612010-10-23 17:37:54 +0000178static Py_hash_t
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000179PyHKEY_hashFunc(PyObject *ob)
180{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000181 /* Just use the address.
182 XXX - should we use the handle value?
183 */
184 return _Py_HashPointer(ob);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000185}
186
187
188static PyNumberMethods PyHKEY_NumberMethods =
189{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190 PyHKEY_binaryFailureFunc, /* nb_add */
191 PyHKEY_binaryFailureFunc, /* nb_subtract */
192 PyHKEY_binaryFailureFunc, /* nb_multiply */
193 PyHKEY_binaryFailureFunc, /* nb_remainder */
194 PyHKEY_binaryFailureFunc, /* nb_divmod */
195 PyHKEY_ternaryFailureFunc, /* nb_power */
196 PyHKEY_unaryFailureFunc, /* nb_negative */
197 PyHKEY_unaryFailureFunc, /* nb_positive */
198 PyHKEY_unaryFailureFunc, /* nb_absolute */
199 PyHKEY_boolFunc, /* nb_bool */
200 PyHKEY_unaryFailureFunc, /* nb_invert */
201 PyHKEY_binaryFailureFunc, /* nb_lshift */
202 PyHKEY_binaryFailureFunc, /* nb_rshift */
203 PyHKEY_binaryFailureFunc, /* nb_and */
204 PyHKEY_binaryFailureFunc, /* nb_xor */
205 PyHKEY_binaryFailureFunc, /* nb_or */
206 PyHKEY_intFunc, /* nb_int */
207 0, /* nb_reserved */
208 PyHKEY_unaryFailureFunc, /* nb_float */
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000209};
210
Zachary Warefd2d4822015-05-13 01:21:57 -0500211/*[clinic input]
212module winreg
213class winreg.HKEYType "PyHKEYObject *" "&PyHKEY_Type"
214[clinic start generated code]*/
215/*[clinic end generated code: output=da39a3ee5e6b4b0d input=4c964eba3bf914d6]*/
216
217/*[python input]
218class REGSAM_converter(CConverter):
219 type = 'REGSAM'
220 format_unit = 'i'
221
222class DWORD_converter(CConverter):
223 type = 'DWORD'
224 format_unit = 'k'
225
226class HKEY_converter(CConverter):
227 type = 'HKEY'
228 converter = 'clinic_HKEY_converter'
229
230class HKEY_return_converter(CReturnConverter):
231 type = 'HKEY'
232
233 def render(self, function, data):
234 self.declare(data)
235 self.err_occurred_if_null_pointer("_return_value", data)
236 data.return_conversion.append(
237 'return_value = PyHKEY_FromHKEY(_return_value);\n')
238
239# HACK: this only works for PyHKEYObjects, nothing else.
240# Should this be generalized and enshrined in clinic.py,
241# destroy this converter with prejudice.
242class self_return_converter(CReturnConverter):
243 type = 'PyHKEYObject *'
244
245 def render(self, function, data):
246 self.declare(data)
247 data.return_conversion.append(
248 'return_value = (PyObject *)_return_value;\n')
249[python start generated code]*/
250/*[python end generated code: output=da39a3ee5e6b4b0d input=22f7aedc6d68e80e]*/
251
252#include "clinic/winreg.c.h"
253
254/************************************************************************
255
256 The PyHKEY object methods
257
258************************************************************************/
259/*[clinic input]
260winreg.HKEYType.Close
261
262Closes the underlying Windows handle.
263
264If the handle is already closed, no error is raised.
265[clinic start generated code]*/
266
267static PyObject *
268winreg_HKEYType_Close_impl(PyHKEYObject *self)
269/*[clinic end generated code: output=fced3a624fb0c344 input=6786ac75f6b89de6]*/
270{
271 if (!PyHKEY_Close((PyObject *)self))
272 return NULL;
273 Py_RETURN_NONE;
274}
275
276/*[clinic input]
277winreg.HKEYType.Detach
278
279Detaches the Windows handle from the handle object.
280
281The result is the value of the handle before it is detached. If the
282handle is already detached, this will return zero.
283
284After calling this function, the handle is effectively invalidated,
285but the handle is not closed. You would call this function when you
286need the underlying win32 handle to exist beyond the lifetime of the
287handle object.
288[clinic start generated code]*/
289
290static PyObject *
291winreg_HKEYType_Detach_impl(PyHKEYObject *self)
292/*[clinic end generated code: output=dda5a9e1a01ae78f input=dd2cc09e6c6ba833]*/
293{
294 void* ret;
295 ret = (void*)self->hkey;
296 self->hkey = 0;
297 return PyLong_FromVoidPtr(ret);
298}
299
300/*[clinic input]
301winreg.HKEYType.__enter__ -> self
302[clinic start generated code]*/
303
304static PyHKEYObject *
305winreg_HKEYType___enter___impl(PyHKEYObject *self)
306/*[clinic end generated code: output=52c34986dab28990 input=c40fab1f0690a8e2]*/
307{
308 Py_XINCREF(self);
309 return self;
310}
311
312
313/*[clinic input]
314winreg.HKEYType.__exit__
315
316 exc_type: object
317 exc_value: object
318 traceback: object
319[clinic start generated code]*/
320
321static PyObject *
Zachary Ware77772c02015-05-13 10:58:35 -0500322winreg_HKEYType___exit___impl(PyHKEYObject *self, PyObject *exc_type,
323 PyObject *exc_value, PyObject *traceback)
324/*[clinic end generated code: output=923ebe7389e6a263 input=fb32489ee92403c7]*/
Zachary Warefd2d4822015-05-13 01:21:57 -0500325{
326 if (!PyHKEY_Close((PyObject *)self))
327 return NULL;
328 Py_RETURN_NONE;
329}
330
331/*[clinic input]
332[clinic start generated code]*/
333/*[clinic end generated code: output=da39a3ee5e6b4b0d input=da39a3ee5e6b4b0d]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000334
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000335static struct PyMethodDef PyHKEY_methods[] = {
Zachary Warefd2d4822015-05-13 01:21:57 -0500336 WINREG_HKEYTYPE_CLOSE_METHODDEF
337 WINREG_HKEYTYPE_DETACH_METHODDEF
338 WINREG_HKEYTYPE___ENTER___METHODDEF
339 WINREG_HKEYTYPE___EXIT___METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 {NULL}
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000341};
342
343#define OFF(e) offsetof(PyHKEYObject, e)
344static PyMemberDef PyHKEY_memberlist[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 {"handle", T_INT, OFF(hkey), READONLY},
346 {NULL} /* Sentinel */
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000347};
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000348
349/* The type itself */
350PyTypeObject PyHKEY_Type =
351{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 PyVarObject_HEAD_INIT(0, 0) /* fill in type at module init */
353 "PyHKEY",
354 sizeof(PyHKEYObject),
355 0,
356 PyHKEY_deallocFunc, /* tp_dealloc */
357 0, /* tp_print */
358 0, /* tp_getattr */
359 0, /* tp_setattr */
360 0, /* tp_reserved */
361 0, /* tp_repr */
362 &PyHKEY_NumberMethods, /* tp_as_number */
363 0, /* tp_as_sequence */
364 0, /* tp_as_mapping */
365 PyHKEY_hashFunc, /* tp_hash */
366 0, /* tp_call */
367 PyHKEY_strFunc, /* tp_str */
368 0, /* tp_getattro */
369 0, /* tp_setattro */
370 0, /* tp_as_buffer */
371 0, /* tp_flags */
372 PyHKEY_doc, /* tp_doc */
373 0, /*tp_traverse*/
374 0, /*tp_clear*/
375 0, /*tp_richcompare*/
376 0, /*tp_weaklistoffset*/
377 0, /*tp_iter*/
378 0, /*tp_iternext*/
379 PyHKEY_methods, /*tp_methods*/
380 PyHKEY_memberlist, /*tp_members*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000381};
382
383/************************************************************************
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000384 The public PyHKEY API (well, not public yet :-)
385************************************************************************/
386PyObject *
387PyHKEY_New(HKEY hInit)
388{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000389 PyHKEYObject *key = PyObject_NEW(PyHKEYObject, &PyHKEY_Type);
390 if (key)
391 key->hkey = hInit;
392 return (PyObject *)key;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000393}
394
395BOOL
396PyHKEY_Close(PyObject *ob_handle)
397{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 LONG rc;
399 PyHKEYObject *key;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000401 if (!PyHKEY_Check(ob_handle)) {
402 PyErr_SetString(PyExc_TypeError, "bad operand type");
403 return FALSE;
404 }
405 key = (PyHKEYObject *)ob_handle;
406 rc = key->hkey ? RegCloseKey((HKEY)key->hkey) : ERROR_SUCCESS;
407 key->hkey = 0;
408 if (rc != ERROR_SUCCESS)
409 PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
410 return rc == ERROR_SUCCESS;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000411}
412
413BOOL
414PyHKEY_AsHKEY(PyObject *ob, HKEY *pHANDLE, BOOL bNoneOK)
415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 if (ob == Py_None) {
417 if (!bNoneOK) {
418 PyErr_SetString(
419 PyExc_TypeError,
420 "None is not a valid HKEY in this context");
421 return FALSE;
422 }
423 *pHANDLE = (HKEY)0;
424 }
425 else if (PyHKEY_Check(ob)) {
426 PyHKEYObject *pH = (PyHKEYObject *)ob;
427 *pHANDLE = pH->hkey;
428 }
429 else if (PyLong_Check(ob)) {
430 /* We also support integers */
431 PyErr_Clear();
432 *pHANDLE = (HKEY)PyLong_AsVoidPtr(ob);
433 if (PyErr_Occurred())
434 return FALSE;
435 }
436 else {
437 PyErr_SetString(
438 PyExc_TypeError,
439 "The object is not a PyHKEY object");
440 return FALSE;
441 }
442 return TRUE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000443}
444
Zachary Warefd2d4822015-05-13 01:21:57 -0500445BOOL
446clinic_HKEY_converter(PyObject *ob, void *p)
447{
448 if (!PyHKEY_AsHKEY(ob, (HKEY *)p, FALSE))
449 return FALSE;
450 return TRUE;
451}
452
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000453PyObject *
454PyHKEY_FromHKEY(HKEY h)
455{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 PyHKEYObject *op;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 /* Inline PyObject_New */
459 op = (PyHKEYObject *) PyObject_MALLOC(sizeof(PyHKEYObject));
460 if (op == NULL)
461 return PyErr_NoMemory();
462 PyObject_INIT(op, &PyHKEY_Type);
463 op->hkey = h;
464 return (PyObject *)op;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000465}
466
467
468/************************************************************************
469 The module methods
470************************************************************************/
471BOOL
472PyWinObject_CloseHKEY(PyObject *obHandle)
473{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 BOOL ok;
475 if (PyHKEY_Check(obHandle)) {
476 ok = PyHKEY_Close(obHandle);
477 }
Fred Drake25e17262000-06-30 17:48:51 +0000478#if SIZEOF_LONG >= SIZEOF_HKEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 else if (PyLong_Check(obHandle)) {
480 long rc = RegCloseKey((HKEY)PyLong_AsLong(obHandle));
481 ok = (rc == ERROR_SUCCESS);
482 if (!ok)
483 PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
484 }
Fred Drake25e17262000-06-30 17:48:51 +0000485#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 else if (PyLong_Check(obHandle)) {
487 long rc = RegCloseKey((HKEY)PyLong_AsVoidPtr(obHandle));
488 ok = (rc == ERROR_SUCCESS);
489 if (!ok)
490 PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
491 }
Fred Drake25e17262000-06-30 17:48:51 +0000492#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 else {
494 PyErr_SetString(
495 PyExc_TypeError,
496 "A handle must be a HKEY object or an integer");
497 return FALSE;
498 }
499 return ok;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000500}
501
502
503/*
504 Private Helper functions for the registry interfaces
505
506** Note that fixupMultiSZ and countString have both had changes
507** made to support "incorrect strings". The registry specification
508** calls for strings to be terminated with 2 null bytes. It seems
Thomas Wouters7e474022000-07-16 12:04:32 +0000509** some commercial packages install strings which dont conform,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000510** causing this code to fail - however, "regedit" etc still work
511** with these strings (ie only we dont!).
512*/
513static void
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000514fixupMultiSZ(wchar_t **str, wchar_t *data, int len)
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000515{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 wchar_t *P;
517 int i;
518 wchar_t *Q;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000520 Q = data + len;
521 for (P = data, i = 0; P < Q && *P != '\0'; P++, i++) {
522 str[i] = P;
523 for(; *P != '\0'; P++)
524 ;
525 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000526}
527
528static int
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000529countStrings(wchar_t *data, int len)
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000530{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 int strings;
532 wchar_t *P;
533 wchar_t *Q = data + len;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 for (P = data, strings = 0; P < Q && *P != '\0'; P++, strings++)
536 for (; P < Q && *P != '\0'; P++)
537 ;
538 return strings;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000539}
540
541/* Convert PyObject into Registry data.
542 Allocates space as needed. */
543static BOOL
544Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 Py_ssize_t i,j;
547 switch (typ) {
548 case REG_DWORD:
549 if (value != Py_None && !PyLong_Check(value))
550 return FALSE;
551 *retDataBuf = (BYTE *)PyMem_NEW(DWORD, 1);
Steve Dower4d4bc422016-05-25 11:26:07 -0700552 if (*retDataBuf == NULL){
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 PyErr_NoMemory();
554 return FALSE;
555 }
556 *retDataSize = sizeof(DWORD);
557 if (value == Py_None) {
558 DWORD zero = 0;
559 memcpy(*retDataBuf, &zero, sizeof(DWORD));
560 }
561 else {
Brian Curtin12706f22012-12-27 10:12:45 -0600562 DWORD d = PyLong_AsUnsignedLong(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 memcpy(*retDataBuf, &d, sizeof(DWORD));
564 }
565 break;
Steve Dower80ac11d2016-05-24 15:42:04 -0700566 case REG_QWORD:
567 if (value != Py_None && !PyLong_Check(value))
568 return FALSE;
569 *retDataBuf = (BYTE *)PyMem_NEW(DWORD64, 1);
Steve Dower4d4bc422016-05-25 11:26:07 -0700570 if (*retDataBuf == NULL){
Steve Dower80ac11d2016-05-24 15:42:04 -0700571 PyErr_NoMemory();
572 return FALSE;
573 }
574 *retDataSize = sizeof(DWORD64);
575 if (value == Py_None) {
576 DWORD64 zero = 0;
577 memcpy(*retDataBuf, &zero, sizeof(DWORD64));
578 }
579 else {
580 DWORD64 d = PyLong_AsUnsignedLongLong(value);
581 memcpy(*retDataBuf, &d, sizeof(DWORD64));
582 }
583 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 case REG_SZ:
585 case REG_EXPAND_SZ:
586 {
Victor Stinnerbe492442011-11-21 12:43:50 +0100587 if (value != Py_None) {
588 Py_ssize_t len;
589 if (!PyUnicode_Check(value))
590 return FALSE;
591 *retDataBuf = (BYTE*)PyUnicode_AsWideCharString(value, &len);
592 if (*retDataBuf == NULL)
593 return FALSE;
594 *retDataSize = Py_SAFE_DOWNCAST(
595 (len + 1) * sizeof(wchar_t),
596 Py_ssize_t, DWORD);
597 }
598 else {
599 *retDataBuf = (BYTE *)PyMem_NEW(wchar_t, 1);
600 if (*retDataBuf == NULL) {
601 PyErr_NoMemory();
602 return FALSE;
603 }
604 ((wchar_t *)*retDataBuf)[0] = L'\0';
605 *retDataSize = 1 * sizeof(wchar_t);
606 }
607 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 }
609 case REG_MULTI_SZ:
610 {
611 DWORD size = 0;
612 wchar_t *P;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 if (value == Py_None)
615 i = 0;
616 else {
617 if (!PyList_Check(value))
618 return FALSE;
619 i = PyList_Size(value);
620 }
621 for (j = 0; j < i; j++)
622 {
623 PyObject *t;
Victor Stinnerbe492442011-11-21 12:43:50 +0100624 wchar_t *wstr;
625 Py_ssize_t len;
626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 t = PyList_GET_ITEM(value, j);
628 if (!PyUnicode_Check(t))
629 return FALSE;
Victor Stinnerbe492442011-11-21 12:43:50 +0100630 wstr = PyUnicode_AsUnicodeAndSize(t, &len);
631 if (wstr == NULL)
632 return FALSE;
633 size += Py_SAFE_DOWNCAST((len + 1) * sizeof(wchar_t),
Brian Curtinabb33512010-08-17 20:08:40 +0000634 size_t, DWORD);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 *retDataSize = size + 2;
638 *retDataBuf = (BYTE *)PyMem_NEW(char,
639 *retDataSize);
Steve Dower4d4bc422016-05-25 11:26:07 -0700640 if (*retDataBuf == NULL){
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 PyErr_NoMemory();
642 return FALSE;
643 }
644 P = (wchar_t *)*retDataBuf;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 for (j = 0; j < i; j++)
647 {
648 PyObject *t;
Victor Stinnerbe492442011-11-21 12:43:50 +0100649 wchar_t *wstr;
650 Py_ssize_t len;
651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 t = PyList_GET_ITEM(value, j);
Victor Stinnerbe492442011-11-21 12:43:50 +0100653 wstr = PyUnicode_AsUnicodeAndSize(t, &len);
654 if (wstr == NULL)
655 return FALSE;
656 wcscpy(P, wstr);
657 P += (len + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 }
659 /* And doubly-terminate the list... */
660 *P = '\0';
661 break;
662 }
663 case REG_BINARY:
664 /* ALSO handle ALL unknown data types here. Even if we can't
665 support it natively, we should handle the bits. */
666 default:
Zachary Waread4690f2014-07-03 10:58:06 -0500667 if (value == Py_None) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 *retDataSize = 0;
Zachary Waread4690f2014-07-03 10:58:06 -0500669 *retDataBuf = NULL;
670 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 else {
672 Py_buffer view;
Neal Norwitz1385b892007-08-26 23:07:13 +0000673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 if (!PyObject_CheckBuffer(value)) {
675 PyErr_Format(PyExc_TypeError,
676 "Objects of type '%s' can not "
677 "be used as binary registry values",
678 value->ob_type->tp_name);
679 return FALSE;
680 }
Neal Norwitz1385b892007-08-26 23:07:13 +0000681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 if (PyObject_GetBuffer(value, &view, PyBUF_SIMPLE) < 0)
683 return FALSE;
Neal Norwitz1385b892007-08-26 23:07:13 +0000684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 *retDataBuf = (BYTE *)PyMem_NEW(char, view.len);
Steve Dower4d4bc422016-05-25 11:26:07 -0700686 if (*retDataBuf == NULL){
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 PyBuffer_Release(&view);
688 PyErr_NoMemory();
689 return FALSE;
690 }
Brian Curtinabb33512010-08-17 20:08:40 +0000691 *retDataSize = Py_SAFE_DOWNCAST(view.len, Py_ssize_t, DWORD);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 memcpy(*retDataBuf, view.buf, view.len);
693 PyBuffer_Release(&view);
694 }
695 break;
696 }
697 return TRUE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000698}
699
700/* Convert Registry data into PyObject*/
701static PyObject *
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000702Reg2Py(BYTE *retDataBuf, DWORD retDataSize, DWORD typ)
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000703{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 PyObject *obData;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 switch (typ) {
707 case REG_DWORD:
708 if (retDataSize == 0)
Brian Curtin172e4222012-12-27 14:04:42 -0600709 obData = PyLong_FromUnsignedLong(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 else
Steve Dower80ac11d2016-05-24 15:42:04 -0700711 obData = PyLong_FromUnsignedLong(*(DWORD *)retDataBuf);
712 break;
713 case REG_QWORD:
714 if (retDataSize == 0)
715 obData = PyLong_FromUnsignedLongLong(0);
716 else
717 obData = PyLong_FromUnsignedLongLong(*(DWORD64 *)retDataBuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 break;
719 case REG_SZ:
720 case REG_EXPAND_SZ:
721 {
Steve Dower40fa2662016-12-17 13:30:27 -0800722 /* REG_SZ should be a NUL terminated string, but only by
723 * convention. The buffer may have been saved without a NUL
724 * or with embedded NULs. To be consistent with reg.exe and
725 * regedit.exe, consume only up to the first NUL. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 wchar_t *data = (wchar_t *)retDataBuf;
Steve Dower40fa2662016-12-17 13:30:27 -0800727 size_t len = wcsnlen(data, retDataSize / sizeof(wchar_t));
728 obData = PyUnicode_FromWideChar(data, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 break;
730 }
731 case REG_MULTI_SZ:
732 if (retDataSize == 0)
733 obData = PyList_New(0);
734 else
735 {
736 int index = 0;
737 wchar_t *data = (wchar_t *)retDataBuf;
738 int len = retDataSize / 2;
739 int s = countStrings(data, len);
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +0200740 wchar_t **str = PyMem_New(wchar_t *, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 if (str == NULL)
742 return PyErr_NoMemory();
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 fixupMultiSZ(str, data, len);
745 obData = PyList_New(s);
Jesus Cea782c4cf2014-03-13 17:35:32 +0100746 if (obData == NULL) {
Victor Stinner9cb1ec52014-03-13 19:08:10 +0100747 PyMem_Free(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000748 return NULL;
Jesus Cea782c4cf2014-03-13 17:35:32 +0100749 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 for (index = 0; index < s; index++)
751 {
752 size_t len = wcslen(str[index]);
753 if (len > INT_MAX) {
754 PyErr_SetString(PyExc_OverflowError,
755 "registry string is too long for a Python string");
756 Py_DECREF(obData);
Victor Stinner9cb1ec52014-03-13 19:08:10 +0100757 PyMem_Free(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 return NULL;
759 }
760 PyList_SetItem(obData,
761 index,
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200762 PyUnicode_FromWideChar(str[index], len));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 }
Victor Stinnerb6404912013-07-07 16:21:41 +0200764 PyMem_Free(str);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 break;
767 }
768 case REG_BINARY:
769 /* ALSO handle ALL unknown data types here. Even if we can't
770 support it natively, we should handle the bits. */
771 default:
772 if (retDataSize == 0) {
773 Py_INCREF(Py_None);
774 obData = Py_None;
775 }
776 else
777 obData = PyBytes_FromStringAndSize(
778 (char *)retDataBuf, retDataSize);
779 break;
780 }
781 return obData;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000782}
783
784/* The Python methods */
785
Zachary Warefd2d4822015-05-13 01:21:57 -0500786/*[clinic input]
787winreg.CloseKey
788
789 hkey: object
790 A previously opened key.
791 /
792
793Closes a previously opened registry key.
794
795Note that if the key is not closed using this method, it will be
796closed when the hkey object is destroyed by Python.
797[clinic start generated code]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000798
799static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300800winreg_CloseKey(PyObject *module, PyObject *hkey)
801/*[clinic end generated code: output=a4fa537019a80d15 input=5b1aac65ba5127ad]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000802{
Zachary Warefd2d4822015-05-13 01:21:57 -0500803 if (!PyHKEY_Close(hkey))
804 return NULL;
805 Py_RETURN_NONE;
806}
807
808/*[clinic input]
809winreg.ConnectRegistry -> HKEY
810
Zachary Ware77772c02015-05-13 10:58:35 -0500811 computer_name: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -0500812 The name of the remote computer, of the form r"\\computername". If
813 None, the local computer is used.
814 key: HKEY
815 The predefined key to connect to.
816 /
817
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300818Establishes a connection to the registry on another computer.
Zachary Warefd2d4822015-05-13 01:21:57 -0500819
820The return value is the handle of the opened key.
821If the function fails, an OSError exception is raised.
822[clinic start generated code]*/
823
824static HKEY
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300825winreg_ConnectRegistry_impl(PyObject *module, Py_UNICODE *computer_name,
Zachary Ware77772c02015-05-13 10:58:35 -0500826 HKEY key)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300827/*[clinic end generated code: output=5ab79d02aa3167b4 input=5f98a891a347e68e]*/
Zachary Warefd2d4822015-05-13 01:21:57 -0500828{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 HKEY retKey;
830 long rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -0500832 rc = RegConnectRegistryW(computer_name, key, &retKey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 Py_END_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -0500834 if (rc != ERROR_SUCCESS) {
835 PyErr_SetFromWindowsErrWithFunction(rc, "ConnectRegistry");
836 return NULL;
837 }
838 return retKey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000839}
840
Zachary Warefd2d4822015-05-13 01:21:57 -0500841/*[clinic input]
842winreg.CreateKey -> HKEY
843
844 key: HKEY
845 An already open key, or one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -0500846 sub_key: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -0500847 The name of the key this method opens or creates.
848 /
849
850Creates or opens the specified key.
851
852If key is one of the predefined keys, sub_key may be None. In that case,
853the handle returned is the same key handle passed in to the function.
854
855If the key already exists, this function opens the existing key.
856
857The return value is the handle of the opened key.
858If the function fails, an OSError exception is raised.
859[clinic start generated code]*/
860
861static HKEY
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300862winreg_CreateKey_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key)
863/*[clinic end generated code: output=9c81d4095527c927 input=3cdd1622488acea2]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000864{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 HKEY retKey;
866 long rc;
Zachary Warefd2d4822015-05-13 01:21:57 -0500867
868 rc = RegCreateKeyW(key, sub_key, &retKey);
869 if (rc != ERROR_SUCCESS) {
870 PyErr_SetFromWindowsErrWithFunction(rc, "CreateKey");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 return NULL;
Zachary Warefd2d4822015-05-13 01:21:57 -0500872 }
873 return retKey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000874}
875
Zachary Warefd2d4822015-05-13 01:21:57 -0500876/*[clinic input]
877winreg.CreateKeyEx -> HKEY
878
879 key: HKEY
880 An already open key, or one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -0500881 sub_key: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -0500882 The name of the key this method opens or creates.
883 reserved: int = 0
884 A reserved integer, and must be zero. Default is zero.
885 access: REGSAM(c_default='KEY_WRITE') = winreg.KEY_WRITE
886 An integer that specifies an access mask that describes the
887 desired security access for the key. Default is KEY_WRITE.
888
889Creates or opens the specified key.
890
891If key is one of the predefined keys, sub_key may be None. In that case,
892the handle returned is the same key handle passed in to the function.
893
894If the key already exists, this function opens the existing key
895
896The return value is the handle of the opened key.
897If the function fails, an OSError exception is raised.
898[clinic start generated code]*/
899
900static HKEY
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300901winreg_CreateKeyEx_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
Zachary Ware77772c02015-05-13 10:58:35 -0500902 int reserved, REGSAM access)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300903/*[clinic end generated code: output=b9fce6dc5c4e39b1 input=42c2b03f98406b66]*/
Brian Curtin3035c392010-04-21 23:56:21 +0000904{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 HKEY retKey;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 long rc;
Brian Curtin1771b542010-09-27 17:56:36 +0000907
Zachary Warefd2d4822015-05-13 01:21:57 -0500908 rc = RegCreateKeyExW(key, sub_key, reserved, NULL, (DWORD)NULL,
Brian Curtin1771b542010-09-27 17:56:36 +0000909 access, NULL, &retKey, NULL);
Zachary Warefd2d4822015-05-13 01:21:57 -0500910 if (rc != ERROR_SUCCESS) {
911 PyErr_SetFromWindowsErrWithFunction(rc, "CreateKeyEx");
912 return NULL;
913 }
914 return retKey;
Brian Curtin3035c392010-04-21 23:56:21 +0000915}
916
Zachary Warefd2d4822015-05-13 01:21:57 -0500917/*[clinic input]
918winreg.DeleteKey
919 key: HKEY
920 An already open key, or any one of the predefined HKEY_* constants.
921 sub_key: Py_UNICODE
922 A string that must be the name of a subkey of the key identified by
923 the key parameter. This value must not be None, and the key may not
924 have subkeys.
925 /
926
927Deletes the specified key.
928
929This method can not delete keys with subkeys.
930
931If the function succeeds, the entire key, including all of its values,
932is removed. If the function fails, an OSError exception is raised.
933[clinic start generated code]*/
934
Brian Curtin3035c392010-04-21 23:56:21 +0000935static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300936winreg_DeleteKey_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key)
937/*[clinic end generated code: output=7734b1e431991ae4 input=b31d225b935e4211]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000938{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 long rc;
Zachary Warefd2d4822015-05-13 01:21:57 -0500940 rc = RegDeleteKeyW(key, sub_key );
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 if (rc != ERROR_SUCCESS)
942 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKey");
Zachary Warefd2d4822015-05-13 01:21:57 -0500943 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000944}
945
Zachary Warefd2d4822015-05-13 01:21:57 -0500946/*[clinic input]
947winreg.DeleteKeyEx
948
949 key: HKEY
950 An already open key, or any one of the predefined HKEY_* constants.
951 sub_key: Py_UNICODE
952 A string that must be the name of a subkey of the key identified by
953 the key parameter. This value must not be None, and the key may not
954 have subkeys.
955 access: REGSAM(c_default='KEY_WOW64_64KEY') = winreg.KEY_WOW64_64KEY
956 An integer that specifies an access mask that describes the
957 desired security access for the key. Default is KEY_WOW64_64KEY.
958 reserved: int = 0
959 A reserved integer, and must be zero. Default is zero.
960
961Deletes the specified key (64-bit OS only).
962
963This method can not delete keys with subkeys.
964
965If the function succeeds, the entire key, including all of its values,
966is removed. If the function fails, an OSError exception is raised.
967On unsupported Windows versions, NotImplementedError is raised.
968[clinic start generated code]*/
969
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000970static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300971winreg_DeleteKeyEx_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
Zachary Ware77772c02015-05-13 10:58:35 -0500972 REGSAM access, int reserved)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300973/*[clinic end generated code: output=01378d86ad3eb936 input=711d9d89e7ecbed7]*/
Brian Curtin3035c392010-04-21 23:56:21 +0000974{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 HMODULE hMod;
976 typedef LONG (WINAPI *RDKEFunc)(HKEY, const wchar_t*, REGSAM, int);
977 RDKEFunc pfn = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 long rc;
Brian Curtin3035c392010-04-21 23:56:21 +0000979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 /* Only available on 64bit platforms, so we must load it
981 dynamically. */
Martin v. Löwis50590f12012-01-14 17:54:09 +0100982 hMod = GetModuleHandleW(L"advapi32.dll");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 if (hMod)
984 pfn = (RDKEFunc)GetProcAddress(hMod,
985 "RegDeleteKeyExW");
986 if (!pfn) {
987 PyErr_SetString(PyExc_NotImplementedError,
988 "not implemented on this platform");
989 return NULL;
990 }
991 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -0500992 rc = (*pfn)(key, sub_key, access, reserved);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 Py_END_ALLOW_THREADS
Brian Curtin3035c392010-04-21 23:56:21 +0000994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 if (rc != ERROR_SUCCESS)
996 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKeyEx");
Zachary Warefd2d4822015-05-13 01:21:57 -0500997 Py_RETURN_NONE;
Brian Curtin3035c392010-04-21 23:56:21 +0000998}
999
Zachary Warefd2d4822015-05-13 01:21:57 -05001000/*[clinic input]
1001winreg.DeleteValue
1002
1003 key: HKEY
1004 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001005 value: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001006 A string that identifies the value to remove.
1007 /
1008
1009Removes a named value from a registry key.
1010[clinic start generated code]*/
1011
Brian Curtin3035c392010-04-21 23:56:21 +00001012static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001013winreg_DeleteValue_impl(PyObject *module, HKEY key, Py_UNICODE *value)
1014/*[clinic end generated code: output=67e7e9a514f84951 input=a78d3407a4197b21]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001015{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 long rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001018 rc = RegDeleteValueW(key, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 Py_END_ALLOW_THREADS
1020 if (rc !=ERROR_SUCCESS)
1021 return PyErr_SetFromWindowsErrWithFunction(rc,
1022 "RegDeleteValue");
Zachary Warefd2d4822015-05-13 01:21:57 -05001023 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001024}
1025
Zachary Warefd2d4822015-05-13 01:21:57 -05001026/*[clinic input]
1027winreg.EnumKey
1028
1029 key: HKEY
1030 An already open key, or any one of the predefined HKEY_* constants.
1031 index: int
1032 An integer that identifies the index of the key to retrieve.
1033 /
1034
1035Enumerates subkeys of an open registry key.
1036
1037The function retrieves the name of one subkey each time it is called.
1038It is typically called repeatedly until an OSError exception is
1039raised, indicating no more values are available.
1040[clinic start generated code]*/
1041
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001042static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001043winreg_EnumKey_impl(PyObject *module, HKEY key, int index)
1044/*[clinic end generated code: output=25a6ec52cd147bc4 input=fad9a7c00ab0e04b]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001045{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 long rc;
1047 PyObject *retStr;
Brian Curtin60853212010-05-26 17:43:50 +00001048
1049 /* The Windows docs claim that the max key name length is 255
1050 * characters, plus a terminating nul character. However,
1051 * empirical testing demonstrates that it is possible to
1052 * create a 256 character key that is missing the terminating
1053 * nul. RegEnumKeyEx requires a 257 character buffer to
1054 * retrieve such a key name. */
1055 wchar_t tmpbuf[257];
Kristján Valur Jónsson984dfa72012-04-02 15:23:29 +00001056 DWORD len = sizeof(tmpbuf)/sizeof(wchar_t); /* includes NULL terminator */
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001059 rc = RegEnumKeyExW(key, index, tmpbuf, &len, NULL, NULL, NULL, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 Py_END_ALLOW_THREADS
1061 if (rc != ERROR_SUCCESS)
1062 return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKeyEx");
Tim Peters313fcd42006-02-19 04:05:39 +00001063
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001064 retStr = PyUnicode_FromWideChar(tmpbuf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 return retStr; /* can be NULL */
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001066}
1067
Zachary Warefd2d4822015-05-13 01:21:57 -05001068/*[clinic input]
1069winreg.EnumValue
1070
1071 key: HKEY
1072 An already open key, or any one of the predefined HKEY_* constants.
1073 index: int
1074 An integer that identifies the index of the value to retrieve.
1075 /
1076
1077Enumerates values of an open registry key.
1078
1079The function retrieves the name of one subkey each time it is called.
1080It is typically called repeatedly, until an OSError exception
1081is raised, indicating no more values.
1082
1083The result is a tuple of 3 items:
1084 value_name
1085 A string that identifies the value.
1086 value_data
1087 An object that holds the value data, and whose type depends
1088 on the underlying registry type.
1089 data_type
1090 An integer that identifies the type of the value data.
1091[clinic start generated code]*/
1092
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001093static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001094winreg_EnumValue_impl(PyObject *module, HKEY key, int index)
1095/*[clinic end generated code: output=d363b5a06f8789ac input=4414f47a6fb238b5]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 long rc;
1098 wchar_t *retValueBuf;
Amaury Forgeot d'Arcf2b69df2010-08-16 22:11:29 +00001099 BYTE *tmpBuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 BYTE *retDataBuf;
Brian Curtin60853212010-05-26 17:43:50 +00001101 DWORD retValueSize, bufValueSize;
1102 DWORD retDataSize, bufDataSize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 DWORD typ;
1104 PyObject *obData;
1105 PyObject *retVal;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001106
Zachary Warefd2d4822015-05-13 01:21:57 -05001107 if ((rc = RegQueryInfoKeyW(key, NULL, NULL, NULL, NULL, NULL, NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 NULL,
1109 &retValueSize, &retDataSize, NULL, NULL))
1110 != ERROR_SUCCESS)
1111 return PyErr_SetFromWindowsErrWithFunction(rc,
1112 "RegQueryInfoKey");
1113 ++retValueSize; /* include null terminators */
1114 ++retDataSize;
Brian Curtin60853212010-05-26 17:43:50 +00001115 bufDataSize = retDataSize;
1116 bufValueSize = retValueSize;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001117 retValueBuf = PyMem_New(wchar_t, retValueSize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 if (retValueBuf == NULL)
1119 return PyErr_NoMemory();
1120 retDataBuf = (BYTE *)PyMem_Malloc(retDataSize);
1121 if (retDataBuf == NULL) {
1122 PyMem_Free(retValueBuf);
1123 return PyErr_NoMemory();
1124 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001125
Brian Curtin60853212010-05-26 17:43:50 +00001126 while (1) {
Brian Curtin60853212010-05-26 17:43:50 +00001127 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001128 rc = RegEnumValueW(key,
Brian Curtin60853212010-05-26 17:43:50 +00001129 index,
1130 retValueBuf,
1131 &retValueSize,
1132 NULL,
1133 &typ,
1134 (BYTE *)retDataBuf,
1135 &retDataSize);
1136 Py_END_ALLOW_THREADS
1137
1138 if (rc != ERROR_MORE_DATA)
1139 break;
1140
1141 bufDataSize *= 2;
Amaury Forgeot d'Arcf2b69df2010-08-16 22:11:29 +00001142 tmpBuf = (BYTE *)PyMem_Realloc(retDataBuf, bufDataSize);
Brian Curtin9b7e2d12010-06-08 20:57:52 +00001143 if (tmpBuf == NULL) {
Brian Curtin60853212010-05-26 17:43:50 +00001144 PyErr_NoMemory();
1145 retVal = NULL;
1146 goto fail;
1147 }
Brian Curtin9b7e2d12010-06-08 20:57:52 +00001148 retDataBuf = tmpBuf;
Brian Curtin60853212010-05-26 17:43:50 +00001149 retDataSize = bufDataSize;
1150 retValueSize = bufValueSize;
1151 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 if (rc != ERROR_SUCCESS) {
1154 retVal = PyErr_SetFromWindowsErrWithFunction(rc,
1155 "PyRegEnumValue");
1156 goto fail;
1157 }
1158 obData = Reg2Py(retDataBuf, retDataSize, typ);
1159 if (obData == NULL) {
1160 retVal = NULL;
1161 goto fail;
1162 }
1163 retVal = Py_BuildValue("uOi", retValueBuf, obData, typ);
1164 Py_DECREF(obData);
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001165 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 PyMem_Free(retValueBuf);
1167 PyMem_Free(retDataBuf);
1168 return retVal;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001169}
1170
Zachary Warefd2d4822015-05-13 01:21:57 -05001171/*[clinic input]
1172winreg.ExpandEnvironmentStrings
1173
1174 string: Py_UNICODE
1175 /
1176
1177Expand environment vars.
1178[clinic start generated code]*/
1179
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001180static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001181winreg_ExpandEnvironmentStrings_impl(PyObject *module, Py_UNICODE *string)
1182/*[clinic end generated code: output=cba46ac293a8af1a input=b2a9714d2b751aa6]*/
Christian Heimes2380ac72008-01-09 00:17:24 +00001183{
Victor Stinner9d3b93b2011-11-22 02:27:30 +01001184 wchar_t *retValue = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 DWORD retValueSize;
1186 DWORD rc;
1187 PyObject *o;
Christian Heimes2380ac72008-01-09 00:17:24 +00001188
Zachary Warefd2d4822015-05-13 01:21:57 -05001189 retValueSize = ExpandEnvironmentStringsW(string, retValue, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 if (retValueSize == 0) {
1191 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1192 "ExpandEnvironmentStrings");
1193 }
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001194 retValue = PyMem_New(wchar_t, retValueSize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 if (retValue == NULL) {
1196 return PyErr_NoMemory();
1197 }
Christian Heimes2380ac72008-01-09 00:17:24 +00001198
Zachary Warefd2d4822015-05-13 01:21:57 -05001199 rc = ExpandEnvironmentStringsW(string, retValue, retValueSize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 if (rc == 0) {
1201 PyMem_Free(retValue);
1202 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1203 "ExpandEnvironmentStrings");
1204 }
Victor Stinner9d3b93b2011-11-22 02:27:30 +01001205 o = PyUnicode_FromWideChar(retValue, wcslen(retValue));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 PyMem_Free(retValue);
1207 return o;
Christian Heimes2380ac72008-01-09 00:17:24 +00001208}
1209
Zachary Warefd2d4822015-05-13 01:21:57 -05001210/*[clinic input]
1211winreg.FlushKey
1212
1213 key: HKEY
1214 An already open key, or any one of the predefined HKEY_* constants.
1215 /
1216
1217Writes all the attributes of a key to the registry.
1218
1219It is not necessary to call FlushKey to change a key. Registry changes
1220are flushed to disk by the registry using its lazy flusher. Registry
1221changes are also flushed to disk at system shutdown. Unlike
1222CloseKey(), the FlushKey() method returns only when all the data has
1223been written to the registry.
1224
1225An application should only call FlushKey() if it requires absolute
1226certainty that registry changes are on disk. If you don't know whether
1227a FlushKey() call is required, it probably isn't.
1228[clinic start generated code]*/
1229
Christian Heimes2380ac72008-01-09 00:17:24 +00001230static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001231winreg_FlushKey_impl(PyObject *module, HKEY key)
1232/*[clinic end generated code: output=e6fc230d4c5dc049 input=f57457c12297d82f]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 long rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001236 rc = RegFlushKey(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 Py_END_ALLOW_THREADS
1238 if (rc != ERROR_SUCCESS)
1239 return PyErr_SetFromWindowsErrWithFunction(rc, "RegFlushKey");
Zachary Warefd2d4822015-05-13 01:21:57 -05001240 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001241}
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001242
Zachary Warefd2d4822015-05-13 01:21:57 -05001243
1244/*[clinic input]
1245winreg.LoadKey
1246
1247 key: HKEY
1248 An already open key, or any one of the predefined HKEY_* constants.
1249 sub_key: Py_UNICODE
1250 A string that identifies the sub-key to load.
1251 file_name: Py_UNICODE
1252 The name of the file to load registry data from. This file must
1253 have been created with the SaveKey() function. Under the file
1254 allocation table (FAT) file system, the filename may not have an
1255 extension.
1256 /
1257
1258Insert data into the registry from a file.
1259
1260Creates a subkey under the specified key and stores registration
1261information from a specified file into that subkey.
1262
1263A call to LoadKey() fails if the calling process does not have the
1264SE_RESTORE_PRIVILEGE privilege.
1265
1266If key is a handle returned by ConnectRegistry(), then the path
1267specified in fileName is relative to the remote computer.
1268
1269The MSDN docs imply key must be in the HKEY_USER or HKEY_LOCAL_MACHINE
1270tree.
1271[clinic start generated code]*/
1272
1273static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001274winreg_LoadKey_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
Zachary Ware77772c02015-05-13 10:58:35 -05001275 Py_UNICODE *file_name)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001276/*[clinic end generated code: output=87344005c5905cde input=e3b5b45ade311582]*/
Zachary Warefd2d4822015-05-13 01:21:57 -05001277{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 long rc;
Zachary Warefd2d4822015-05-13 01:21:57 -05001279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001281 rc = RegLoadKeyW(key, sub_key, file_name );
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 Py_END_ALLOW_THREADS
1283 if (rc != ERROR_SUCCESS)
1284 return PyErr_SetFromWindowsErrWithFunction(rc, "RegLoadKey");
Zachary Warefd2d4822015-05-13 01:21:57 -05001285 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001286}
1287
Zachary Warefd2d4822015-05-13 01:21:57 -05001288/*[clinic input]
1289winreg.OpenKey -> HKEY
1290
1291 key: HKEY
1292 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001293 sub_key: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001294 A string that identifies the sub_key to open.
1295 reserved: int = 0
1296 A reserved integer that must be zero. Default is zero.
1297 access: REGSAM(c_default='KEY_READ') = winreg.KEY_READ
1298 An integer that specifies an access mask that describes the desired
1299 security access for the key. Default is KEY_READ.
1300
1301Opens the specified key.
1302
1303The result is a new handle to the specified key.
1304If the function fails, an OSError exception is raised.
1305[clinic start generated code]*/
1306
1307static HKEY
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001308winreg_OpenKey_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
Zachary Ware77772c02015-05-13 10:58:35 -05001309 int reserved, REGSAM access)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001310/*[clinic end generated code: output=a905f1b947f3ce85 input=098505ac36a9ae28]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001311{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 HKEY retKey;
1313 long rc;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001316 rc = RegOpenKeyExW(key, sub_key, reserved, access, &retKey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 Py_END_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001318 if (rc != ERROR_SUCCESS) {
1319 PyErr_SetFromWindowsErrWithFunction(rc, "RegOpenKeyEx");
1320 return NULL;
1321 }
1322 return retKey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001323}
1324
Zachary Warefd2d4822015-05-13 01:21:57 -05001325/*[clinic input]
1326winreg.OpenKeyEx = winreg.OpenKey
1327
1328Opens the specified key.
1329
1330The result is a new handle to the specified key.
1331If the function fails, an OSError exception is raised.
1332[clinic start generated code]*/
1333
1334static HKEY
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001335winreg_OpenKeyEx_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
Zachary Ware77772c02015-05-13 10:58:35 -05001336 int reserved, REGSAM access)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001337/*[clinic end generated code: output=226042593b37e940 input=c6c4972af8622959]*/
Zachary Warefd2d4822015-05-13 01:21:57 -05001338{
1339 return winreg_OpenKey_impl(module, key, sub_key, reserved, access);
1340}
1341
1342/*[clinic input]
1343winreg.QueryInfoKey
1344
1345 key: HKEY
1346 An already open key, or any one of the predefined HKEY_* constants.
1347 /
1348
1349Returns information about a key.
1350
1351The result is a tuple of 3 items:
1352An integer that identifies the number of sub keys this key has.
1353An integer that identifies the number of values this key has.
1354An integer that identifies when the key was last modified (if available)
1355as 100's of nanoseconds since Jan 1, 1600.
1356[clinic start generated code]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001357
1358static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001359winreg_QueryInfoKey_impl(PyObject *module, HKEY key)
1360/*[clinic end generated code: output=dc657b8356a4f438 input=c3593802390cde1f]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001361{
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001362 long rc;
1363 DWORD nSubKeys, nValues;
1364 FILETIME ft;
1365 LARGE_INTEGER li;
1366 PyObject *l;
1367 PyObject *ret;
Zachary Warefd2d4822015-05-13 01:21:57 -05001368
1369 if ((rc = RegQueryInfoKey(key, NULL, NULL, 0, &nSubKeys, NULL, NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 &nValues, NULL, NULL, NULL, &ft))
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001371 != ERROR_SUCCESS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryInfoKey");
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001373 li.LowPart = ft.dwLowDateTime;
1374 li.HighPart = ft.dwHighDateTime;
1375 l = PyLong_FromLongLong(li.QuadPart);
1376 if (l == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001378 ret = Py_BuildValue("iiO", nSubKeys, nValues, l);
1379 Py_DECREF(l);
1380 return ret;
1381}
1382
Zachary Warefd2d4822015-05-13 01:21:57 -05001383/*[clinic input]
1384winreg.QueryValue
1385
1386 key: HKEY
1387 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001388 sub_key: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001389 A string that holds the name of the subkey with which the value
1390 is associated. If this parameter is None or empty, the function
1391 retrieves the value set by the SetValue() method for the key
1392 identified by key.
1393 /
1394
1395Retrieves the unnamed value for a key.
1396
1397Values in the registry have name, type, and data components. This method
1398retrieves the data for a key's first value that has a NULL name.
1399But since the underlying API call doesn't return the type, you'll
1400probably be happier using QueryValueEx; this function is just here for
1401completeness.
1402[clinic start generated code]*/
1403
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001404static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001405winreg_QueryValue_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key)
1406/*[clinic end generated code: output=2bb8d1e02c10d0b6 input=41cafbbf423b21d6]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001407{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 long rc;
1409 PyObject *retStr;
1410 wchar_t *retBuf;
Brian Curtin60853212010-05-26 17:43:50 +00001411 DWORD bufSize = 0;
1412 DWORD retSize = 0;
1413 wchar_t *tmp;
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001414
Zachary Warefd2d4822015-05-13 01:21:57 -05001415 rc = RegQueryValueW(key, sub_key, NULL, &retSize);
Brian Curtin60853212010-05-26 17:43:50 +00001416 if (rc == ERROR_MORE_DATA)
1417 retSize = 256;
1418 else if (rc != ERROR_SUCCESS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 return PyErr_SetFromWindowsErrWithFunction(rc,
1420 "RegQueryValue");
Brian Curtin60853212010-05-26 17:43:50 +00001421
1422 bufSize = retSize;
1423 retBuf = (wchar_t *) PyMem_Malloc(bufSize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 if (retBuf == NULL)
1425 return PyErr_NoMemory();
Guido van Rossuma8c360e2007-07-17 20:50:43 +00001426
Brian Curtin60853212010-05-26 17:43:50 +00001427 while (1) {
1428 retSize = bufSize;
Zachary Warefd2d4822015-05-13 01:21:57 -05001429 rc = RegQueryValueW(key, sub_key, retBuf, &retSize);
Brian Curtin60853212010-05-26 17:43:50 +00001430 if (rc != ERROR_MORE_DATA)
1431 break;
1432
1433 bufSize *= 2;
1434 tmp = (wchar_t *) PyMem_Realloc(retBuf, bufSize);
1435 if (tmp == NULL) {
1436 PyMem_Free(retBuf);
1437 return PyErr_NoMemory();
1438 }
1439 retBuf = tmp;
1440 }
1441
1442 if (rc != ERROR_SUCCESS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 PyMem_Free(retBuf);
1444 return PyErr_SetFromWindowsErrWithFunction(rc,
1445 "RegQueryValue");
1446 }
Guido van Rossuma8c360e2007-07-17 20:50:43 +00001447
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001448 retStr = PyUnicode_FromWideChar(retBuf, wcslen(retBuf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001449 PyMem_Free(retBuf);
1450 return retStr;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001451}
1452
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001453
Zachary Warefd2d4822015-05-13 01:21:57 -05001454/*[clinic input]
1455winreg.QueryValueEx
1456
1457 key: HKEY
1458 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001459 name: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001460 A string indicating the value to query.
1461 /
1462
1463Retrieves the type and value of a specified sub-key.
1464
1465Behaves mostly like QueryValue(), but also returns the type of the
1466specified value name associated with the given open registry key.
1467
1468The return value is a tuple of the value and the type_id.
1469[clinic start generated code]*/
1470
1471static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001472winreg_QueryValueEx_impl(PyObject *module, HKEY key, Py_UNICODE *name)
1473/*[clinic end generated code: output=5b4fa3e33d6d3e8f input=cf366cada4836891]*/
Zachary Warefd2d4822015-05-13 01:21:57 -05001474{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 long rc;
Brian Curtin60853212010-05-26 17:43:50 +00001476 BYTE *retBuf, *tmp;
1477 DWORD bufSize = 0, retSize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 DWORD typ;
1479 PyObject *obData;
1480 PyObject *result;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001481
Zachary Warefd2d4822015-05-13 01:21:57 -05001482 rc = RegQueryValueExW(key, name, NULL, NULL, NULL, &bufSize);
Brian Curtin60853212010-05-26 17:43:50 +00001483 if (rc == ERROR_MORE_DATA)
1484 bufSize = 256;
1485 else if (rc != ERROR_SUCCESS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 return PyErr_SetFromWindowsErrWithFunction(rc,
1487 "RegQueryValueEx");
1488 retBuf = (BYTE *)PyMem_Malloc(bufSize);
1489 if (retBuf == NULL)
1490 return PyErr_NoMemory();
Brian Curtin60853212010-05-26 17:43:50 +00001491
1492 while (1) {
1493 retSize = bufSize;
Zachary Warefd2d4822015-05-13 01:21:57 -05001494 rc = RegQueryValueExW(key, name, NULL, &typ,
Brian Curtin60853212010-05-26 17:43:50 +00001495 (BYTE *)retBuf, &retSize);
1496 if (rc != ERROR_MORE_DATA)
1497 break;
1498
1499 bufSize *= 2;
1500 tmp = (char *) PyMem_Realloc(retBuf, bufSize);
1501 if (tmp == NULL) {
1502 PyMem_Free(retBuf);
1503 return PyErr_NoMemory();
1504 }
1505 retBuf = tmp;
1506 }
1507
1508 if (rc != ERROR_SUCCESS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 PyMem_Free(retBuf);
1510 return PyErr_SetFromWindowsErrWithFunction(rc,
1511 "RegQueryValueEx");
1512 }
1513 obData = Reg2Py(retBuf, bufSize, typ);
1514 PyMem_Free(retBuf);
1515 if (obData == NULL)
1516 return NULL;
1517 result = Py_BuildValue("Oi", obData, typ);
1518 Py_DECREF(obData);
1519 return result;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001520}
1521
Zachary Warefd2d4822015-05-13 01:21:57 -05001522/*[clinic input]
1523winreg.SaveKey
1524
1525 key: HKEY
1526 An already open key, or any one of the predefined HKEY_* constants.
1527 file_name: Py_UNICODE
1528 The name of the file to save registry data to. This file cannot
1529 already exist. If this filename includes an extension, it cannot be
1530 used on file allocation table (FAT) file systems by the LoadKey(),
1531 ReplaceKey() or RestoreKey() methods.
1532 /
1533
1534Saves the specified key, and all its subkeys to the specified file.
1535
1536If key represents a key on a remote computer, the path described by
1537file_name is relative to the remote computer.
1538
1539The caller of this method must possess the SeBackupPrivilege
1540security privilege. This function passes NULL for security_attributes
1541to the API.
1542[clinic start generated code]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001543
1544static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001545winreg_SaveKey_impl(PyObject *module, HKEY key, Py_UNICODE *file_name)
1546/*[clinic end generated code: output=1dda1502bd4c30d8 input=da735241f91ac7a2]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 LPSECURITY_ATTRIBUTES pSA = NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 long rc;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001551/* One day we may get security into the core?
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 if (!PyWinObject_AsSECURITY_ATTRIBUTES(obSA, &pSA, TRUE))
1553 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001554*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001556 rc = RegSaveKeyW(key, file_name, pSA );
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 Py_END_ALLOW_THREADS
1558 if (rc != ERROR_SUCCESS)
1559 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSaveKey");
Zachary Warefd2d4822015-05-13 01:21:57 -05001560 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001561}
1562
Zachary Warefd2d4822015-05-13 01:21:57 -05001563/*[clinic input]
1564winreg.SetValue
1565
1566 key: HKEY
1567 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001568 sub_key: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001569 A string that names the subkey with which the value is associated.
1570 type: DWORD
1571 An integer that specifies the type of the data. Currently this must
1572 be REG_SZ, meaning only strings are supported.
Zachary Ware77772c02015-05-13 10:58:35 -05001573 value: Py_UNICODE(zeroes=True)
Zachary Warefd2d4822015-05-13 01:21:57 -05001574 A string that specifies the new value.
1575 /
1576
1577Associates a value with a specified key.
1578
1579If the key specified by the sub_key parameter does not exist, the
1580SetValue function creates it.
1581
1582Value lengths are limited by available memory. Long values (more than
15832048 bytes) should be stored as files with the filenames stored in
1584the configuration registry to help the registry perform efficiently.
1585
1586The key identified by the key parameter must have been opened with
1587KEY_SET_VALUE access.
1588[clinic start generated code]*/
1589
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001590static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001591winreg_SetValue_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
Zachary Ware77772c02015-05-13 10:58:35 -05001592 DWORD type, Py_UNICODE *value,
1593 Py_ssize_clean_t value_length)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001594/*[clinic end generated code: output=1e31931174820631 input=2cd2adab79339c53]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001595{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 long rc;
Zachary Warefd2d4822015-05-13 01:21:57 -05001597
1598 if (type != REG_SZ) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 PyErr_SetString(PyExc_TypeError,
1600 "Type must be winreg.REG_SZ");
1601 return NULL;
1602 }
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001605 rc = RegSetValueW(key, sub_key, REG_SZ, value, value_length+1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 Py_END_ALLOW_THREADS
1607 if (rc != ERROR_SUCCESS)
1608 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSetValue");
Zachary Warefd2d4822015-05-13 01:21:57 -05001609 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001610}
1611
Zachary Warefd2d4822015-05-13 01:21:57 -05001612/*[clinic input]
1613winreg.SetValueEx
1614
1615 key: HKEY
1616 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001617 value_name: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001618 A string containing the name of the value to set, or None.
1619 reserved: object
1620 Can be anything - zero is always passed to the API.
1621 type: DWORD
1622 An integer that specifies the type of the data, one of:
1623 REG_BINARY -- Binary data in any form.
1624 REG_DWORD -- A 32-bit number.
Steve Dower80ac11d2016-05-24 15:42:04 -07001625 REG_DWORD_LITTLE_ENDIAN -- A 32-bit number in little-endian format. Equivalent to REG_DWORD
Zachary Warefd2d4822015-05-13 01:21:57 -05001626 REG_DWORD_BIG_ENDIAN -- A 32-bit number in big-endian format.
1627 REG_EXPAND_SZ -- A null-terminated string that contains unexpanded
1628 references to environment variables (for example,
1629 %PATH%).
1630 REG_LINK -- A Unicode symbolic link.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03001631 REG_MULTI_SZ -- A sequence of null-terminated strings, terminated
Zachary Warefd2d4822015-05-13 01:21:57 -05001632 by two null characters. Note that Python handles
1633 this termination automatically.
1634 REG_NONE -- No defined value type.
Steve Dower80ac11d2016-05-24 15:42:04 -07001635 REG_QWORD -- A 64-bit number.
1636 REG_QWORD_LITTLE_ENDIAN -- A 64-bit number in little-endian format. Equivalent to REG_QWORD.
Zachary Warefd2d4822015-05-13 01:21:57 -05001637 REG_RESOURCE_LIST -- A device-driver resource list.
1638 REG_SZ -- A null-terminated string.
1639 value: object
1640 A string that specifies the new value.
1641 /
1642
1643Stores data in the value field of an open registry key.
1644
1645This method can also set additional value and type information for the
1646specified key. The key identified by the key parameter must have been
1647opened with KEY_SET_VALUE access.
1648
1649To open the key, use the CreateKeyEx() or OpenKeyEx() methods.
1650
1651Value lengths are limited by available memory. Long values (more than
16522048 bytes) should be stored as files with the filenames stored in
1653the configuration registry to help the registry perform efficiently.
1654[clinic start generated code]*/
1655
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001656static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001657winreg_SetValueEx_impl(PyObject *module, HKEY key, Py_UNICODE *value_name,
Zachary Ware77772c02015-05-13 10:58:35 -05001658 PyObject *reserved, DWORD type, PyObject *value)
Serhiy Storchaka2954f832016-07-07 18:20:03 +03001659/*[clinic end generated code: output=c88c8426b6c00ec7 input=900a9e3990bfb196]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001660{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001661 BYTE *data;
1662 DWORD len;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 LONG rc;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001665
Zachary Warefd2d4822015-05-13 01:21:57 -05001666 if (!Py2Reg(value, type, &data, &len))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 {
1668 if (!PyErr_Occurred())
1669 PyErr_SetString(PyExc_ValueError,
1670 "Could not convert the data to the specified type.");
1671 return NULL;
1672 }
1673 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001674 rc = RegSetValueExW(key, value_name, 0, type, data, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 Py_END_ALLOW_THREADS
1676 PyMem_DEL(data);
1677 if (rc != ERROR_SUCCESS)
1678 return PyErr_SetFromWindowsErrWithFunction(rc,
1679 "RegSetValueEx");
Zachary Warefd2d4822015-05-13 01:21:57 -05001680 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001681}
1682
Zachary Warefd2d4822015-05-13 01:21:57 -05001683/*[clinic input]
1684winreg.DisableReflectionKey
1685
1686 key: HKEY
1687 An already open key, or any one of the predefined HKEY_* constants.
1688 /
1689
1690Disables registry reflection for 32bit processes running on a 64bit OS.
1691
1692Will generally raise NotImplemented if executed on a 32bit OS.
1693
1694If the key is not on the reflection list, the function succeeds but has
1695no effect. Disabling reflection for a key does not affect reflection
1696of any subkeys.
1697[clinic start generated code]*/
1698
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001699static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001700winreg_DisableReflectionKey_impl(PyObject *module, HKEY key)
1701/*[clinic end generated code: output=830cce504cc764b4 input=a6c9e5ca5410193c]*/
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 HMODULE hMod;
1704 typedef LONG (WINAPI *RDRKFunc)(HKEY);
1705 RDRKFunc pfn = NULL;
1706 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 /* Only available on 64bit platforms, so we must load it
1709 dynamically.*/
Martin v. Löwis50590f12012-01-14 17:54:09 +01001710 hMod = GetModuleHandleW(L"advapi32.dll");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 if (hMod)
1712 pfn = (RDRKFunc)GetProcAddress(hMod,
1713 "RegDisableReflectionKey");
1714 if (!pfn) {
1715 PyErr_SetString(PyExc_NotImplementedError,
1716 "not implemented on this platform");
1717 return NULL;
1718 }
1719 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001720 rc = (*pfn)(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 Py_END_ALLOW_THREADS
1722 if (rc != ERROR_SUCCESS)
1723 return PyErr_SetFromWindowsErrWithFunction(rc,
1724 "RegDisableReflectionKey");
Zachary Warefd2d4822015-05-13 01:21:57 -05001725 Py_RETURN_NONE;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001726}
1727
Zachary Warefd2d4822015-05-13 01:21:57 -05001728/*[clinic input]
1729winreg.EnableReflectionKey
1730
1731 key: HKEY
1732 An already open key, or any one of the predefined HKEY_* constants.
1733 /
1734
1735Restores registry reflection for the specified disabled key.
1736
1737Will generally raise NotImplemented if executed on a 32bit OS.
1738Restoring reflection for a key does not affect reflection of any
1739subkeys.
1740[clinic start generated code]*/
1741
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001742static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001743winreg_EnableReflectionKey_impl(PyObject *module, HKEY key)
1744/*[clinic end generated code: output=86fa1385fdd9ce57 input=7748abbacd1e166a]*/
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001745{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 HMODULE hMod;
1747 typedef LONG (WINAPI *RERKFunc)(HKEY);
1748 RERKFunc pfn = NULL;
1749 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 /* Only available on 64bit platforms, so we must load it
1752 dynamically.*/
Martin v. Löwis50590f12012-01-14 17:54:09 +01001753 hMod = GetModuleHandleW(L"advapi32.dll");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 if (hMod)
1755 pfn = (RERKFunc)GetProcAddress(hMod,
1756 "RegEnableReflectionKey");
1757 if (!pfn) {
1758 PyErr_SetString(PyExc_NotImplementedError,
1759 "not implemented on this platform");
1760 return NULL;
1761 }
1762 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001763 rc = (*pfn)(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 Py_END_ALLOW_THREADS
1765 if (rc != ERROR_SUCCESS)
1766 return PyErr_SetFromWindowsErrWithFunction(rc,
1767 "RegEnableReflectionKey");
Zachary Warefd2d4822015-05-13 01:21:57 -05001768 Py_RETURN_NONE;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001769}
1770
Zachary Warefd2d4822015-05-13 01:21:57 -05001771/*[clinic input]
1772winreg.QueryReflectionKey
1773
1774 key: HKEY
1775 An already open key, or any one of the predefined HKEY_* constants.
1776 /
1777
1778Returns the reflection state for the specified key as a bool.
1779
1780Will generally raise NotImplemented if executed on a 32bit OS.
1781[clinic start generated code]*/
1782
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001783static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001784winreg_QueryReflectionKey_impl(PyObject *module, HKEY key)
1785/*[clinic end generated code: output=4e774af288c3ebb9 input=9f325eacb5a65d88]*/
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001786{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 HMODULE hMod;
1788 typedef LONG (WINAPI *RQRKFunc)(HKEY, BOOL *);
1789 RQRKFunc pfn = NULL;
1790 BOOL result;
1791 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 /* Only available on 64bit platforms, so we must load it
1794 dynamically.*/
Martin v. Löwis50590f12012-01-14 17:54:09 +01001795 hMod = GetModuleHandleW(L"advapi32.dll");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 if (hMod)
1797 pfn = (RQRKFunc)GetProcAddress(hMod,
1798 "RegQueryReflectionKey");
1799 if (!pfn) {
1800 PyErr_SetString(PyExc_NotImplementedError,
1801 "not implemented on this platform");
1802 return NULL;
1803 }
1804 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001805 rc = (*pfn)(key, &result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001806 Py_END_ALLOW_THREADS
1807 if (rc != ERROR_SUCCESS)
1808 return PyErr_SetFromWindowsErrWithFunction(rc,
1809 "RegQueryReflectionKey");
1810 return PyBool_FromLong(result);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001811}
1812
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001813static struct PyMethodDef winreg_methods[] = {
Zachary Warefd2d4822015-05-13 01:21:57 -05001814 WINREG_CLOSEKEY_METHODDEF
1815 WINREG_CONNECTREGISTRY_METHODDEF
1816 WINREG_CREATEKEY_METHODDEF
1817 WINREG_CREATEKEYEX_METHODDEF
1818 WINREG_DELETEKEY_METHODDEF
1819 WINREG_DELETEKEYEX_METHODDEF
1820 WINREG_DELETEVALUE_METHODDEF
1821 WINREG_DISABLEREFLECTIONKEY_METHODDEF
1822 WINREG_ENABLEREFLECTIONKEY_METHODDEF
1823 WINREG_ENUMKEY_METHODDEF
1824 WINREG_ENUMVALUE_METHODDEF
1825 WINREG_EXPANDENVIRONMENTSTRINGS_METHODDEF
1826 WINREG_FLUSHKEY_METHODDEF
1827 WINREG_LOADKEY_METHODDEF
1828 WINREG_OPENKEY_METHODDEF
1829 WINREG_OPENKEYEX_METHODDEF
1830 WINREG_QUERYVALUE_METHODDEF
1831 WINREG_QUERYVALUEEX_METHODDEF
1832 WINREG_QUERYINFOKEY_METHODDEF
1833 WINREG_QUERYREFLECTIONKEY_METHODDEF
1834 WINREG_SAVEKEY_METHODDEF
1835 WINREG_SETVALUE_METHODDEF
1836 WINREG_SETVALUEEX_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 NULL,
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001838};
1839
1840static void
1841insint(PyObject * d, char * name, long value)
1842{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 PyObject *v = PyLong_FromLong(value);
1844 if (!v || PyDict_SetItemString(d, name, v))
1845 PyErr_Clear();
1846 Py_XDECREF(v);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001847}
1848
1849#define ADD_INT(val) insint(d, #val, val)
1850
1851static void
1852inskey(PyObject * d, char * name, HKEY key)
1853{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 PyObject *v = PyLong_FromVoidPtr(key);
1855 if (!v || PyDict_SetItemString(d, name, v))
1856 PyErr_Clear();
1857 Py_XDECREF(v);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001858}
1859
1860#define ADD_KEY(val) inskey(d, #val, val)
1861
Martin v. Löwis1a214512008-06-11 05:26:20 +00001862
1863static struct PyModuleDef winregmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 PyModuleDef_HEAD_INIT,
1865 "winreg",
1866 module_doc,
1867 -1,
1868 winreg_methods,
1869 NULL,
1870 NULL,
1871 NULL,
1872 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001873};
1874
1875PyMODINIT_FUNC PyInit_winreg(void)
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001876{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 PyObject *m, *d;
1878 m = PyModule_Create(&winregmodule);
1879 if (m == NULL)
1880 return NULL;
1881 d = PyModule_GetDict(m);
1882 PyHKEY_Type.tp_doc = PyHKEY_doc;
1883 if (PyType_Ready(&PyHKEY_Type) < 0)
1884 return NULL;
1885 Py_INCREF(&PyHKEY_Type);
1886 if (PyDict_SetItemString(d, "HKEYType",
1887 (PyObject *)&PyHKEY_Type) != 0)
1888 return NULL;
Andrew Svetlov2606a6f2012-12-19 14:33:35 +02001889 Py_INCREF(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890 if (PyDict_SetItemString(d, "error",
Andrew Svetlov2606a6f2012-12-19 14:33:35 +02001891 PyExc_OSError) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 /* Add the relevant constants */
1895 ADD_KEY(HKEY_CLASSES_ROOT);
1896 ADD_KEY(HKEY_CURRENT_USER);
1897 ADD_KEY(HKEY_LOCAL_MACHINE);
1898 ADD_KEY(HKEY_USERS);
1899 ADD_KEY(HKEY_PERFORMANCE_DATA);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001900#ifdef HKEY_CURRENT_CONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 ADD_KEY(HKEY_CURRENT_CONFIG);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001902#endif
1903#ifdef HKEY_DYN_DATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 ADD_KEY(HKEY_DYN_DATA);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001906 ADD_INT(KEY_QUERY_VALUE);
1907 ADD_INT(KEY_SET_VALUE);
1908 ADD_INT(KEY_CREATE_SUB_KEY);
1909 ADD_INT(KEY_ENUMERATE_SUB_KEYS);
1910 ADD_INT(KEY_NOTIFY);
1911 ADD_INT(KEY_CREATE_LINK);
1912 ADD_INT(KEY_READ);
1913 ADD_INT(KEY_WRITE);
1914 ADD_INT(KEY_EXECUTE);
1915 ADD_INT(KEY_ALL_ACCESS);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001916#ifdef KEY_WOW64_64KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 ADD_INT(KEY_WOW64_64KEY);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001918#endif
1919#ifdef KEY_WOW64_32KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 ADD_INT(KEY_WOW64_32KEY);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001921#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 ADD_INT(REG_OPTION_RESERVED);
1923 ADD_INT(REG_OPTION_NON_VOLATILE);
1924 ADD_INT(REG_OPTION_VOLATILE);
1925 ADD_INT(REG_OPTION_CREATE_LINK);
1926 ADD_INT(REG_OPTION_BACKUP_RESTORE);
1927 ADD_INT(REG_OPTION_OPEN_LINK);
1928 ADD_INT(REG_LEGAL_OPTION);
1929 ADD_INT(REG_CREATED_NEW_KEY);
1930 ADD_INT(REG_OPENED_EXISTING_KEY);
1931 ADD_INT(REG_WHOLE_HIVE_VOLATILE);
1932 ADD_INT(REG_REFRESH_HIVE);
1933 ADD_INT(REG_NO_LAZY_FLUSH);
1934 ADD_INT(REG_NOTIFY_CHANGE_NAME);
1935 ADD_INT(REG_NOTIFY_CHANGE_ATTRIBUTES);
1936 ADD_INT(REG_NOTIFY_CHANGE_LAST_SET);
1937 ADD_INT(REG_NOTIFY_CHANGE_SECURITY);
1938 ADD_INT(REG_LEGAL_CHANGE_FILTER);
1939 ADD_INT(REG_NONE);
1940 ADD_INT(REG_SZ);
1941 ADD_INT(REG_EXPAND_SZ);
1942 ADD_INT(REG_BINARY);
1943 ADD_INT(REG_DWORD);
1944 ADD_INT(REG_DWORD_LITTLE_ENDIAN);
1945 ADD_INT(REG_DWORD_BIG_ENDIAN);
Steve Dower80ac11d2016-05-24 15:42:04 -07001946 ADD_INT(REG_QWORD);
1947 ADD_INT(REG_QWORD_LITTLE_ENDIAN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 ADD_INT(REG_LINK);
1949 ADD_INT(REG_MULTI_SZ);
1950 ADD_INT(REG_RESOURCE_LIST);
1951 ADD_INT(REG_FULL_RESOURCE_DESCRIPTOR);
1952 ADD_INT(REG_RESOURCE_REQUIREMENTS_LIST);
1953 return m;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001954}
1955
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001956