source: python/vendor/Python-2.7.6/PC/_winreg.c

Last change on this file was 388, checked in by dmik, 11 years ago

python: Update vendor to 2.7.6.

  • Property svn:eol-style set to native
File size: 60.4 KB
Line 
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 "malloc.h" /* for alloca */
18#include "windows.h"
19
20static BOOL PyHKEY_AsHKEY(PyObject *ob, HKEY *pRes, BOOL bNoneOK);
21static PyObject *PyHKEY_FromHKEY(HKEY h);
22static BOOL PyHKEY_Close(PyObject *obHandle);
23
24static char errNotAHandle[] = "Object is not a handle";
25
26/* The win32api module reports the function name that failed,
27 but this concept is not in the Python core.
28 Hopefully it will one day, and in the meantime I 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 */
37PyDoc_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 string.\n"
51"FlushKey() - Writes all the attributes of the specified key to the registry.\n"
52"LoadKey() - Creates a subkey under HKEY_USER or HKEY_LOCAL_MACHINE and stores\n"
53" registration information from a specified file into that subkey.\n"
54"OpenKey() - Alias for <om win32api.RegOpenKeyEx>\n"
55"OpenKeyEx() - Opens the specified key.\n"
56"QueryValue() - Retrieves the value associated with the unnamed value for a\n"
57" specified key in the registry.\n"
58"QueryValueEx() - Retrieves the type and data for a specified value name\n"
59" associated with an open registry key.\n"
60"QueryInfoKey() - Returns information about the specified key.\n"
61"SaveKey() - Saves the specified key, and all its subkeys a file.\n"
62"SetValue() - Associates a value with a specified key.\n"
63"SetValueEx() - Stores data in the value field of an open registry key.\n"
64"\n"
65"Special objects:\n"
66"\n"
67"HKEYType -- type object for HKEY objects\n"
68"error -- exception raised for Win32 errors\n"
69"\n"
70"Integer constants:\n"
71"Many constants are defined - see the documentation for each function\n"
72"to see what constants are used, and where.");
73
74
75PyDoc_STRVAR(CloseKey_doc,
76"CloseKey(hkey) - Closes a previously opened registry key.\n"
77"\n"
78"The hkey argument specifies a previously opened key.\n"
79"\n"
80"Note that if the key is not closed using this method, it will be\n"
81"closed when the hkey object is destroyed by Python.");
82
83PyDoc_STRVAR(ConnectRegistry_doc,
84"key = ConnectRegistry(computer_name, key) - "
85"Establishes a connection to a predefined registry handle on another computer.\n"
86"\n"
87"computer_name is the name of the remote computer, of the form \\\\computername.\n"
88" If None, the local computer is used.\n"
89"key is the predefined handle to connect to.\n"
90"\n"
91"The return value is the handle of the opened key.\n"
92"If the function fails, a WindowsError exception is raised.");
93
94PyDoc_STRVAR(CreateKey_doc,
95"key = CreateKey(key, sub_key) - Creates or opens the specified key.\n"
96"\n"
97"key is an already open key, or one of the predefined HKEY_* constants\n"
98"sub_key is a string that names the key this method opens or creates.\n"
99" If key is one of the predefined keys, sub_key may be None. In that case,\n"
100" the handle returned is the same key handle passed in to the function.\n"
101"\n"
102"If the key already exists, this function opens the existing key\n"
103"\n"
104"The return value is the handle of the opened key.\n"
105"If the function fails, an exception is raised.");
106
107PyDoc_STRVAR(CreateKeyEx_doc,
108"key = CreateKeyEx(key, sub_key, res, sam) - Creates or opens the specified key.\n"
109"\n"
110"key is an already open key, or one of the predefined HKEY_* constants\n"
111"sub_key is a string that names the key this method opens or creates.\n"
112"res is a reserved integer, and must be zero. Default is zero.\n"
113"sam is an integer that specifies an access mask that describes the desired\n"
114" If key is one of the predefined keys, sub_key may be None. In that case,\n"
115" the handle returned is the same key handle passed in to the function.\n"
116"\n"
117"If the key already exists, this function opens the existing key\n"
118"\n"
119"The return value is the handle of the opened key.\n"
120"If the function fails, an exception is raised.");
121
122PyDoc_STRVAR(DeleteKey_doc,
123"DeleteKey(key, sub_key) - Deletes the specified key.\n"
124"\n"
125"key is an already open key, or any one of the predefined HKEY_* constants.\n"
126"sub_key is a string that must be a subkey of the key identified by the key parameter.\n"
127" This value must not be None, and the key may not have subkeys.\n"
128"\n"
129"This method can not delete keys with subkeys.\n"
130"\n"
131"If the method succeeds, the entire key, including all of its values,\n"
132"is removed. If the method fails, a WindowsError exception is raised.");
133
134PyDoc_STRVAR(DeleteKeyEx_doc,
135"DeleteKeyEx(key, sub_key, sam, res) - Deletes the specified key.\n"
136"\n"
137"key is an already open key, or any one of the predefined HKEY_* constants.\n"
138"sub_key is a string that must be a subkey of the key identified by the key parameter.\n"
139"res is a reserved integer, and must be zero. Default is zero.\n"
140"sam is an integer that specifies an access mask that describes the desired\n"
141" This value must not be None, and the key may not have subkeys.\n"
142"\n"
143"This method can not delete keys with subkeys.\n"
144"\n"
145"If the method succeeds, the entire key, including all of its values,\n"
146"is removed. If the method fails, a WindowsError exception is raised.\n"
147"On unsupported Windows versions, NotImplementedError is raised.");
148
149PyDoc_STRVAR(DeleteValue_doc,
150"DeleteValue(key, value) - Removes a named value from a registry key.\n"
151"\n"
152"key is an already open key, or any one of the predefined HKEY_* constants.\n"
153"value is a string that identifies the value to remove.");
154
155PyDoc_STRVAR(EnumKey_doc,
156"string = EnumKey(key, index) - Enumerates subkeys of an open registry key.\n"
157"\n"
158"key is an already open key, or any one of the predefined HKEY_* constants.\n"
159"index is an integer that identifies the index of the key to retrieve.\n"
160"\n"
161"The function retrieves the name of one subkey each time it is called.\n"
162"It is typically called repeatedly until a WindowsError exception is\n"
163"raised, indicating no more values are available.");
164
165PyDoc_STRVAR(EnumValue_doc,
166"tuple = EnumValue(key, index) - Enumerates values of an open registry key.\n"
167"key is an already open key, or any one of the predefined HKEY_* constants.\n"
168"index is an integer that identifies the index of the value to retrieve.\n"
169"\n"
170"The function retrieves the name of one subkey each time it is called.\n"
171"It is typically called repeatedly, until a WindowsError exception\n"
172"is raised, indicating no more values.\n"
173"\n"
174"The result is a tuple of 3 items:\n"
175"value_name is a string that identifies the value.\n"
176"value_data is an object that holds the value data, and whose type depends\n"
177" on the underlying registry type.\n"
178"data_type is an integer that identifies the type of the value data.");
179
180PyDoc_STRVAR(ExpandEnvironmentStrings_doc,
181"string = ExpandEnvironmentStrings(string) - Expand environment vars.\n");
182
183PyDoc_STRVAR(FlushKey_doc,
184"FlushKey(key) - Writes all the attributes of a key to the registry.\n"
185"\n"
186"key is an already open key, or any one of the predefined HKEY_* constants.\n"
187"\n"
188"It is not necessary to call RegFlushKey to change a key.\n"
189"Registry changes are flushed to disk by the registry using its lazy flusher.\n"
190"Registry changes are also flushed to disk at system shutdown.\n"
191"Unlike CloseKey(), the FlushKey() method returns only when all the data has\n"
192"been written to the registry.\n"
193"An application should only call FlushKey() if it requires absolute certainty that registry changes are on disk.\n"
194"If you don't know whether a FlushKey() call is required, it probably isn't.");
195
196PyDoc_STRVAR(LoadKey_doc,
197"LoadKey(key, sub_key, file_name) - Creates a subkey under the specified key\n"
198"and stores registration information from a specified file into that subkey.\n"
199"\n"
200"key is an already open key, or any one of the predefined HKEY_* constants.\n"
201"sub_key is a string that identifies the sub_key to load\n"
202"file_name is the name of the file to load registry data from.\n"
203" This file must have been created with the SaveKey() function.\n"
204" Under the file allocation table (FAT) file system, the filename may not\n"
205"have an extension.\n"
206"\n"
207"A call to LoadKey() fails if the calling process does not have the\n"
208"SE_RESTORE_PRIVILEGE privilege.\n"
209"\n"
210"If key is a handle returned by ConnectRegistry(), then the path specified\n"
211"in fileName is relative to the remote computer.\n"
212"\n"
213"The docs imply key must be in the HKEY_USER or HKEY_LOCAL_MACHINE tree");
214
215PyDoc_STRVAR(OpenKey_doc,
216"key = OpenKey(key, sub_key, res = 0, sam = KEY_READ) - Opens the specified key.\n"
217"\n"
218"key is an already open key, or any one of the predefined HKEY_* constants.\n"
219"sub_key is a string that identifies the sub_key to open\n"
220"res is a reserved integer, and must be zero. Default is zero.\n"
221"sam is an integer that specifies an access mask that describes the desired\n"
222" security access for the key. Default is KEY_READ\n"
223"\n"
224"The result is a new handle to the specified key\n"
225"If the function fails, a WindowsError exception is raised.");
226
227PyDoc_STRVAR(OpenKeyEx_doc, "See OpenKey()");
228
229PyDoc_STRVAR(QueryInfoKey_doc,
230"tuple = QueryInfoKey(key) - Returns information about a key.\n"
231"\n"
232"key is an already open key, or any one of the predefined HKEY_* constants.\n"
233"\n"
234"The result is a tuple of 3 items:"
235"An integer that identifies the number of sub keys this key has.\n"
236"An integer that identifies the number of values this key has.\n"
237"A long integer that identifies when the key was last modified (if available)\n"
238" as 100's of nanoseconds since Jan 1, 1600.");
239
240PyDoc_STRVAR(QueryValue_doc,
241"string = QueryValue(key, sub_key) - retrieves the unnamed value for a key.\n"
242"\n"
243"key is an already open key, or any one of the predefined HKEY_* constants.\n"
244"sub_key is a string that holds the name of the subkey with which the value\n"
245" is associated. If this parameter is None or empty, the function retrieves\n"
246" the value set by the SetValue() method for the key identified by key."
247"\n"
248"Values in the registry have name, type, and data components. This method\n"
249"retrieves the data for a key's first value that has a NULL name.\n"
250"But the underlying API call doesn't return the type, Lame Lame Lame, DONT USE THIS!!!");
251
252PyDoc_STRVAR(QueryValueEx_doc,
253"value,type_id = QueryValueEx(key, value_name) - Retrieves the type and data for a specified value name associated with an open registry key.\n"
254"\n"
255"key is an already open key, or any one of the predefined HKEY_* constants.\n"
256"value_name is a string indicating the value to query");
257
258PyDoc_STRVAR(SaveKey_doc,
259"SaveKey(key, file_name) - Saves the specified key, and all its subkeys to the specified file.\n"
260"\n"
261"key is an already open key, or any one of the predefined HKEY_* constants.\n"
262"file_name is the name of the file to save registry data to.\n"
263" This file cannot already exist. If this filename includes an extension,\n"
264" it cannot be used on file allocation table (FAT) file systems by the\n"
265" LoadKey(), ReplaceKey() or RestoreKey() methods.\n"
266"\n"
267"If key represents a key on a remote computer, the path described by\n"
268"file_name is relative to the remote computer.\n"
269"The caller of this method must possess the SeBackupPrivilege security privilege.\n"
270"This function passes NULL for security_attributes to the API.");
271
272PyDoc_STRVAR(SetValue_doc,
273"SetValue(key, sub_key, type, value) - Associates a value with a specified key.\n"
274"\n"
275"key is an already open key, or any one of the predefined HKEY_* constants.\n"
276"sub_key is a string that names the subkey with which the value is associated.\n"
277"type is an integer that specifies the type of the data. Currently this\n"
278" must be REG_SZ, meaning only strings are supported.\n"
279"value is a string that specifies the new value.\n"
280"\n"
281"If the key specified by the sub_key parameter does not exist, the SetValue\n"
282"function creates it.\n"
283"\n"
284"Value lengths are limited by available memory. Long values (more than\n"
285"2048 bytes) should be stored as files with the filenames stored in \n"
286"the configuration registry. This helps the registry perform efficiently.\n"
287"\n"
288"The key identified by the key parameter must have been opened with\n"
289"KEY_SET_VALUE access.");
290
291PyDoc_STRVAR(SetValueEx_doc,
292"SetValueEx(key, value_name, reserved, type, value) - Stores data in the value field of an open registry key.\n"
293"\n"
294"key is an already open key, or any one of the predefined HKEY_* constants.\n"
295"value_name is a string containing the name of the value to set, or None\n"
296"type is an integer that specifies the type of the data. This should be one of:\n"
297" REG_BINARY -- Binary data in any form.\n"
298" REG_DWORD -- A 32-bit number.\n"
299" REG_DWORD_LITTLE_ENDIAN -- A 32-bit number in little-endian format.\n"
300" REG_DWORD_BIG_ENDIAN -- A 32-bit number in big-endian format.\n"
301" REG_EXPAND_SZ -- A null-terminated string that contains unexpanded references\n"
302" to environment variables (for example, %PATH%).\n"
303" REG_LINK -- A Unicode symbolic link.\n"
304" REG_MULTI_SZ -- An sequence of null-terminated strings, terminated by\n"
305" two null characters. Note that Python handles this\n"
306" termination automatically.\n"
307" REG_NONE -- No defined value type.\n"
308" REG_RESOURCE_LIST -- A device-driver resource list.\n"
309" REG_SZ -- A null-terminated string.\n"
310"reserved can be anything - zero is always passed to the API.\n"
311"value is a string that specifies the new value.\n"
312"\n"
313"This method can also set additional value and type information for the\n"
314"specified key. The key identified by the key parameter must have been\n"
315"opened with KEY_SET_VALUE access.\n"
316"\n"
317"To open the key, use the CreateKeyEx() or OpenKeyEx() methods.\n"
318"\n"
319"Value lengths are limited by available memory. Long values (more than\n"
320"2048 bytes) should be stored as files with the filenames stored in \n"
321"the configuration registry. This helps the registry perform efficiently.");
322
323PyDoc_STRVAR(DisableReflectionKey_doc,
324"Disables registry reflection for 32-bit processes running on a 64-bit\n"
325"Operating System. Will generally raise NotImplemented if executed on\n"
326"a 32-bit Operating System.\n"
327"If the key is not on the reflection list, the function succeeds but has no effect.\n"
328"Disabling reflection for a key does not affect reflection of any subkeys.");
329
330PyDoc_STRVAR(EnableReflectionKey_doc,
331"Restores registry reflection for the specified disabled key.\n"
332"Will generally raise NotImplemented if executed on a 32-bit Operating System.\n"
333"Restoring reflection for a key does not affect reflection of any subkeys.");
334
335PyDoc_STRVAR(QueryReflectionKey_doc,
336"bool = QueryReflectionKey(hkey) - Determines the reflection state for the specified key.\n"
337"Will generally raise NotImplemented if executed on a 32-bit Operating System.\n");
338
339/* PyHKEY docstrings */
340PyDoc_STRVAR(PyHKEY_doc,
341"PyHKEY Object - A Python object, representing a win32 registry key.\n"
342"\n"
343"This object wraps a Windows HKEY object, automatically closing it when\n"
344"the object is destroyed. To guarantee cleanup, you can call either\n"
345"the Close() method on the PyHKEY, or the CloseKey() method.\n"
346"\n"
347"All functions which accept a handle object also accept an integer - \n"
348"however, use of the handle object is encouraged.\n"
349"\n"
350"Functions:\n"
351"Close() - Closes the underlying handle.\n"
352"Detach() - Returns the integer Win32 handle, detaching it from the object\n"
353"\n"
354"Properties:\n"
355"handle - The integer Win32 handle.\n"
356"\n"
357"Operations:\n"
358"__nonzero__ - Handles with an open object return true, otherwise false.\n"
359"__int__ - Converting a handle to an integer returns the Win32 handle.\n"
360"__cmp__ - Handle objects are compared using the handle value.");
361
362
363PyDoc_STRVAR(PyHKEY_Close_doc,
364"key.Close() - Closes the underlying Windows handle.\n"
365"\n"
366"If the handle is already closed, no error is raised.");
367
368PyDoc_STRVAR(PyHKEY_Detach_doc,
369"int = key.Detach() - Detaches the Windows handle from the handle object.\n"
370"\n"
371"The result is the value of the handle before it is detached. If the\n"
372"handle is already detached, this will return zero.\n"
373"\n"
374"After calling this function, the handle is effectively invalidated,\n"
375"but the handle is not closed. You would call this function when you\n"
376"need the underlying win32 handle to exist beyond the lifetime of the\n"
377"handle object.\n"
378"On 64 bit windows, the result of this function is a long integer");
379
380
381/************************************************************************
382
383 The PyHKEY object definition
384
385************************************************************************/
386typedef struct {
387 PyObject_VAR_HEAD
388 HKEY hkey;
389} PyHKEYObject;
390
391#define PyHKEY_Check(op) ((op)->ob_type == &PyHKEY_Type)
392
393static char *failMsg = "bad operand type";
394
395static PyObject *
396PyHKEY_unaryFailureFunc(PyObject *ob)
397{
398 PyErr_SetString(PyExc_TypeError, failMsg);
399 return NULL;
400}
401static PyObject *
402PyHKEY_binaryFailureFunc(PyObject *ob1, PyObject *ob2)
403{
404 PyErr_SetString(PyExc_TypeError, failMsg);
405 return NULL;
406}
407static PyObject *
408PyHKEY_ternaryFailureFunc(PyObject *ob1, PyObject *ob2, PyObject *ob3)
409{
410 PyErr_SetString(PyExc_TypeError, failMsg);
411 return NULL;
412}
413
414static void
415PyHKEY_deallocFunc(PyObject *ob)
416{
417 /* Can not call PyHKEY_Close, as the ob->tp_type
418 has already been cleared, thus causing the type
419 check to fail!
420 */
421 PyHKEYObject *obkey = (PyHKEYObject *)ob;
422 if (obkey->hkey)
423 RegCloseKey((HKEY)obkey->hkey);
424 PyObject_DEL(ob);
425}
426
427static int
428PyHKEY_nonzeroFunc(PyObject *ob)
429{
430 return ((PyHKEYObject *)ob)->hkey != 0;
431}
432
433static PyObject *
434PyHKEY_intFunc(PyObject *ob)
435{
436 PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
437 return PyLong_FromVoidPtr(pyhkey->hkey);
438}
439
440static int
441PyHKEY_printFunc(PyObject *ob, FILE *fp, int flags)
442{
443 PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
444 fprintf(fp, "<PyHKEY at %p (%p)>",
445 ob, pyhkey->hkey);
446 return 0;
447}
448
449static PyObject *
450PyHKEY_strFunc(PyObject *ob)
451{
452 PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
453 return PyString_FromFormat("<PyHKEY:%p>", pyhkey->hkey);
454}
455
456static int
457PyHKEY_compareFunc(PyObject *ob1, PyObject *ob2)
458{
459 PyHKEYObject *pyhkey1 = (PyHKEYObject *)ob1;
460 PyHKEYObject *pyhkey2 = (PyHKEYObject *)ob2;
461 return pyhkey1 == pyhkey2 ? 0 :
462 (pyhkey1 < pyhkey2 ? -1 : 1);
463}
464
465static long
466PyHKEY_hashFunc(PyObject *ob)
467{
468 /* Just use the address.
469 XXX - should we use the handle value?
470 */
471 return _Py_HashPointer(ob);
472}
473
474
475static PyNumberMethods PyHKEY_NumberMethods =
476{
477 PyHKEY_binaryFailureFunc, /* nb_add */
478 PyHKEY_binaryFailureFunc, /* nb_subtract */
479 PyHKEY_binaryFailureFunc, /* nb_multiply */
480 PyHKEY_binaryFailureFunc, /* nb_divide */
481 PyHKEY_binaryFailureFunc, /* nb_remainder */
482 PyHKEY_binaryFailureFunc, /* nb_divmod */
483 PyHKEY_ternaryFailureFunc, /* nb_power */
484 PyHKEY_unaryFailureFunc, /* nb_negative */
485 PyHKEY_unaryFailureFunc, /* nb_positive */
486 PyHKEY_unaryFailureFunc, /* nb_absolute */
487 PyHKEY_nonzeroFunc, /* nb_nonzero */
488 PyHKEY_unaryFailureFunc, /* nb_invert */
489 PyHKEY_binaryFailureFunc, /* nb_lshift */
490 PyHKEY_binaryFailureFunc, /* nb_rshift */
491 PyHKEY_binaryFailureFunc, /* nb_and */
492 PyHKEY_binaryFailureFunc, /* nb_xor */
493 PyHKEY_binaryFailureFunc, /* nb_or */
494 0, /* nb_coerce (allowed to be zero) */
495 PyHKEY_intFunc, /* nb_int */
496 PyHKEY_unaryFailureFunc, /* nb_long */
497 PyHKEY_unaryFailureFunc, /* nb_float */
498 PyHKEY_unaryFailureFunc, /* nb_oct */
499 PyHKEY_unaryFailureFunc, /* nb_hex */
500};
501
502static PyObject *PyHKEY_CloseMethod(PyObject *self, PyObject *args);
503static PyObject *PyHKEY_DetachMethod(PyObject *self, PyObject *args);
504static PyObject *PyHKEY_Enter(PyObject *self);
505static PyObject *PyHKEY_Exit(PyObject *self, PyObject *args);
506
507static struct PyMethodDef PyHKEY_methods[] = {
508 {"Close", PyHKEY_CloseMethod, METH_VARARGS, PyHKEY_Close_doc},
509 {"Detach", PyHKEY_DetachMethod, METH_VARARGS, PyHKEY_Detach_doc},
510 {"__enter__", (PyCFunction)PyHKEY_Enter, METH_NOARGS, NULL},
511 {"__exit__", PyHKEY_Exit, METH_VARARGS, NULL},
512 {NULL}
513};
514
515static PyMemberDef PyHKEY_memberlist[] = {
516 {"handle", T_PYSSIZET, offsetof(PyHKEYObject, hkey), READONLY},
517 {NULL} /* Sentinel */
518};
519
520/* The type itself */
521PyTypeObject PyHKEY_Type =
522{
523 PyVarObject_HEAD_INIT(0, 0) /* fill in type at module init */
524 "PyHKEY",
525 sizeof(PyHKEYObject),
526 0,
527 PyHKEY_deallocFunc, /* tp_dealloc */
528 PyHKEY_printFunc, /* tp_print */
529 0, /* tp_getattr */
530 0, /* tp_setattr */
531 PyHKEY_compareFunc, /* tp_compare */
532 0, /* tp_repr */
533 &PyHKEY_NumberMethods, /* tp_as_number */
534 0, /* tp_as_sequence */
535 0, /* tp_as_mapping */
536 PyHKEY_hashFunc, /* tp_hash */
537 0, /* tp_call */
538 PyHKEY_strFunc, /* tp_str */
539 0, /* tp_getattro */
540 0, /* tp_setattro */
541 0, /* tp_as_buffer */
542 Py_TPFLAGS_DEFAULT, /* tp_flags */
543 PyHKEY_doc, /* tp_doc */
544 0, /* tp_traverse */
545 0, /* tp_clear */
546 0, /* tp_richcompare */
547 0, /* tp_weaklistoffset */
548 0, /* tp_iter */
549 0, /* tp_iternext */
550 PyHKEY_methods, /* tp_methods */
551 PyHKEY_memberlist, /* tp_members */
552};
553
554/************************************************************************
555
556 The PyHKEY object methods
557
558************************************************************************/
559static PyObject *
560PyHKEY_CloseMethod(PyObject *self, PyObject *args)
561{
562 if (!PyArg_ParseTuple(args, ":Close"))
563 return NULL;
564 if (!PyHKEY_Close(self))
565 return NULL;
566 Py_INCREF(Py_None);
567 return Py_None;
568}
569
570static PyObject *
571PyHKEY_DetachMethod(PyObject *self, PyObject *args)
572{
573 void* ret;
574 PyHKEYObject *pThis = (PyHKEYObject *)self;
575 if (!PyArg_ParseTuple(args, ":Detach"))
576 return NULL;
577 ret = (void*)pThis->hkey;
578 pThis->hkey = 0;
579 return PyLong_FromVoidPtr(ret);
580}
581
582static PyObject *
583PyHKEY_Enter(PyObject *self)
584{
585 Py_XINCREF(self);
586 return self;
587}
588
589static PyObject *
590PyHKEY_Exit(PyObject *self, PyObject *args)
591{
592 if (!PyHKEY_Close(self))
593 return NULL;
594 Py_RETURN_NONE;
595}
596
597
598/************************************************************************
599 The public PyHKEY API (well, not public yet :-)
600************************************************************************/
601PyObject *
602PyHKEY_New(HKEY hInit)
603{
604 PyHKEYObject *key = PyObject_NEW(PyHKEYObject, &PyHKEY_Type);
605 if (key)
606 key->hkey = hInit;
607 return (PyObject *)key;
608}
609
610BOOL
611PyHKEY_Close(PyObject *ob_handle)
612{
613 LONG rc;
614 PyHKEYObject *key;
615
616 if (!PyHKEY_Check(ob_handle)) {
617 PyErr_SetString(PyExc_TypeError, "bad operand type");
618 return FALSE;
619 }
620 key = (PyHKEYObject *)ob_handle;
621 rc = key->hkey ? RegCloseKey((HKEY)key->hkey) : ERROR_SUCCESS;
622 key->hkey = 0;
623 if (rc != ERROR_SUCCESS)
624 PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
625 return rc == ERROR_SUCCESS;
626}
627
628BOOL
629PyHKEY_AsHKEY(PyObject *ob, HKEY *pHANDLE, BOOL bNoneOK)
630{
631 if (ob == Py_None) {
632 if (!bNoneOK) {
633 PyErr_SetString(
634 PyExc_TypeError,
635 "None is not a valid HKEY in this context");
636 return FALSE;
637 }
638 *pHANDLE = (HKEY)0;
639 }
640 else if (PyHKEY_Check(ob)) {
641 PyHKEYObject *pH = (PyHKEYObject *)ob;
642 *pHANDLE = pH->hkey;
643 }
644 else if (PyInt_Check(ob) || PyLong_Check(ob)) {
645 /* We also support integers */
646 PyErr_Clear();
647 *pHANDLE = (HKEY)PyLong_AsVoidPtr(ob);
648 if (PyErr_Occurred())
649 return FALSE;
650 }
651 else {
652 PyErr_SetString(
653 PyExc_TypeError,
654 "The object is not a PyHKEY object");
655 return FALSE;
656 }
657 return TRUE;
658}
659
660PyObject *
661PyHKEY_FromHKEY(HKEY h)
662{
663 PyHKEYObject *op;
664
665 /* Inline PyObject_New */
666 op = (PyHKEYObject *) PyObject_MALLOC(sizeof(PyHKEYObject));
667 if (op == NULL)
668 return PyErr_NoMemory();
669 PyObject_INIT(op, &PyHKEY_Type);
670 op->hkey = h;
671 return (PyObject *)op;
672}
673
674
675/************************************************************************
676 The module methods
677************************************************************************/
678BOOL
679PyWinObject_CloseHKEY(PyObject *obHandle)
680{
681 BOOL ok;
682 if (PyHKEY_Check(obHandle)) {
683 ok = PyHKEY_Close(obHandle);
684 }
685#if SIZEOF_LONG >= SIZEOF_HKEY
686 else if (PyInt_Check(obHandle)) {
687 long rc = RegCloseKey((HKEY)PyInt_AsLong(obHandle));
688 ok = (rc == ERROR_SUCCESS);
689 if (!ok)
690 PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
691 }
692#else
693 else if (PyLong_Check(obHandle)) {
694 long rc = RegCloseKey((HKEY)PyLong_AsVoidPtr(obHandle));
695 ok = (rc == ERROR_SUCCESS);
696 if (!ok)
697 PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
698 }
699#endif
700 else {
701 PyErr_SetString(
702 PyExc_TypeError,
703 "A handle must be a HKEY object or an integer");
704 return FALSE;
705 }
706 return ok;
707}
708
709
710/*
711 Private Helper functions for the registry interfaces
712
713** Note that fixupMultiSZ and countString have both had changes
714** made to support "incorrect strings". The registry specification
715** calls for strings to be terminated with 2 null bytes. It seems
716** some commercial packages install strings which don't conform,
717** causing this code to fail - however, "regedit" etc still work
718** with these strings (ie only we don't!).
719*/
720static void
721fixupMultiSZ(char **str, char *data, int len)
722{
723 char *P;
724 int i;
725 char *Q;
726
727 Q = data + len;
728 for (P = data, i = 0; P < Q && *P != '\0'; P++, i++) {
729 str[i] = P;
730 for(; *P != '\0'; P++)
731 ;
732 }
733}
734
735static int
736countStrings(char *data, int len)
737{
738 int strings;
739 char *P;
740 char *Q = data + len;
741
742 for (P = data, strings = 0; P < Q && *P != '\0'; P++, strings++)
743 for (; P < Q && *P != '\0'; P++)
744 ;
745 return strings;
746}
747
748/* Convert PyObject into Registry data.
749 Allocates space as needed. */
750static BOOL
751Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
752{
753 Py_ssize_t i,j;
754 switch (typ) {
755 case REG_DWORD:
756 if (value != Py_None &&
757 !(PyInt_Check(value) || PyLong_Check(value)))
758 return FALSE;
759 *retDataBuf = (BYTE *)PyMem_NEW(DWORD, 1);
760 if (*retDataBuf==NULL){
761 PyErr_NoMemory();
762 return FALSE;
763 }
764 *retDataSize = sizeof(DWORD);
765 if (value == Py_None) {
766 DWORD zero = 0;
767 memcpy(*retDataBuf, &zero, sizeof(DWORD));
768 }
769 else {
770 DWORD d = PyLong_AsUnsignedLong(value);
771 memcpy(*retDataBuf, &d, sizeof(DWORD));
772 }
773 break;
774 case REG_SZ:
775 case REG_EXPAND_SZ:
776 {
777 int need_decref = 0;
778 if (value == Py_None)
779 *retDataSize = 1;
780 else {
781 if (PyUnicode_Check(value)) {
782 value = PyUnicode_AsEncodedString(
783 value,
784 "mbcs",
785 NULL);
786 if (value==NULL)
787 return FALSE;
788 need_decref = 1;
789 }
790 if (!PyString_Check(value))
791 return FALSE;
792 *retDataSize = 1 + strlen(
793 PyString_AS_STRING(
794 (PyStringObject *)value));
795 }
796 *retDataBuf = (BYTE *)PyMem_NEW(DWORD, *retDataSize);
797 if (*retDataBuf==NULL){
798 PyErr_NoMemory();
799 return FALSE;
800 }
801 if (value == Py_None)
802 strcpy((char *)*retDataBuf, "");
803 else
804 strcpy((char *)*retDataBuf,
805 PyString_AS_STRING(
806 (PyStringObject *)value));
807 if (need_decref)
808 Py_DECREF(value);
809 break;
810 }
811 case REG_MULTI_SZ:
812 {
813 DWORD size = 0;
814 char *P;
815 PyObject **obs = NULL;
816
817 if (value == Py_None)
818 i = 0;
819 else {
820 if (!PyList_Check(value))
821 return FALSE;
822 i = PyList_Size(value);
823 }
824 obs = malloc(sizeof(PyObject *) * i);
825 memset(obs, 0, sizeof(PyObject *) * i);
826 for (j = 0; j < i; j++)
827 {
828 PyObject *t;
829 t = PyList_GET_ITEM(
830 (PyListObject *)value,j);
831 if (PyString_Check(t)) {
832 obs[j] = t;
833 Py_INCREF(t);
834 } else if (PyUnicode_Check(t)) {
835 obs[j] = PyUnicode_AsEncodedString(
836 t,
837 "mbcs",
838 NULL);
839 if (obs[j]==NULL)
840 goto reg_multi_fail;
841 } else
842 goto reg_multi_fail;
843 size += 1 + strlen(
844 PyString_AS_STRING(
845 (PyStringObject *)obs[j]));
846 }
847
848 *retDataSize = size + 1;
849 *retDataBuf = (BYTE *)PyMem_NEW(char,
850 *retDataSize);
851 if (*retDataBuf==NULL){
852 PyErr_NoMemory();
853 goto reg_multi_fail;
854 }
855 P = (char *)*retDataBuf;
856
857 for (j = 0; j < i; j++)
858 {
859 PyObject *t;
860 t = obs[j];
861 strcpy(P,
862 PyString_AS_STRING(
863 (PyStringObject *)t));
864 P += 1 + strlen(
865 PyString_AS_STRING(
866 (PyStringObject *)t));
867 Py_DECREF(obs[j]);
868 }
869 /* And doubly-terminate the list... */
870 *P = '\0';
871 free(obs);
872 break;
873 reg_multi_fail:
874 if (obs) {
875 for (j = 0; j < i; j++)
876 Py_XDECREF(obs[j]);
877
878 free(obs);
879 }
880 return FALSE;
881 }
882 case REG_BINARY:
883 /* ALSO handle ALL unknown data types here. Even if we can't
884 support it natively, we should handle the bits. */
885 default:
886 if (value == Py_None)
887 *retDataSize = 0;
888 else {
889 void *src_buf;
890 PyBufferProcs *pb = value->ob_type->tp_as_buffer;
891 if (pb==NULL) {
892 PyErr_Format(PyExc_TypeError,
893 "Objects of type '%s' can not "
894 "be used as binary registry values",
895 value->ob_type->tp_name);
896 return FALSE;
897 }
898 *retDataSize = (*pb->bf_getreadbuffer)(value, 0, &src_buf);
899 *retDataBuf = (BYTE *)PyMem_NEW(char,
900 *retDataSize);
901 if (*retDataBuf==NULL){
902 PyErr_NoMemory();
903 return FALSE;
904 }
905 memcpy(*retDataBuf, src_buf, *retDataSize);
906 }
907 break;
908 }
909 return TRUE;
910}
911
912/* Convert Registry data into PyObject*/
913static PyObject *
914Reg2Py(char *retDataBuf, DWORD retDataSize, DWORD typ)
915{
916 PyObject *obData;
917
918 switch (typ) {
919 case REG_DWORD:
920 if (retDataSize == 0)
921 obData = Py_BuildValue("k", 0);
922 else
923 obData = Py_BuildValue("k",
924 *(int *)retDataBuf);
925 break;
926 case REG_SZ:
927 case REG_EXPAND_SZ:
928 /* retDataBuf may or may not have a trailing NULL in
929 the buffer. */
930 if (retDataSize && retDataBuf[retDataSize-1] == '\0')
931 --retDataSize;
932 if (retDataSize ==0)
933 retDataBuf = "";
934 obData = PyUnicode_DecodeMBCS(retDataBuf,
935 retDataSize,
936 NULL);
937 break;
938 case REG_MULTI_SZ:
939 if (retDataSize == 0)
940 obData = PyList_New(0);
941 else
942 {
943 int index = 0;
944 int s = countStrings(retDataBuf, retDataSize);
945 char **str = (char **)malloc(sizeof(char *)*s);
946 if (str == NULL)
947 return PyErr_NoMemory();
948
949 fixupMultiSZ(str, retDataBuf, retDataSize);
950 obData = PyList_New(s);
951 if (obData == NULL)
952 return NULL;
953 for (index = 0; index < s; index++)
954 {
955 size_t len = _mbstrlen(str[index]);
956 if (len > INT_MAX) {
957 PyErr_SetString(PyExc_OverflowError,
958 "registry string is too long for a Python string");
959 Py_DECREF(obData);
960 return NULL;
961 }
962 PyList_SetItem(obData,
963 index,
964 PyUnicode_DecodeMBCS(
965 (const char *)str[index],
966 (int)len,
967 NULL)
968 );
969 }
970 free(str);
971
972 break;
973 }
974 case REG_BINARY:
975 /* ALSO handle ALL unknown data types here. Even if we can't
976 support it natively, we should handle the bits. */
977 default:
978 if (retDataSize == 0) {
979 Py_INCREF(Py_None);
980 obData = Py_None;
981 }
982 else
983 obData = Py_BuildValue("s#",
984 (char *)retDataBuf,
985 retDataSize);
986 break;
987 }
988 if (obData == NULL)
989 return NULL;
990 else
991 return obData;
992}
993
994/* The Python methods */
995
996static PyObject *
997PyCloseKey(PyObject *self, PyObject *args)
998{
999 PyObject *obKey;
1000 if (!PyArg_ParseTuple(args, "O:CloseKey", &obKey))
1001 return NULL;
1002 if (!PyHKEY_Close(obKey))
1003 return NULL;
1004 Py_INCREF(Py_None);
1005 return Py_None;
1006}
1007
1008static PyObject *
1009PyConnectRegistry(PyObject *self, PyObject *args)
1010{
1011 HKEY hKey;
1012 PyObject *obKey;
1013 char *szCompName = NULL;
1014 HKEY retKey;
1015 long rc;
1016 if (!PyArg_ParseTuple(args, "zO:ConnectRegistry", &szCompName, &obKey))
1017 return NULL;
1018 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1019 return NULL;
1020 Py_BEGIN_ALLOW_THREADS
1021 rc = RegConnectRegistry(szCompName, hKey, &retKey);
1022 Py_END_ALLOW_THREADS
1023 if (rc != ERROR_SUCCESS)
1024 return PyErr_SetFromWindowsErrWithFunction(rc,
1025 "ConnectRegistry");
1026 return PyHKEY_FromHKEY(retKey);
1027}
1028
1029static PyObject *
1030PyCreateKey(PyObject *self, PyObject *args)
1031{
1032 HKEY hKey;
1033 PyObject *obKey;
1034 char *subKey;
1035 HKEY retKey;
1036 long rc;
1037 if (!PyArg_ParseTuple(args, "Oz:CreateKey", &obKey, &subKey))
1038 return NULL;
1039 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1040 return NULL;
1041 rc = RegCreateKey(hKey, subKey, &retKey);
1042 if (rc != ERROR_SUCCESS)
1043 return PyErr_SetFromWindowsErrWithFunction(rc, "CreateKey");
1044 return PyHKEY_FromHKEY(retKey);
1045}
1046
1047static PyObject *
1048PyCreateKeyEx(PyObject *self, PyObject *args)
1049{
1050 HKEY hKey;
1051 PyObject *obKey;
1052 char *subKey;
1053 HKEY retKey;
1054 int res = 0;
1055 REGSAM sam = KEY_WRITE;
1056 long rc;
1057 if (!PyArg_ParseTuple(args, "Oz|ii:CreateKeyEx", &obKey, &subKey,
1058 &res, &sam))
1059 return NULL;
1060 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1061 return NULL;
1062
1063 rc = RegCreateKeyEx(hKey, subKey, res, NULL, (DWORD)NULL,
1064 sam, NULL, &retKey, NULL);
1065 if (rc != ERROR_SUCCESS)
1066 return PyErr_SetFromWindowsErrWithFunction(rc, "CreateKeyEx");
1067 return PyHKEY_FromHKEY(retKey);
1068}
1069
1070static PyObject *
1071PyDeleteKey(PyObject *self, PyObject *args)
1072{
1073 HKEY hKey;
1074 PyObject *obKey;
1075 char *subKey;
1076 long rc;
1077 if (!PyArg_ParseTuple(args, "Os:DeleteKey", &obKey, &subKey))
1078 return NULL;
1079 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1080 return NULL;
1081 rc = RegDeleteKey(hKey, subKey );
1082 if (rc != ERROR_SUCCESS)
1083 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKey");
1084 Py_INCREF(Py_None);
1085 return Py_None;
1086}
1087
1088static PyObject *
1089PyDeleteKeyEx(PyObject *self, PyObject *args)
1090{
1091 HKEY hKey;
1092 PyObject *obKey;
1093 HMODULE hMod;
1094 typedef LONG (WINAPI *RDKEFunc)(HKEY, const char*, REGSAM, int);
1095 RDKEFunc pfn = NULL;
1096 char *subKey;
1097 long rc;
1098 int res = 0;
1099 REGSAM sam = KEY_WOW64_64KEY;
1100
1101 if (!PyArg_ParseTuple(args, "Os|ii:DeleteKeyEx",
1102 &obKey, &subKey, &sam, &res))
1103 return NULL;
1104 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1105 return NULL;
1106
1107 /* Only available on 64bit platforms, so we must load it
1108 dynamically. */
1109 hMod = GetModuleHandle("advapi32.dll");
1110 if (hMod)
1111 pfn = (RDKEFunc)GetProcAddress(hMod,
1112 "RegDeleteKeyExA");
1113 if (!pfn) {
1114 PyErr_SetString(PyExc_NotImplementedError,
1115 "not implemented on this platform");
1116 return NULL;
1117 }
1118 Py_BEGIN_ALLOW_THREADS
1119 rc = (*pfn)(hKey, subKey, sam, res);
1120 Py_END_ALLOW_THREADS
1121
1122 if (rc != ERROR_SUCCESS)
1123 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKeyEx");
1124 Py_INCREF(Py_None);
1125 return Py_None;
1126}
1127
1128static PyObject *
1129PyDeleteValue(PyObject *self, PyObject *args)
1130{
1131 HKEY hKey;
1132 PyObject *obKey;
1133 char *subKey;
1134 long rc;
1135 if (!PyArg_ParseTuple(args, "Oz:DeleteValue", &obKey, &subKey))
1136 return NULL;
1137 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1138 return NULL;
1139 Py_BEGIN_ALLOW_THREADS
1140 rc = RegDeleteValue(hKey, subKey);
1141 Py_END_ALLOW_THREADS
1142 if (rc !=ERROR_SUCCESS)
1143 return PyErr_SetFromWindowsErrWithFunction(rc,
1144 "RegDeleteValue");
1145 Py_INCREF(Py_None);
1146 return Py_None;
1147}
1148
1149static PyObject *
1150PyEnumKey(PyObject *self, PyObject *args)
1151{
1152 HKEY hKey;
1153 PyObject *obKey;
1154 int index;
1155 long rc;
1156 PyObject *retStr;
1157
1158 /* The Windows docs claim that the max key name length is 255
1159 * characters, plus a terminating nul character. However,
1160 * empirical testing demonstrates that it is possible to
1161 * create a 256 character key that is missing the terminating
1162 * nul. RegEnumKeyEx requires a 257 character buffer to
1163 * retrieve such a key name. */
1164 char tmpbuf[257];
1165 DWORD len = sizeof(tmpbuf); /* includes NULL terminator */
1166
1167 if (!PyArg_ParseTuple(args, "Oi:EnumKey", &obKey, &index))
1168 return NULL;
1169 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1170 return NULL;
1171
1172 Py_BEGIN_ALLOW_THREADS
1173 rc = RegEnumKeyEx(hKey, index, tmpbuf, &len, NULL, NULL, NULL, NULL);
1174 Py_END_ALLOW_THREADS
1175 if (rc != ERROR_SUCCESS)
1176 return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKeyEx");
1177
1178 retStr = PyString_FromStringAndSize(tmpbuf, len);
1179 return retStr; /* can be NULL */
1180}
1181
1182static PyObject *
1183PyEnumValue(PyObject *self, PyObject *args)
1184{
1185 HKEY hKey;
1186 PyObject *obKey;
1187 int index;
1188 long rc;
1189 char *retValueBuf;
1190 char *retDataBuf;
1191 char *tmpBuf;
1192 DWORD retValueSize, bufValueSize;
1193 DWORD retDataSize, bufDataSize;
1194 DWORD typ;
1195 PyObject *obData;
1196 PyObject *retVal;
1197
1198 if (!PyArg_ParseTuple(args, "Oi:EnumValue", &obKey, &index))
1199 return NULL;
1200 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1201 return NULL;
1202
1203 if ((rc = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL,
1204 NULL,
1205 &retValueSize, &retDataSize, NULL, NULL))
1206 != ERROR_SUCCESS)
1207 return PyErr_SetFromWindowsErrWithFunction(rc,
1208 "RegQueryInfoKey");
1209 ++retValueSize; /* include null terminators */
1210 ++retDataSize;
1211 bufDataSize = retDataSize;
1212 bufValueSize = retValueSize;
1213 retValueBuf = (char *)PyMem_Malloc(retValueSize);
1214 if (retValueBuf == NULL)
1215 return PyErr_NoMemory();
1216 retDataBuf = (char *)PyMem_Malloc(retDataSize);
1217 if (retDataBuf == NULL) {
1218 PyMem_Free(retValueBuf);
1219 return PyErr_NoMemory();
1220 }
1221
1222 while (1) {
1223 Py_BEGIN_ALLOW_THREADS
1224 rc = RegEnumValue(hKey,
1225 index,
1226 retValueBuf,
1227 &retValueSize,
1228 NULL,
1229 &typ,
1230 (BYTE *)retDataBuf,
1231 &retDataSize);
1232 Py_END_ALLOW_THREADS
1233
1234 if (rc != ERROR_MORE_DATA)
1235 break;
1236
1237 bufDataSize *= 2;
1238 tmpBuf = (char *)PyMem_Realloc(retDataBuf, bufDataSize);
1239 if (tmpBuf == NULL) {
1240 PyErr_NoMemory();
1241 retVal = NULL;
1242 goto fail;
1243 }
1244 retDataBuf = tmpBuf;
1245 retDataSize = bufDataSize;
1246 retValueSize = bufValueSize;
1247 }
1248
1249 if (rc != ERROR_SUCCESS) {
1250 retVal = PyErr_SetFromWindowsErrWithFunction(rc,
1251 "PyRegEnumValue");
1252 goto fail;
1253 }
1254 obData = Reg2Py(retDataBuf, retDataSize, typ);
1255 if (obData == NULL) {
1256 retVal = NULL;
1257 goto fail;
1258 }
1259 retVal = Py_BuildValue("sOi", retValueBuf, obData, typ);
1260 Py_DECREF(obData);
1261 fail:
1262 PyMem_Free(retValueBuf);
1263 PyMem_Free(retDataBuf);
1264 return retVal;
1265}
1266
1267static PyObject *
1268PyExpandEnvironmentStrings(PyObject *self, PyObject *args)
1269{
1270 Py_UNICODE *retValue = NULL;
1271 Py_UNICODE *src;
1272 DWORD retValueSize;
1273 DWORD rc;
1274 PyObject *o;
1275
1276 if (!PyArg_ParseTuple(args, "u:ExpandEnvironmentStrings", &src))
1277 return NULL;
1278
1279 retValueSize = ExpandEnvironmentStringsW(src, retValue, 0);
1280 if (retValueSize == 0) {
1281 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1282 "ExpandEnvironmentStrings");
1283 }
1284 retValue = (Py_UNICODE *)PyMem_Malloc(retValueSize * sizeof(Py_UNICODE));
1285 if (retValue == NULL) {
1286 return PyErr_NoMemory();
1287 }
1288
1289 rc = ExpandEnvironmentStringsW(src, retValue, retValueSize);
1290 if (rc == 0) {
1291 PyMem_Free(retValue);
1292 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1293 "ExpandEnvironmentStrings");
1294 }
1295 o = PyUnicode_FromUnicode(retValue, wcslen(retValue));
1296 PyMem_Free(retValue);
1297 return o;
1298}
1299
1300static PyObject *
1301PyFlushKey(PyObject *self, PyObject *args)
1302{
1303 HKEY hKey;
1304 PyObject *obKey;
1305 long rc;
1306 if (!PyArg_ParseTuple(args, "O:FlushKey", &obKey))
1307 return NULL;
1308 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1309 return NULL;
1310 Py_BEGIN_ALLOW_THREADS
1311 rc = RegFlushKey(hKey);
1312 Py_END_ALLOW_THREADS
1313 if (rc != ERROR_SUCCESS)
1314 return PyErr_SetFromWindowsErrWithFunction(rc, "RegFlushKey");
1315 Py_INCREF(Py_None);
1316 return Py_None;
1317}
1318static PyObject *
1319PyLoadKey(PyObject *self, PyObject *args)
1320{
1321 HKEY hKey;
1322 PyObject *obKey;
1323 char *subKey;
1324 char *fileName;
1325
1326 long rc;
1327 if (!PyArg_ParseTuple(args, "Oss:LoadKey", &obKey, &subKey, &fileName))
1328 return NULL;
1329 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1330 return NULL;
1331 Py_BEGIN_ALLOW_THREADS
1332 rc = RegLoadKey(hKey, subKey, fileName );
1333 Py_END_ALLOW_THREADS
1334 if (rc != ERROR_SUCCESS)
1335 return PyErr_SetFromWindowsErrWithFunction(rc, "RegLoadKey");
1336 Py_INCREF(Py_None);
1337 return Py_None;
1338}
1339
1340static PyObject *
1341PyOpenKey(PyObject *self, PyObject *args)
1342{
1343 HKEY hKey;
1344 PyObject *obKey;
1345
1346 char *subKey;
1347 int res = 0;
1348 HKEY retKey;
1349 long rc;
1350 REGSAM sam = KEY_READ;
1351 if (!PyArg_ParseTuple(args, "Oz|ii:OpenKey", &obKey, &subKey,
1352 &res, &sam))
1353 return NULL;
1354 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1355 return NULL;
1356
1357 Py_BEGIN_ALLOW_THREADS
1358 rc = RegOpenKeyEx(hKey, subKey, res, sam, &retKey);
1359 Py_END_ALLOW_THREADS
1360 if (rc != ERROR_SUCCESS)
1361 return PyErr_SetFromWindowsErrWithFunction(rc, "RegOpenKeyEx");
1362 return PyHKEY_FromHKEY(retKey);
1363}
1364
1365
1366static PyObject *
1367PyQueryInfoKey(PyObject *self, PyObject *args)
1368{
1369 HKEY hKey;
1370 PyObject *obKey;
1371 long rc;
1372 DWORD nSubKeys, nValues;
1373 FILETIME ft;
1374 LARGE_INTEGER li;
1375 PyObject *l;
1376 PyObject *ret;
1377 if (!PyArg_ParseTuple(args, "O:QueryInfoKey", &obKey))
1378 return NULL;
1379 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1380 return NULL;
1381 if ((rc = RegQueryInfoKey(hKey, NULL, NULL, 0, &nSubKeys, NULL, NULL,
1382 &nValues, NULL, NULL, NULL, &ft))
1383 != ERROR_SUCCESS)
1384 return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryInfoKey");
1385 li.LowPart = ft.dwLowDateTime;
1386 li.HighPart = ft.dwHighDateTime;
1387 l = PyLong_FromLongLong(li.QuadPart);
1388 if (l == NULL)
1389 return NULL;
1390 ret = Py_BuildValue("iiO", nSubKeys, nValues, l);
1391 Py_DECREF(l);
1392 return ret;
1393}
1394
1395static PyObject *
1396PyQueryValue(PyObject *self, PyObject *args)
1397{
1398 HKEY hKey;
1399 PyObject *obKey;
1400 char *subKey;
1401 long rc;
1402 PyObject *retStr;
1403 char *retBuf;
1404 DWORD bufSize = 0;
1405 DWORD retSize = 0;
1406 char *tmp;
1407
1408 if (!PyArg_ParseTuple(args, "Oz:QueryValue", &obKey, &subKey))
1409 return NULL;
1410
1411 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1412 return NULL;
1413
1414 rc = RegQueryValue(hKey, subKey, NULL, &retSize);
1415 if (rc == ERROR_MORE_DATA)
1416 retSize = 256;
1417 else if (rc != ERROR_SUCCESS)
1418 return PyErr_SetFromWindowsErrWithFunction(rc,
1419 "RegQueryValue");
1420
1421 bufSize = retSize;
1422 retBuf = (char *) PyMem_Malloc(bufSize);
1423 if (retBuf == NULL)
1424 return PyErr_NoMemory();
1425
1426 while (1) {
1427 retSize = bufSize;
1428 rc = RegQueryValue(hKey, subKey, retBuf, &retSize);
1429 if (rc != ERROR_MORE_DATA)
1430 break;
1431
1432 bufSize *= 2;
1433 tmp = (char *) PyMem_Realloc(retBuf, bufSize);
1434 if (tmp == NULL) {
1435 PyMem_Free(retBuf);
1436 return PyErr_NoMemory();
1437 }
1438 retBuf = tmp;
1439 }
1440
1441 if (rc != ERROR_SUCCESS) {
1442 PyMem_Free(retBuf);
1443 return PyErr_SetFromWindowsErrWithFunction(rc,
1444 "RegQueryValue");
1445 }
1446
1447 if (retBuf[retSize-1] == '\x00')
1448 retSize--;
1449 retStr = PyString_FromStringAndSize(retBuf, retSize);
1450 if (retStr == NULL) {
1451 PyMem_Free(retBuf);
1452 return NULL;
1453 }
1454 return retStr;
1455}
1456
1457static PyObject *
1458PyQueryValueEx(PyObject *self, PyObject *args)
1459{
1460 HKEY hKey;
1461 PyObject *obKey;
1462 char *valueName;
1463
1464 long rc;
1465 char *retBuf, *tmp;
1466 DWORD bufSize = 0, retSize;
1467 DWORD typ;
1468 PyObject *obData;
1469 PyObject *result;
1470
1471 if (!PyArg_ParseTuple(args, "Oz:QueryValueEx", &obKey, &valueName))
1472 return NULL;
1473
1474 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1475 return NULL;
1476
1477 rc = RegQueryValueEx(hKey, valueName, NULL, NULL, NULL, &bufSize);
1478 if (rc == ERROR_MORE_DATA)
1479 bufSize = 256;
1480 else if (rc != ERROR_SUCCESS)
1481 return PyErr_SetFromWindowsErrWithFunction(rc,
1482 "RegQueryValueEx");
1483 retBuf = (char *)PyMem_Malloc(bufSize);
1484 if (retBuf == NULL)
1485 return PyErr_NoMemory();
1486
1487 while (1) {
1488 retSize = bufSize;
1489 rc = RegQueryValueEx(hKey, valueName, NULL, &typ,
1490 (BYTE *)retBuf, &retSize);
1491 if (rc != ERROR_MORE_DATA)
1492 break;
1493
1494 bufSize *= 2;
1495 tmp = (char *) PyMem_Realloc(retBuf, bufSize);
1496 if (tmp == NULL) {
1497 PyMem_Free(retBuf);
1498 return PyErr_NoMemory();
1499 }
1500 retBuf = tmp;
1501 }
1502
1503 if (rc != ERROR_SUCCESS) {
1504 PyMem_Free(retBuf);
1505 return PyErr_SetFromWindowsErrWithFunction(rc,
1506 "RegQueryValueEx");
1507 }
1508 obData = Reg2Py(retBuf, bufSize, typ);
1509 PyMem_Free((void *)retBuf);
1510 if (obData == NULL)
1511 return NULL;
1512 result = Py_BuildValue("Oi", obData, typ);
1513 Py_DECREF(obData);
1514 return result;
1515}
1516
1517
1518static PyObject *
1519PySaveKey(PyObject *self, PyObject *args)
1520{
1521 HKEY hKey;
1522 PyObject *obKey;
1523 char *fileName;
1524 LPSECURITY_ATTRIBUTES pSA = NULL;
1525
1526 long rc;
1527 if (!PyArg_ParseTuple(args, "Os:SaveKey", &obKey, &fileName))
1528 return NULL;
1529 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1530 return NULL;
1531/* One day we may get security into the core?
1532 if (!PyWinObject_AsSECURITY_ATTRIBUTES(obSA, &pSA, TRUE))
1533 return NULL;
1534*/
1535 Py_BEGIN_ALLOW_THREADS
1536 rc = RegSaveKey(hKey, fileName, pSA );
1537 Py_END_ALLOW_THREADS
1538 if (rc != ERROR_SUCCESS)
1539 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSaveKey");
1540 Py_INCREF(Py_None);
1541 return Py_None;
1542}
1543
1544static PyObject *
1545PySetValue(PyObject *self, PyObject *args)
1546{
1547 HKEY hKey;
1548 PyObject *obKey;
1549 char *subKey;
1550 char *str;
1551 DWORD typ;
1552 DWORD len;
1553 long rc;
1554 PyObject *obStrVal;
1555 PyObject *obSubKey;
1556 if (!PyArg_ParseTuple(args, "OOiO:SetValue",
1557 &obKey,
1558 &obSubKey,
1559 &typ,
1560 &obStrVal))
1561 return NULL;
1562 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1563 return NULL;
1564 if (typ != REG_SZ) {
1565 PyErr_SetString(PyExc_TypeError,
1566 "Type must be _winreg.REG_SZ");
1567 return NULL;
1568 }
1569 /* XXX - need Unicode support */
1570 str = PyString_AsString(obStrVal);
1571 if (str == NULL)
1572 return NULL;
1573 len = PyString_Size(obStrVal);
1574 if (obSubKey == Py_None)
1575 subKey = NULL;
1576 else {
1577 subKey = PyString_AsString(obSubKey);
1578 if (subKey == NULL)
1579 return NULL;
1580 }
1581 Py_BEGIN_ALLOW_THREADS
1582 rc = RegSetValue(hKey, subKey, REG_SZ, str, len+1);
1583 Py_END_ALLOW_THREADS
1584 if (rc != ERROR_SUCCESS)
1585 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSetValue");
1586 Py_INCREF(Py_None);
1587 return Py_None;
1588}
1589
1590static PyObject *
1591PySetValueEx(PyObject *self, PyObject *args)
1592{
1593 HKEY hKey;
1594 PyObject *obKey;
1595 char *valueName;
1596 PyObject *obRes;
1597 PyObject *value;
1598 BYTE *data;
1599 DWORD len;
1600 DWORD typ;
1601
1602 LONG rc;
1603
1604 if (!PyArg_ParseTuple(args, "OzOiO:SetValueEx",
1605 &obKey,
1606 &valueName,
1607 &obRes,
1608 &typ,
1609 &value))
1610 return NULL;
1611 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1612 return NULL;
1613 if (!Py2Reg(value, typ, &data, &len))
1614 {
1615 if (!PyErr_Occurred())
1616 PyErr_SetString(PyExc_ValueError,
1617 "Could not convert the data to the specified type.");
1618 return NULL;
1619 }
1620 Py_BEGIN_ALLOW_THREADS
1621 rc = RegSetValueEx(hKey, valueName, 0, typ, data, len);
1622 Py_END_ALLOW_THREADS
1623 PyMem_DEL(data);
1624 if (rc != ERROR_SUCCESS)
1625 return PyErr_SetFromWindowsErrWithFunction(rc,
1626 "RegSetValueEx");
1627 Py_INCREF(Py_None);
1628 return Py_None;
1629}
1630
1631static PyObject *
1632PyDisableReflectionKey(PyObject *self, PyObject *args)
1633{
1634 HKEY hKey;
1635 PyObject *obKey;
1636 HMODULE hMod;
1637 typedef LONG (WINAPI *RDRKFunc)(HKEY);
1638 RDRKFunc pfn = NULL;
1639 LONG rc;
1640
1641 if (!PyArg_ParseTuple(args, "O:DisableReflectionKey", &obKey))
1642 return NULL;
1643 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1644 return NULL;
1645
1646 /* Only available on 64bit platforms, so we must load it
1647 dynamically. */
1648 hMod = GetModuleHandle("advapi32.dll");
1649 if (hMod)
1650 pfn = (RDRKFunc)GetProcAddress(hMod,
1651 "RegDisableReflectionKey");
1652 if (!pfn) {
1653 PyErr_SetString(PyExc_NotImplementedError,
1654 "not implemented on this platform");
1655 return NULL;
1656 }
1657 Py_BEGIN_ALLOW_THREADS
1658 rc = (*pfn)(hKey);
1659 Py_END_ALLOW_THREADS
1660 if (rc != ERROR_SUCCESS)
1661 return PyErr_SetFromWindowsErrWithFunction(rc,
1662 "RegDisableReflectionKey");
1663 Py_INCREF(Py_None);
1664 return Py_None;
1665}
1666
1667static PyObject *
1668PyEnableReflectionKey(PyObject *self, PyObject *args)
1669{
1670 HKEY hKey;
1671 PyObject *obKey;
1672 HMODULE hMod;
1673 typedef LONG (WINAPI *RERKFunc)(HKEY);
1674 RERKFunc pfn = NULL;
1675 LONG rc;
1676
1677 if (!PyArg_ParseTuple(args, "O:EnableReflectionKey", &obKey))
1678 return NULL;
1679 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1680 return NULL;
1681
1682 /* Only available on 64bit platforms, so we must load it
1683 dynamically. */
1684 hMod = GetModuleHandle("advapi32.dll");
1685 if (hMod)
1686 pfn = (RERKFunc)GetProcAddress(hMod,
1687 "RegEnableReflectionKey");
1688 if (!pfn) {
1689 PyErr_SetString(PyExc_NotImplementedError,
1690 "not implemented on this platform");
1691 return NULL;
1692 }
1693 Py_BEGIN_ALLOW_THREADS
1694 rc = (*pfn)(hKey);
1695 Py_END_ALLOW_THREADS
1696 if (rc != ERROR_SUCCESS)
1697 return PyErr_SetFromWindowsErrWithFunction(rc,
1698 "RegEnableReflectionKey");
1699 Py_INCREF(Py_None);
1700 return Py_None;
1701}
1702
1703static PyObject *
1704PyQueryReflectionKey(PyObject *self, PyObject *args)
1705{
1706 HKEY hKey;
1707 PyObject *obKey;
1708 HMODULE hMod;
1709 typedef LONG (WINAPI *RQRKFunc)(HKEY, BOOL *);
1710 RQRKFunc pfn = NULL;
1711 BOOL result;
1712 LONG rc;
1713
1714 if (!PyArg_ParseTuple(args, "O:QueryReflectionKey", &obKey))
1715 return NULL;
1716 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1717 return NULL;
1718
1719 /* Only available on 64bit platforms, so we must load it
1720 dynamically. */
1721 hMod = GetModuleHandle("advapi32.dll");
1722 if (hMod)
1723 pfn = (RQRKFunc)GetProcAddress(hMod,
1724 "RegQueryReflectionKey");
1725 if (!pfn) {
1726 PyErr_SetString(PyExc_NotImplementedError,
1727 "not implemented on this platform");
1728 return NULL;
1729 }
1730 Py_BEGIN_ALLOW_THREADS
1731 rc = (*pfn)(hKey, &result);
1732 Py_END_ALLOW_THREADS
1733 if (rc != ERROR_SUCCESS)
1734 return PyErr_SetFromWindowsErrWithFunction(rc,
1735 "RegQueryReflectionKey");
1736 return PyBool_FromLong(result);
1737}
1738
1739static struct PyMethodDef winreg_methods[] = {
1740 {"CloseKey", PyCloseKey, METH_VARARGS, CloseKey_doc},
1741 {"ConnectRegistry", PyConnectRegistry, METH_VARARGS, ConnectRegistry_doc},
1742 {"CreateKey", PyCreateKey, METH_VARARGS, CreateKey_doc},
1743 {"CreateKeyEx", PyCreateKeyEx, METH_VARARGS, CreateKeyEx_doc},
1744 {"DeleteKey", PyDeleteKey, METH_VARARGS, DeleteKey_doc},
1745 {"DeleteKeyEx", PyDeleteKeyEx, METH_VARARGS, DeleteKeyEx_doc},
1746 {"DeleteValue", PyDeleteValue, METH_VARARGS, DeleteValue_doc},
1747 {"DisableReflectionKey", PyDisableReflectionKey, METH_VARARGS, DisableReflectionKey_doc},
1748 {"EnableReflectionKey", PyEnableReflectionKey, METH_VARARGS, EnableReflectionKey_doc},
1749 {"EnumKey", PyEnumKey, METH_VARARGS, EnumKey_doc},
1750 {"EnumValue", PyEnumValue, METH_VARARGS, EnumValue_doc},
1751 {"ExpandEnvironmentStrings", PyExpandEnvironmentStrings, METH_VARARGS,
1752 ExpandEnvironmentStrings_doc },
1753 {"FlushKey", PyFlushKey, METH_VARARGS, FlushKey_doc},
1754 {"LoadKey", PyLoadKey, METH_VARARGS, LoadKey_doc},
1755 {"OpenKey", PyOpenKey, METH_VARARGS, OpenKey_doc},
1756 {"OpenKeyEx", PyOpenKey, METH_VARARGS, OpenKeyEx_doc},
1757 {"QueryValue", PyQueryValue, METH_VARARGS, QueryValue_doc},
1758 {"QueryValueEx", PyQueryValueEx, METH_VARARGS, QueryValueEx_doc},
1759 {"QueryInfoKey", PyQueryInfoKey, METH_VARARGS, QueryInfoKey_doc},
1760 {"QueryReflectionKey",PyQueryReflectionKey,METH_VARARGS, QueryReflectionKey_doc},
1761 {"SaveKey", PySaveKey, METH_VARARGS, SaveKey_doc},
1762 {"SetValue", PySetValue, METH_VARARGS, SetValue_doc},
1763 {"SetValueEx", PySetValueEx, METH_VARARGS, SetValueEx_doc},
1764 NULL,
1765};
1766
1767static void
1768insint(PyObject * d, char * name, long value)
1769{
1770 PyObject *v = PyInt_FromLong(value);
1771 if (!v || PyDict_SetItemString(d, name, v))
1772 PyErr_Clear();
1773 Py_XDECREF(v);
1774}
1775
1776#define ADD_INT(val) insint(d, #val, val)
1777
1778static void
1779inskey(PyObject * d, char * name, HKEY key)
1780{
1781 PyObject *v = PyLong_FromVoidPtr(key);
1782 if (!v || PyDict_SetItemString(d, name, v))
1783 PyErr_Clear();
1784 Py_XDECREF(v);
1785}
1786
1787#define ADD_KEY(val) inskey(d, #val, val)
1788
1789PyMODINIT_FUNC init_winreg(void)
1790{
1791 PyObject *m, *d;
1792 m = Py_InitModule3("_winreg", winreg_methods, module_doc);
1793 if (m == NULL)
1794 return;
1795 d = PyModule_GetDict(m);
1796 if (PyType_Ready(&PyHKEY_Type) < 0)
1797 return;
1798 PyHKEY_Type.tp_doc = PyHKEY_doc;
1799 Py_INCREF(&PyHKEY_Type);
1800 if (PyDict_SetItemString(d, "HKEYType",
1801 (PyObject *)&PyHKEY_Type) != 0)
1802 return;
1803 Py_INCREF(PyExc_WindowsError);
1804 if (PyDict_SetItemString(d, "error",
1805 PyExc_WindowsError) != 0)
1806 return;
1807
1808 /* Add the relevant constants */
1809 ADD_KEY(HKEY_CLASSES_ROOT);
1810 ADD_KEY(HKEY_CURRENT_USER);
1811 ADD_KEY(HKEY_LOCAL_MACHINE);
1812 ADD_KEY(HKEY_USERS);
1813 ADD_KEY(HKEY_PERFORMANCE_DATA);
1814#ifdef HKEY_CURRENT_CONFIG
1815 ADD_KEY(HKEY_CURRENT_CONFIG);
1816#endif
1817#ifdef HKEY_DYN_DATA
1818 ADD_KEY(HKEY_DYN_DATA);
1819#endif
1820 ADD_INT(KEY_QUERY_VALUE);
1821 ADD_INT(KEY_SET_VALUE);
1822 ADD_INT(KEY_CREATE_SUB_KEY);
1823 ADD_INT(KEY_ENUMERATE_SUB_KEYS);
1824 ADD_INT(KEY_NOTIFY);
1825 ADD_INT(KEY_CREATE_LINK);
1826 ADD_INT(KEY_READ);
1827 ADD_INT(KEY_WRITE);
1828 ADD_INT(KEY_EXECUTE);
1829 ADD_INT(KEY_ALL_ACCESS);
1830#ifdef KEY_WOW64_64KEY
1831 ADD_INT(KEY_WOW64_64KEY);
1832#endif
1833#ifdef KEY_WOW64_32KEY
1834 ADD_INT(KEY_WOW64_32KEY);
1835#endif
1836 ADD_INT(REG_OPTION_RESERVED);
1837 ADD_INT(REG_OPTION_NON_VOLATILE);
1838 ADD_INT(REG_OPTION_VOLATILE);
1839 ADD_INT(REG_OPTION_CREATE_LINK);
1840 ADD_INT(REG_OPTION_BACKUP_RESTORE);
1841 ADD_INT(REG_OPTION_OPEN_LINK);
1842 ADD_INT(REG_LEGAL_OPTION);
1843 ADD_INT(REG_CREATED_NEW_KEY);
1844 ADD_INT(REG_OPENED_EXISTING_KEY);
1845 ADD_INT(REG_WHOLE_HIVE_VOLATILE);
1846 ADD_INT(REG_REFRESH_HIVE);
1847 ADD_INT(REG_NO_LAZY_FLUSH);
1848 ADD_INT(REG_NOTIFY_CHANGE_NAME);
1849 ADD_INT(REG_NOTIFY_CHANGE_ATTRIBUTES);
1850 ADD_INT(REG_NOTIFY_CHANGE_LAST_SET);
1851 ADD_INT(REG_NOTIFY_CHANGE_SECURITY);
1852 ADD_INT(REG_LEGAL_CHANGE_FILTER);
1853 ADD_INT(REG_NONE);
1854 ADD_INT(REG_SZ);
1855 ADD_INT(REG_EXPAND_SZ);
1856 ADD_INT(REG_BINARY);
1857 ADD_INT(REG_DWORD);
1858 ADD_INT(REG_DWORD_LITTLE_ENDIAN);
1859 ADD_INT(REG_DWORD_BIG_ENDIAN);
1860 ADD_INT(REG_LINK);
1861 ADD_INT(REG_MULTI_SZ);
1862 ADD_INT(REG_RESOURCE_LIST);
1863 ADD_INT(REG_FULL_RESOURCE_DESCRIPTOR);
1864 ADD_INT(REG_RESOURCE_REQUIREMENTS_LIST);
1865}
1866
Note: See TracBrowser for help on using the repository browser.