blob: 9524838c087f75d6449646d48c10e4ea9063b75e [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 {
722 /* the buffer may or may not have a trailing NULL */
723 wchar_t *data = (wchar_t *)retDataBuf;
724 int len = retDataSize / 2;
725 if (retDataSize && data[len-1] == '\0')
726 retDataSize -= 2;
727 if (retDataSize <= 0)
728 data = L"";
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200729 obData = PyUnicode_FromWideChar(data, retDataSize/2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 break;
731 }
732 case REG_MULTI_SZ:
733 if (retDataSize == 0)
734 obData = PyList_New(0);
735 else
736 {
737 int index = 0;
738 wchar_t *data = (wchar_t *)retDataBuf;
739 int len = retDataSize / 2;
740 int s = countStrings(data, len);
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +0200741 wchar_t **str = PyMem_New(wchar_t *, s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 if (str == NULL)
743 return PyErr_NoMemory();
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 fixupMultiSZ(str, data, len);
746 obData = PyList_New(s);
Jesus Cea782c4cf2014-03-13 17:35:32 +0100747 if (obData == NULL) {
Victor Stinner9cb1ec52014-03-13 19:08:10 +0100748 PyMem_Free(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 return NULL;
Jesus Cea782c4cf2014-03-13 17:35:32 +0100750 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 for (index = 0; index < s; index++)
752 {
753 size_t len = wcslen(str[index]);
754 if (len > INT_MAX) {
755 PyErr_SetString(PyExc_OverflowError,
756 "registry string is too long for a Python string");
757 Py_DECREF(obData);
Victor Stinner9cb1ec52014-03-13 19:08:10 +0100758 PyMem_Free(str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000759 return NULL;
760 }
761 PyList_SetItem(obData,
762 index,
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200763 PyUnicode_FromWideChar(str[index], len));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 }
Victor Stinnerb6404912013-07-07 16:21:41 +0200765 PyMem_Free(str);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 break;
768 }
769 case REG_BINARY:
770 /* ALSO handle ALL unknown data types here. Even if we can't
771 support it natively, we should handle the bits. */
772 default:
773 if (retDataSize == 0) {
774 Py_INCREF(Py_None);
775 obData = Py_None;
776 }
777 else
778 obData = PyBytes_FromStringAndSize(
779 (char *)retDataBuf, retDataSize);
780 break;
781 }
782 return obData;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000783}
784
785/* The Python methods */
786
Zachary Warefd2d4822015-05-13 01:21:57 -0500787/*[clinic input]
788winreg.CloseKey
789
790 hkey: object
791 A previously opened key.
792 /
793
794Closes a previously opened registry key.
795
796Note that if the key is not closed using this method, it will be
797closed when the hkey object is destroyed by Python.
798[clinic start generated code]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000799
800static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300801winreg_CloseKey(PyObject *module, PyObject *hkey)
802/*[clinic end generated code: output=a4fa537019a80d15 input=5b1aac65ba5127ad]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000803{
Zachary Warefd2d4822015-05-13 01:21:57 -0500804 if (!PyHKEY_Close(hkey))
805 return NULL;
806 Py_RETURN_NONE;
807}
808
809/*[clinic input]
810winreg.ConnectRegistry -> HKEY
811
Zachary Ware77772c02015-05-13 10:58:35 -0500812 computer_name: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -0500813 The name of the remote computer, of the form r"\\computername". If
814 None, the local computer is used.
815 key: HKEY
816 The predefined key to connect to.
817 /
818
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300819Establishes a connection to the registry on another computer.
Zachary Warefd2d4822015-05-13 01:21:57 -0500820
821The return value is the handle of the opened key.
822If the function fails, an OSError exception is raised.
823[clinic start generated code]*/
824
825static HKEY
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300826winreg_ConnectRegistry_impl(PyObject *module, Py_UNICODE *computer_name,
Zachary Ware77772c02015-05-13 10:58:35 -0500827 HKEY key)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300828/*[clinic end generated code: output=5ab79d02aa3167b4 input=5f98a891a347e68e]*/
Zachary Warefd2d4822015-05-13 01:21:57 -0500829{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 HKEY retKey;
831 long rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -0500833 rc = RegConnectRegistryW(computer_name, key, &retKey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 Py_END_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -0500835 if (rc != ERROR_SUCCESS) {
836 PyErr_SetFromWindowsErrWithFunction(rc, "ConnectRegistry");
837 return NULL;
838 }
839 return retKey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000840}
841
Zachary Warefd2d4822015-05-13 01:21:57 -0500842/*[clinic input]
843winreg.CreateKey -> HKEY
844
845 key: HKEY
846 An already open key, or one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -0500847 sub_key: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -0500848 The name of the key this method opens or creates.
849 /
850
851Creates or opens the specified key.
852
853If key is one of the predefined keys, sub_key may be None. In that case,
854the handle returned is the same key handle passed in to the function.
855
856If the key already exists, this function opens the existing key.
857
858The return value is the handle of the opened key.
859If the function fails, an OSError exception is raised.
860[clinic start generated code]*/
861
862static HKEY
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300863winreg_CreateKey_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key)
864/*[clinic end generated code: output=9c81d4095527c927 input=3cdd1622488acea2]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000865{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 HKEY retKey;
867 long rc;
Zachary Warefd2d4822015-05-13 01:21:57 -0500868
869 rc = RegCreateKeyW(key, sub_key, &retKey);
870 if (rc != ERROR_SUCCESS) {
871 PyErr_SetFromWindowsErrWithFunction(rc, "CreateKey");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 return NULL;
Zachary Warefd2d4822015-05-13 01:21:57 -0500873 }
874 return retKey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000875}
876
Zachary Warefd2d4822015-05-13 01:21:57 -0500877/*[clinic input]
878winreg.CreateKeyEx -> HKEY
879
880 key: HKEY
881 An already open key, or one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -0500882 sub_key: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -0500883 The name of the key this method opens or creates.
884 reserved: int = 0
885 A reserved integer, and must be zero. Default is zero.
886 access: REGSAM(c_default='KEY_WRITE') = winreg.KEY_WRITE
887 An integer that specifies an access mask that describes the
888 desired security access for the key. Default is KEY_WRITE.
889
890Creates or opens the specified key.
891
892If key is one of the predefined keys, sub_key may be None. In that case,
893the handle returned is the same key handle passed in to the function.
894
895If the key already exists, this function opens the existing key
896
897The return value is the handle of the opened key.
898If the function fails, an OSError exception is raised.
899[clinic start generated code]*/
900
901static HKEY
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300902winreg_CreateKeyEx_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
Zachary Ware77772c02015-05-13 10:58:35 -0500903 int reserved, REGSAM access)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300904/*[clinic end generated code: output=b9fce6dc5c4e39b1 input=42c2b03f98406b66]*/
Brian Curtin3035c392010-04-21 23:56:21 +0000905{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 HKEY retKey;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 long rc;
Brian Curtin1771b542010-09-27 17:56:36 +0000908
Zachary Warefd2d4822015-05-13 01:21:57 -0500909 rc = RegCreateKeyExW(key, sub_key, reserved, NULL, (DWORD)NULL,
Brian Curtin1771b542010-09-27 17:56:36 +0000910 access, NULL, &retKey, NULL);
Zachary Warefd2d4822015-05-13 01:21:57 -0500911 if (rc != ERROR_SUCCESS) {
912 PyErr_SetFromWindowsErrWithFunction(rc, "CreateKeyEx");
913 return NULL;
914 }
915 return retKey;
Brian Curtin3035c392010-04-21 23:56:21 +0000916}
917
Zachary Warefd2d4822015-05-13 01:21:57 -0500918/*[clinic input]
919winreg.DeleteKey
920 key: HKEY
921 An already open key, or any one of the predefined HKEY_* constants.
922 sub_key: Py_UNICODE
923 A string that must be the name of a subkey of the key identified by
924 the key parameter. This value must not be None, and the key may not
925 have subkeys.
926 /
927
928Deletes the specified key.
929
930This method can not delete keys with subkeys.
931
932If the function succeeds, the entire key, including all of its values,
933is removed. If the function fails, an OSError exception is raised.
934[clinic start generated code]*/
935
Brian Curtin3035c392010-04-21 23:56:21 +0000936static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300937winreg_DeleteKey_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key)
938/*[clinic end generated code: output=7734b1e431991ae4 input=b31d225b935e4211]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000939{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 long rc;
Zachary Warefd2d4822015-05-13 01:21:57 -0500941 rc = RegDeleteKeyW(key, sub_key );
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 if (rc != ERROR_SUCCESS)
943 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKey");
Zachary Warefd2d4822015-05-13 01:21:57 -0500944 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000945}
946
Zachary Warefd2d4822015-05-13 01:21:57 -0500947/*[clinic input]
948winreg.DeleteKeyEx
949
950 key: HKEY
951 An already open key, or any one of the predefined HKEY_* constants.
952 sub_key: Py_UNICODE
953 A string that must be the name of a subkey of the key identified by
954 the key parameter. This value must not be None, and the key may not
955 have subkeys.
956 access: REGSAM(c_default='KEY_WOW64_64KEY') = winreg.KEY_WOW64_64KEY
957 An integer that specifies an access mask that describes the
958 desired security access for the key. Default is KEY_WOW64_64KEY.
959 reserved: int = 0
960 A reserved integer, and must be zero. Default is zero.
961
962Deletes the specified key (64-bit OS only).
963
964This method can not delete keys with subkeys.
965
966If the function succeeds, the entire key, including all of its values,
967is removed. If the function fails, an OSError exception is raised.
968On unsupported Windows versions, NotImplementedError is raised.
969[clinic start generated code]*/
970
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000971static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300972winreg_DeleteKeyEx_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
Zachary Ware77772c02015-05-13 10:58:35 -0500973 REGSAM access, int reserved)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +0300974/*[clinic end generated code: output=01378d86ad3eb936 input=711d9d89e7ecbed7]*/
Brian Curtin3035c392010-04-21 23:56:21 +0000975{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 HMODULE hMod;
977 typedef LONG (WINAPI *RDKEFunc)(HKEY, const wchar_t*, REGSAM, int);
978 RDKEFunc pfn = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 long rc;
Brian Curtin3035c392010-04-21 23:56:21 +0000980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000981 /* Only available on 64bit platforms, so we must load it
982 dynamically. */
Martin v. Löwis50590f12012-01-14 17:54:09 +0100983 hMod = GetModuleHandleW(L"advapi32.dll");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 if (hMod)
985 pfn = (RDKEFunc)GetProcAddress(hMod,
986 "RegDeleteKeyExW");
987 if (!pfn) {
988 PyErr_SetString(PyExc_NotImplementedError,
989 "not implemented on this platform");
990 return NULL;
991 }
992 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -0500993 rc = (*pfn)(key, sub_key, access, reserved);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 Py_END_ALLOW_THREADS
Brian Curtin3035c392010-04-21 23:56:21 +0000995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 if (rc != ERROR_SUCCESS)
997 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKeyEx");
Zachary Warefd2d4822015-05-13 01:21:57 -0500998 Py_RETURN_NONE;
Brian Curtin3035c392010-04-21 23:56:21 +0000999}
1000
Zachary Warefd2d4822015-05-13 01:21:57 -05001001/*[clinic input]
1002winreg.DeleteValue
1003
1004 key: HKEY
1005 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001006 value: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001007 A string that identifies the value to remove.
1008 /
1009
1010Removes a named value from a registry key.
1011[clinic start generated code]*/
1012
Brian Curtin3035c392010-04-21 23:56:21 +00001013static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001014winreg_DeleteValue_impl(PyObject *module, HKEY key, Py_UNICODE *value)
1015/*[clinic end generated code: output=67e7e9a514f84951 input=a78d3407a4197b21]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001016{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 long rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001019 rc = RegDeleteValueW(key, value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 Py_END_ALLOW_THREADS
1021 if (rc !=ERROR_SUCCESS)
1022 return PyErr_SetFromWindowsErrWithFunction(rc,
1023 "RegDeleteValue");
Zachary Warefd2d4822015-05-13 01:21:57 -05001024 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001025}
1026
Zachary Warefd2d4822015-05-13 01:21:57 -05001027/*[clinic input]
1028winreg.EnumKey
1029
1030 key: HKEY
1031 An already open key, or any one of the predefined HKEY_* constants.
1032 index: int
1033 An integer that identifies the index of the key to retrieve.
1034 /
1035
1036Enumerates subkeys of an open registry key.
1037
1038The function retrieves the name of one subkey each time it is called.
1039It is typically called repeatedly until an OSError exception is
1040raised, indicating no more values are available.
1041[clinic start generated code]*/
1042
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001043static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001044winreg_EnumKey_impl(PyObject *module, HKEY key, int index)
1045/*[clinic end generated code: output=25a6ec52cd147bc4 input=fad9a7c00ab0e04b]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001046{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 long rc;
1048 PyObject *retStr;
Brian Curtin60853212010-05-26 17:43:50 +00001049
1050 /* The Windows docs claim that the max key name length is 255
1051 * characters, plus a terminating nul character. However,
1052 * empirical testing demonstrates that it is possible to
1053 * create a 256 character key that is missing the terminating
1054 * nul. RegEnumKeyEx requires a 257 character buffer to
1055 * retrieve such a key name. */
1056 wchar_t tmpbuf[257];
Kristján Valur Jónsson984dfa72012-04-02 15:23:29 +00001057 DWORD len = sizeof(tmpbuf)/sizeof(wchar_t); /* includes NULL terminator */
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001060 rc = RegEnumKeyExW(key, index, tmpbuf, &len, NULL, NULL, NULL, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 Py_END_ALLOW_THREADS
1062 if (rc != ERROR_SUCCESS)
1063 return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKeyEx");
Tim Peters313fcd42006-02-19 04:05:39 +00001064
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001065 retStr = PyUnicode_FromWideChar(tmpbuf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001066 return retStr; /* can be NULL */
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001067}
1068
Zachary Warefd2d4822015-05-13 01:21:57 -05001069/*[clinic input]
1070winreg.EnumValue
1071
1072 key: HKEY
1073 An already open key, or any one of the predefined HKEY_* constants.
1074 index: int
1075 An integer that identifies the index of the value to retrieve.
1076 /
1077
1078Enumerates values of an open registry key.
1079
1080The function retrieves the name of one subkey each time it is called.
1081It is typically called repeatedly, until an OSError exception
1082is raised, indicating no more values.
1083
1084The result is a tuple of 3 items:
1085 value_name
1086 A string that identifies the value.
1087 value_data
1088 An object that holds the value data, and whose type depends
1089 on the underlying registry type.
1090 data_type
1091 An integer that identifies the type of the value data.
1092[clinic start generated code]*/
1093
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001094static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001095winreg_EnumValue_impl(PyObject *module, HKEY key, int index)
1096/*[clinic end generated code: output=d363b5a06f8789ac input=4414f47a6fb238b5]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001097{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 long rc;
1099 wchar_t *retValueBuf;
Amaury Forgeot d'Arcf2b69df2010-08-16 22:11:29 +00001100 BYTE *tmpBuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 BYTE *retDataBuf;
Brian Curtin60853212010-05-26 17:43:50 +00001102 DWORD retValueSize, bufValueSize;
1103 DWORD retDataSize, bufDataSize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 DWORD typ;
1105 PyObject *obData;
1106 PyObject *retVal;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001107
Zachary Warefd2d4822015-05-13 01:21:57 -05001108 if ((rc = RegQueryInfoKeyW(key, NULL, NULL, NULL, NULL, NULL, NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 NULL,
1110 &retValueSize, &retDataSize, NULL, NULL))
1111 != ERROR_SUCCESS)
1112 return PyErr_SetFromWindowsErrWithFunction(rc,
1113 "RegQueryInfoKey");
1114 ++retValueSize; /* include null terminators */
1115 ++retDataSize;
Brian Curtin60853212010-05-26 17:43:50 +00001116 bufDataSize = retDataSize;
1117 bufValueSize = retValueSize;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001118 retValueBuf = PyMem_New(wchar_t, retValueSize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 if (retValueBuf == NULL)
1120 return PyErr_NoMemory();
1121 retDataBuf = (BYTE *)PyMem_Malloc(retDataSize);
1122 if (retDataBuf == NULL) {
1123 PyMem_Free(retValueBuf);
1124 return PyErr_NoMemory();
1125 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001126
Brian Curtin60853212010-05-26 17:43:50 +00001127 while (1) {
Brian Curtin60853212010-05-26 17:43:50 +00001128 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001129 rc = RegEnumValueW(key,
Brian Curtin60853212010-05-26 17:43:50 +00001130 index,
1131 retValueBuf,
1132 &retValueSize,
1133 NULL,
1134 &typ,
1135 (BYTE *)retDataBuf,
1136 &retDataSize);
1137 Py_END_ALLOW_THREADS
1138
1139 if (rc != ERROR_MORE_DATA)
1140 break;
1141
1142 bufDataSize *= 2;
Amaury Forgeot d'Arcf2b69df2010-08-16 22:11:29 +00001143 tmpBuf = (BYTE *)PyMem_Realloc(retDataBuf, bufDataSize);
Brian Curtin9b7e2d12010-06-08 20:57:52 +00001144 if (tmpBuf == NULL) {
Brian Curtin60853212010-05-26 17:43:50 +00001145 PyErr_NoMemory();
1146 retVal = NULL;
1147 goto fail;
1148 }
Brian Curtin9b7e2d12010-06-08 20:57:52 +00001149 retDataBuf = tmpBuf;
Brian Curtin60853212010-05-26 17:43:50 +00001150 retDataSize = bufDataSize;
1151 retValueSize = bufValueSize;
1152 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 if (rc != ERROR_SUCCESS) {
1155 retVal = PyErr_SetFromWindowsErrWithFunction(rc,
1156 "PyRegEnumValue");
1157 goto fail;
1158 }
1159 obData = Reg2Py(retDataBuf, retDataSize, typ);
1160 if (obData == NULL) {
1161 retVal = NULL;
1162 goto fail;
1163 }
1164 retVal = Py_BuildValue("uOi", retValueBuf, obData, typ);
1165 Py_DECREF(obData);
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001166 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 PyMem_Free(retValueBuf);
1168 PyMem_Free(retDataBuf);
1169 return retVal;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001170}
1171
Zachary Warefd2d4822015-05-13 01:21:57 -05001172/*[clinic input]
1173winreg.ExpandEnvironmentStrings
1174
1175 string: Py_UNICODE
1176 /
1177
1178Expand environment vars.
1179[clinic start generated code]*/
1180
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001181static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001182winreg_ExpandEnvironmentStrings_impl(PyObject *module, Py_UNICODE *string)
1183/*[clinic end generated code: output=cba46ac293a8af1a input=b2a9714d2b751aa6]*/
Christian Heimes2380ac72008-01-09 00:17:24 +00001184{
Victor Stinner9d3b93b2011-11-22 02:27:30 +01001185 wchar_t *retValue = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 DWORD retValueSize;
1187 DWORD rc;
1188 PyObject *o;
Christian Heimes2380ac72008-01-09 00:17:24 +00001189
Zachary Warefd2d4822015-05-13 01:21:57 -05001190 retValueSize = ExpandEnvironmentStringsW(string, retValue, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 if (retValueSize == 0) {
1192 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1193 "ExpandEnvironmentStrings");
1194 }
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02001195 retValue = PyMem_New(wchar_t, retValueSize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 if (retValue == NULL) {
1197 return PyErr_NoMemory();
1198 }
Christian Heimes2380ac72008-01-09 00:17:24 +00001199
Zachary Warefd2d4822015-05-13 01:21:57 -05001200 rc = ExpandEnvironmentStringsW(string, retValue, retValueSize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 if (rc == 0) {
1202 PyMem_Free(retValue);
1203 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1204 "ExpandEnvironmentStrings");
1205 }
Victor Stinner9d3b93b2011-11-22 02:27:30 +01001206 o = PyUnicode_FromWideChar(retValue, wcslen(retValue));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001207 PyMem_Free(retValue);
1208 return o;
Christian Heimes2380ac72008-01-09 00:17:24 +00001209}
1210
Zachary Warefd2d4822015-05-13 01:21:57 -05001211/*[clinic input]
1212winreg.FlushKey
1213
1214 key: HKEY
1215 An already open key, or any one of the predefined HKEY_* constants.
1216 /
1217
1218Writes all the attributes of a key to the registry.
1219
1220It is not necessary to call FlushKey to change a key. Registry changes
1221are flushed to disk by the registry using its lazy flusher. Registry
1222changes are also flushed to disk at system shutdown. Unlike
1223CloseKey(), the FlushKey() method returns only when all the data has
1224been written to the registry.
1225
1226An application should only call FlushKey() if it requires absolute
1227certainty that registry changes are on disk. If you don't know whether
1228a FlushKey() call is required, it probably isn't.
1229[clinic start generated code]*/
1230
Christian Heimes2380ac72008-01-09 00:17:24 +00001231static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001232winreg_FlushKey_impl(PyObject *module, HKEY key)
1233/*[clinic end generated code: output=e6fc230d4c5dc049 input=f57457c12297d82f]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001234{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 long rc;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001237 rc = RegFlushKey(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 Py_END_ALLOW_THREADS
1239 if (rc != ERROR_SUCCESS)
1240 return PyErr_SetFromWindowsErrWithFunction(rc, "RegFlushKey");
Zachary Warefd2d4822015-05-13 01:21:57 -05001241 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001242}
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001243
Zachary Warefd2d4822015-05-13 01:21:57 -05001244
1245/*[clinic input]
1246winreg.LoadKey
1247
1248 key: HKEY
1249 An already open key, or any one of the predefined HKEY_* constants.
1250 sub_key: Py_UNICODE
1251 A string that identifies the sub-key to load.
1252 file_name: Py_UNICODE
1253 The name of the file to load registry data from. This file must
1254 have been created with the SaveKey() function. Under the file
1255 allocation table (FAT) file system, the filename may not have an
1256 extension.
1257 /
1258
1259Insert data into the registry from a file.
1260
1261Creates a subkey under the specified key and stores registration
1262information from a specified file into that subkey.
1263
1264A call to LoadKey() fails if the calling process does not have the
1265SE_RESTORE_PRIVILEGE privilege.
1266
1267If key is a handle returned by ConnectRegistry(), then the path
1268specified in fileName is relative to the remote computer.
1269
1270The MSDN docs imply key must be in the HKEY_USER or HKEY_LOCAL_MACHINE
1271tree.
1272[clinic start generated code]*/
1273
1274static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001275winreg_LoadKey_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
Zachary Ware77772c02015-05-13 10:58:35 -05001276 Py_UNICODE *file_name)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001277/*[clinic end generated code: output=87344005c5905cde input=e3b5b45ade311582]*/
Zachary Warefd2d4822015-05-13 01:21:57 -05001278{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 long rc;
Zachary Warefd2d4822015-05-13 01:21:57 -05001280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001282 rc = RegLoadKeyW(key, sub_key, file_name );
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 Py_END_ALLOW_THREADS
1284 if (rc != ERROR_SUCCESS)
1285 return PyErr_SetFromWindowsErrWithFunction(rc, "RegLoadKey");
Zachary Warefd2d4822015-05-13 01:21:57 -05001286 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001287}
1288
Zachary Warefd2d4822015-05-13 01:21:57 -05001289/*[clinic input]
1290winreg.OpenKey -> HKEY
1291
1292 key: HKEY
1293 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001294 sub_key: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001295 A string that identifies the sub_key to open.
1296 reserved: int = 0
1297 A reserved integer that must be zero. Default is zero.
1298 access: REGSAM(c_default='KEY_READ') = winreg.KEY_READ
1299 An integer that specifies an access mask that describes the desired
1300 security access for the key. Default is KEY_READ.
1301
1302Opens the specified key.
1303
1304The result is a new handle to the specified key.
1305If the function fails, an OSError exception is raised.
1306[clinic start generated code]*/
1307
1308static HKEY
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001309winreg_OpenKey_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
Zachary Ware77772c02015-05-13 10:58:35 -05001310 int reserved, REGSAM access)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001311/*[clinic end generated code: output=a905f1b947f3ce85 input=098505ac36a9ae28]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001312{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 HKEY retKey;
1314 long rc;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001317 rc = RegOpenKeyExW(key, sub_key, reserved, access, &retKey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 Py_END_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001319 if (rc != ERROR_SUCCESS) {
1320 PyErr_SetFromWindowsErrWithFunction(rc, "RegOpenKeyEx");
1321 return NULL;
1322 }
1323 return retKey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001324}
1325
Zachary Warefd2d4822015-05-13 01:21:57 -05001326/*[clinic input]
1327winreg.OpenKeyEx = winreg.OpenKey
1328
1329Opens the specified key.
1330
1331The result is a new handle to the specified key.
1332If the function fails, an OSError exception is raised.
1333[clinic start generated code]*/
1334
1335static HKEY
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001336winreg_OpenKeyEx_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
Zachary Ware77772c02015-05-13 10:58:35 -05001337 int reserved, REGSAM access)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001338/*[clinic end generated code: output=226042593b37e940 input=c6c4972af8622959]*/
Zachary Warefd2d4822015-05-13 01:21:57 -05001339{
1340 return winreg_OpenKey_impl(module, key, sub_key, reserved, access);
1341}
1342
1343/*[clinic input]
1344winreg.QueryInfoKey
1345
1346 key: HKEY
1347 An already open key, or any one of the predefined HKEY_* constants.
1348 /
1349
1350Returns information about a key.
1351
1352The result is a tuple of 3 items:
1353An integer that identifies the number of sub keys this key has.
1354An integer that identifies the number of values this key has.
1355An integer that identifies when the key was last modified (if available)
1356as 100's of nanoseconds since Jan 1, 1600.
1357[clinic start generated code]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001358
1359static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001360winreg_QueryInfoKey_impl(PyObject *module, HKEY key)
1361/*[clinic end generated code: output=dc657b8356a4f438 input=c3593802390cde1f]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001362{
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001363 long rc;
1364 DWORD nSubKeys, nValues;
1365 FILETIME ft;
1366 LARGE_INTEGER li;
1367 PyObject *l;
1368 PyObject *ret;
Zachary Warefd2d4822015-05-13 01:21:57 -05001369
1370 if ((rc = RegQueryInfoKey(key, NULL, NULL, 0, &nSubKeys, NULL, NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 &nValues, NULL, NULL, NULL, &ft))
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001372 != ERROR_SUCCESS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryInfoKey");
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001374 li.LowPart = ft.dwLowDateTime;
1375 li.HighPart = ft.dwHighDateTime;
1376 l = PyLong_FromLongLong(li.QuadPart);
1377 if (l == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001379 ret = Py_BuildValue("iiO", nSubKeys, nValues, l);
1380 Py_DECREF(l);
1381 return ret;
1382}
1383
Zachary Warefd2d4822015-05-13 01:21:57 -05001384/*[clinic input]
1385winreg.QueryValue
1386
1387 key: HKEY
1388 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001389 sub_key: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001390 A string that holds the name of the subkey with which the value
1391 is associated. If this parameter is None or empty, the function
1392 retrieves the value set by the SetValue() method for the key
1393 identified by key.
1394 /
1395
1396Retrieves the unnamed value for a key.
1397
1398Values in the registry have name, type, and data components. This method
1399retrieves the data for a key's first value that has a NULL name.
1400But since the underlying API call doesn't return the type, you'll
1401probably be happier using QueryValueEx; this function is just here for
1402completeness.
1403[clinic start generated code]*/
1404
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001405static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001406winreg_QueryValue_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key)
1407/*[clinic end generated code: output=2bb8d1e02c10d0b6 input=41cafbbf423b21d6]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001408{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 long rc;
1410 PyObject *retStr;
1411 wchar_t *retBuf;
Brian Curtin60853212010-05-26 17:43:50 +00001412 DWORD bufSize = 0;
1413 DWORD retSize = 0;
1414 wchar_t *tmp;
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001415
Zachary Warefd2d4822015-05-13 01:21:57 -05001416 rc = RegQueryValueW(key, sub_key, NULL, &retSize);
Brian Curtin60853212010-05-26 17:43:50 +00001417 if (rc == ERROR_MORE_DATA)
1418 retSize = 256;
1419 else if (rc != ERROR_SUCCESS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 return PyErr_SetFromWindowsErrWithFunction(rc,
1421 "RegQueryValue");
Brian Curtin60853212010-05-26 17:43:50 +00001422
1423 bufSize = retSize;
1424 retBuf = (wchar_t *) PyMem_Malloc(bufSize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 if (retBuf == NULL)
1426 return PyErr_NoMemory();
Guido van Rossuma8c360e2007-07-17 20:50:43 +00001427
Brian Curtin60853212010-05-26 17:43:50 +00001428 while (1) {
1429 retSize = bufSize;
Zachary Warefd2d4822015-05-13 01:21:57 -05001430 rc = RegQueryValueW(key, sub_key, retBuf, &retSize);
Brian Curtin60853212010-05-26 17:43:50 +00001431 if (rc != ERROR_MORE_DATA)
1432 break;
1433
1434 bufSize *= 2;
1435 tmp = (wchar_t *) PyMem_Realloc(retBuf, bufSize);
1436 if (tmp == NULL) {
1437 PyMem_Free(retBuf);
1438 return PyErr_NoMemory();
1439 }
1440 retBuf = tmp;
1441 }
1442
1443 if (rc != ERROR_SUCCESS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 PyMem_Free(retBuf);
1445 return PyErr_SetFromWindowsErrWithFunction(rc,
1446 "RegQueryValue");
1447 }
Guido van Rossuma8c360e2007-07-17 20:50:43 +00001448
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001449 retStr = PyUnicode_FromWideChar(retBuf, wcslen(retBuf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 PyMem_Free(retBuf);
1451 return retStr;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001452}
1453
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001454
Zachary Warefd2d4822015-05-13 01:21:57 -05001455/*[clinic input]
1456winreg.QueryValueEx
1457
1458 key: HKEY
1459 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001460 name: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001461 A string indicating the value to query.
1462 /
1463
1464Retrieves the type and value of a specified sub-key.
1465
1466Behaves mostly like QueryValue(), but also returns the type of the
1467specified value name associated with the given open registry key.
1468
1469The return value is a tuple of the value and the type_id.
1470[clinic start generated code]*/
1471
1472static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001473winreg_QueryValueEx_impl(PyObject *module, HKEY key, Py_UNICODE *name)
1474/*[clinic end generated code: output=5b4fa3e33d6d3e8f input=cf366cada4836891]*/
Zachary Warefd2d4822015-05-13 01:21:57 -05001475{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 long rc;
Brian Curtin60853212010-05-26 17:43:50 +00001477 BYTE *retBuf, *tmp;
1478 DWORD bufSize = 0, retSize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 DWORD typ;
1480 PyObject *obData;
1481 PyObject *result;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001482
Zachary Warefd2d4822015-05-13 01:21:57 -05001483 rc = RegQueryValueExW(key, name, NULL, NULL, NULL, &bufSize);
Brian Curtin60853212010-05-26 17:43:50 +00001484 if (rc == ERROR_MORE_DATA)
1485 bufSize = 256;
1486 else if (rc != ERROR_SUCCESS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 return PyErr_SetFromWindowsErrWithFunction(rc,
1488 "RegQueryValueEx");
1489 retBuf = (BYTE *)PyMem_Malloc(bufSize);
1490 if (retBuf == NULL)
1491 return PyErr_NoMemory();
Brian Curtin60853212010-05-26 17:43:50 +00001492
1493 while (1) {
1494 retSize = bufSize;
Zachary Warefd2d4822015-05-13 01:21:57 -05001495 rc = RegQueryValueExW(key, name, NULL, &typ,
Brian Curtin60853212010-05-26 17:43:50 +00001496 (BYTE *)retBuf, &retSize);
1497 if (rc != ERROR_MORE_DATA)
1498 break;
1499
1500 bufSize *= 2;
1501 tmp = (char *) PyMem_Realloc(retBuf, bufSize);
1502 if (tmp == NULL) {
1503 PyMem_Free(retBuf);
1504 return PyErr_NoMemory();
1505 }
1506 retBuf = tmp;
1507 }
1508
1509 if (rc != ERROR_SUCCESS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 PyMem_Free(retBuf);
1511 return PyErr_SetFromWindowsErrWithFunction(rc,
1512 "RegQueryValueEx");
1513 }
1514 obData = Reg2Py(retBuf, bufSize, typ);
1515 PyMem_Free(retBuf);
1516 if (obData == NULL)
1517 return NULL;
1518 result = Py_BuildValue("Oi", obData, typ);
1519 Py_DECREF(obData);
1520 return result;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001521}
1522
Zachary Warefd2d4822015-05-13 01:21:57 -05001523/*[clinic input]
1524winreg.SaveKey
1525
1526 key: HKEY
1527 An already open key, or any one of the predefined HKEY_* constants.
1528 file_name: Py_UNICODE
1529 The name of the file to save registry data to. This file cannot
1530 already exist. If this filename includes an extension, it cannot be
1531 used on file allocation table (FAT) file systems by the LoadKey(),
1532 ReplaceKey() or RestoreKey() methods.
1533 /
1534
1535Saves the specified key, and all its subkeys to the specified file.
1536
1537If key represents a key on a remote computer, the path described by
1538file_name is relative to the remote computer.
1539
1540The caller of this method must possess the SeBackupPrivilege
1541security privilege. This function passes NULL for security_attributes
1542to the API.
1543[clinic start generated code]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001544
1545static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001546winreg_SaveKey_impl(PyObject *module, HKEY key, Py_UNICODE *file_name)
1547/*[clinic end generated code: output=1dda1502bd4c30d8 input=da735241f91ac7a2]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001548{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 LPSECURITY_ATTRIBUTES pSA = NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 long rc;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001552/* One day we may get security into the core?
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 if (!PyWinObject_AsSECURITY_ATTRIBUTES(obSA, &pSA, TRUE))
1554 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001555*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001557 rc = RegSaveKeyW(key, file_name, pSA );
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 Py_END_ALLOW_THREADS
1559 if (rc != ERROR_SUCCESS)
1560 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSaveKey");
Zachary Warefd2d4822015-05-13 01:21:57 -05001561 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001562}
1563
Zachary Warefd2d4822015-05-13 01:21:57 -05001564/*[clinic input]
1565winreg.SetValue
1566
1567 key: HKEY
1568 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001569 sub_key: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001570 A string that names the subkey with which the value is associated.
1571 type: DWORD
1572 An integer that specifies the type of the data. Currently this must
1573 be REG_SZ, meaning only strings are supported.
Zachary Ware77772c02015-05-13 10:58:35 -05001574 value: Py_UNICODE(zeroes=True)
Zachary Warefd2d4822015-05-13 01:21:57 -05001575 A string that specifies the new value.
1576 /
1577
1578Associates a value with a specified key.
1579
1580If the key specified by the sub_key parameter does not exist, the
1581SetValue function creates it.
1582
1583Value lengths are limited by available memory. Long values (more than
15842048 bytes) should be stored as files with the filenames stored in
1585the configuration registry to help the registry perform efficiently.
1586
1587The key identified by the key parameter must have been opened with
1588KEY_SET_VALUE access.
1589[clinic start generated code]*/
1590
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001591static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001592winreg_SetValue_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
Zachary Ware77772c02015-05-13 10:58:35 -05001593 DWORD type, Py_UNICODE *value,
1594 Py_ssize_clean_t value_length)
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001595/*[clinic end generated code: output=1e31931174820631 input=2cd2adab79339c53]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001596{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 long rc;
Zachary Warefd2d4822015-05-13 01:21:57 -05001598
1599 if (type != REG_SZ) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 PyErr_SetString(PyExc_TypeError,
1601 "Type must be winreg.REG_SZ");
1602 return NULL;
1603 }
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001606 rc = RegSetValueW(key, sub_key, REG_SZ, value, value_length+1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 Py_END_ALLOW_THREADS
1608 if (rc != ERROR_SUCCESS)
1609 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSetValue");
Zachary Warefd2d4822015-05-13 01:21:57 -05001610 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001611}
1612
Zachary Warefd2d4822015-05-13 01:21:57 -05001613/*[clinic input]
1614winreg.SetValueEx
1615
1616 key: HKEY
1617 An already open key, or any one of the predefined HKEY_* constants.
Zachary Ware77772c02015-05-13 10:58:35 -05001618 value_name: Py_UNICODE(accept={str, NoneType})
Zachary Warefd2d4822015-05-13 01:21:57 -05001619 A string containing the name of the value to set, or None.
1620 reserved: object
1621 Can be anything - zero is always passed to the API.
1622 type: DWORD
1623 An integer that specifies the type of the data, one of:
1624 REG_BINARY -- Binary data in any form.
1625 REG_DWORD -- A 32-bit number.
Steve Dower80ac11d2016-05-24 15:42:04 -07001626 REG_DWORD_LITTLE_ENDIAN -- A 32-bit number in little-endian format. Equivalent to REG_DWORD
Zachary Warefd2d4822015-05-13 01:21:57 -05001627 REG_DWORD_BIG_ENDIAN -- A 32-bit number in big-endian format.
1628 REG_EXPAND_SZ -- A null-terminated string that contains unexpanded
1629 references to environment variables (for example,
1630 %PATH%).
1631 REG_LINK -- A Unicode symbolic link.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +03001632 REG_MULTI_SZ -- A sequence of null-terminated strings, terminated
Zachary Warefd2d4822015-05-13 01:21:57 -05001633 by two null characters. Note that Python handles
1634 this termination automatically.
1635 REG_NONE -- No defined value type.
Steve Dower80ac11d2016-05-24 15:42:04 -07001636 REG_QWORD -- A 64-bit number.
1637 REG_QWORD_LITTLE_ENDIAN -- A 64-bit number in little-endian format. Equivalent to REG_QWORD.
Zachary Warefd2d4822015-05-13 01:21:57 -05001638 REG_RESOURCE_LIST -- A device-driver resource list.
1639 REG_SZ -- A null-terminated string.
1640 value: object
1641 A string that specifies the new value.
1642 /
1643
1644Stores data in the value field of an open registry key.
1645
1646This method can also set additional value and type information for the
1647specified key. The key identified by the key parameter must have been
1648opened with KEY_SET_VALUE access.
1649
1650To open the key, use the CreateKeyEx() or OpenKeyEx() methods.
1651
1652Value lengths are limited by available memory. Long values (more than
16532048 bytes) should be stored as files with the filenames stored in
1654the configuration registry to help the registry perform efficiently.
1655[clinic start generated code]*/
1656
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001657static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001658winreg_SetValueEx_impl(PyObject *module, HKEY key, Py_UNICODE *value_name,
Zachary Ware77772c02015-05-13 10:58:35 -05001659 PyObject *reserved, DWORD type, PyObject *value)
Serhiy Storchaka2954f832016-07-07 18:20:03 +03001660/*[clinic end generated code: output=c88c8426b6c00ec7 input=900a9e3990bfb196]*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001661{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 BYTE *data;
1663 DWORD len;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 LONG rc;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001666
Zachary Warefd2d4822015-05-13 01:21:57 -05001667 if (!Py2Reg(value, type, &data, &len))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 {
1669 if (!PyErr_Occurred())
1670 PyErr_SetString(PyExc_ValueError,
1671 "Could not convert the data to the specified type.");
1672 return NULL;
1673 }
1674 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001675 rc = RegSetValueExW(key, value_name, 0, type, data, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 Py_END_ALLOW_THREADS
1677 PyMem_DEL(data);
1678 if (rc != ERROR_SUCCESS)
1679 return PyErr_SetFromWindowsErrWithFunction(rc,
1680 "RegSetValueEx");
Zachary Warefd2d4822015-05-13 01:21:57 -05001681 Py_RETURN_NONE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001682}
1683
Zachary Warefd2d4822015-05-13 01:21:57 -05001684/*[clinic input]
1685winreg.DisableReflectionKey
1686
1687 key: HKEY
1688 An already open key, or any one of the predefined HKEY_* constants.
1689 /
1690
1691Disables registry reflection for 32bit processes running on a 64bit OS.
1692
1693Will generally raise NotImplemented if executed on a 32bit OS.
1694
1695If the key is not on the reflection list, the function succeeds but has
1696no effect. Disabling reflection for a key does not affect reflection
1697of any subkeys.
1698[clinic start generated code]*/
1699
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001700static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001701winreg_DisableReflectionKey_impl(PyObject *module, HKEY key)
1702/*[clinic end generated code: output=830cce504cc764b4 input=a6c9e5ca5410193c]*/
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001703{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 HMODULE hMod;
1705 typedef LONG (WINAPI *RDRKFunc)(HKEY);
1706 RDRKFunc pfn = NULL;
1707 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 /* Only available on 64bit platforms, so we must load it
1710 dynamically.*/
Martin v. Löwis50590f12012-01-14 17:54:09 +01001711 hMod = GetModuleHandleW(L"advapi32.dll");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 if (hMod)
1713 pfn = (RDRKFunc)GetProcAddress(hMod,
1714 "RegDisableReflectionKey");
1715 if (!pfn) {
1716 PyErr_SetString(PyExc_NotImplementedError,
1717 "not implemented on this platform");
1718 return NULL;
1719 }
1720 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001721 rc = (*pfn)(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 Py_END_ALLOW_THREADS
1723 if (rc != ERROR_SUCCESS)
1724 return PyErr_SetFromWindowsErrWithFunction(rc,
1725 "RegDisableReflectionKey");
Zachary Warefd2d4822015-05-13 01:21:57 -05001726 Py_RETURN_NONE;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001727}
1728
Zachary Warefd2d4822015-05-13 01:21:57 -05001729/*[clinic input]
1730winreg.EnableReflectionKey
1731
1732 key: HKEY
1733 An already open key, or any one of the predefined HKEY_* constants.
1734 /
1735
1736Restores registry reflection for the specified disabled key.
1737
1738Will generally raise NotImplemented if executed on a 32bit OS.
1739Restoring reflection for a key does not affect reflection of any
1740subkeys.
1741[clinic start generated code]*/
1742
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001743static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001744winreg_EnableReflectionKey_impl(PyObject *module, HKEY key)
1745/*[clinic end generated code: output=86fa1385fdd9ce57 input=7748abbacd1e166a]*/
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001746{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 HMODULE hMod;
1748 typedef LONG (WINAPI *RERKFunc)(HKEY);
1749 RERKFunc pfn = NULL;
1750 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 /* Only available on 64bit platforms, so we must load it
1753 dynamically.*/
Martin v. Löwis50590f12012-01-14 17:54:09 +01001754 hMod = GetModuleHandleW(L"advapi32.dll");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 if (hMod)
1756 pfn = (RERKFunc)GetProcAddress(hMod,
1757 "RegEnableReflectionKey");
1758 if (!pfn) {
1759 PyErr_SetString(PyExc_NotImplementedError,
1760 "not implemented on this platform");
1761 return NULL;
1762 }
1763 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001764 rc = (*pfn)(key);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 Py_END_ALLOW_THREADS
1766 if (rc != ERROR_SUCCESS)
1767 return PyErr_SetFromWindowsErrWithFunction(rc,
1768 "RegEnableReflectionKey");
Zachary Warefd2d4822015-05-13 01:21:57 -05001769 Py_RETURN_NONE;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001770}
1771
Zachary Warefd2d4822015-05-13 01:21:57 -05001772/*[clinic input]
1773winreg.QueryReflectionKey
1774
1775 key: HKEY
1776 An already open key, or any one of the predefined HKEY_* constants.
1777 /
1778
1779Returns the reflection state for the specified key as a bool.
1780
1781Will generally raise NotImplemented if executed on a 32bit OS.
1782[clinic start generated code]*/
1783
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001784static PyObject *
Serhiy Storchaka1a2b24f2016-07-07 17:35:15 +03001785winreg_QueryReflectionKey_impl(PyObject *module, HKEY key)
1786/*[clinic end generated code: output=4e774af288c3ebb9 input=9f325eacb5a65d88]*/
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001787{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 HMODULE hMod;
1789 typedef LONG (WINAPI *RQRKFunc)(HKEY, BOOL *);
1790 RQRKFunc pfn = NULL;
1791 BOOL result;
1792 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 /* Only available on 64bit platforms, so we must load it
1795 dynamically.*/
Martin v. Löwis50590f12012-01-14 17:54:09 +01001796 hMod = GetModuleHandleW(L"advapi32.dll");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 if (hMod)
1798 pfn = (RQRKFunc)GetProcAddress(hMod,
1799 "RegQueryReflectionKey");
1800 if (!pfn) {
1801 PyErr_SetString(PyExc_NotImplementedError,
1802 "not implemented on this platform");
1803 return NULL;
1804 }
1805 Py_BEGIN_ALLOW_THREADS
Zachary Warefd2d4822015-05-13 01:21:57 -05001806 rc = (*pfn)(key, &result);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 Py_END_ALLOW_THREADS
1808 if (rc != ERROR_SUCCESS)
1809 return PyErr_SetFromWindowsErrWithFunction(rc,
1810 "RegQueryReflectionKey");
1811 return PyBool_FromLong(result);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001812}
1813
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001814static struct PyMethodDef winreg_methods[] = {
Zachary Warefd2d4822015-05-13 01:21:57 -05001815 WINREG_CLOSEKEY_METHODDEF
1816 WINREG_CONNECTREGISTRY_METHODDEF
1817 WINREG_CREATEKEY_METHODDEF
1818 WINREG_CREATEKEYEX_METHODDEF
1819 WINREG_DELETEKEY_METHODDEF
1820 WINREG_DELETEKEYEX_METHODDEF
1821 WINREG_DELETEVALUE_METHODDEF
1822 WINREG_DISABLEREFLECTIONKEY_METHODDEF
1823 WINREG_ENABLEREFLECTIONKEY_METHODDEF
1824 WINREG_ENUMKEY_METHODDEF
1825 WINREG_ENUMVALUE_METHODDEF
1826 WINREG_EXPANDENVIRONMENTSTRINGS_METHODDEF
1827 WINREG_FLUSHKEY_METHODDEF
1828 WINREG_LOADKEY_METHODDEF
1829 WINREG_OPENKEY_METHODDEF
1830 WINREG_OPENKEYEX_METHODDEF
1831 WINREG_QUERYVALUE_METHODDEF
1832 WINREG_QUERYVALUEEX_METHODDEF
1833 WINREG_QUERYINFOKEY_METHODDEF
1834 WINREG_QUERYREFLECTIONKEY_METHODDEF
1835 WINREG_SAVEKEY_METHODDEF
1836 WINREG_SETVALUE_METHODDEF
1837 WINREG_SETVALUEEX_METHODDEF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 NULL,
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001839};
1840
1841static void
1842insint(PyObject * d, char * name, long value)
1843{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 PyObject *v = PyLong_FromLong(value);
1845 if (!v || PyDict_SetItemString(d, name, v))
1846 PyErr_Clear();
1847 Py_XDECREF(v);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001848}
1849
1850#define ADD_INT(val) insint(d, #val, val)
1851
1852static void
1853inskey(PyObject * d, char * name, HKEY key)
1854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 PyObject *v = PyLong_FromVoidPtr(key);
1856 if (!v || PyDict_SetItemString(d, name, v))
1857 PyErr_Clear();
1858 Py_XDECREF(v);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001859}
1860
1861#define ADD_KEY(val) inskey(d, #val, val)
1862
Martin v. Löwis1a214512008-06-11 05:26:20 +00001863
1864static struct PyModuleDef winregmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001865 PyModuleDef_HEAD_INIT,
1866 "winreg",
1867 module_doc,
1868 -1,
1869 winreg_methods,
1870 NULL,
1871 NULL,
1872 NULL,
1873 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001874};
1875
1876PyMODINIT_FUNC PyInit_winreg(void)
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001877{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 PyObject *m, *d;
1879 m = PyModule_Create(&winregmodule);
1880 if (m == NULL)
1881 return NULL;
1882 d = PyModule_GetDict(m);
1883 PyHKEY_Type.tp_doc = PyHKEY_doc;
1884 if (PyType_Ready(&PyHKEY_Type) < 0)
1885 return NULL;
1886 Py_INCREF(&PyHKEY_Type);
1887 if (PyDict_SetItemString(d, "HKEYType",
1888 (PyObject *)&PyHKEY_Type) != 0)
1889 return NULL;
Andrew Svetlov2606a6f2012-12-19 14:33:35 +02001890 Py_INCREF(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 if (PyDict_SetItemString(d, "error",
Andrew Svetlov2606a6f2012-12-19 14:33:35 +02001892 PyExc_OSError) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001893 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 /* Add the relevant constants */
1896 ADD_KEY(HKEY_CLASSES_ROOT);
1897 ADD_KEY(HKEY_CURRENT_USER);
1898 ADD_KEY(HKEY_LOCAL_MACHINE);
1899 ADD_KEY(HKEY_USERS);
1900 ADD_KEY(HKEY_PERFORMANCE_DATA);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001901#ifdef HKEY_CURRENT_CONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001902 ADD_KEY(HKEY_CURRENT_CONFIG);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001903#endif
1904#ifdef HKEY_DYN_DATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 ADD_KEY(HKEY_DYN_DATA);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001906#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 ADD_INT(KEY_QUERY_VALUE);
1908 ADD_INT(KEY_SET_VALUE);
1909 ADD_INT(KEY_CREATE_SUB_KEY);
1910 ADD_INT(KEY_ENUMERATE_SUB_KEYS);
1911 ADD_INT(KEY_NOTIFY);
1912 ADD_INT(KEY_CREATE_LINK);
1913 ADD_INT(KEY_READ);
1914 ADD_INT(KEY_WRITE);
1915 ADD_INT(KEY_EXECUTE);
1916 ADD_INT(KEY_ALL_ACCESS);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001917#ifdef KEY_WOW64_64KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 ADD_INT(KEY_WOW64_64KEY);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001919#endif
1920#ifdef KEY_WOW64_32KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 ADD_INT(KEY_WOW64_32KEY);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001922#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001923 ADD_INT(REG_OPTION_RESERVED);
1924 ADD_INT(REG_OPTION_NON_VOLATILE);
1925 ADD_INT(REG_OPTION_VOLATILE);
1926 ADD_INT(REG_OPTION_CREATE_LINK);
1927 ADD_INT(REG_OPTION_BACKUP_RESTORE);
1928 ADD_INT(REG_OPTION_OPEN_LINK);
1929 ADD_INT(REG_LEGAL_OPTION);
1930 ADD_INT(REG_CREATED_NEW_KEY);
1931 ADD_INT(REG_OPENED_EXISTING_KEY);
1932 ADD_INT(REG_WHOLE_HIVE_VOLATILE);
1933 ADD_INT(REG_REFRESH_HIVE);
1934 ADD_INT(REG_NO_LAZY_FLUSH);
1935 ADD_INT(REG_NOTIFY_CHANGE_NAME);
1936 ADD_INT(REG_NOTIFY_CHANGE_ATTRIBUTES);
1937 ADD_INT(REG_NOTIFY_CHANGE_LAST_SET);
1938 ADD_INT(REG_NOTIFY_CHANGE_SECURITY);
1939 ADD_INT(REG_LEGAL_CHANGE_FILTER);
1940 ADD_INT(REG_NONE);
1941 ADD_INT(REG_SZ);
1942 ADD_INT(REG_EXPAND_SZ);
1943 ADD_INT(REG_BINARY);
1944 ADD_INT(REG_DWORD);
1945 ADD_INT(REG_DWORD_LITTLE_ENDIAN);
1946 ADD_INT(REG_DWORD_BIG_ENDIAN);
Steve Dower80ac11d2016-05-24 15:42:04 -07001947 ADD_INT(REG_QWORD);
1948 ADD_INT(REG_QWORD_LITTLE_ENDIAN);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 ADD_INT(REG_LINK);
1950 ADD_INT(REG_MULTI_SZ);
1951 ADD_INT(REG_RESOURCE_LIST);
1952 ADD_INT(REG_FULL_RESOURCE_DESCRIPTOR);
1953 ADD_INT(REG_RESOURCE_REQUIREMENTS_LIST);
1954 return m;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001955}
1956
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001957