1 /*
2 winreg.c
3
4 Windows Registry access module for Python.
5
6 * Simple registry access written by Mark Hammond in win32api
7 module circa 1995.
8 * Bill Tutt expanded the support significantly not long after.
9 * Numerous other people have submitted patches since then.
10 * Ripped from win32api module 03-Feb-2000 by Mark Hammond, and
11 basic Unicode support added.
12
13 */
14
15 #include "Python.h"
16 #include "structmember.h"
17 #include "windows.h"
18
19 static BOOL PyHKEY_AsHKEY(PyObject *ob, HKEY *pRes, BOOL bNoneOK);
20 static BOOL clinic_HKEY_converter(PyObject *ob, void *p);
21 static PyObject *PyHKEY_FromHKEY(HKEY h);
22 static BOOL PyHKEY_Close(PyObject *obHandle);
23
24 static 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 don't
29 want to lose this info...
30 */
31 #define PyErr_SetFromWindowsErrWithFunction(rc, fnname) \
32 PyErr_SetFromWindowsErr(rc)
33
34 /* Forward declares */
35
36 /* Doc strings */
37 PyDoc_STRVAR(module_doc,
38 "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"
50 "ExpandEnvironmentStrings() - Expand the env strings in a REG_EXPAND_SZ\n"
51 " string.\n"
52 "FlushKey() - Writes all the attributes of the specified key to the registry.\n"
53 "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"
56 "OpenKey() - Opens the specified key.\n"
57 "OpenKeyEx() - Alias of OpenKey().\n"
58 "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"
74 "to see what constants are used, and where.");
75
76
77
78 /* PyHKEY docstrings */
79 PyDoc_STRVAR(PyHKEY_doc,
80 "PyHKEY Object - A Python object, representing a win32 registry key.\n"
81 "\n"
82 "This object wraps a Windows HKEY object, automatically closing it when\n"
83 "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"
97 "__bool__ - Handles with an open object return true, otherwise false.\n"
98 "__int__ - Converting a handle to an integer returns the Win32 handle.\n"
99 "rich comparison - Handle objects are compared using the handle value.");
100
101
102
103 /************************************************************************
104
105 The PyHKEY object definition
106
107 ************************************************************************/
108 typedef struct {
109 PyObject_VAR_HEAD
110 HKEY hkey;
111 } PyHKEYObject;
112
113 #define PyHKEY_Check(op) ((op)->ob_type == &PyHKEY_Type)
114
115 static char *failMsg = "bad operand type";
116
117 static PyObject *
PyHKEY_unaryFailureFunc(PyObject * ob)118 PyHKEY_unaryFailureFunc(PyObject *ob)
119 {
120 PyErr_SetString(PyExc_TypeError, failMsg);
121 return NULL;
122 }
123 static PyObject *
PyHKEY_binaryFailureFunc(PyObject * ob1,PyObject * ob2)124 PyHKEY_binaryFailureFunc(PyObject *ob1, PyObject *ob2)
125 {
126 PyErr_SetString(PyExc_TypeError, failMsg);
127 return NULL;
128 }
129 static PyObject *
PyHKEY_ternaryFailureFunc(PyObject * ob1,PyObject * ob2,PyObject * ob3)130 PyHKEY_ternaryFailureFunc(PyObject *ob1, PyObject *ob2, PyObject *ob3)
131 {
132 PyErr_SetString(PyExc_TypeError, failMsg);
133 return NULL;
134 }
135
136 static void
PyHKEY_deallocFunc(PyObject * ob)137 PyHKEY_deallocFunc(PyObject *ob)
138 {
139 /* 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);
147 }
148
149 static int
PyHKEY_boolFunc(PyObject * ob)150 PyHKEY_boolFunc(PyObject *ob)
151 {
152 return ((PyHKEYObject *)ob)->hkey != 0;
153 }
154
155 static PyObject *
PyHKEY_intFunc(PyObject * ob)156 PyHKEY_intFunc(PyObject *ob)
157 {
158 PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
159 return PyLong_FromVoidPtr(pyhkey->hkey);
160 }
161
162 static PyObject *
PyHKEY_strFunc(PyObject * ob)163 PyHKEY_strFunc(PyObject *ob)
164 {
165 PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
166 return PyUnicode_FromFormat("<PyHKEY:%p>", pyhkey->hkey);
167 }
168
169 static int
PyHKEY_compareFunc(PyObject * ob1,PyObject * ob2)170 PyHKEY_compareFunc(PyObject *ob1, PyObject *ob2)
171 {
172 PyHKEYObject *pyhkey1 = (PyHKEYObject *)ob1;
173 PyHKEYObject *pyhkey2 = (PyHKEYObject *)ob2;
174 return pyhkey1 == pyhkey2 ? 0 :
175 (pyhkey1 < pyhkey2 ? -1 : 1);
176 }
177
178 static Py_hash_t
PyHKEY_hashFunc(PyObject * ob)179 PyHKEY_hashFunc(PyObject *ob)
180 {
181 /* Just use the address.
182 XXX - should we use the handle value?
183 */
184 return _Py_HashPointer(ob);
185 }
186
187
188 static PyNumberMethods PyHKEY_NumberMethods =
189 {
190 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 */
209 };
210
211 /*[clinic input]
212 module winreg
213 class winreg.HKEYType "PyHKEYObject *" "&PyHKEY_Type"
214 [clinic start generated code]*/
215 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=4c964eba3bf914d6]*/
216
217 /*[python input]
218 class REGSAM_converter(CConverter):
219 type = 'REGSAM'
220 format_unit = 'i'
221
222 class DWORD_converter(CConverter):
223 type = 'DWORD'
224 format_unit = 'k'
225
226 class HKEY_converter(CConverter):
227 type = 'HKEY'
228 converter = 'clinic_HKEY_converter'
229
230 class 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.
242 class 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]
260 winreg.HKEYType.Close
261
262 Closes the underlying Windows handle.
263
264 If the handle is already closed, no error is raised.
265 [clinic start generated code]*/
266
267 static PyObject *
winreg_HKEYType_Close_impl(PyHKEYObject * self)268 winreg_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]
277 winreg.HKEYType.Detach
278
279 Detaches the Windows handle from the handle object.
280
281 The result is the value of the handle before it is detached. If the
282 handle is already detached, this will return zero.
283
284 After calling this function, the handle is effectively invalidated,
285 but the handle is not closed. You would call this function when you
286 need the underlying win32 handle to exist beyond the lifetime of the
287 handle object.
288 [clinic start generated code]*/
289
290 static PyObject *
winreg_HKEYType_Detach_impl(PyHKEYObject * self)291 winreg_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]
301 winreg.HKEYType.__enter__ -> self
302 [clinic start generated code]*/
303
304 static PyHKEYObject *
winreg_HKEYType___enter___impl(PyHKEYObject * self)305 winreg_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]
314 winreg.HKEYType.__exit__
315
316 exc_type: object
317 exc_value: object
318 traceback: object
319 [clinic start generated code]*/
320
321 static PyObject *
winreg_HKEYType___exit___impl(PyHKEYObject * self,PyObject * exc_type,PyObject * exc_value,PyObject * traceback)322 winreg_HKEYType___exit___impl(PyHKEYObject *self, PyObject *exc_type,
323 PyObject *exc_value, PyObject *traceback)
324 /*[clinic end generated code: output=923ebe7389e6a263 input=fb32489ee92403c7]*/
325 {
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]*/
334
335 static struct PyMethodDef PyHKEY_methods[] = {
336 WINREG_HKEYTYPE_CLOSE_METHODDEF
337 WINREG_HKEYTYPE_DETACH_METHODDEF
338 WINREG_HKEYTYPE___ENTER___METHODDEF
339 WINREG_HKEYTYPE___EXIT___METHODDEF
340 {NULL}
341 };
342
343 #define OFF(e) offsetof(PyHKEYObject, e)
344 static PyMemberDef PyHKEY_memberlist[] = {
345 {"handle", T_INT, OFF(hkey), READONLY},
346 {NULL} /* Sentinel */
347 };
348
349 /* The type itself */
350 PyTypeObject PyHKEY_Type =
351 {
352 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*/
381 };
382
383 /************************************************************************
384 The public PyHKEY API (well, not public yet :-)
385 ************************************************************************/
386 PyObject *
PyHKEY_New(HKEY hInit)387 PyHKEY_New(HKEY hInit)
388 {
389 PyHKEYObject *key = PyObject_NEW(PyHKEYObject, &PyHKEY_Type);
390 if (key)
391 key->hkey = hInit;
392 return (PyObject *)key;
393 }
394
395 BOOL
PyHKEY_Close(PyObject * ob_handle)396 PyHKEY_Close(PyObject *ob_handle)
397 {
398 LONG rc;
399 PyHKEYObject *key;
400
401 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;
411 }
412
413 BOOL
PyHKEY_AsHKEY(PyObject * ob,HKEY * pHANDLE,BOOL bNoneOK)414 PyHKEY_AsHKEY(PyObject *ob, HKEY *pHANDLE, BOOL bNoneOK)
415 {
416 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;
443 }
444
445 BOOL
clinic_HKEY_converter(PyObject * ob,void * p)446 clinic_HKEY_converter(PyObject *ob, void *p)
447 {
448 if (!PyHKEY_AsHKEY(ob, (HKEY *)p, FALSE))
449 return FALSE;
450 return TRUE;
451 }
452
453 PyObject *
PyHKEY_FromHKEY(HKEY h)454 PyHKEY_FromHKEY(HKEY h)
455 {
456 PyHKEYObject *op;
457
458 /* 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;
465 }
466
467
468 /************************************************************************
469 The module methods
470 ************************************************************************/
471 BOOL
PyWinObject_CloseHKEY(PyObject * obHandle)472 PyWinObject_CloseHKEY(PyObject *obHandle)
473 {
474 BOOL ok;
475 if (PyHKEY_Check(obHandle)) {
476 ok = PyHKEY_Close(obHandle);
477 }
478 #if SIZEOF_LONG >= SIZEOF_HKEY
479 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 }
485 #else
486 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 }
492 #endif
493 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;
500 }
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
509 ** some commercial packages install strings which don't conform,
510 ** causing this code to fail - however, "regedit" etc still work
511 ** with these strings (ie only we don't!).
512 */
513 static void
fixupMultiSZ(wchar_t ** str,wchar_t * data,int len)514 fixupMultiSZ(wchar_t **str, wchar_t *data, int len)
515 {
516 wchar_t *P;
517 int i;
518 wchar_t *Q;
519
520 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 }
526 }
527
528 static int
countStrings(wchar_t * data,int len)529 countStrings(wchar_t *data, int len)
530 {
531 int strings;
532 wchar_t *P;
533 wchar_t *Q = data + len;
534
535 for (P = data, strings = 0; P < Q && *P != '\0'; P++, strings++)
536 for (; P < Q && *P != '\0'; P++)
537 ;
538 return strings;
539 }
540
541 /* Convert PyObject into Registry data.
542 Allocates space as needed. */
543 static BOOL
Py2Reg(PyObject * value,DWORD typ,BYTE ** retDataBuf,DWORD * retDataSize)544 Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
545 {
546 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);
552 if (*retDataBuf == NULL){
553 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 {
562 DWORD d = PyLong_AsUnsignedLong(value);
563 memcpy(*retDataBuf, &d, sizeof(DWORD));
564 }
565 break;
566 case REG_QWORD:
567 if (value != Py_None && !PyLong_Check(value))
568 return FALSE;
569 *retDataBuf = (BYTE *)PyMem_NEW(DWORD64, 1);
570 if (*retDataBuf == NULL){
571 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;
584 case REG_SZ:
585 case REG_EXPAND_SZ:
586 {
587 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;
608 }
609 case REG_MULTI_SZ:
610 {
611 DWORD size = 0;
612 wchar_t *P;
613
614 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;
624 wchar_t *wstr;
625 Py_ssize_t len;
626
627 t = PyList_GET_ITEM(value, j);
628 if (!PyUnicode_Check(t))
629 return FALSE;
630 wstr = PyUnicode_AsUnicodeAndSize(t, &len);
631 if (wstr == NULL)
632 return FALSE;
633 size += Py_SAFE_DOWNCAST((len + 1) * sizeof(wchar_t),
634 size_t, DWORD);
635 }
636
637 *retDataSize = size + 2;
638 *retDataBuf = (BYTE *)PyMem_NEW(char,
639 *retDataSize);
640 if (*retDataBuf == NULL){
641 PyErr_NoMemory();
642 return FALSE;
643 }
644 P = (wchar_t *)*retDataBuf;
645
646 for (j = 0; j < i; j++)
647 {
648 PyObject *t;
649 wchar_t *wstr;
650 Py_ssize_t len;
651
652 t = PyList_GET_ITEM(value, j);
653 wstr = PyUnicode_AsUnicodeAndSize(t, &len);
654 if (wstr == NULL)
655 return FALSE;
656 wcscpy(P, wstr);
657 P += (len + 1);
658 }
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:
667 if (value == Py_None) {
668 *retDataSize = 0;
669 *retDataBuf = NULL;
670 }
671 else {
672 Py_buffer view;
673
674 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 }
681
682 if (PyObject_GetBuffer(value, &view, PyBUF_SIMPLE) < 0)
683 return FALSE;
684
685 *retDataBuf = (BYTE *)PyMem_NEW(char, view.len);
686 if (*retDataBuf == NULL){
687 PyBuffer_Release(&view);
688 PyErr_NoMemory();
689 return FALSE;
690 }
691 *retDataSize = Py_SAFE_DOWNCAST(view.len, Py_ssize_t, DWORD);
692 memcpy(*retDataBuf, view.buf, view.len);
693 PyBuffer_Release(&view);
694 }
695 break;
696 }
697 return TRUE;
698 }
699
700 /* Convert Registry data into PyObject*/
701 static PyObject *
Reg2Py(BYTE * retDataBuf,DWORD retDataSize,DWORD typ)702 Reg2Py(BYTE *retDataBuf, DWORD retDataSize, DWORD typ)
703 {
704 PyObject *obData;
705
706 switch (typ) {
707 case REG_DWORD:
708 if (retDataSize == 0)
709 obData = PyLong_FromUnsignedLong(0);
710 else
711 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);
718 break;
719 case REG_SZ:
720 case REG_EXPAND_SZ:
721 {
722 /* 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. */
726 wchar_t *data = (wchar_t *)retDataBuf;
727 size_t len = wcsnlen(data, retDataSize / sizeof(wchar_t));
728 obData = PyUnicode_FromWideChar(data, len);
729 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);
740 wchar_t **str = PyMem_New(wchar_t *, s);
741 if (str == NULL)
742 return PyErr_NoMemory();
743
744 fixupMultiSZ(str, data, len);
745 obData = PyList_New(s);
746 if (obData == NULL) {
747 PyMem_Free(str);
748 return NULL;
749 }
750 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);
757 PyMem_Free(str);
758 return NULL;
759 }
760 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);
767 }
768 PyMem_Free(str);
769
770 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;
786 }
787
788 /* The Python methods */
789
790 /*[clinic input]
791 winreg.CloseKey
792
793 hkey: object
794 A previously opened key.
795 /
796
797 Closes a previously opened registry key.
798
799 Note that if the key is not closed using this method, it will be
800 closed when the hkey object is destroyed by Python.
801 [clinic start generated code]*/
802
803 static PyObject *
winreg_CloseKey(PyObject * module,PyObject * hkey)804 winreg_CloseKey(PyObject *module, PyObject *hkey)
805 /*[clinic end generated code: output=a4fa537019a80d15 input=5b1aac65ba5127ad]*/
806 {
807 if (!PyHKEY_Close(hkey))
808 return NULL;
809 Py_RETURN_NONE;
810 }
811
812 /*[clinic input]
813 winreg.ConnectRegistry -> HKEY
814
815 computer_name: Py_UNICODE(accept={str, NoneType})
816 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
822 Establishes a connection to the registry on another computer.
823
824 The return value is the handle of the opened key.
825 If the function fails, an OSError exception is raised.
826 [clinic start generated code]*/
827
828 static HKEY
winreg_ConnectRegistry_impl(PyObject * module,const Py_UNICODE * computer_name,HKEY key)829 winreg_ConnectRegistry_impl(PyObject *module,
830 const Py_UNICODE *computer_name, HKEY key)
831 /*[clinic end generated code: output=cd4f70fb9ec901fb input=5f98a891a347e68e]*/
832 {
833 HKEY retKey;
834 long rc;
835 Py_BEGIN_ALLOW_THREADS
836 rc = RegConnectRegistryW(computer_name, key, &retKey);
837 Py_END_ALLOW_THREADS
838 if (rc != ERROR_SUCCESS) {
839 PyErr_SetFromWindowsErrWithFunction(rc, "ConnectRegistry");
840 return NULL;
841 }
842 return retKey;
843 }
844
845 /*[clinic input]
846 winreg.CreateKey -> HKEY
847
848 key: HKEY
849 An already open key, or one of the predefined HKEY_* constants.
850 sub_key: Py_UNICODE(accept={str, NoneType})
851 The name of the key this method opens or creates.
852 /
853
854 Creates or opens the specified key.
855
856 If key is one of the predefined keys, sub_key may be None. In that case,
857 the handle returned is the same key handle passed in to the function.
858
859 If the key already exists, this function opens the existing key.
860
861 The return value is the handle of the opened key.
862 If the function fails, an OSError exception is raised.
863 [clinic start generated code]*/
864
865 static HKEY
winreg_CreateKey_impl(PyObject * module,HKEY key,const Py_UNICODE * sub_key)866 winreg_CreateKey_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key)
867 /*[clinic end generated code: output=2af13910d56eae26 input=3cdd1622488acea2]*/
868 {
869 HKEY retKey;
870 long rc;
871
872 rc = RegCreateKeyW(key, sub_key, &retKey);
873 if (rc != ERROR_SUCCESS) {
874 PyErr_SetFromWindowsErrWithFunction(rc, "CreateKey");
875 return NULL;
876 }
877 return retKey;
878 }
879
880 /*[clinic input]
881 winreg.CreateKeyEx -> HKEY
882
883 key: HKEY
884 An already open key, or one of the predefined HKEY_* constants.
885 sub_key: Py_UNICODE(accept={str, NoneType})
886 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
893 Creates or opens the specified key.
894
895 If key is one of the predefined keys, sub_key may be None. In that case,
896 the handle returned is the same key handle passed in to the function.
897
898 If the key already exists, this function opens the existing key
899
900 The return value is the handle of the opened key.
901 If the function fails, an OSError exception is raised.
902 [clinic start generated code]*/
903
904 static HKEY
winreg_CreateKeyEx_impl(PyObject * module,HKEY key,const Py_UNICODE * sub_key,int reserved,REGSAM access)905 winreg_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]*/
909 {
910 HKEY retKey;
911 long rc;
912
913 rc = RegCreateKeyExW(key, sub_key, reserved, NULL, 0,
914 access, NULL, &retKey, NULL);
915 if (rc != ERROR_SUCCESS) {
916 PyErr_SetFromWindowsErrWithFunction(rc, "CreateKeyEx");
917 return NULL;
918 }
919 return retKey;
920 }
921
922 /*[clinic input]
923 winreg.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
932 Deletes the specified key.
933
934 This method can not delete keys with subkeys.
935
936 If the function succeeds, the entire key, including all of its values,
937 is removed. If the function fails, an OSError exception is raised.
938 [clinic start generated code]*/
939
940 static PyObject *
winreg_DeleteKey_impl(PyObject * module,HKEY key,const Py_UNICODE * sub_key)941 winreg_DeleteKey_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key)
942 /*[clinic end generated code: output=d2652a84f70e0862 input=b31d225b935e4211]*/
943 {
944 long rc;
945 rc = RegDeleteKeyW(key, sub_key );
946 if (rc != ERROR_SUCCESS)
947 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKey");
948 Py_RETURN_NONE;
949 }
950
951 /*[clinic input]
952 winreg.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
966 Deletes the specified key (64-bit OS only).
967
968 This method can not delete keys with subkeys.
969
970 If the function succeeds, the entire key, including all of its values,
971 is removed. If the function fails, an OSError exception is raised.
972 On unsupported Windows versions, NotImplementedError is raised.
973 [clinic start generated code]*/
974
975 static PyObject *
winreg_DeleteKeyEx_impl(PyObject * module,HKEY key,const Py_UNICODE * sub_key,REGSAM access,int reserved)976 winreg_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]*/
980 {
981 HMODULE hMod;
982 typedef LONG (WINAPI *RDKEFunc)(HKEY, const wchar_t*, REGSAM, int);
983 RDKEFunc pfn = NULL;
984 long rc;
985
986 /* Only available on 64bit platforms, so we must load it
987 dynamically. */
988 hMod = GetModuleHandleW(L"advapi32.dll");
989 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
998 rc = (*pfn)(key, sub_key, access, reserved);
999 Py_END_ALLOW_THREADS
1000
1001 if (rc != ERROR_SUCCESS)
1002 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKeyEx");
1003 Py_RETURN_NONE;
1004 }
1005
1006 /*[clinic input]
1007 winreg.DeleteValue
1008
1009 key: HKEY
1010 An already open key, or any one of the predefined HKEY_* constants.
1011 value: Py_UNICODE(accept={str, NoneType})
1012 A string that identifies the value to remove.
1013 /
1014
1015 Removes a named value from a registry key.
1016 [clinic start generated code]*/
1017
1018 static PyObject *
winreg_DeleteValue_impl(PyObject * module,HKEY key,const Py_UNICODE * value)1019 winreg_DeleteValue_impl(PyObject *module, HKEY key, const Py_UNICODE *value)
1020 /*[clinic end generated code: output=56fa9d21f3a54371 input=a78d3407a4197b21]*/
1021 {
1022 long rc;
1023 Py_BEGIN_ALLOW_THREADS
1024 rc = RegDeleteValueW(key, value);
1025 Py_END_ALLOW_THREADS
1026 if (rc !=ERROR_SUCCESS)
1027 return PyErr_SetFromWindowsErrWithFunction(rc,
1028 "RegDeleteValue");
1029 Py_RETURN_NONE;
1030 }
1031
1032 /*[clinic input]
1033 winreg.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
1041 Enumerates subkeys of an open registry key.
1042
1043 The function retrieves the name of one subkey each time it is called.
1044 It is typically called repeatedly until an OSError exception is
1045 raised, indicating no more values are available.
1046 [clinic start generated code]*/
1047
1048 static PyObject *
winreg_EnumKey_impl(PyObject * module,HKEY key,int index)1049 winreg_EnumKey_impl(PyObject *module, HKEY key, int index)
1050 /*[clinic end generated code: output=25a6ec52cd147bc4 input=fad9a7c00ab0e04b]*/
1051 {
1052 long rc;
1053 PyObject *retStr;
1054
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];
1062 DWORD len = sizeof(tmpbuf)/sizeof(wchar_t); /* includes NULL terminator */
1063
1064 Py_BEGIN_ALLOW_THREADS
1065 rc = RegEnumKeyExW(key, index, tmpbuf, &len, NULL, NULL, NULL, NULL);
1066 Py_END_ALLOW_THREADS
1067 if (rc != ERROR_SUCCESS)
1068 return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKeyEx");
1069
1070 retStr = PyUnicode_FromWideChar(tmpbuf, len);
1071 return retStr; /* can be NULL */
1072 }
1073
1074 /*[clinic input]
1075 winreg.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
1083 Enumerates values of an open registry key.
1084
1085 The function retrieves the name of one subkey each time it is called.
1086 It is typically called repeatedly, until an OSError exception
1087 is raised, indicating no more values.
1088
1089 The 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
1099 static PyObject *
winreg_EnumValue_impl(PyObject * module,HKEY key,int index)1100 winreg_EnumValue_impl(PyObject *module, HKEY key, int index)
1101 /*[clinic end generated code: output=d363b5a06f8789ac input=4414f47a6fb238b5]*/
1102 {
1103 long rc;
1104 wchar_t *retValueBuf;
1105 BYTE *tmpBuf;
1106 BYTE *retDataBuf;
1107 DWORD retValueSize, bufValueSize;
1108 DWORD retDataSize, bufDataSize;
1109 DWORD typ;
1110 PyObject *obData;
1111 PyObject *retVal;
1112
1113 if ((rc = RegQueryInfoKeyW(key, NULL, NULL, NULL, NULL, NULL, NULL,
1114 NULL,
1115 &retValueSize, &retDataSize, NULL, NULL))
1116 != ERROR_SUCCESS)
1117 return PyErr_SetFromWindowsErrWithFunction(rc,
1118 "RegQueryInfoKey");
1119 ++retValueSize; /* include null terminators */
1120 ++retDataSize;
1121 bufDataSize = retDataSize;
1122 bufValueSize = retValueSize;
1123 retValueBuf = PyMem_New(wchar_t, retValueSize);
1124 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 }
1131
1132 while (1) {
1133 Py_BEGIN_ALLOW_THREADS
1134 rc = RegEnumValueW(key,
1135 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;
1148 tmpBuf = (BYTE *)PyMem_Realloc(retDataBuf, bufDataSize);
1149 if (tmpBuf == NULL) {
1150 PyErr_NoMemory();
1151 retVal = NULL;
1152 goto fail;
1153 }
1154 retDataBuf = tmpBuf;
1155 retDataSize = bufDataSize;
1156 retValueSize = bufValueSize;
1157 }
1158
1159 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);
1171 fail:
1172 PyMem_Free(retValueBuf);
1173 PyMem_Free(retDataBuf);
1174 return retVal;
1175 }
1176
1177 /*[clinic input]
1178 winreg.ExpandEnvironmentStrings
1179
1180 string: Py_UNICODE
1181 /
1182
1183 Expand environment vars.
1184 [clinic start generated code]*/
1185
1186 static PyObject *
winreg_ExpandEnvironmentStrings_impl(PyObject * module,const Py_UNICODE * string)1187 winreg_ExpandEnvironmentStrings_impl(PyObject *module,
1188 const Py_UNICODE *string)
1189 /*[clinic end generated code: output=8fa4e959747a7312 input=b2a9714d2b751aa6]*/
1190 {
1191 wchar_t *retValue = NULL;
1192 DWORD retValueSize;
1193 DWORD rc;
1194 PyObject *o;
1195
1196 retValueSize = ExpandEnvironmentStringsW(string, retValue, 0);
1197 if (retValueSize == 0) {
1198 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1199 "ExpandEnvironmentStrings");
1200 }
1201 retValue = PyMem_New(wchar_t, retValueSize);
1202 if (retValue == NULL) {
1203 return PyErr_NoMemory();
1204 }
1205
1206 rc = ExpandEnvironmentStringsW(string, retValue, retValueSize);
1207 if (rc == 0) {
1208 PyMem_Free(retValue);
1209 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1210 "ExpandEnvironmentStrings");
1211 }
1212 o = PyUnicode_FromWideChar(retValue, wcslen(retValue));
1213 PyMem_Free(retValue);
1214 return o;
1215 }
1216
1217 /*[clinic input]
1218 winreg.FlushKey
1219
1220 key: HKEY
1221 An already open key, or any one of the predefined HKEY_* constants.
1222 /
1223
1224 Writes all the attributes of a key to the registry.
1225
1226 It is not necessary to call FlushKey to change a key. Registry changes
1227 are flushed to disk by the registry using its lazy flusher. Registry
1228 changes are also flushed to disk at system shutdown. Unlike
1229 CloseKey(), the FlushKey() method returns only when all the data has
1230 been written to the registry.
1231
1232 An application should only call FlushKey() if it requires absolute
1233 certainty that registry changes are on disk. If you don't know whether
1234 a FlushKey() call is required, it probably isn't.
1235 [clinic start generated code]*/
1236
1237 static PyObject *
winreg_FlushKey_impl(PyObject * module,HKEY key)1238 winreg_FlushKey_impl(PyObject *module, HKEY key)
1239 /*[clinic end generated code: output=e6fc230d4c5dc049 input=f57457c12297d82f]*/
1240 {
1241 long rc;
1242 Py_BEGIN_ALLOW_THREADS
1243 rc = RegFlushKey(key);
1244 Py_END_ALLOW_THREADS
1245 if (rc != ERROR_SUCCESS)
1246 return PyErr_SetFromWindowsErrWithFunction(rc, "RegFlushKey");
1247 Py_RETURN_NONE;
1248 }
1249
1250
1251 /*[clinic input]
1252 winreg.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
1265 Insert data into the registry from a file.
1266
1267 Creates a subkey under the specified key and stores registration
1268 information from a specified file into that subkey.
1269
1270 A call to LoadKey() fails if the calling process does not have the
1271 SE_RESTORE_PRIVILEGE privilege.
1272
1273 If key is a handle returned by ConnectRegistry(), then the path
1274 specified in fileName is relative to the remote computer.
1275
1276 The MSDN docs imply key must be in the HKEY_USER or HKEY_LOCAL_MACHINE
1277 tree.
1278 [clinic start generated code]*/
1279
1280 static PyObject *
winreg_LoadKey_impl(PyObject * module,HKEY key,const Py_UNICODE * sub_key,const Py_UNICODE * file_name)1281 winreg_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]*/
1284 {
1285 long rc;
1286
1287 Py_BEGIN_ALLOW_THREADS
1288 rc = RegLoadKeyW(key, sub_key, file_name );
1289 Py_END_ALLOW_THREADS
1290 if (rc != ERROR_SUCCESS)
1291 return PyErr_SetFromWindowsErrWithFunction(rc, "RegLoadKey");
1292 Py_RETURN_NONE;
1293 }
1294
1295 /*[clinic input]
1296 winreg.OpenKey -> HKEY
1297
1298 key: HKEY
1299 An already open key, or any one of the predefined HKEY_* constants.
1300 sub_key: Py_UNICODE(accept={str, NoneType})
1301 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
1308 Opens the specified key.
1309
1310 The result is a new handle to the specified key.
1311 If the function fails, an OSError exception is raised.
1312 [clinic start generated code]*/
1313
1314 static HKEY
winreg_OpenKey_impl(PyObject * module,HKEY key,const Py_UNICODE * sub_key,int reserved,REGSAM access)1315 winreg_OpenKey_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key,
1316 int reserved, REGSAM access)
1317 /*[clinic end generated code: output=8849bff2c30104ad input=098505ac36a9ae28]*/
1318 {
1319 HKEY retKey;
1320 long rc;
1321
1322 Py_BEGIN_ALLOW_THREADS
1323 rc = RegOpenKeyExW(key, sub_key, reserved, access, &retKey);
1324 Py_END_ALLOW_THREADS
1325 if (rc != ERROR_SUCCESS) {
1326 PyErr_SetFromWindowsErrWithFunction(rc, "RegOpenKeyEx");
1327 return NULL;
1328 }
1329 return retKey;
1330 }
1331
1332 /*[clinic input]
1333 winreg.OpenKeyEx = winreg.OpenKey
1334
1335 Opens the specified key.
1336
1337 The result is a new handle to the specified key.
1338 If the function fails, an OSError exception is raised.
1339 [clinic start generated code]*/
1340
1341 static HKEY
winreg_OpenKeyEx_impl(PyObject * module,HKEY key,const Py_UNICODE * sub_key,int reserved,REGSAM access)1342 winreg_OpenKeyEx_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key,
1343 int reserved, REGSAM access)
1344 /*[clinic end generated code: output=81bc2bd684bc77ae input=c6c4972af8622959]*/
1345 {
1346 return winreg_OpenKey_impl(module, key, sub_key, reserved, access);
1347 }
1348
1349 /*[clinic input]
1350 winreg.QueryInfoKey
1351
1352 key: HKEY
1353 An already open key, or any one of the predefined HKEY_* constants.
1354 /
1355
1356 Returns information about a key.
1357
1358 The result is a tuple of 3 items:
1359 An integer that identifies the number of sub keys this key has.
1360 An integer that identifies the number of values this key has.
1361 An integer that identifies when the key was last modified (if available)
1362 as 100's of nanoseconds since Jan 1, 1600.
1363 [clinic start generated code]*/
1364
1365 static PyObject *
winreg_QueryInfoKey_impl(PyObject * module,HKEY key)1366 winreg_QueryInfoKey_impl(PyObject *module, HKEY key)
1367 /*[clinic end generated code: output=dc657b8356a4f438 input=c3593802390cde1f]*/
1368 {
1369 long rc;
1370 DWORD nSubKeys, nValues;
1371 FILETIME ft;
1372 LARGE_INTEGER li;
1373 PyObject *l;
1374 PyObject *ret;
1375
1376 if ((rc = RegQueryInfoKey(key, NULL, NULL, 0, &nSubKeys, NULL, NULL,
1377 &nValues, NULL, NULL, NULL, &ft))
1378 != ERROR_SUCCESS)
1379 return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryInfoKey");
1380 li.LowPart = ft.dwLowDateTime;
1381 li.HighPart = ft.dwHighDateTime;
1382 l = PyLong_FromLongLong(li.QuadPart);
1383 if (l == NULL)
1384 return NULL;
1385 ret = Py_BuildValue("iiO", nSubKeys, nValues, l);
1386 Py_DECREF(l);
1387 return ret;
1388 }
1389
1390 /*[clinic input]
1391 winreg.QueryValue
1392
1393 key: HKEY
1394 An already open key, or any one of the predefined HKEY_* constants.
1395 sub_key: Py_UNICODE(accept={str, NoneType})
1396 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
1402 Retrieves the unnamed value for a key.
1403
1404 Values in the registry have name, type, and data components. This method
1405 retrieves the data for a key's first value that has a NULL name.
1406 But since the underlying API call doesn't return the type, you'll
1407 probably be happier using QueryValueEx; this function is just here for
1408 completeness.
1409 [clinic start generated code]*/
1410
1411 static PyObject *
winreg_QueryValue_impl(PyObject * module,HKEY key,const Py_UNICODE * sub_key)1412 winreg_QueryValue_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key)
1413 /*[clinic end generated code: output=c655810ae50c63a9 input=41cafbbf423b21d6]*/
1414 {
1415 long rc;
1416 PyObject *retStr;
1417 wchar_t *retBuf;
1418 DWORD bufSize = 0;
1419 DWORD retSize = 0;
1420 wchar_t *tmp;
1421
1422 rc = RegQueryValueW(key, sub_key, NULL, &retSize);
1423 if (rc == ERROR_MORE_DATA)
1424 retSize = 256;
1425 else if (rc != ERROR_SUCCESS)
1426 return PyErr_SetFromWindowsErrWithFunction(rc,
1427 "RegQueryValue");
1428
1429 bufSize = retSize;
1430 retBuf = (wchar_t *) PyMem_Malloc(bufSize);
1431 if (retBuf == NULL)
1432 return PyErr_NoMemory();
1433
1434 while (1) {
1435 retSize = bufSize;
1436 rc = RegQueryValueW(key, sub_key, retBuf, &retSize);
1437 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) {
1450 PyMem_Free(retBuf);
1451 return PyErr_SetFromWindowsErrWithFunction(rc,
1452 "RegQueryValue");
1453 }
1454
1455 retStr = PyUnicode_FromWideChar(retBuf, wcslen(retBuf));
1456 PyMem_Free(retBuf);
1457 return retStr;
1458 }
1459
1460
1461 /*[clinic input]
1462 winreg.QueryValueEx
1463
1464 key: HKEY
1465 An already open key, or any one of the predefined HKEY_* constants.
1466 name: Py_UNICODE(accept={str, NoneType})
1467 A string indicating the value to query.
1468 /
1469
1470 Retrieves the type and value of a specified sub-key.
1471
1472 Behaves mostly like QueryValue(), but also returns the type of the
1473 specified value name associated with the given open registry key.
1474
1475 The return value is a tuple of the value and the type_id.
1476 [clinic start generated code]*/
1477
1478 static PyObject *
winreg_QueryValueEx_impl(PyObject * module,HKEY key,const Py_UNICODE * name)1479 winreg_QueryValueEx_impl(PyObject *module, HKEY key, const Py_UNICODE *name)
1480 /*[clinic end generated code: output=f1b85b1c3d887ec7 input=cf366cada4836891]*/
1481 {
1482 long rc;
1483 BYTE *retBuf, *tmp;
1484 DWORD bufSize = 0, retSize;
1485 DWORD typ;
1486 PyObject *obData;
1487 PyObject *result;
1488
1489 rc = RegQueryValueExW(key, name, NULL, NULL, NULL, &bufSize);
1490 if (rc == ERROR_MORE_DATA)
1491 bufSize = 256;
1492 else if (rc != ERROR_SUCCESS)
1493 return PyErr_SetFromWindowsErrWithFunction(rc,
1494 "RegQueryValueEx");
1495 retBuf = (BYTE *)PyMem_Malloc(bufSize);
1496 if (retBuf == NULL)
1497 return PyErr_NoMemory();
1498
1499 while (1) {
1500 retSize = bufSize;
1501 rc = RegQueryValueExW(key, name, NULL, &typ,
1502 (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) {
1516 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;
1527 }
1528
1529 /*[clinic input]
1530 winreg.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
1541 Saves the specified key, and all its subkeys to the specified file.
1542
1543 If key represents a key on a remote computer, the path described by
1544 file_name is relative to the remote computer.
1545
1546 The caller of this method must possess the SeBackupPrivilege
1547 security privilege. This function passes NULL for security_attributes
1548 to the API.
1549 [clinic start generated code]*/
1550
1551 static PyObject *
winreg_SaveKey_impl(PyObject * module,HKEY key,const Py_UNICODE * file_name)1552 winreg_SaveKey_impl(PyObject *module, HKEY key, const Py_UNICODE *file_name)
1553 /*[clinic end generated code: output=ca94b835c88f112b input=da735241f91ac7a2]*/
1554 {
1555 LPSECURITY_ATTRIBUTES pSA = NULL;
1556
1557 long rc;
1558 /* One day we may get security into the core?
1559 if (!PyWinObject_AsSECURITY_ATTRIBUTES(obSA, &pSA, TRUE))
1560 return NULL;
1561 */
1562 Py_BEGIN_ALLOW_THREADS
1563 rc = RegSaveKeyW(key, file_name, pSA );
1564 Py_END_ALLOW_THREADS
1565 if (rc != ERROR_SUCCESS)
1566 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSaveKey");
1567 Py_RETURN_NONE;
1568 }
1569
1570 /*[clinic input]
1571 winreg.SetValue
1572
1573 key: HKEY
1574 An already open key, or any one of the predefined HKEY_* constants.
1575 sub_key: Py_UNICODE(accept={str, NoneType})
1576 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.
1580 value: Py_UNICODE(zeroes=True)
1581 A string that specifies the new value.
1582 /
1583
1584 Associates a value with a specified key.
1585
1586 If the key specified by the sub_key parameter does not exist, the
1587 SetValue function creates it.
1588
1589 Value lengths are limited by available memory. Long values (more than
1590 2048 bytes) should be stored as files with the filenames stored in
1591 the configuration registry to help the registry perform efficiently.
1592
1593 The key identified by the key parameter must have been opened with
1594 KEY_SET_VALUE access.
1595 [clinic start generated code]*/
1596
1597 static PyObject *
winreg_SetValue_impl(PyObject * module,HKEY key,const Py_UNICODE * sub_key,DWORD type,const Py_UNICODE * value,Py_ssize_clean_t value_length)1598 winreg_SetValue_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key,
1599 DWORD type, const Py_UNICODE *value,
1600 Py_ssize_clean_t value_length)
1601 /*[clinic end generated code: output=686bedb1cbb4367b input=2cd2adab79339c53]*/
1602 {
1603 long rc;
1604
1605 if (type != REG_SZ) {
1606 PyErr_SetString(PyExc_TypeError,
1607 "Type must be winreg.REG_SZ");
1608 return NULL;
1609 }
1610
1611 Py_BEGIN_ALLOW_THREADS
1612 rc = RegSetValueW(key, sub_key, REG_SZ, value, value_length+1);
1613 Py_END_ALLOW_THREADS
1614 if (rc != ERROR_SUCCESS)
1615 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSetValue");
1616 Py_RETURN_NONE;
1617 }
1618
1619 /*[clinic input]
1620 winreg.SetValueEx
1621
1622 key: HKEY
1623 An already open key, or any one of the predefined HKEY_* constants.
1624 value_name: Py_UNICODE(accept={str, NoneType})
1625 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.
1632 REG_DWORD_LITTLE_ENDIAN -- A 32-bit number in little-endian format. Equivalent to REG_DWORD
1633 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.
1638 REG_MULTI_SZ -- A sequence of null-terminated strings, terminated
1639 by two null characters. Note that Python handles
1640 this termination automatically.
1641 REG_NONE -- No defined value type.
1642 REG_QWORD -- A 64-bit number.
1643 REG_QWORD_LITTLE_ENDIAN -- A 64-bit number in little-endian format. Equivalent to REG_QWORD.
1644 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
1650 Stores data in the value field of an open registry key.
1651
1652 This method can also set additional value and type information for the
1653 specified key. The key identified by the key parameter must have been
1654 opened with KEY_SET_VALUE access.
1655
1656 To open the key, use the CreateKeyEx() or OpenKeyEx() methods.
1657
1658 Value lengths are limited by available memory. Long values (more than
1659 2048 bytes) should be stored as files with the filenames stored in
1660 the configuration registry to help the registry perform efficiently.
1661 [clinic start generated code]*/
1662
1663 static PyObject *
winreg_SetValueEx_impl(PyObject * module,HKEY key,const Py_UNICODE * value_name,PyObject * reserved,DWORD type,PyObject * value)1664 winreg_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]*/
1668 {
1669 BYTE *data;
1670 DWORD len;
1671
1672 LONG rc;
1673
1674 if (!Py2Reg(value, type, &data, &len))
1675 {
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
1682 rc = RegSetValueExW(key, value_name, 0, type, data, len);
1683 Py_END_ALLOW_THREADS
1684 PyMem_DEL(data);
1685 if (rc != ERROR_SUCCESS)
1686 return PyErr_SetFromWindowsErrWithFunction(rc,
1687 "RegSetValueEx");
1688 Py_RETURN_NONE;
1689 }
1690
1691 /*[clinic input]
1692 winreg.DisableReflectionKey
1693
1694 key: HKEY
1695 An already open key, or any one of the predefined HKEY_* constants.
1696 /
1697
1698 Disables registry reflection for 32bit processes running on a 64bit OS.
1699
1700 Will generally raise NotImplemented if executed on a 32bit OS.
1701
1702 If the key is not on the reflection list, the function succeeds but has
1703 no effect. Disabling reflection for a key does not affect reflection
1704 of any subkeys.
1705 [clinic start generated code]*/
1706
1707 static PyObject *
winreg_DisableReflectionKey_impl(PyObject * module,HKEY key)1708 winreg_DisableReflectionKey_impl(PyObject *module, HKEY key)
1709 /*[clinic end generated code: output=830cce504cc764b4 input=a6c9e5ca5410193c]*/
1710 {
1711 HMODULE hMod;
1712 typedef LONG (WINAPI *RDRKFunc)(HKEY);
1713 RDRKFunc pfn = NULL;
1714 LONG rc;
1715
1716 /* Only available on 64bit platforms, so we must load it
1717 dynamically.*/
1718 hMod = GetModuleHandleW(L"advapi32.dll");
1719 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
1728 rc = (*pfn)(key);
1729 Py_END_ALLOW_THREADS
1730 if (rc != ERROR_SUCCESS)
1731 return PyErr_SetFromWindowsErrWithFunction(rc,
1732 "RegDisableReflectionKey");
1733 Py_RETURN_NONE;
1734 }
1735
1736 /*[clinic input]
1737 winreg.EnableReflectionKey
1738
1739 key: HKEY
1740 An already open key, or any one of the predefined HKEY_* constants.
1741 /
1742
1743 Restores registry reflection for the specified disabled key.
1744
1745 Will generally raise NotImplemented if executed on a 32bit OS.
1746 Restoring reflection for a key does not affect reflection of any
1747 subkeys.
1748 [clinic start generated code]*/
1749
1750 static PyObject *
winreg_EnableReflectionKey_impl(PyObject * module,HKEY key)1751 winreg_EnableReflectionKey_impl(PyObject *module, HKEY key)
1752 /*[clinic end generated code: output=86fa1385fdd9ce57 input=7748abbacd1e166a]*/
1753 {
1754 HMODULE hMod;
1755 typedef LONG (WINAPI *RERKFunc)(HKEY);
1756 RERKFunc pfn = NULL;
1757 LONG rc;
1758
1759 /* Only available on 64bit platforms, so we must load it
1760 dynamically.*/
1761 hMod = GetModuleHandleW(L"advapi32.dll");
1762 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
1771 rc = (*pfn)(key);
1772 Py_END_ALLOW_THREADS
1773 if (rc != ERROR_SUCCESS)
1774 return PyErr_SetFromWindowsErrWithFunction(rc,
1775 "RegEnableReflectionKey");
1776 Py_RETURN_NONE;
1777 }
1778
1779 /*[clinic input]
1780 winreg.QueryReflectionKey
1781
1782 key: HKEY
1783 An already open key, or any one of the predefined HKEY_* constants.
1784 /
1785
1786 Returns the reflection state for the specified key as a bool.
1787
1788 Will generally raise NotImplemented if executed on a 32bit OS.
1789 [clinic start generated code]*/
1790
1791 static PyObject *
winreg_QueryReflectionKey_impl(PyObject * module,HKEY key)1792 winreg_QueryReflectionKey_impl(PyObject *module, HKEY key)
1793 /*[clinic end generated code: output=4e774af288c3ebb9 input=9f325eacb5a65d88]*/
1794 {
1795 HMODULE hMod;
1796 typedef LONG (WINAPI *RQRKFunc)(HKEY, BOOL *);
1797 RQRKFunc pfn = NULL;
1798 BOOL result;
1799 LONG rc;
1800
1801 /* Only available on 64bit platforms, so we must load it
1802 dynamically.*/
1803 hMod = GetModuleHandleW(L"advapi32.dll");
1804 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
1813 rc = (*pfn)(key, &result);
1814 Py_END_ALLOW_THREADS
1815 if (rc != ERROR_SUCCESS)
1816 return PyErr_SetFromWindowsErrWithFunction(rc,
1817 "RegQueryReflectionKey");
1818 return PyBool_FromLong(result);
1819 }
1820
1821 static struct PyMethodDef winreg_methods[] = {
1822 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
1845 NULL,
1846 };
1847
1848 static void
insint(PyObject * d,char * name,long value)1849 insint(PyObject * d, char * name, long value)
1850 {
1851 PyObject *v = PyLong_FromLong(value);
1852 if (!v || PyDict_SetItemString(d, name, v))
1853 PyErr_Clear();
1854 Py_XDECREF(v);
1855 }
1856
1857 #define ADD_INT(val) insint(d, #val, val)
1858
1859 static void
inskey(PyObject * d,char * name,HKEY key)1860 inskey(PyObject * d, char * name, HKEY key)
1861 {
1862 PyObject *v = PyLong_FromVoidPtr(key);
1863 if (!v || PyDict_SetItemString(d, name, v))
1864 PyErr_Clear();
1865 Py_XDECREF(v);
1866 }
1867
1868 #define ADD_KEY(val) inskey(d, #val, val)
1869
1870
1871 static struct PyModuleDef winregmodule = {
1872 PyModuleDef_HEAD_INIT,
1873 "winreg",
1874 module_doc,
1875 -1,
1876 winreg_methods,
1877 NULL,
1878 NULL,
1879 NULL,
1880 NULL
1881 };
1882
PyInit_winreg(void)1883 PyMODINIT_FUNC PyInit_winreg(void)
1884 {
1885 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;
1897 Py_INCREF(PyExc_OSError);
1898 if (PyDict_SetItemString(d, "error",
1899 PyExc_OSError) != 0)
1900 return NULL;
1901
1902 /* 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);
1908 #ifdef HKEY_CURRENT_CONFIG
1909 ADD_KEY(HKEY_CURRENT_CONFIG);
1910 #endif
1911 #ifdef HKEY_DYN_DATA
1912 ADD_KEY(HKEY_DYN_DATA);
1913 #endif
1914 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);
1924 #ifdef KEY_WOW64_64KEY
1925 ADD_INT(KEY_WOW64_64KEY);
1926 #endif
1927 #ifdef KEY_WOW64_32KEY
1928 ADD_INT(KEY_WOW64_32KEY);
1929 #endif
1930 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);
1954 ADD_INT(REG_QWORD);
1955 ADD_INT(REG_QWORD_LITTLE_ENDIAN);
1956 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;
1962 }
1963
1964
1965