• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 dont
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 dont conform,
510 ** causing this code to fail - however, "regedit" etc still work
511 ** with these strings (ie only we dont!).
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                     PyList_SetItem(obData,
761                                    index,
762                                    PyUnicode_FromWideChar(str[index], len));
763                 }
764                 PyMem_Free(str);
765 
766                 break;
767             }
768         case REG_BINARY:
769         /* ALSO handle ALL unknown data types here.  Even if we can't
770            support it natively, we should handle the bits. */
771         default:
772             if (retDataSize == 0) {
773                 Py_INCREF(Py_None);
774                 obData = Py_None;
775             }
776             else
777                 obData = PyBytes_FromStringAndSize(
778                              (char *)retDataBuf, retDataSize);
779             break;
780     }
781     return obData;
782 }
783 
784 /* The Python methods */
785 
786 /*[clinic input]
787 winreg.CloseKey
788 
789     hkey: object
790         A previously opened key.
791     /
792 
793 Closes a previously opened registry key.
794 
795 Note that if the key is not closed using this method, it will be
796 closed when the hkey object is destroyed by Python.
797 [clinic start generated code]*/
798 
799 static PyObject *
winreg_CloseKey(PyObject * module,PyObject * hkey)800 winreg_CloseKey(PyObject *module, PyObject *hkey)
801 /*[clinic end generated code: output=a4fa537019a80d15 input=5b1aac65ba5127ad]*/
802 {
803     if (!PyHKEY_Close(hkey))
804         return NULL;
805     Py_RETURN_NONE;
806 }
807 
808 /*[clinic input]
809 winreg.ConnectRegistry -> HKEY
810 
811     computer_name: Py_UNICODE(accept={str, NoneType})
812         The name of the remote computer, of the form r"\\computername".  If
813         None, the local computer is used.
814     key: HKEY
815         The predefined key to connect to.
816     /
817 
818 Establishes a connection to the registry on another computer.
819 
820 The return value is the handle of the opened key.
821 If the function fails, an OSError exception is raised.
822 [clinic start generated code]*/
823 
824 static HKEY
winreg_ConnectRegistry_impl(PyObject * module,Py_UNICODE * computer_name,HKEY key)825 winreg_ConnectRegistry_impl(PyObject *module, Py_UNICODE *computer_name,
826                             HKEY key)
827 /*[clinic end generated code: output=5ab79d02aa3167b4 input=5f98a891a347e68e]*/
828 {
829     HKEY retKey;
830     long rc;
831     Py_BEGIN_ALLOW_THREADS
832     rc = RegConnectRegistryW(computer_name, key, &retKey);
833     Py_END_ALLOW_THREADS
834     if (rc != ERROR_SUCCESS) {
835         PyErr_SetFromWindowsErrWithFunction(rc, "ConnectRegistry");
836         return NULL;
837     }
838     return retKey;
839 }
840 
841 /*[clinic input]
842 winreg.CreateKey -> HKEY
843 
844     key: HKEY
845         An already open key, or one of the predefined HKEY_* constants.
846     sub_key: Py_UNICODE(accept={str, NoneType})
847         The name of the key this method opens or creates.
848     /
849 
850 Creates or opens the specified key.
851 
852 If key is one of the predefined keys, sub_key may be None. In that case,
853 the handle returned is the same key handle passed in to the function.
854 
855 If the key already exists, this function opens the existing key.
856 
857 The return value is the handle of the opened key.
858 If the function fails, an OSError exception is raised.
859 [clinic start generated code]*/
860 
861 static HKEY
winreg_CreateKey_impl(PyObject * module,HKEY key,Py_UNICODE * sub_key)862 winreg_CreateKey_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key)
863 /*[clinic end generated code: output=9c81d4095527c927 input=3cdd1622488acea2]*/
864 {
865     HKEY retKey;
866     long rc;
867 
868     rc = RegCreateKeyW(key, sub_key, &retKey);
869     if (rc != ERROR_SUCCESS) {
870         PyErr_SetFromWindowsErrWithFunction(rc, "CreateKey");
871         return NULL;
872     }
873     return retKey;
874 }
875 
876 /*[clinic input]
877 winreg.CreateKeyEx -> HKEY
878 
879     key: HKEY
880         An already open key, or one of the predefined HKEY_* constants.
881     sub_key: Py_UNICODE(accept={str, NoneType})
882         The name of the key this method opens or creates.
883     reserved: int = 0
884         A reserved integer, and must be zero.  Default is zero.
885     access: REGSAM(c_default='KEY_WRITE') = winreg.KEY_WRITE
886         An integer that specifies an access mask that describes the
887         desired security access for the key. Default is KEY_WRITE.
888 
889 Creates or opens the specified key.
890 
891 If key is one of the predefined keys, sub_key may be None. In that case,
892 the handle returned is the same key handle passed in to the function.
893 
894 If the key already exists, this function opens the existing key
895 
896 The return value is the handle of the opened key.
897 If the function fails, an OSError exception is raised.
898 [clinic start generated code]*/
899 
900 static HKEY
winreg_CreateKeyEx_impl(PyObject * module,HKEY key,Py_UNICODE * sub_key,int reserved,REGSAM access)901 winreg_CreateKeyEx_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
902                         int reserved, REGSAM access)
903 /*[clinic end generated code: output=b9fce6dc5c4e39b1 input=42c2b03f98406b66]*/
904 {
905     HKEY retKey;
906     long rc;
907 
908     rc = RegCreateKeyExW(key, sub_key, reserved, NULL, (DWORD)NULL,
909                          access, NULL, &retKey, NULL);
910     if (rc != ERROR_SUCCESS) {
911         PyErr_SetFromWindowsErrWithFunction(rc, "CreateKeyEx");
912         return NULL;
913     }
914     return retKey;
915 }
916 
917 /*[clinic input]
918 winreg.DeleteKey
919     key: HKEY
920         An already open key, or any one of the predefined HKEY_* constants.
921     sub_key: Py_UNICODE
922         A string that must be the name of a subkey of the key identified by
923         the key parameter. This value must not be None, and the key may not
924         have subkeys.
925     /
926 
927 Deletes the specified key.
928 
929 This method can not delete keys with subkeys.
930 
931 If the function succeeds, the entire key, including all of its values,
932 is removed.  If the function fails, an OSError exception is raised.
933 [clinic start generated code]*/
934 
935 static PyObject *
winreg_DeleteKey_impl(PyObject * module,HKEY key,Py_UNICODE * sub_key)936 winreg_DeleteKey_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key)
937 /*[clinic end generated code: output=7734b1e431991ae4 input=b31d225b935e4211]*/
938 {
939     long rc;
940     rc = RegDeleteKeyW(key, sub_key );
941     if (rc != ERROR_SUCCESS)
942         return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKey");
943     Py_RETURN_NONE;
944 }
945 
946 /*[clinic input]
947 winreg.DeleteKeyEx
948 
949     key: HKEY
950         An already open key, or any one of the predefined HKEY_* constants.
951     sub_key: Py_UNICODE
952         A string that must be the name of a subkey of the key identified by
953         the key parameter. This value must not be None, and the key may not
954         have subkeys.
955     access: REGSAM(c_default='KEY_WOW64_64KEY') = winreg.KEY_WOW64_64KEY
956         An integer that specifies an access mask that describes the
957         desired security access for the key. Default is KEY_WOW64_64KEY.
958     reserved: int = 0
959         A reserved integer, and must be zero.  Default is zero.
960 
961 Deletes the specified key (64-bit OS only).
962 
963 This method can not delete keys with subkeys.
964 
965 If the function succeeds, the entire key, including all of its values,
966 is removed.  If the function fails, an OSError exception is raised.
967 On unsupported Windows versions, NotImplementedError is raised.
968 [clinic start generated code]*/
969 
970 static PyObject *
winreg_DeleteKeyEx_impl(PyObject * module,HKEY key,Py_UNICODE * sub_key,REGSAM access,int reserved)971 winreg_DeleteKeyEx_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
972                         REGSAM access, int reserved)
973 /*[clinic end generated code: output=01378d86ad3eb936 input=711d9d89e7ecbed7]*/
974 {
975     HMODULE hMod;
976     typedef LONG (WINAPI *RDKEFunc)(HKEY, const wchar_t*, REGSAM, int);
977     RDKEFunc pfn = NULL;
978     long rc;
979 
980     /* Only available on 64bit platforms, so we must load it
981        dynamically. */
982     hMod = GetModuleHandleW(L"advapi32.dll");
983     if (hMod)
984         pfn = (RDKEFunc)GetProcAddress(hMod,
985                                                                    "RegDeleteKeyExW");
986     if (!pfn) {
987         PyErr_SetString(PyExc_NotImplementedError,
988                                         "not implemented on this platform");
989         return NULL;
990     }
991     Py_BEGIN_ALLOW_THREADS
992     rc = (*pfn)(key, sub_key, access, reserved);
993     Py_END_ALLOW_THREADS
994 
995     if (rc != ERROR_SUCCESS)
996         return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKeyEx");
997     Py_RETURN_NONE;
998 }
999 
1000 /*[clinic input]
1001 winreg.DeleteValue
1002 
1003     key: HKEY
1004         An already open key, or any one of the predefined HKEY_* constants.
1005     value: Py_UNICODE(accept={str, NoneType})
1006         A string that identifies the value to remove.
1007     /
1008 
1009 Removes a named value from a registry key.
1010 [clinic start generated code]*/
1011 
1012 static PyObject *
winreg_DeleteValue_impl(PyObject * module,HKEY key,Py_UNICODE * value)1013 winreg_DeleteValue_impl(PyObject *module, HKEY key, Py_UNICODE *value)
1014 /*[clinic end generated code: output=67e7e9a514f84951 input=a78d3407a4197b21]*/
1015 {
1016     long rc;
1017     Py_BEGIN_ALLOW_THREADS
1018     rc = RegDeleteValueW(key, value);
1019     Py_END_ALLOW_THREADS
1020     if (rc !=ERROR_SUCCESS)
1021         return PyErr_SetFromWindowsErrWithFunction(rc,
1022                                                    "RegDeleteValue");
1023     Py_RETURN_NONE;
1024 }
1025 
1026 /*[clinic input]
1027 winreg.EnumKey
1028 
1029     key: HKEY
1030         An already open key, or any one of the predefined HKEY_* constants.
1031     index: int
1032         An integer that identifies the index of the key to retrieve.
1033     /
1034 
1035 Enumerates subkeys of an open registry key.
1036 
1037 The function retrieves the name of one subkey each time it is called.
1038 It is typically called repeatedly until an OSError exception is
1039 raised, indicating no more values are available.
1040 [clinic start generated code]*/
1041 
1042 static PyObject *
winreg_EnumKey_impl(PyObject * module,HKEY key,int index)1043 winreg_EnumKey_impl(PyObject *module, HKEY key, int index)
1044 /*[clinic end generated code: output=25a6ec52cd147bc4 input=fad9a7c00ab0e04b]*/
1045 {
1046     long rc;
1047     PyObject *retStr;
1048 
1049     /* The Windows docs claim that the max key name length is 255
1050      * characters, plus a terminating nul character.  However,
1051      * empirical testing demonstrates that it is possible to
1052      * create a 256 character key that is missing the terminating
1053      * nul.  RegEnumKeyEx requires a 257 character buffer to
1054      * retrieve such a key name. */
1055     wchar_t tmpbuf[257];
1056     DWORD len = sizeof(tmpbuf)/sizeof(wchar_t); /* includes NULL terminator */
1057 
1058     Py_BEGIN_ALLOW_THREADS
1059     rc = RegEnumKeyExW(key, index, tmpbuf, &len, NULL, NULL, NULL, NULL);
1060     Py_END_ALLOW_THREADS
1061     if (rc != ERROR_SUCCESS)
1062         return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKeyEx");
1063 
1064     retStr = PyUnicode_FromWideChar(tmpbuf, len);
1065     return retStr;  /* can be NULL */
1066 }
1067 
1068 /*[clinic input]
1069 winreg.EnumValue
1070 
1071     key: HKEY
1072             An already open key, or any one of the predefined HKEY_* constants.
1073     index: int
1074         An integer that identifies the index of the value to retrieve.
1075     /
1076 
1077 Enumerates values of an open registry key.
1078 
1079 The function retrieves the name of one subkey each time it is called.
1080 It is typically called repeatedly, until an OSError exception
1081 is raised, indicating no more values.
1082 
1083 The result is a tuple of 3 items:
1084   value_name
1085     A string that identifies the value.
1086   value_data
1087     An object that holds the value data, and whose type depends
1088     on the underlying registry type.
1089   data_type
1090     An integer that identifies the type of the value data.
1091 [clinic start generated code]*/
1092 
1093 static PyObject *
winreg_EnumValue_impl(PyObject * module,HKEY key,int index)1094 winreg_EnumValue_impl(PyObject *module, HKEY key, int index)
1095 /*[clinic end generated code: output=d363b5a06f8789ac input=4414f47a6fb238b5]*/
1096 {
1097     long rc;
1098     wchar_t *retValueBuf;
1099     BYTE *tmpBuf;
1100     BYTE *retDataBuf;
1101     DWORD retValueSize, bufValueSize;
1102     DWORD retDataSize, bufDataSize;
1103     DWORD typ;
1104     PyObject *obData;
1105     PyObject *retVal;
1106 
1107     if ((rc = RegQueryInfoKeyW(key, NULL, NULL, NULL, NULL, NULL, NULL,
1108                               NULL,
1109                               &retValueSize, &retDataSize, NULL, NULL))
1110         != ERROR_SUCCESS)
1111         return PyErr_SetFromWindowsErrWithFunction(rc,
1112                                                    "RegQueryInfoKey");
1113     ++retValueSize;    /* include null terminators */
1114     ++retDataSize;
1115     bufDataSize = retDataSize;
1116     bufValueSize = retValueSize;
1117     retValueBuf = PyMem_New(wchar_t, retValueSize);
1118     if (retValueBuf == NULL)
1119         return PyErr_NoMemory();
1120     retDataBuf = (BYTE *)PyMem_Malloc(retDataSize);
1121     if (retDataBuf == NULL) {
1122         PyMem_Free(retValueBuf);
1123         return PyErr_NoMemory();
1124     }
1125 
1126     while (1) {
1127         Py_BEGIN_ALLOW_THREADS
1128         rc = RegEnumValueW(key,
1129                   index,
1130                   retValueBuf,
1131                   &retValueSize,
1132                   NULL,
1133                   &typ,
1134                   (BYTE *)retDataBuf,
1135                   &retDataSize);
1136         Py_END_ALLOW_THREADS
1137 
1138         if (rc != ERROR_MORE_DATA)
1139             break;
1140 
1141         bufDataSize *= 2;
1142         tmpBuf = (BYTE *)PyMem_Realloc(retDataBuf, bufDataSize);
1143         if (tmpBuf == NULL) {
1144             PyErr_NoMemory();
1145             retVal = NULL;
1146             goto fail;
1147         }
1148         retDataBuf = tmpBuf;
1149         retDataSize = bufDataSize;
1150         retValueSize = bufValueSize;
1151     }
1152 
1153     if (rc != ERROR_SUCCESS) {
1154         retVal = PyErr_SetFromWindowsErrWithFunction(rc,
1155                                                      "PyRegEnumValue");
1156         goto fail;
1157     }
1158     obData = Reg2Py(retDataBuf, retDataSize, typ);
1159     if (obData == NULL) {
1160         retVal = NULL;
1161         goto fail;
1162     }
1163     retVal = Py_BuildValue("uOi", retValueBuf, obData, typ);
1164     Py_DECREF(obData);
1165   fail:
1166     PyMem_Free(retValueBuf);
1167     PyMem_Free(retDataBuf);
1168     return retVal;
1169 }
1170 
1171 /*[clinic input]
1172 winreg.ExpandEnvironmentStrings
1173 
1174     string: Py_UNICODE
1175     /
1176 
1177 Expand environment vars.
1178 [clinic start generated code]*/
1179 
1180 static PyObject *
winreg_ExpandEnvironmentStrings_impl(PyObject * module,Py_UNICODE * string)1181 winreg_ExpandEnvironmentStrings_impl(PyObject *module, Py_UNICODE *string)
1182 /*[clinic end generated code: output=cba46ac293a8af1a input=b2a9714d2b751aa6]*/
1183 {
1184     wchar_t *retValue = NULL;
1185     DWORD retValueSize;
1186     DWORD rc;
1187     PyObject *o;
1188 
1189     retValueSize = ExpandEnvironmentStringsW(string, retValue, 0);
1190     if (retValueSize == 0) {
1191         return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1192                                         "ExpandEnvironmentStrings");
1193     }
1194     retValue = PyMem_New(wchar_t, retValueSize);
1195     if (retValue == NULL) {
1196         return PyErr_NoMemory();
1197     }
1198 
1199     rc = ExpandEnvironmentStringsW(string, retValue, retValueSize);
1200     if (rc == 0) {
1201         PyMem_Free(retValue);
1202         return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1203                                         "ExpandEnvironmentStrings");
1204     }
1205     o = PyUnicode_FromWideChar(retValue, wcslen(retValue));
1206     PyMem_Free(retValue);
1207     return o;
1208 }
1209 
1210 /*[clinic input]
1211 winreg.FlushKey
1212 
1213     key: HKEY
1214         An already open key, or any one of the predefined HKEY_* constants.
1215     /
1216 
1217 Writes all the attributes of a key to the registry.
1218 
1219 It is not necessary to call FlushKey to change a key.  Registry changes
1220 are flushed to disk by the registry using its lazy flusher.  Registry
1221 changes are also flushed to disk at system shutdown.  Unlike
1222 CloseKey(), the FlushKey() method returns only when all the data has
1223 been written to the registry.
1224 
1225 An application should only call FlushKey() if it requires absolute
1226 certainty that registry changes are on disk.  If you don't know whether
1227 a FlushKey() call is required, it probably isn't.
1228 [clinic start generated code]*/
1229 
1230 static PyObject *
winreg_FlushKey_impl(PyObject * module,HKEY key)1231 winreg_FlushKey_impl(PyObject *module, HKEY key)
1232 /*[clinic end generated code: output=e6fc230d4c5dc049 input=f57457c12297d82f]*/
1233 {
1234     long rc;
1235     Py_BEGIN_ALLOW_THREADS
1236     rc = RegFlushKey(key);
1237     Py_END_ALLOW_THREADS
1238     if (rc != ERROR_SUCCESS)
1239         return PyErr_SetFromWindowsErrWithFunction(rc, "RegFlushKey");
1240     Py_RETURN_NONE;
1241 }
1242 
1243 
1244 /*[clinic input]
1245 winreg.LoadKey
1246 
1247     key: HKEY
1248         An already open key, or any one of the predefined HKEY_* constants.
1249     sub_key: Py_UNICODE
1250         A string that identifies the sub-key to load.
1251     file_name: Py_UNICODE
1252         The name of the file to load registry data from.  This file must
1253         have been created with the SaveKey() function.  Under the file
1254         allocation table (FAT) file system, the filename may not have an
1255         extension.
1256     /
1257 
1258 Insert data into the registry from a file.
1259 
1260 Creates a subkey under the specified key and stores registration
1261 information from a specified file into that subkey.
1262 
1263 A call to LoadKey() fails if the calling process does not have the
1264 SE_RESTORE_PRIVILEGE privilege.
1265 
1266 If key is a handle returned by ConnectRegistry(), then the path
1267 specified in fileName is relative to the remote computer.
1268 
1269 The MSDN docs imply key must be in the HKEY_USER or HKEY_LOCAL_MACHINE
1270 tree.
1271 [clinic start generated code]*/
1272 
1273 static PyObject *
winreg_LoadKey_impl(PyObject * module,HKEY key,Py_UNICODE * sub_key,Py_UNICODE * file_name)1274 winreg_LoadKey_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
1275                     Py_UNICODE *file_name)
1276 /*[clinic end generated code: output=87344005c5905cde input=e3b5b45ade311582]*/
1277 {
1278     long rc;
1279 
1280     Py_BEGIN_ALLOW_THREADS
1281     rc = RegLoadKeyW(key, sub_key, file_name );
1282     Py_END_ALLOW_THREADS
1283     if (rc != ERROR_SUCCESS)
1284         return PyErr_SetFromWindowsErrWithFunction(rc, "RegLoadKey");
1285     Py_RETURN_NONE;
1286 }
1287 
1288 /*[clinic input]
1289 winreg.OpenKey -> HKEY
1290 
1291     key: HKEY
1292         An already open key, or any one of the predefined HKEY_* constants.
1293     sub_key: Py_UNICODE(accept={str, NoneType})
1294         A string that identifies the sub_key to open.
1295     reserved: int = 0
1296         A reserved integer that must be zero.  Default is zero.
1297     access: REGSAM(c_default='KEY_READ') = winreg.KEY_READ
1298         An integer that specifies an access mask that describes the desired
1299         security access for the key.  Default is KEY_READ.
1300 
1301 Opens the specified key.
1302 
1303 The result is a new handle to the specified key.
1304 If the function fails, an OSError exception is raised.
1305 [clinic start generated code]*/
1306 
1307 static HKEY
winreg_OpenKey_impl(PyObject * module,HKEY key,Py_UNICODE * sub_key,int reserved,REGSAM access)1308 winreg_OpenKey_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
1309                     int reserved, REGSAM access)
1310 /*[clinic end generated code: output=a905f1b947f3ce85 input=098505ac36a9ae28]*/
1311 {
1312     HKEY retKey;
1313     long rc;
1314 
1315     Py_BEGIN_ALLOW_THREADS
1316     rc = RegOpenKeyExW(key, sub_key, reserved, access, &retKey);
1317     Py_END_ALLOW_THREADS
1318     if (rc != ERROR_SUCCESS) {
1319         PyErr_SetFromWindowsErrWithFunction(rc, "RegOpenKeyEx");
1320         return NULL;
1321     }
1322     return retKey;
1323 }
1324 
1325 /*[clinic input]
1326 winreg.OpenKeyEx = winreg.OpenKey
1327 
1328 Opens the specified key.
1329 
1330 The result is a new handle to the specified key.
1331 If the function fails, an OSError exception is raised.
1332 [clinic start generated code]*/
1333 
1334 static HKEY
winreg_OpenKeyEx_impl(PyObject * module,HKEY key,Py_UNICODE * sub_key,int reserved,REGSAM access)1335 winreg_OpenKeyEx_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
1336                       int reserved, REGSAM access)
1337 /*[clinic end generated code: output=226042593b37e940 input=c6c4972af8622959]*/
1338 {
1339     return winreg_OpenKey_impl(module, key, sub_key, reserved, access);
1340 }
1341 
1342 /*[clinic input]
1343 winreg.QueryInfoKey
1344 
1345     key: HKEY
1346         An already open key, or any one of the predefined HKEY_* constants.
1347     /
1348 
1349 Returns information about a key.
1350 
1351 The result is a tuple of 3 items:
1352 An integer that identifies the number of sub keys this key has.
1353 An integer that identifies the number of values this key has.
1354 An integer that identifies when the key was last modified (if available)
1355 as 100's of nanoseconds since Jan 1, 1600.
1356 [clinic start generated code]*/
1357 
1358 static PyObject *
winreg_QueryInfoKey_impl(PyObject * module,HKEY key)1359 winreg_QueryInfoKey_impl(PyObject *module, HKEY key)
1360 /*[clinic end generated code: output=dc657b8356a4f438 input=c3593802390cde1f]*/
1361 {
1362   long rc;
1363   DWORD nSubKeys, nValues;
1364   FILETIME ft;
1365   LARGE_INTEGER li;
1366   PyObject *l;
1367   PyObject *ret;
1368 
1369   if ((rc = RegQueryInfoKey(key, NULL, NULL, 0, &nSubKeys, NULL, NULL,
1370                             &nValues,  NULL,  NULL, NULL, &ft))
1371       != ERROR_SUCCESS)
1372     return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryInfoKey");
1373   li.LowPart = ft.dwLowDateTime;
1374   li.HighPart = ft.dwHighDateTime;
1375   l = PyLong_FromLongLong(li.QuadPart);
1376   if (l == NULL)
1377     return NULL;
1378   ret = Py_BuildValue("iiO", nSubKeys, nValues, l);
1379   Py_DECREF(l);
1380   return ret;
1381 }
1382 
1383 /*[clinic input]
1384 winreg.QueryValue
1385 
1386     key: HKEY
1387         An already open key, or any one of the predefined HKEY_* constants.
1388     sub_key: Py_UNICODE(accept={str, NoneType})
1389         A string that holds the name of the subkey with which the value
1390         is associated.  If this parameter is None or empty, the function
1391         retrieves the value set by the SetValue() method for the key
1392         identified by key.
1393     /
1394 
1395 Retrieves the unnamed value for a key.
1396 
1397 Values in the registry have name, type, and data components. This method
1398 retrieves the data for a key's first value that has a NULL name.
1399 But since the underlying API call doesn't return the type, you'll
1400 probably be happier using QueryValueEx; this function is just here for
1401 completeness.
1402 [clinic start generated code]*/
1403 
1404 static PyObject *
winreg_QueryValue_impl(PyObject * module,HKEY key,Py_UNICODE * sub_key)1405 winreg_QueryValue_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key)
1406 /*[clinic end generated code: output=2bb8d1e02c10d0b6 input=41cafbbf423b21d6]*/
1407 {
1408     long rc;
1409     PyObject *retStr;
1410     wchar_t *retBuf;
1411     DWORD bufSize = 0;
1412     DWORD retSize = 0;
1413     wchar_t *tmp;
1414 
1415     rc = RegQueryValueW(key, sub_key, NULL, &retSize);
1416     if (rc == ERROR_MORE_DATA)
1417         retSize = 256;
1418     else if (rc != ERROR_SUCCESS)
1419         return PyErr_SetFromWindowsErrWithFunction(rc,
1420                                                    "RegQueryValue");
1421 
1422     bufSize = retSize;
1423     retBuf = (wchar_t *) PyMem_Malloc(bufSize);
1424     if (retBuf == NULL)
1425         return PyErr_NoMemory();
1426 
1427     while (1) {
1428         retSize = bufSize;
1429         rc = RegQueryValueW(key, sub_key, retBuf, &retSize);
1430         if (rc != ERROR_MORE_DATA)
1431             break;
1432 
1433         bufSize *= 2;
1434         tmp = (wchar_t *) PyMem_Realloc(retBuf, bufSize);
1435         if (tmp == NULL) {
1436             PyMem_Free(retBuf);
1437             return PyErr_NoMemory();
1438         }
1439         retBuf = tmp;
1440     }
1441 
1442     if (rc != ERROR_SUCCESS) {
1443         PyMem_Free(retBuf);
1444         return PyErr_SetFromWindowsErrWithFunction(rc,
1445                                                    "RegQueryValue");
1446     }
1447 
1448     retStr = PyUnicode_FromWideChar(retBuf, wcslen(retBuf));
1449     PyMem_Free(retBuf);
1450     return retStr;
1451 }
1452 
1453 
1454 /*[clinic input]
1455 winreg.QueryValueEx
1456 
1457     key: HKEY
1458         An already open key, or any one of the predefined HKEY_* constants.
1459     name: Py_UNICODE(accept={str, NoneType})
1460         A string indicating the value to query.
1461     /
1462 
1463 Retrieves the type and value of a specified sub-key.
1464 
1465 Behaves mostly like QueryValue(), but also returns the type of the
1466 specified value name associated with the given open registry key.
1467 
1468 The return value is a tuple of the value and the type_id.
1469 [clinic start generated code]*/
1470 
1471 static PyObject *
winreg_QueryValueEx_impl(PyObject * module,HKEY key,Py_UNICODE * name)1472 winreg_QueryValueEx_impl(PyObject *module, HKEY key, Py_UNICODE *name)
1473 /*[clinic end generated code: output=5b4fa3e33d6d3e8f input=cf366cada4836891]*/
1474 {
1475     long rc;
1476     BYTE *retBuf, *tmp;
1477     DWORD bufSize = 0, retSize;
1478     DWORD typ;
1479     PyObject *obData;
1480     PyObject *result;
1481 
1482     rc = RegQueryValueExW(key, name, NULL, NULL, NULL, &bufSize);
1483     if (rc == ERROR_MORE_DATA)
1484         bufSize = 256;
1485     else if (rc != ERROR_SUCCESS)
1486         return PyErr_SetFromWindowsErrWithFunction(rc,
1487                                                    "RegQueryValueEx");
1488     retBuf = (BYTE *)PyMem_Malloc(bufSize);
1489     if (retBuf == NULL)
1490         return PyErr_NoMemory();
1491 
1492     while (1) {
1493         retSize = bufSize;
1494         rc = RegQueryValueExW(key, name, NULL, &typ,
1495                              (BYTE *)retBuf, &retSize);
1496         if (rc != ERROR_MORE_DATA)
1497             break;
1498 
1499         bufSize *= 2;
1500         tmp = (char *) PyMem_Realloc(retBuf, bufSize);
1501         if (tmp == NULL) {
1502             PyMem_Free(retBuf);
1503             return PyErr_NoMemory();
1504         }
1505        retBuf = tmp;
1506     }
1507 
1508     if (rc != ERROR_SUCCESS) {
1509         PyMem_Free(retBuf);
1510         return PyErr_SetFromWindowsErrWithFunction(rc,
1511                                                    "RegQueryValueEx");
1512     }
1513     obData = Reg2Py(retBuf, bufSize, typ);
1514     PyMem_Free(retBuf);
1515     if (obData == NULL)
1516         return NULL;
1517     result = Py_BuildValue("Oi", obData, typ);
1518     Py_DECREF(obData);
1519     return result;
1520 }
1521 
1522 /*[clinic input]
1523 winreg.SaveKey
1524 
1525     key: HKEY
1526         An already open key, or any one of the predefined HKEY_* constants.
1527     file_name: Py_UNICODE
1528         The name of the file to save registry data to.  This file cannot
1529         already exist. If this filename includes an extension, it cannot be
1530         used on file allocation table (FAT) file systems by the LoadKey(),
1531         ReplaceKey() or RestoreKey() methods.
1532     /
1533 
1534 Saves the specified key, and all its subkeys to the specified file.
1535 
1536 If key represents a key on a remote computer, the path described by
1537 file_name is relative to the remote computer.
1538 
1539 The caller of this method must possess the SeBackupPrivilege
1540 security privilege.  This function passes NULL for security_attributes
1541 to the API.
1542 [clinic start generated code]*/
1543 
1544 static PyObject *
winreg_SaveKey_impl(PyObject * module,HKEY key,Py_UNICODE * file_name)1545 winreg_SaveKey_impl(PyObject *module, HKEY key, Py_UNICODE *file_name)
1546 /*[clinic end generated code: output=1dda1502bd4c30d8 input=da735241f91ac7a2]*/
1547 {
1548     LPSECURITY_ATTRIBUTES pSA = NULL;
1549 
1550     long rc;
1551 /*  One day we may get security into the core?
1552     if (!PyWinObject_AsSECURITY_ATTRIBUTES(obSA, &pSA, TRUE))
1553         return NULL;
1554 */
1555     Py_BEGIN_ALLOW_THREADS
1556     rc = RegSaveKeyW(key, file_name, pSA );
1557     Py_END_ALLOW_THREADS
1558     if (rc != ERROR_SUCCESS)
1559         return PyErr_SetFromWindowsErrWithFunction(rc, "RegSaveKey");
1560     Py_RETURN_NONE;
1561 }
1562 
1563 /*[clinic input]
1564 winreg.SetValue
1565 
1566     key: HKEY
1567         An already open key, or any one of the predefined HKEY_* constants.
1568     sub_key: Py_UNICODE(accept={str, NoneType})
1569         A string that names the subkey with which the value is associated.
1570     type: DWORD
1571         An integer that specifies the type of the data.  Currently this must
1572         be REG_SZ, meaning only strings are supported.
1573     value: Py_UNICODE(zeroes=True)
1574         A string that specifies the new value.
1575     /
1576 
1577 Associates a value with a specified key.
1578 
1579 If the key specified by the sub_key parameter does not exist, the
1580 SetValue function creates it.
1581 
1582 Value lengths are limited by available memory. Long values (more than
1583 2048 bytes) should be stored as files with the filenames stored in
1584 the configuration registry to help the registry perform efficiently.
1585 
1586 The key identified by the key parameter must have been opened with
1587 KEY_SET_VALUE access.
1588 [clinic start generated code]*/
1589 
1590 static PyObject *
winreg_SetValue_impl(PyObject * module,HKEY key,Py_UNICODE * sub_key,DWORD type,Py_UNICODE * value,Py_ssize_clean_t value_length)1591 winreg_SetValue_impl(PyObject *module, HKEY key, Py_UNICODE *sub_key,
1592                      DWORD type, Py_UNICODE *value,
1593                      Py_ssize_clean_t value_length)
1594 /*[clinic end generated code: output=1e31931174820631 input=2cd2adab79339c53]*/
1595 {
1596     long rc;
1597 
1598     if (type != REG_SZ) {
1599         PyErr_SetString(PyExc_TypeError,
1600                         "Type must be winreg.REG_SZ");
1601         return NULL;
1602     }
1603 
1604     Py_BEGIN_ALLOW_THREADS
1605     rc = RegSetValueW(key, sub_key, REG_SZ, value, value_length+1);
1606     Py_END_ALLOW_THREADS
1607     if (rc != ERROR_SUCCESS)
1608         return PyErr_SetFromWindowsErrWithFunction(rc, "RegSetValue");
1609     Py_RETURN_NONE;
1610 }
1611 
1612 /*[clinic input]
1613 winreg.SetValueEx
1614 
1615     key: HKEY
1616         An already open key, or any one of the predefined HKEY_* constants.
1617     value_name: Py_UNICODE(accept={str, NoneType})
1618         A string containing the name of the value to set, or None.
1619     reserved: object
1620         Can be anything - zero is always passed to the API.
1621     type: DWORD
1622         An integer that specifies the type of the data, one of:
1623         REG_BINARY -- Binary data in any form.
1624         REG_DWORD -- A 32-bit number.
1625         REG_DWORD_LITTLE_ENDIAN -- A 32-bit number in little-endian format. Equivalent to REG_DWORD
1626         REG_DWORD_BIG_ENDIAN -- A 32-bit number in big-endian format.
1627         REG_EXPAND_SZ -- A null-terminated string that contains unexpanded
1628                          references to environment variables (for example,
1629                          %PATH%).
1630         REG_LINK -- A Unicode symbolic link.
1631         REG_MULTI_SZ -- A sequence of null-terminated strings, terminated
1632                         by two null characters.  Note that Python handles
1633                         this termination automatically.
1634         REG_NONE -- No defined value type.
1635         REG_QWORD -- A 64-bit number.
1636         REG_QWORD_LITTLE_ENDIAN -- A 64-bit number in little-endian format. Equivalent to REG_QWORD.
1637         REG_RESOURCE_LIST -- A device-driver resource list.
1638         REG_SZ -- A null-terminated string.
1639     value: object
1640         A string that specifies the new value.
1641     /
1642 
1643 Stores data in the value field of an open registry key.
1644 
1645 This method can also set additional value and type information for the
1646 specified key.  The key identified by the key parameter must have been
1647 opened with KEY_SET_VALUE access.
1648 
1649 To open the key, use the CreateKeyEx() or OpenKeyEx() methods.
1650 
1651 Value lengths are limited by available memory. Long values (more than
1652 2048 bytes) should be stored as files with the filenames stored in
1653 the configuration registry to help the registry perform efficiently.
1654 [clinic start generated code]*/
1655 
1656 static PyObject *
winreg_SetValueEx_impl(PyObject * module,HKEY key,Py_UNICODE * value_name,PyObject * reserved,DWORD type,PyObject * value)1657 winreg_SetValueEx_impl(PyObject *module, HKEY key, Py_UNICODE *value_name,
1658                        PyObject *reserved, DWORD type, PyObject *value)
1659 /*[clinic end generated code: output=c88c8426b6c00ec7 input=900a9e3990bfb196]*/
1660 {
1661     BYTE *data;
1662     DWORD len;
1663 
1664     LONG rc;
1665 
1666     if (!Py2Reg(value, type, &data, &len))
1667     {
1668         if (!PyErr_Occurred())
1669             PyErr_SetString(PyExc_ValueError,
1670                      "Could not convert the data to the specified type.");
1671         return NULL;
1672     }
1673     Py_BEGIN_ALLOW_THREADS
1674     rc = RegSetValueExW(key, value_name, 0, type, data, len);
1675     Py_END_ALLOW_THREADS
1676     PyMem_DEL(data);
1677     if (rc != ERROR_SUCCESS)
1678         return PyErr_SetFromWindowsErrWithFunction(rc,
1679                                                    "RegSetValueEx");
1680     Py_RETURN_NONE;
1681 }
1682 
1683 /*[clinic input]
1684 winreg.DisableReflectionKey
1685 
1686     key: HKEY
1687         An already open key, or any one of the predefined HKEY_* constants.
1688     /
1689 
1690 Disables registry reflection for 32bit processes running on a 64bit OS.
1691 
1692 Will generally raise NotImplemented if executed on a 32bit OS.
1693 
1694 If the key is not on the reflection list, the function succeeds but has
1695 no effect.  Disabling reflection for a key does not affect reflection
1696 of any subkeys.
1697 [clinic start generated code]*/
1698 
1699 static PyObject *
winreg_DisableReflectionKey_impl(PyObject * module,HKEY key)1700 winreg_DisableReflectionKey_impl(PyObject *module, HKEY key)
1701 /*[clinic end generated code: output=830cce504cc764b4 input=a6c9e5ca5410193c]*/
1702 {
1703     HMODULE hMod;
1704     typedef LONG (WINAPI *RDRKFunc)(HKEY);
1705     RDRKFunc pfn = NULL;
1706     LONG rc;
1707 
1708     /* Only available on 64bit platforms, so we must load it
1709        dynamically.*/
1710     hMod = GetModuleHandleW(L"advapi32.dll");
1711     if (hMod)
1712         pfn = (RDRKFunc)GetProcAddress(hMod,
1713                                        "RegDisableReflectionKey");
1714     if (!pfn) {
1715         PyErr_SetString(PyExc_NotImplementedError,
1716                         "not implemented on this platform");
1717         return NULL;
1718     }
1719     Py_BEGIN_ALLOW_THREADS
1720     rc = (*pfn)(key);
1721     Py_END_ALLOW_THREADS
1722     if (rc != ERROR_SUCCESS)
1723         return PyErr_SetFromWindowsErrWithFunction(rc,
1724                                                    "RegDisableReflectionKey");
1725     Py_RETURN_NONE;
1726 }
1727 
1728 /*[clinic input]
1729 winreg.EnableReflectionKey
1730 
1731     key: HKEY
1732         An already open key, or any one of the predefined HKEY_* constants.
1733     /
1734 
1735 Restores registry reflection for the specified disabled key.
1736 
1737 Will generally raise NotImplemented if executed on a 32bit OS.
1738 Restoring reflection for a key does not affect reflection of any
1739 subkeys.
1740 [clinic start generated code]*/
1741 
1742 static PyObject *
winreg_EnableReflectionKey_impl(PyObject * module,HKEY key)1743 winreg_EnableReflectionKey_impl(PyObject *module, HKEY key)
1744 /*[clinic end generated code: output=86fa1385fdd9ce57 input=7748abbacd1e166a]*/
1745 {
1746     HMODULE hMod;
1747     typedef LONG (WINAPI *RERKFunc)(HKEY);
1748     RERKFunc pfn = NULL;
1749     LONG rc;
1750 
1751     /* Only available on 64bit platforms, so we must load it
1752        dynamically.*/
1753     hMod = GetModuleHandleW(L"advapi32.dll");
1754     if (hMod)
1755         pfn = (RERKFunc)GetProcAddress(hMod,
1756                                        "RegEnableReflectionKey");
1757     if (!pfn) {
1758         PyErr_SetString(PyExc_NotImplementedError,
1759                         "not implemented on this platform");
1760         return NULL;
1761     }
1762     Py_BEGIN_ALLOW_THREADS
1763     rc = (*pfn)(key);
1764     Py_END_ALLOW_THREADS
1765     if (rc != ERROR_SUCCESS)
1766         return PyErr_SetFromWindowsErrWithFunction(rc,
1767                                                    "RegEnableReflectionKey");
1768     Py_RETURN_NONE;
1769 }
1770 
1771 /*[clinic input]
1772 winreg.QueryReflectionKey
1773 
1774     key: HKEY
1775         An already open key, or any one of the predefined HKEY_* constants.
1776     /
1777 
1778 Returns the reflection state for the specified key as a bool.
1779 
1780 Will generally raise NotImplemented if executed on a 32bit OS.
1781 [clinic start generated code]*/
1782 
1783 static PyObject *
winreg_QueryReflectionKey_impl(PyObject * module,HKEY key)1784 winreg_QueryReflectionKey_impl(PyObject *module, HKEY key)
1785 /*[clinic end generated code: output=4e774af288c3ebb9 input=9f325eacb5a65d88]*/
1786 {
1787     HMODULE hMod;
1788     typedef LONG (WINAPI *RQRKFunc)(HKEY, BOOL *);
1789     RQRKFunc pfn = NULL;
1790     BOOL result;
1791     LONG rc;
1792 
1793     /* Only available on 64bit platforms, so we must load it
1794        dynamically.*/
1795     hMod = GetModuleHandleW(L"advapi32.dll");
1796     if (hMod)
1797         pfn = (RQRKFunc)GetProcAddress(hMod,
1798                                        "RegQueryReflectionKey");
1799     if (!pfn) {
1800         PyErr_SetString(PyExc_NotImplementedError,
1801                         "not implemented on this platform");
1802         return NULL;
1803     }
1804     Py_BEGIN_ALLOW_THREADS
1805     rc = (*pfn)(key, &result);
1806     Py_END_ALLOW_THREADS
1807     if (rc != ERROR_SUCCESS)
1808         return PyErr_SetFromWindowsErrWithFunction(rc,
1809                                                    "RegQueryReflectionKey");
1810     return PyBool_FromLong(result);
1811 }
1812 
1813 static struct PyMethodDef winreg_methods[] = {
1814     WINREG_CLOSEKEY_METHODDEF
1815     WINREG_CONNECTREGISTRY_METHODDEF
1816     WINREG_CREATEKEY_METHODDEF
1817     WINREG_CREATEKEYEX_METHODDEF
1818     WINREG_DELETEKEY_METHODDEF
1819     WINREG_DELETEKEYEX_METHODDEF
1820     WINREG_DELETEVALUE_METHODDEF
1821     WINREG_DISABLEREFLECTIONKEY_METHODDEF
1822     WINREG_ENABLEREFLECTIONKEY_METHODDEF
1823     WINREG_ENUMKEY_METHODDEF
1824     WINREG_ENUMVALUE_METHODDEF
1825     WINREG_EXPANDENVIRONMENTSTRINGS_METHODDEF
1826     WINREG_FLUSHKEY_METHODDEF
1827     WINREG_LOADKEY_METHODDEF
1828     WINREG_OPENKEY_METHODDEF
1829     WINREG_OPENKEYEX_METHODDEF
1830     WINREG_QUERYVALUE_METHODDEF
1831     WINREG_QUERYVALUEEX_METHODDEF
1832     WINREG_QUERYINFOKEY_METHODDEF
1833     WINREG_QUERYREFLECTIONKEY_METHODDEF
1834     WINREG_SAVEKEY_METHODDEF
1835     WINREG_SETVALUE_METHODDEF
1836     WINREG_SETVALUEEX_METHODDEF
1837     NULL,
1838 };
1839 
1840 static void
insint(PyObject * d,char * name,long value)1841 insint(PyObject * d, char * name, long value)
1842 {
1843     PyObject *v = PyLong_FromLong(value);
1844     if (!v || PyDict_SetItemString(d, name, v))
1845         PyErr_Clear();
1846     Py_XDECREF(v);
1847 }
1848 
1849 #define ADD_INT(val) insint(d, #val, val)
1850 
1851 static void
inskey(PyObject * d,char * name,HKEY key)1852 inskey(PyObject * d, char * name, HKEY key)
1853 {
1854     PyObject *v = PyLong_FromVoidPtr(key);
1855     if (!v || PyDict_SetItemString(d, name, v))
1856         PyErr_Clear();
1857     Py_XDECREF(v);
1858 }
1859 
1860 #define ADD_KEY(val) inskey(d, #val, val)
1861 
1862 
1863 static struct PyModuleDef winregmodule = {
1864     PyModuleDef_HEAD_INIT,
1865     "winreg",
1866     module_doc,
1867     -1,
1868     winreg_methods,
1869     NULL,
1870     NULL,
1871     NULL,
1872     NULL
1873 };
1874 
PyInit_winreg(void)1875 PyMODINIT_FUNC PyInit_winreg(void)
1876 {
1877     PyObject *m, *d;
1878     m = PyModule_Create(&winregmodule);
1879     if (m == NULL)
1880         return NULL;
1881     d = PyModule_GetDict(m);
1882     PyHKEY_Type.tp_doc = PyHKEY_doc;
1883     if (PyType_Ready(&PyHKEY_Type) < 0)
1884         return NULL;
1885     Py_INCREF(&PyHKEY_Type);
1886     if (PyDict_SetItemString(d, "HKEYType",
1887                              (PyObject *)&PyHKEY_Type) != 0)
1888         return NULL;
1889     Py_INCREF(PyExc_OSError);
1890     if (PyDict_SetItemString(d, "error",
1891                              PyExc_OSError) != 0)
1892         return NULL;
1893 
1894     /* Add the relevant constants */
1895     ADD_KEY(HKEY_CLASSES_ROOT);
1896     ADD_KEY(HKEY_CURRENT_USER);
1897     ADD_KEY(HKEY_LOCAL_MACHINE);
1898     ADD_KEY(HKEY_USERS);
1899     ADD_KEY(HKEY_PERFORMANCE_DATA);
1900 #ifdef HKEY_CURRENT_CONFIG
1901     ADD_KEY(HKEY_CURRENT_CONFIG);
1902 #endif
1903 #ifdef HKEY_DYN_DATA
1904     ADD_KEY(HKEY_DYN_DATA);
1905 #endif
1906     ADD_INT(KEY_QUERY_VALUE);
1907     ADD_INT(KEY_SET_VALUE);
1908     ADD_INT(KEY_CREATE_SUB_KEY);
1909     ADD_INT(KEY_ENUMERATE_SUB_KEYS);
1910     ADD_INT(KEY_NOTIFY);
1911     ADD_INT(KEY_CREATE_LINK);
1912     ADD_INT(KEY_READ);
1913     ADD_INT(KEY_WRITE);
1914     ADD_INT(KEY_EXECUTE);
1915     ADD_INT(KEY_ALL_ACCESS);
1916 #ifdef KEY_WOW64_64KEY
1917     ADD_INT(KEY_WOW64_64KEY);
1918 #endif
1919 #ifdef KEY_WOW64_32KEY
1920     ADD_INT(KEY_WOW64_32KEY);
1921 #endif
1922     ADD_INT(REG_OPTION_RESERVED);
1923     ADD_INT(REG_OPTION_NON_VOLATILE);
1924     ADD_INT(REG_OPTION_VOLATILE);
1925     ADD_INT(REG_OPTION_CREATE_LINK);
1926     ADD_INT(REG_OPTION_BACKUP_RESTORE);
1927     ADD_INT(REG_OPTION_OPEN_LINK);
1928     ADD_INT(REG_LEGAL_OPTION);
1929     ADD_INT(REG_CREATED_NEW_KEY);
1930     ADD_INT(REG_OPENED_EXISTING_KEY);
1931     ADD_INT(REG_WHOLE_HIVE_VOLATILE);
1932     ADD_INT(REG_REFRESH_HIVE);
1933     ADD_INT(REG_NO_LAZY_FLUSH);
1934     ADD_INT(REG_NOTIFY_CHANGE_NAME);
1935     ADD_INT(REG_NOTIFY_CHANGE_ATTRIBUTES);
1936     ADD_INT(REG_NOTIFY_CHANGE_LAST_SET);
1937     ADD_INT(REG_NOTIFY_CHANGE_SECURITY);
1938     ADD_INT(REG_LEGAL_CHANGE_FILTER);
1939     ADD_INT(REG_NONE);
1940     ADD_INT(REG_SZ);
1941     ADD_INT(REG_EXPAND_SZ);
1942     ADD_INT(REG_BINARY);
1943     ADD_INT(REG_DWORD);
1944     ADD_INT(REG_DWORD_LITTLE_ENDIAN);
1945     ADD_INT(REG_DWORD_BIG_ENDIAN);
1946     ADD_INT(REG_QWORD);
1947     ADD_INT(REG_QWORD_LITTLE_ENDIAN);
1948     ADD_INT(REG_LINK);
1949     ADD_INT(REG_MULTI_SZ);
1950     ADD_INT(REG_RESOURCE_LIST);
1951     ADD_INT(REG_FULL_RESOURCE_DESCRIPTOR);
1952     ADD_INT(REG_RESOURCE_REQUIREMENTS_LIST);
1953     return m;
1954 }
1955 
1956 
1957