• 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 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