blob: e3801b257b071e74285bb2fd006c0dfc49f2f8ee [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.
luzpaza5293b42017-11-05 07:37:50 -060028 Hopefully it will one day, and in the meantime I don't
Guido van Rossum9f3712c2000-03-28 20:37:15 +000029 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
luzpaza5293b42017-11-05 07:37:50 -0600509** some commercial packages install strings which don't conform,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000510** causing this code to fail - however, "regedit" etc still work
luzpaza5293b42017-11-05 07:37:50 -0600511** with these strings (ie only we don't!).
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000512*/
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 }
Miss Islington (bot)8b7d8ac2018-12-08 06:34:49 -0800760 PyObject *uni = PyUnicode_FromWideChar(str[index], len);
761 if (uni == NULL) {
762 Py_DECREF(obData);
763 PyMem_Free(str);
764 return NULL;
765 }
766 PyList_SET_ITEM(obData, index, uni);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 }
Victor Stinnerb6404912013-07-07 16:21:41 +0200768 PyMem_Free(str);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 break;
771 }
772 case REG_BINARY:
773 /* ALSO handle ALL unknown data types here. Even if we can't
774 support it natively, we should handle the bits. */
775 default:
776 if (retDataSize == 0) {
777 Py_INCREF(Py_None);
778 obData = Py_None;
779 }
780 else
781 obData = PyBytes_FromStringAndSize(
782 (char *)retDataBuf, retDataSize);
783 break;
784 }
785 return obData;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000786}
787
788/* The Python methods */
789
Zachary Warefd2d4822015-05-13 01:21:57 -0500790/*[clinic input]
791winreg.CloseKey
792
793 hkey: object
794 A previously opened key.
795 /
796
797Closes a previously opened registry key.
798
799Note that if the key is not closed using this method, it will be
800closed when the hkey object is destroyed by Python.
801[clinic start generated code]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000802
803static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300804winreg_CloseKey(PyObject *module, PyObject *hkey)
805/*[clinic end generated code: output=a4fa537019a80d15 input=5b1aac65ba5127ad]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000806{
Zachary Warefd2d4822015-05-13 01:21:57 -0500807 if (!PyHKEY_Close(hkey))
808 return NULL;
809 Py_RETURN_NONE;
810}
811
812/*[clinic input]
813winreg.ConnectRegistry -> HKEY
814
Zachary Ware77772c02015-05-13 10:58:35 -0500815 computer_name: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -0500816 The name of the remote computer, of the form r"\\computername". If
817 None, the local computer is used.
818 key: HKEY
819 The predefined key to connect to.
820 /
821
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300822Establishes a connection to the registry on another computer.
Zachary Warefd2d4822015-05-13 01:21:57 -0500823
824The return value is the handle of the opened key.
825If the function fails, an OSError exception is raised.
826[clinic start generated code]*/
827
828static HKEY
Serhiy Storchaka45a7b762018-12-14 11:56:48 +0200829winreg_ConnectRegistry_impl(PyObject *module,
830 const Py_UNICODE *computer_name, HKEY key)
831/*[clinic end generated code: output=cd4f70fb9ec901fb input=5f98a891a347e68e]*/
Zachary Warefd2d4822015-05-13 01:21:57 -0500832{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 HKEY retKey;
834 long rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -0500836 rc = RegConnectRegistryW(computer_name, key, &retKey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000837 Py_END_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -0500838 if (rc != ERROR_SUCCESS) {
839 PyErr_SetFromWindowsErrWithFunction(rc, "ConnectRegistry");
840 return NULL;
841 }
842 return retKey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000843}
844
Zachary Warefd2d4822015-05-13 01:21:57 -0500845/*[clinic input]
846winreg.CreateKey -> HKEY
847
848 key: HKEY
849 An already open key, or one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -0500850 sub_key: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -0500851 The name of the key this method opens or creates.
852 /
853
854Creates or opens the specified key.
855
856If key is one of the predefined keys, sub_key may be None. In that case,
857the handle returned is the same key handle passed in to the function.
858
859If the key already exists, this function opens the existing key.
860
861The return value is the handle of the opened key.
862If the function fails, an OSError exception is raised.
863[clinic start generated code]*/
864
865static HKEY
Serhiy Storchaka45a7b762018-12-14 11:56:48 +0200866winreg_CreateKey_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key)
867/*[clinic end generated code: output=2af13910d56eae26 input=3cdd1622488acea2]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000868{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 HKEY retKey;
870 long rc;
Zachary Warefd2d4822015-05-13 01:21:57 -0500871
872 rc = RegCreateKeyW(key, sub_key, &retKey);
873 if (rc != ERROR_SUCCESS) {
874 PyErr_SetFromWindowsErrWithFunction(rc, "CreateKey");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 return NULL;
Zachary Warefd2d4822015-05-13 01:21:57 -0500876 }
877 return retKey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000878}
879
Zachary Warefd2d4822015-05-13 01:21:57 -0500880/*[clinic input]
881winreg.CreateKeyEx -> HKEY
882
883 key: HKEY
884 An already open key, or one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -0500885 sub_key: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -0500886 The name of the key this method opens or creates.
887 reserved: int = 0
888 A reserved integer, and must be zero. Default is zero.
889 access: REGSAM(c_default='KEY_WRITE') = winreg.KEY_WRITE
890 An integer that specifies an access mask that describes the
891 desired security access for the key. Default is KEY_WRITE.
892
893Creates or opens the specified key.
894
895If key is one of the predefined keys, sub_key may be None. In that case,
896the handle returned is the same key handle passed in to the function.
897
898If the key already exists, this function opens the existing key
899
900The return value is the handle of the opened key.
901If the function fails, an OSError exception is raised.
902[clinic start generated code]*/
903
904static HKEY
Serhiy Storchaka45a7b762018-12-14 11:56:48 +0200905winreg_CreateKeyEx_impl(PyObject *module, HKEY key,
906 const Py_UNICODE *sub_key, int reserved,
907 REGSAM access)
908/*[clinic end generated code: output=643a70ad6a361a97 input=42c2b03f98406b66]*/
Brian Curtin3035c392010-04-21 23:56:21 +0000909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 HKEY retKey;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 long rc;
Brian Curtin1771b542010-09-27 17:56:36 +0000912
Segev Finer679b5662017-07-27 01:17:57 +0300913 rc = RegCreateKeyExW(key, sub_key, reserved, NULL, 0,
Brian Curtin1771b542010-09-27 17:56:36 +0000914 access, NULL, &retKey, NULL);
Zachary Warefd2d4822015-05-13 01:21:57 -0500915 if (rc != ERROR_SUCCESS) {
916 PyErr_SetFromWindowsErrWithFunction(rc, "CreateKeyEx");
917 return NULL;
918 }
919 return retKey;
Brian Curtin3035c392010-04-21 23:56:21 +0000920}
921
Zachary Warefd2d4822015-05-13 01:21:57 -0500922/*[clinic input]
923winreg.DeleteKey
924 key: HKEY
925 An already open key, or any one of the predefined HKEY_* constants.
926 sub_key: Py_UNICODE
927 A string that must be the name of a subkey of the key identified by
928 the key parameter. This value must not be None, and the key may not
929 have subkeys.
930 /
931
932Deletes the specified key.
933
934This method can not delete keys with subkeys.
935
936If the function succeeds, the entire key, including all of its values,
937is removed. If the function fails, an OSError exception is raised.
938[clinic start generated code]*/
939
Brian Curtin3035c392010-04-21 23:56:21 +0000940static PyObject *
Serhiy Storchaka45a7b762018-12-14 11:56:48 +0200941winreg_DeleteKey_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key)
942/*[clinic end generated code: output=d2652a84f70e0862 input=b31d225b935e4211]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000943{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 long rc;
Zachary Warefd2d4822015-05-13 01:21:57 -0500945 rc = RegDeleteKeyW(key, sub_key );
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 if (rc != ERROR_SUCCESS)
947 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKey");
Zachary Warefd2d4822015-05-13 01:21:57 -0500948 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000949}
950
Zachary Warefd2d4822015-05-13 01:21:57 -0500951/*[clinic input]
952winreg.DeleteKeyEx
953
954 key: HKEY
955 An already open key, or any one of the predefined HKEY_* constants.
956 sub_key: Py_UNICODE
957 A string that must be the name of a subkey of the key identified by
958 the key parameter. This value must not be None, and the key may not
959 have subkeys.
960 access: REGSAM(c_default='KEY_WOW64_64KEY') = winreg.KEY_WOW64_64KEY
961 An integer that specifies an access mask that describes the
962 desired security access for the key. Default is KEY_WOW64_64KEY.
963 reserved: int = 0
964 A reserved integer, and must be zero. Default is zero.
965
966Deletes the specified key (64-bit OS only).
967
968This method can not delete keys with subkeys.
969
970If the function succeeds, the entire key, including all of its values,
971is removed. If the function fails, an OSError exception is raised.
972On unsupported Windows versions, NotImplementedError is raised.
973[clinic start generated code]*/
974
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000975static PyObject *
Serhiy Storchaka45a7b762018-12-14 11:56:48 +0200976winreg_DeleteKeyEx_impl(PyObject *module, HKEY key,
977 const Py_UNICODE *sub_key, REGSAM access,
978 int reserved)
979/*[clinic end generated code: output=52a1c8b374ebc003 input=711d9d89e7ecbed7]*/
Brian Curtin3035c392010-04-21 23:56:21 +0000980{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 HMODULE hMod;
982 typedef LONG (WINAPI *RDKEFunc)(HKEY, const wchar_t*, REGSAM, int);
983 RDKEFunc pfn = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 long rc;
Brian Curtin3035c392010-04-21 23:56:21 +0000985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 /* Only available on 64bit platforms, so we must load it
987 dynamically. */
Martin v. Löwis50590f12012-01-14 17:54:09 +0100988 hMod = GetModuleHandleW(L"advapi32.dll");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 if (hMod)
990 pfn = (RDKEFunc)GetProcAddress(hMod,
991 "RegDeleteKeyExW");
992 if (!pfn) {
993 PyErr_SetString(PyExc_NotImplementedError,
994 "not implemented on this platform");
995 return NULL;
996 }
997 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -0500998 rc = (*pfn)(key, sub_key, access, reserved);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 Py_END_ALLOW_THREADS
Brian Curtin3035c392010-04-21 23:56:21 +00001000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 if (rc != ERROR_SUCCESS)
1002 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKeyEx");
Zachary Warefd2d4822015-05-13 01:21:57 -05001003 Py_RETURN_NONE;
Brian Curtin3035c392010-04-21 23:56:21 +00001004}
1005
Zachary Warefd2d4822015-05-13 01:21:57 -05001006/*[clinic input]
1007winreg.DeleteValue
1008
1009 key: HKEY
1010 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001011 value: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001012 A string that identifies the value to remove.
1013 /
1014
1015Removes a named value from a registry key.
1016[clinic start generated code]*/
1017
Brian Curtin3035c392010-04-21 23:56:21 +00001018static PyObject *
Serhiy Storchaka45a7b762018-12-14 11:56:48 +02001019winreg_DeleteValue_impl(PyObject *module, HKEY key, const Py_UNICODE *value)
1020/*[clinic end generated code: output=56fa9d21f3a54371 input=a78d3407a4197b21]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001021{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 long rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001024 rc = RegDeleteValueW(key, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 Py_END_ALLOW_THREADS
1026 if (rc !=ERROR_SUCCESS)
1027 return PyErr_SetFromWindowsErrWithFunction(rc,
1028 "RegDeleteValue");
Zachary Warefd2d4822015-05-13 01:21:57 -05001029 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001030}
1031
Zachary Warefd2d4822015-05-13 01:21:57 -05001032/*[clinic input]
1033winreg.EnumKey
1034
1035 key: HKEY
1036 An already open key, or any one of the predefined HKEY_* constants.
1037 index: int
1038 An integer that identifies the index of the key to retrieve.
1039 /
1040
1041Enumerates subkeys of an open registry key.
1042
1043The function retrieves the name of one subkey each time it is called.
1044It is typically called repeatedly until an OSError exception is
1045raised, indicating no more values are available.
1046[clinic start generated code]*/
1047
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001048static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001049winreg_EnumKey_impl(PyObject *module, HKEY key, int index)
1050/*[clinic end generated code: output=25a6ec52cd147bc4 input=fad9a7c00ab0e04b]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001051{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 long rc;
1053 PyObject *retStr;
Brian Curtin60853212010-05-26 17:43:50 +00001054
1055 /* The Windows docs claim that the max key name length is 255
1056 * characters, plus a terminating nul character. However,
1057 * empirical testing demonstrates that it is possible to
1058 * create a 256 character key that is missing the terminating
1059 * nul. RegEnumKeyEx requires a 257 character buffer to
1060 * retrieve such a key name. */
1061 wchar_t tmpbuf[257];
Kristján Valur Jónsson984dfa72012-04-02 15:23:29 +00001062 DWORD len = sizeof(tmpbuf)/sizeof(wchar_t); /* includes NULL terminator */
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001065 rc = RegEnumKeyExW(key, index, tmpbuf, &len, NULL, NULL, NULL, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 Py_END_ALLOW_THREADS
1067 if (rc != ERROR_SUCCESS)
1068 return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKeyEx");
Tim Peters313fcd42006-02-19 04:05:39 +00001069
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001070 retStr = PyUnicode_FromWideChar(tmpbuf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 return retStr; /* can be NULL */
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001072}
1073
Zachary Warefd2d4822015-05-13 01:21:57 -05001074/*[clinic input]
1075winreg.EnumValue
1076
1077 key: HKEY
1078 An already open key, or any one of the predefined HKEY_* constants.
1079 index: int
1080 An integer that identifies the index of the value to retrieve.
1081 /
1082
1083Enumerates values of an open registry key.
1084
1085The function retrieves the name of one subkey each time it is called.
1086It is typically called repeatedly, until an OSError exception
1087is raised, indicating no more values.
1088
1089The result is a tuple of 3 items:
1090 value_name
1091 A string that identifies the value.
1092 value_data
1093 An object that holds the value data, and whose type depends
1094 on the underlying registry type.
1095 data_type
1096 An integer that identifies the type of the value data.
1097[clinic start generated code]*/
1098
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001099static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001100winreg_EnumValue_impl(PyObject *module, HKEY key, int index)
1101/*[clinic end generated code: output=d363b5a06f8789ac input=4414f47a6fb238b5]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 long rc;
1104 wchar_t *retValueBuf;
Amaury Forgeot d'Arcf2b69df2010-08-16 22:11:29 +00001105 BYTE *tmpBuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 BYTE *retDataBuf;
Brian Curtin60853212010-05-26 17:43:50 +00001107 DWORD retValueSize, bufValueSize;
1108 DWORD retDataSize, bufDataSize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 DWORD typ;
1110 PyObject *obData;
1111 PyObject *retVal;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001112
Zachary Warefd2d4822015-05-13 01:21:57 -05001113 if ((rc = RegQueryInfoKeyW(key, NULL, NULL, NULL, NULL, NULL, NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 NULL,
1115 &retValueSize, &retDataSize, NULL, NULL))
1116 != ERROR_SUCCESS)
1117 return PyErr_SetFromWindowsErrWithFunction(rc,
1118 "RegQueryInfoKey");
1119 ++retValueSize; /* include null terminators */
1120 ++retDataSize;
Brian Curtin60853212010-05-26 17:43:50 +00001121 bufDataSize = retDataSize;
1122 bufValueSize = retValueSize;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001123 retValueBuf = PyMem_New(wchar_t, retValueSize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 if (retValueBuf == NULL)
1125 return PyErr_NoMemory();
1126 retDataBuf = (BYTE *)PyMem_Malloc(retDataSize);
1127 if (retDataBuf == NULL) {
1128 PyMem_Free(retValueBuf);
1129 return PyErr_NoMemory();
1130 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001131
Brian Curtin60853212010-05-26 17:43:50 +00001132 while (1) {
Brian Curtin60853212010-05-26 17:43:50 +00001133 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001134 rc = RegEnumValueW(key,
Brian Curtin60853212010-05-26 17:43:50 +00001135 index,
1136 retValueBuf,
1137 &retValueSize,
1138 NULL,
1139 &typ,
1140 (BYTE *)retDataBuf,
1141 &retDataSize);
1142 Py_END_ALLOW_THREADS
1143
1144 if (rc != ERROR_MORE_DATA)
1145 break;
1146
1147 bufDataSize *= 2;
Amaury Forgeot d'Arcf2b69df2010-08-16 22:11:29 +00001148 tmpBuf = (BYTE *)PyMem_Realloc(retDataBuf, bufDataSize);
Brian Curtin9b7e2d12010-06-08 20:57:52 +00001149 if (tmpBuf == NULL) {
Brian Curtin60853212010-05-26 17:43:50 +00001150 PyErr_NoMemory();
1151 retVal = NULL;
1152 goto fail;
1153 }
Brian Curtin9b7e2d12010-06-08 20:57:52 +00001154 retDataBuf = tmpBuf;
Brian Curtin60853212010-05-26 17:43:50 +00001155 retDataSize = bufDataSize;
1156 retValueSize = bufValueSize;
1157 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 if (rc != ERROR_SUCCESS) {
1160 retVal = PyErr_SetFromWindowsErrWithFunction(rc,
1161 "PyRegEnumValue");
1162 goto fail;
1163 }
1164 obData = Reg2Py(retDataBuf, retDataSize, typ);
1165 if (obData == NULL) {
1166 retVal = NULL;
1167 goto fail;
1168 }
1169 retVal = Py_BuildValue("uOi", retValueBuf, obData, typ);
1170 Py_DECREF(obData);
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001171 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 PyMem_Free(retValueBuf);
1173 PyMem_Free(retDataBuf);
1174 return retVal;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001175}
1176
Zachary Warefd2d4822015-05-13 01:21:57 -05001177/*[clinic input]
1178winreg.ExpandEnvironmentStrings
1179
1180 string: Py_UNICODE
1181 /
1182
1183Expand environment vars.
1184[clinic start generated code]*/
1185
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001186static PyObject *
Serhiy Storchaka45a7b762018-12-14 11:56:48 +02001187winreg_ExpandEnvironmentStrings_impl(PyObject *module,
1188 const Py_UNICODE *string)
1189/*[clinic end generated code: output=8fa4e959747a7312 input=b2a9714d2b751aa6]*/
Christian Heimes2380ac72008-01-09 00:17:24 +00001190{
Victor Stinner9d3b93b2011-11-22 02:27:30 +01001191 wchar_t *retValue = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 DWORD retValueSize;
1193 DWORD rc;
1194 PyObject *o;
Christian Heimes2380ac72008-01-09 00:17:24 +00001195
Zachary Warefd2d4822015-05-13 01:21:57 -05001196 retValueSize = ExpandEnvironmentStringsW(string, retValue, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 if (retValueSize == 0) {
1198 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1199 "ExpandEnvironmentStrings");
1200 }
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001201 retValue = PyMem_New(wchar_t, retValueSize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 if (retValue == NULL) {
1203 return PyErr_NoMemory();
1204 }
Christian Heimes2380ac72008-01-09 00:17:24 +00001205
Zachary Warefd2d4822015-05-13 01:21:57 -05001206 rc = ExpandEnvironmentStringsW(string, retValue, retValueSize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 if (rc == 0) {
1208 PyMem_Free(retValue);
1209 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1210 "ExpandEnvironmentStrings");
1211 }
Victor Stinner9d3b93b2011-11-22 02:27:30 +01001212 o = PyUnicode_FromWideChar(retValue, wcslen(retValue));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 PyMem_Free(retValue);
1214 return o;
Christian Heimes2380ac72008-01-09 00:17:24 +00001215}
1216
Zachary Warefd2d4822015-05-13 01:21:57 -05001217/*[clinic input]
1218winreg.FlushKey
1219
1220 key: HKEY
1221 An already open key, or any one of the predefined HKEY_* constants.
1222 /
1223
1224Writes all the attributes of a key to the registry.
1225
1226It is not necessary to call FlushKey to change a key. Registry changes
1227are flushed to disk by the registry using its lazy flusher. Registry
1228changes are also flushed to disk at system shutdown. Unlike
1229CloseKey(), the FlushKey() method returns only when all the data has
1230been written to the registry.
1231
1232An application should only call FlushKey() if it requires absolute
1233certainty that registry changes are on disk. If you don't know whether
1234a FlushKey() call is required, it probably isn't.
1235[clinic start generated code]*/
1236
Christian Heimes2380ac72008-01-09 00:17:24 +00001237static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001238winreg_FlushKey_impl(PyObject *module, HKEY key)
1239/*[clinic end generated code: output=e6fc230d4c5dc049 input=f57457c12297d82f]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001241 long rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001243 rc = RegFlushKey(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 Py_END_ALLOW_THREADS
1245 if (rc != ERROR_SUCCESS)
1246 return PyErr_SetFromWindowsErrWithFunction(rc, "RegFlushKey");
Zachary Warefd2d4822015-05-13 01:21:57 -05001247 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001248}
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001249
Zachary Warefd2d4822015-05-13 01:21:57 -05001250
1251/*[clinic input]
1252winreg.LoadKey
1253
1254 key: HKEY
1255 An already open key, or any one of the predefined HKEY_* constants.
1256 sub_key: Py_UNICODE
1257 A string that identifies the sub-key to load.
1258 file_name: Py_UNICODE
1259 The name of the file to load registry data from. This file must
1260 have been created with the SaveKey() function. Under the file
1261 allocation table (FAT) file system, the filename may not have an
1262 extension.
1263 /
1264
1265Insert data into the registry from a file.
1266
1267Creates a subkey under the specified key and stores registration
1268information from a specified file into that subkey.
1269
1270A call to LoadKey() fails if the calling process does not have the
1271SE_RESTORE_PRIVILEGE privilege.
1272
1273If key is a handle returned by ConnectRegistry(), then the path
1274specified in fileName is relative to the remote computer.
1275
1276The MSDN docs imply key must be in the HKEY_USER or HKEY_LOCAL_MACHINE
1277tree.
1278[clinic start generated code]*/
1279
1280static PyObject *
Serhiy Storchaka45a7b762018-12-14 11:56:48 +02001281winreg_LoadKey_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key,
1282 const Py_UNICODE *file_name)
1283/*[clinic end generated code: output=65f89f2548cb27c7 input=e3b5b45ade311582]*/
Zachary Warefd2d4822015-05-13 01:21:57 -05001284{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 long rc;
Zachary Warefd2d4822015-05-13 01:21:57 -05001286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001288 rc = RegLoadKeyW(key, sub_key, file_name );
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 Py_END_ALLOW_THREADS
1290 if (rc != ERROR_SUCCESS)
1291 return PyErr_SetFromWindowsErrWithFunction(rc, "RegLoadKey");
Zachary Warefd2d4822015-05-13 01:21:57 -05001292 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001293}
1294
Zachary Warefd2d4822015-05-13 01:21:57 -05001295/*[clinic input]
1296winreg.OpenKey -> HKEY
1297
1298 key: HKEY
1299 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001300 sub_key: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001301 A string that identifies the sub_key to open.
1302 reserved: int = 0
1303 A reserved integer that must be zero. Default is zero.
1304 access: REGSAM(c_default='KEY_READ') = winreg.KEY_READ
1305 An integer that specifies an access mask that describes the desired
1306 security access for the key. Default is KEY_READ.
1307
1308Opens the specified key.
1309
1310The result is a new handle to the specified key.
1311If the function fails, an OSError exception is raised.
1312[clinic start generated code]*/
1313
1314static HKEY
Serhiy Storchaka45a7b762018-12-14 11:56:48 +02001315winreg_OpenKey_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key,
Zachary Ware77772c02015-05-13 10:58:35 -05001316 int reserved, REGSAM access)
Serhiy Storchaka45a7b762018-12-14 11:56:48 +02001317/*[clinic end generated code: output=8849bff2c30104ad input=098505ac36a9ae28]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001318{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 HKEY retKey;
1320 long rc;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001323 rc = RegOpenKeyExW(key, sub_key, reserved, access, &retKey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 Py_END_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001325 if (rc != ERROR_SUCCESS) {
1326 PyErr_SetFromWindowsErrWithFunction(rc, "RegOpenKeyEx");
1327 return NULL;
1328 }
1329 return retKey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001330}
1331
Zachary Warefd2d4822015-05-13 01:21:57 -05001332/*[clinic input]
1333winreg.OpenKeyEx = winreg.OpenKey
1334
1335Opens the specified key.
1336
1337The result is a new handle to the specified key.
1338If the function fails, an OSError exception is raised.
1339[clinic start generated code]*/
1340
1341static HKEY
Serhiy Storchaka45a7b762018-12-14 11:56:48 +02001342winreg_OpenKeyEx_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key,
Zachary Ware77772c02015-05-13 10:58:35 -05001343 int reserved, REGSAM access)
Serhiy Storchaka45a7b762018-12-14 11:56:48 +02001344/*[clinic end generated code: output=81bc2bd684bc77ae input=c6c4972af8622959]*/
Zachary Warefd2d4822015-05-13 01:21:57 -05001345{
1346 return winreg_OpenKey_impl(module, key, sub_key, reserved, access);
1347}
1348
1349/*[clinic input]
1350winreg.QueryInfoKey
1351
1352 key: HKEY
1353 An already open key, or any one of the predefined HKEY_* constants.
1354 /
1355
1356Returns information about a key.
1357
1358The result is a tuple of 3 items:
1359An integer that identifies the number of sub keys this key has.
1360An integer that identifies the number of values this key has.
1361An integer that identifies when the key was last modified (if available)
1362as 100's of nanoseconds since Jan 1, 1600.
1363[clinic start generated code]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001364
1365static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001366winreg_QueryInfoKey_impl(PyObject *module, HKEY key)
1367/*[clinic end generated code: output=dc657b8356a4f438 input=c3593802390cde1f]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001368{
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001369 long rc;
1370 DWORD nSubKeys, nValues;
1371 FILETIME ft;
1372 LARGE_INTEGER li;
1373 PyObject *l;
1374 PyObject *ret;
Zachary Warefd2d4822015-05-13 01:21:57 -05001375
1376 if ((rc = RegQueryInfoKey(key, NULL, NULL, 0, &nSubKeys, NULL, NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 &nValues, NULL, NULL, NULL, &ft))
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001378 != ERROR_SUCCESS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001379 return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryInfoKey");
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001380 li.LowPart = ft.dwLowDateTime;
1381 li.HighPart = ft.dwHighDateTime;
1382 l = PyLong_FromLongLong(li.QuadPart);
1383 if (l == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001385 ret = Py_BuildValue("iiO", nSubKeys, nValues, l);
1386 Py_DECREF(l);
1387 return ret;
1388}
1389
Zachary Warefd2d4822015-05-13 01:21:57 -05001390/*[clinic input]
1391winreg.QueryValue
1392
1393 key: HKEY
1394 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001395 sub_key: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001396 A string that holds the name of the subkey with which the value
1397 is associated. If this parameter is None or empty, the function
1398 retrieves the value set by the SetValue() method for the key
1399 identified by key.
1400 /
1401
1402Retrieves the unnamed value for a key.
1403
1404Values in the registry have name, type, and data components. This method
1405retrieves the data for a key's first value that has a NULL name.
1406But since the underlying API call doesn't return the type, you'll
1407probably be happier using QueryValueEx; this function is just here for
1408completeness.
1409[clinic start generated code]*/
1410
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001411static PyObject *
Serhiy Storchaka45a7b762018-12-14 11:56:48 +02001412winreg_QueryValue_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key)
1413/*[clinic end generated code: output=c655810ae50c63a9 input=41cafbbf423b21d6]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001414{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 long rc;
1416 PyObject *retStr;
1417 wchar_t *retBuf;
Brian Curtin60853212010-05-26 17:43:50 +00001418 DWORD bufSize = 0;
1419 DWORD retSize = 0;
1420 wchar_t *tmp;
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001421
Zachary Warefd2d4822015-05-13 01:21:57 -05001422 rc = RegQueryValueW(key, sub_key, NULL, &retSize);
Brian Curtin60853212010-05-26 17:43:50 +00001423 if (rc == ERROR_MORE_DATA)
1424 retSize = 256;
1425 else if (rc != ERROR_SUCCESS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 return PyErr_SetFromWindowsErrWithFunction(rc,
1427 "RegQueryValue");
Brian Curtin60853212010-05-26 17:43:50 +00001428
1429 bufSize = retSize;
1430 retBuf = (wchar_t *) PyMem_Malloc(bufSize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 if (retBuf == NULL)
1432 return PyErr_NoMemory();
Guido van Rossuma8c360e2007-07-17 20:50:43 +00001433
Brian Curtin60853212010-05-26 17:43:50 +00001434 while (1) {
1435 retSize = bufSize;
Zachary Warefd2d4822015-05-13 01:21:57 -05001436 rc = RegQueryValueW(key, sub_key, retBuf, &retSize);
Brian Curtin60853212010-05-26 17:43:50 +00001437 if (rc != ERROR_MORE_DATA)
1438 break;
1439
1440 bufSize *= 2;
1441 tmp = (wchar_t *) PyMem_Realloc(retBuf, bufSize);
1442 if (tmp == NULL) {
1443 PyMem_Free(retBuf);
1444 return PyErr_NoMemory();
1445 }
1446 retBuf = tmp;
1447 }
1448
1449 if (rc != ERROR_SUCCESS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 PyMem_Free(retBuf);
1451 return PyErr_SetFromWindowsErrWithFunction(rc,
1452 "RegQueryValue");
1453 }
Guido van Rossuma8c360e2007-07-17 20:50:43 +00001454
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001455 retStr = PyUnicode_FromWideChar(retBuf, wcslen(retBuf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 PyMem_Free(retBuf);
1457 return retStr;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001458}
1459
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001460
Zachary Warefd2d4822015-05-13 01:21:57 -05001461/*[clinic input]
1462winreg.QueryValueEx
1463
1464 key: HKEY
1465 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001466 name: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001467 A string indicating the value to query.
1468 /
1469
1470Retrieves the type and value of a specified sub-key.
1471
1472Behaves mostly like QueryValue(), but also returns the type of the
1473specified value name associated with the given open registry key.
1474
1475The return value is a tuple of the value and the type_id.
1476[clinic start generated code]*/
1477
1478static PyObject *
Serhiy Storchaka45a7b762018-12-14 11:56:48 +02001479winreg_QueryValueEx_impl(PyObject *module, HKEY key, const Py_UNICODE *name)
1480/*[clinic end generated code: output=f1b85b1c3d887ec7 input=cf366cada4836891]*/
Zachary Warefd2d4822015-05-13 01:21:57 -05001481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 long rc;
Brian Curtin60853212010-05-26 17:43:50 +00001483 BYTE *retBuf, *tmp;
1484 DWORD bufSize = 0, retSize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 DWORD typ;
1486 PyObject *obData;
1487 PyObject *result;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001488
Zachary Warefd2d4822015-05-13 01:21:57 -05001489 rc = RegQueryValueExW(key, name, NULL, NULL, NULL, &bufSize);
Brian Curtin60853212010-05-26 17:43:50 +00001490 if (rc == ERROR_MORE_DATA)
1491 bufSize = 256;
1492 else if (rc != ERROR_SUCCESS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 return PyErr_SetFromWindowsErrWithFunction(rc,
1494 "RegQueryValueEx");
1495 retBuf = (BYTE *)PyMem_Malloc(bufSize);
1496 if (retBuf == NULL)
1497 return PyErr_NoMemory();
Brian Curtin60853212010-05-26 17:43:50 +00001498
1499 while (1) {
1500 retSize = bufSize;
Zachary Warefd2d4822015-05-13 01:21:57 -05001501 rc = RegQueryValueExW(key, name, NULL, &typ,
Brian Curtin60853212010-05-26 17:43:50 +00001502 (BYTE *)retBuf, &retSize);
1503 if (rc != ERROR_MORE_DATA)
1504 break;
1505
1506 bufSize *= 2;
1507 tmp = (char *) PyMem_Realloc(retBuf, bufSize);
1508 if (tmp == NULL) {
1509 PyMem_Free(retBuf);
1510 return PyErr_NoMemory();
1511 }
1512 retBuf = tmp;
1513 }
1514
1515 if (rc != ERROR_SUCCESS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 PyMem_Free(retBuf);
1517 return PyErr_SetFromWindowsErrWithFunction(rc,
1518 "RegQueryValueEx");
1519 }
1520 obData = Reg2Py(retBuf, bufSize, typ);
1521 PyMem_Free(retBuf);
1522 if (obData == NULL)
1523 return NULL;
1524 result = Py_BuildValue("Oi", obData, typ);
1525 Py_DECREF(obData);
1526 return result;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001527}
1528
Zachary Warefd2d4822015-05-13 01:21:57 -05001529/*[clinic input]
1530winreg.SaveKey
1531
1532 key: HKEY
1533 An already open key, or any one of the predefined HKEY_* constants.
1534 file_name: Py_UNICODE
1535 The name of the file to save registry data to. This file cannot
1536 already exist. If this filename includes an extension, it cannot be
1537 used on file allocation table (FAT) file systems by the LoadKey(),
1538 ReplaceKey() or RestoreKey() methods.
1539 /
1540
1541Saves the specified key, and all its subkeys to the specified file.
1542
1543If key represents a key on a remote computer, the path described by
1544file_name is relative to the remote computer.
1545
1546The caller of this method must possess the SeBackupPrivilege
1547security privilege. This function passes NULL for security_attributes
1548to the API.
1549[clinic start generated code]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001550
1551static PyObject *
Serhiy Storchaka45a7b762018-12-14 11:56:48 +02001552winreg_SaveKey_impl(PyObject *module, HKEY key, const Py_UNICODE *file_name)
1553/*[clinic end generated code: output=ca94b835c88f112b input=da735241f91ac7a2]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001554{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 LPSECURITY_ATTRIBUTES pSA = NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 long rc;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001558/* One day we may get security into the core?
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 if (!PyWinObject_AsSECURITY_ATTRIBUTES(obSA, &pSA, TRUE))
1560 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001561*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001563 rc = RegSaveKeyW(key, file_name, pSA );
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 Py_END_ALLOW_THREADS
1565 if (rc != ERROR_SUCCESS)
1566 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSaveKey");
Zachary Warefd2d4822015-05-13 01:21:57 -05001567 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001568}
1569
Zachary Warefd2d4822015-05-13 01:21:57 -05001570/*[clinic input]
1571winreg.SetValue
1572
1573 key: HKEY
1574 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001575 sub_key: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001576 A string that names the subkey with which the value is associated.
1577 type: DWORD
1578 An integer that specifies the type of the data. Currently this must
1579 be REG_SZ, meaning only strings are supported.
Zachary Ware77772c02015-05-13 10:58:35 -05001580 value: Py_UNICODE(zeroes=True)
Zachary Warefd2d4822015-05-13 01:21:57 -05001581 A string that specifies the new value.
1582 /
1583
1584Associates a value with a specified key.
1585
1586If the key specified by the sub_key parameter does not exist, the
1587SetValue function creates it.
1588
1589Value lengths are limited by available memory. Long values (more than
15902048 bytes) should be stored as files with the filenames stored in
1591the configuration registry to help the registry perform efficiently.
1592
1593The key identified by the key parameter must have been opened with
1594KEY_SET_VALUE access.
1595[clinic start generated code]*/
1596
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001597static PyObject *
Serhiy Storchaka45a7b762018-12-14 11:56:48 +02001598winreg_SetValue_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key,
1599 DWORD type, const Py_UNICODE *value,
Zachary Ware77772c02015-05-13 10:58:35 -05001600 Py_ssize_clean_t value_length)
Serhiy Storchaka45a7b762018-12-14 11:56:48 +02001601/*[clinic end generated code: output=686bedb1cbb4367b input=2cd2adab79339c53]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001602{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 long rc;
Zachary Warefd2d4822015-05-13 01:21:57 -05001604
1605 if (type != REG_SZ) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 PyErr_SetString(PyExc_TypeError,
1607 "Type must be winreg.REG_SZ");
1608 return NULL;
1609 }
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001611 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001612 rc = RegSetValueW(key, sub_key, REG_SZ, value, value_length+1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 Py_END_ALLOW_THREADS
1614 if (rc != ERROR_SUCCESS)
1615 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSetValue");
Zachary Warefd2d4822015-05-13 01:21:57 -05001616 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001617}
1618
Zachary Warefd2d4822015-05-13 01:21:57 -05001619/*[clinic input]
1620winreg.SetValueEx
1621
1622 key: HKEY
1623 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001624 value_name: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001625 A string containing the name of the value to set, or None.
1626 reserved: object
1627 Can be anything - zero is always passed to the API.
1628 type: DWORD
1629 An integer that specifies the type of the data, one of:
1630 REG_BINARY -- Binary data in any form.
1631 REG_DWORD -- A 32-bit number.
Steve Dower80ac11d2016-05-24 15:42:04 -07001632 REG_DWORD_LITTLE_ENDIAN -- A 32-bit number in little-endian format. Equivalent to REG_DWORD
Zachary Warefd2d4822015-05-13 01:21:57 -05001633 REG_DWORD_BIG_ENDIAN -- A 32-bit number in big-endian format.
1634 REG_EXPAND_SZ -- A null-terminated string that contains unexpanded
1635 references to environment variables (for example,
1636 %PATH%).
1637 REG_LINK -- A Unicode symbolic link.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03001638 REG_MULTI_SZ -- A sequence of null-terminated strings, terminated
Zachary Warefd2d4822015-05-13 01:21:57 -05001639 by two null characters. Note that Python handles
1640 this termination automatically.
1641 REG_NONE -- No defined value type.
Steve Dower80ac11d2016-05-24 15:42:04 -07001642 REG_QWORD -- A 64-bit number.
1643 REG_QWORD_LITTLE_ENDIAN -- A 64-bit number in little-endian format. Equivalent to REG_QWORD.
Zachary Warefd2d4822015-05-13 01:21:57 -05001644 REG_RESOURCE_LIST -- A device-driver resource list.
1645 REG_SZ -- A null-terminated string.
1646 value: object
1647 A string that specifies the new value.
1648 /
1649
1650Stores data in the value field of an open registry key.
1651
1652This method can also set additional value and type information for the
1653specified key. The key identified by the key parameter must have been
1654opened with KEY_SET_VALUE access.
1655
1656To open the key, use the CreateKeyEx() or OpenKeyEx() methods.
1657
1658Value lengths are limited by available memory. Long values (more than
16592048 bytes) should be stored as files with the filenames stored in
1660the configuration registry to help the registry perform efficiently.
1661[clinic start generated code]*/
1662
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001663static PyObject *
Serhiy Storchaka45a7b762018-12-14 11:56:48 +02001664winreg_SetValueEx_impl(PyObject *module, HKEY key,
1665 const Py_UNICODE *value_name, PyObject *reserved,
1666 DWORD type, PyObject *value)
1667/*[clinic end generated code: output=811b769a66ae11b7 input=900a9e3990bfb196]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001668{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 BYTE *data;
1670 DWORD len;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 LONG rc;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001673
Zachary Warefd2d4822015-05-13 01:21:57 -05001674 if (!Py2Reg(value, type, &data, &len))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 {
1676 if (!PyErr_Occurred())
1677 PyErr_SetString(PyExc_ValueError,
1678 "Could not convert the data to the specified type.");
1679 return NULL;
1680 }
1681 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001682 rc = RegSetValueExW(key, value_name, 0, type, data, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 Py_END_ALLOW_THREADS
1684 PyMem_DEL(data);
1685 if (rc != ERROR_SUCCESS)
1686 return PyErr_SetFromWindowsErrWithFunction(rc,
1687 "RegSetValueEx");
Zachary Warefd2d4822015-05-13 01:21:57 -05001688 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001689}
1690
Zachary Warefd2d4822015-05-13 01:21:57 -05001691/*[clinic input]
1692winreg.DisableReflectionKey
1693
1694 key: HKEY
1695 An already open key, or any one of the predefined HKEY_* constants.
1696 /
1697
1698Disables registry reflection for 32bit processes running on a 64bit OS.
1699
1700Will generally raise NotImplemented if executed on a 32bit OS.
1701
1702If the key is not on the reflection list, the function succeeds but has
1703no effect. Disabling reflection for a key does not affect reflection
1704of any subkeys.
1705[clinic start generated code]*/
1706
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001707static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001708winreg_DisableReflectionKey_impl(PyObject *module, HKEY key)
1709/*[clinic end generated code: output=830cce504cc764b4 input=a6c9e5ca5410193c]*/
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001710{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 HMODULE hMod;
1712 typedef LONG (WINAPI *RDRKFunc)(HKEY);
1713 RDRKFunc pfn = NULL;
1714 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 /* Only available on 64bit platforms, so we must load it
1717 dynamically.*/
Martin v. Löwis50590f12012-01-14 17:54:09 +01001718 hMod = GetModuleHandleW(L"advapi32.dll");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 if (hMod)
1720 pfn = (RDRKFunc)GetProcAddress(hMod,
1721 "RegDisableReflectionKey");
1722 if (!pfn) {
1723 PyErr_SetString(PyExc_NotImplementedError,
1724 "not implemented on this platform");
1725 return NULL;
1726 }
1727 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001728 rc = (*pfn)(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 Py_END_ALLOW_THREADS
1730 if (rc != ERROR_SUCCESS)
1731 return PyErr_SetFromWindowsErrWithFunction(rc,
1732 "RegDisableReflectionKey");
Zachary Warefd2d4822015-05-13 01:21:57 -05001733 Py_RETURN_NONE;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001734}
1735
Zachary Warefd2d4822015-05-13 01:21:57 -05001736/*[clinic input]
1737winreg.EnableReflectionKey
1738
1739 key: HKEY
1740 An already open key, or any one of the predefined HKEY_* constants.
1741 /
1742
1743Restores registry reflection for the specified disabled key.
1744
1745Will generally raise NotImplemented if executed on a 32bit OS.
1746Restoring reflection for a key does not affect reflection of any
1747subkeys.
1748[clinic start generated code]*/
1749
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001750static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001751winreg_EnableReflectionKey_impl(PyObject *module, HKEY key)
1752/*[clinic end generated code: output=86fa1385fdd9ce57 input=7748abbacd1e166a]*/
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001753{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 HMODULE hMod;
1755 typedef LONG (WINAPI *RERKFunc)(HKEY);
1756 RERKFunc pfn = NULL;
1757 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 /* Only available on 64bit platforms, so we must load it
1760 dynamically.*/
Martin v. Löwis50590f12012-01-14 17:54:09 +01001761 hMod = GetModuleHandleW(L"advapi32.dll");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 if (hMod)
1763 pfn = (RERKFunc)GetProcAddress(hMod,
1764 "RegEnableReflectionKey");
1765 if (!pfn) {
1766 PyErr_SetString(PyExc_NotImplementedError,
1767 "not implemented on this platform");
1768 return NULL;
1769 }
1770 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001771 rc = (*pfn)(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 Py_END_ALLOW_THREADS
1773 if (rc != ERROR_SUCCESS)
1774 return PyErr_SetFromWindowsErrWithFunction(rc,
1775 "RegEnableReflectionKey");
Zachary Warefd2d4822015-05-13 01:21:57 -05001776 Py_RETURN_NONE;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001777}
1778
Zachary Warefd2d4822015-05-13 01:21:57 -05001779/*[clinic input]
1780winreg.QueryReflectionKey
1781
1782 key: HKEY
1783 An already open key, or any one of the predefined HKEY_* constants.
1784 /
1785
1786Returns the reflection state for the specified key as a bool.
1787
1788Will generally raise NotImplemented if executed on a 32bit OS.
1789[clinic start generated code]*/
1790
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001791static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001792winreg_QueryReflectionKey_impl(PyObject *module, HKEY key)
1793/*[clinic end generated code: output=4e774af288c3ebb9 input=9f325eacb5a65d88]*/
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001794{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 HMODULE hMod;
1796 typedef LONG (WINAPI *RQRKFunc)(HKEY, BOOL *);
1797 RQRKFunc pfn = NULL;
1798 BOOL result;
1799 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 /* Only available on 64bit platforms, so we must load it
1802 dynamically.*/
Martin v. Löwis50590f12012-01-14 17:54:09 +01001803 hMod = GetModuleHandleW(L"advapi32.dll");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 if (hMod)
1805 pfn = (RQRKFunc)GetProcAddress(hMod,
1806 "RegQueryReflectionKey");
1807 if (!pfn) {
1808 PyErr_SetString(PyExc_NotImplementedError,
1809 "not implemented on this platform");
1810 return NULL;
1811 }
1812 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001813 rc = (*pfn)(key, &result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 Py_END_ALLOW_THREADS
1815 if (rc != ERROR_SUCCESS)
1816 return PyErr_SetFromWindowsErrWithFunction(rc,
1817 "RegQueryReflectionKey");
1818 return PyBool_FromLong(result);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001819}
1820
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001821static struct PyMethodDef winreg_methods[] = {
Zachary Warefd2d4822015-05-13 01:21:57 -05001822 WINREG_CLOSEKEY_METHODDEF
1823 WINREG_CONNECTREGISTRY_METHODDEF
1824 WINREG_CREATEKEY_METHODDEF
1825 WINREG_CREATEKEYEX_METHODDEF
1826 WINREG_DELETEKEY_METHODDEF
1827 WINREG_DELETEKEYEX_METHODDEF
1828 WINREG_DELETEVALUE_METHODDEF
1829 WINREG_DISABLEREFLECTIONKEY_METHODDEF
1830 WINREG_ENABLEREFLECTIONKEY_METHODDEF
1831 WINREG_ENUMKEY_METHODDEF
1832 WINREG_ENUMVALUE_METHODDEF
1833 WINREG_EXPANDENVIRONMENTSTRINGS_METHODDEF
1834 WINREG_FLUSHKEY_METHODDEF
1835 WINREG_LOADKEY_METHODDEF
1836 WINREG_OPENKEY_METHODDEF
1837 WINREG_OPENKEYEX_METHODDEF
1838 WINREG_QUERYVALUE_METHODDEF
1839 WINREG_QUERYVALUEEX_METHODDEF
1840 WINREG_QUERYINFOKEY_METHODDEF
1841 WINREG_QUERYREFLECTIONKEY_METHODDEF
1842 WINREG_SAVEKEY_METHODDEF
1843 WINREG_SETVALUE_METHODDEF
1844 WINREG_SETVALUEEX_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001845 NULL,
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001846};
1847
1848static void
1849insint(PyObject * d, char * name, long value)
1850{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 PyObject *v = PyLong_FromLong(value);
1852 if (!v || PyDict_SetItemString(d, name, v))
1853 PyErr_Clear();
1854 Py_XDECREF(v);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001855}
1856
1857#define ADD_INT(val) insint(d, #val, val)
1858
1859static void
1860inskey(PyObject * d, char * name, HKEY key)
1861{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 PyObject *v = PyLong_FromVoidPtr(key);
1863 if (!v || PyDict_SetItemString(d, name, v))
1864 PyErr_Clear();
1865 Py_XDECREF(v);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001866}
1867
1868#define ADD_KEY(val) inskey(d, #val, val)
1869
Martin v. Löwis1a214512008-06-11 05:26:20 +00001870
1871static struct PyModuleDef winregmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 PyModuleDef_HEAD_INIT,
1873 "winreg",
1874 module_doc,
1875 -1,
1876 winreg_methods,
1877 NULL,
1878 NULL,
1879 NULL,
1880 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001881};
1882
1883PyMODINIT_FUNC PyInit_winreg(void)
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001884{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 PyObject *m, *d;
1886 m = PyModule_Create(&winregmodule);
1887 if (m == NULL)
1888 return NULL;
1889 d = PyModule_GetDict(m);
1890 PyHKEY_Type.tp_doc = PyHKEY_doc;
1891 if (PyType_Ready(&PyHKEY_Type) < 0)
1892 return NULL;
1893 Py_INCREF(&PyHKEY_Type);
1894 if (PyDict_SetItemString(d, "HKEYType",
1895 (PyObject *)&PyHKEY_Type) != 0)
1896 return NULL;
Andrew Svetlov2606a6f2012-12-19 14:33:35 +02001897 Py_INCREF(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 if (PyDict_SetItemString(d, "error",
Andrew Svetlov2606a6f2012-12-19 14:33:35 +02001899 PyExc_OSError) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001900 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 /* Add the relevant constants */
1903 ADD_KEY(HKEY_CLASSES_ROOT);
1904 ADD_KEY(HKEY_CURRENT_USER);
1905 ADD_KEY(HKEY_LOCAL_MACHINE);
1906 ADD_KEY(HKEY_USERS);
1907 ADD_KEY(HKEY_PERFORMANCE_DATA);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001908#ifdef HKEY_CURRENT_CONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001909 ADD_KEY(HKEY_CURRENT_CONFIG);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001910#endif
1911#ifdef HKEY_DYN_DATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 ADD_KEY(HKEY_DYN_DATA);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001913#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 ADD_INT(KEY_QUERY_VALUE);
1915 ADD_INT(KEY_SET_VALUE);
1916 ADD_INT(KEY_CREATE_SUB_KEY);
1917 ADD_INT(KEY_ENUMERATE_SUB_KEYS);
1918 ADD_INT(KEY_NOTIFY);
1919 ADD_INT(KEY_CREATE_LINK);
1920 ADD_INT(KEY_READ);
1921 ADD_INT(KEY_WRITE);
1922 ADD_INT(KEY_EXECUTE);
1923 ADD_INT(KEY_ALL_ACCESS);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001924#ifdef KEY_WOW64_64KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 ADD_INT(KEY_WOW64_64KEY);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001926#endif
1927#ifdef KEY_WOW64_32KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 ADD_INT(KEY_WOW64_32KEY);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001929#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001930 ADD_INT(REG_OPTION_RESERVED);
1931 ADD_INT(REG_OPTION_NON_VOLATILE);
1932 ADD_INT(REG_OPTION_VOLATILE);
1933 ADD_INT(REG_OPTION_CREATE_LINK);
1934 ADD_INT(REG_OPTION_BACKUP_RESTORE);
1935 ADD_INT(REG_OPTION_OPEN_LINK);
1936 ADD_INT(REG_LEGAL_OPTION);
1937 ADD_INT(REG_CREATED_NEW_KEY);
1938 ADD_INT(REG_OPENED_EXISTING_KEY);
1939 ADD_INT(REG_WHOLE_HIVE_VOLATILE);
1940 ADD_INT(REG_REFRESH_HIVE);
1941 ADD_INT(REG_NO_LAZY_FLUSH);
1942 ADD_INT(REG_NOTIFY_CHANGE_NAME);
1943 ADD_INT(REG_NOTIFY_CHANGE_ATTRIBUTES);
1944 ADD_INT(REG_NOTIFY_CHANGE_LAST_SET);
1945 ADD_INT(REG_NOTIFY_CHANGE_SECURITY);
1946 ADD_INT(REG_LEGAL_CHANGE_FILTER);
1947 ADD_INT(REG_NONE);
1948 ADD_INT(REG_SZ);
1949 ADD_INT(REG_EXPAND_SZ);
1950 ADD_INT(REG_BINARY);
1951 ADD_INT(REG_DWORD);
1952 ADD_INT(REG_DWORD_LITTLE_ENDIAN);
1953 ADD_INT(REG_DWORD_BIG_ENDIAN);
Steve Dower80ac11d2016-05-24 15:42:04 -07001954 ADD_INT(REG_QWORD);
1955 ADD_INT(REG_QWORD_LITTLE_ENDIAN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 ADD_INT(REG_LINK);
1957 ADD_INT(REG_MULTI_SZ);
1958 ADD_INT(REG_RESOURCE_LIST);
1959 ADD_INT(REG_FULL_RESOURCE_DESCRIPTOR);
1960 ADD_INT(REG_RESOURCE_REQUIREMENTS_LIST);
1961 return m;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001962}
1963
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001964