blob: 563a3ebcf59aabef882a150f84a4151a225d05d9 [file] [log] [blame]
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001/*
Georg Brandl38feaf02008-05-25 07:45:51 +00002 winreg.c
Guido van Rossum9f3712c2000-03-28 20:37:15 +00003
4 Windows Registry access module for Python.
5
6 * Simple registry access written by Mark Hammond in win32api
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007 module circa 1995.
Guido van Rossum9f3712c2000-03-28 20:37:15 +00008 * Bill Tutt expanded the support significantly not long after.
9 * Numerous other people have submitted patches since then.
10 * Ripped from win32api module 03-Feb-2000 by Mark Hammond, and
11 basic Unicode support added.
12
13*/
14
Guido van Rossum9f3712c2000-03-28 20:37:15 +000015#include "Python.h"
16#include "structmember.h"
Guido van Rossume7ba4952007-06-06 23:52:48 +000017#include "windows.h"
Guido van Rossum9f3712c2000-03-28 20:37:15 +000018
19static BOOL PyHKEY_AsHKEY(PyObject *ob, HKEY *pRes, BOOL bNoneOK);
20static PyObject *PyHKEY_FromHKEY(HKEY h);
21static BOOL PyHKEY_Close(PyObject *obHandle);
22
23static char errNotAHandle[] = "Object is not a handle";
24
25/* The win32api module reports the function name that failed,
26 but this concept is not in the Python core.
27 Hopefully it will one day, and in the meantime I dont
28 want to lose this info...
29*/
30#define PyErr_SetFromWindowsErrWithFunction(rc, fnname) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000031 PyErr_SetFromWindowsErr(rc)
Guido van Rossum9f3712c2000-03-28 20:37:15 +000032
33/* Forward declares */
34
35/* Doc strings */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000036PyDoc_STRVAR(module_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +000037"This module provides access to the Windows registry API.\n"
38"\n"
39"Functions:\n"
40"\n"
41"CloseKey() - Closes a registry key.\n"
42"ConnectRegistry() - Establishes a connection to a predefined registry handle\n"
43" on another computer.\n"
44"CreateKey() - Creates the specified key, or opens it if it already exists.\n"
45"DeleteKey() - Deletes the specified key.\n"
46"DeleteValue() - Removes a named value from the specified registry key.\n"
47"EnumKey() - Enumerates subkeys of the specified open registry key.\n"
48"EnumValue() - Enumerates values of the specified open registry key.\n"
Christian Heimes2380ac72008-01-09 00:17:24 +000049"ExpandEnvironmentStrings() - Expand the env strings in a REG_EXPAND_SZ string.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +000050"FlushKey() - Writes all the attributes of the specified key to the registry.\n"
51"LoadKey() - Creates a subkey under HKEY_USER or HKEY_LOCAL_MACHINE and stores\n"
52" registration information from a specified file into that subkey.\n"
Brian Curtine9aeca72012-10-29 18:16:39 -050053"OpenKey() - Opens the specified key.\n"
54"OpenKeyEx() - Alias of OpenKey().\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +000055"QueryValue() - Retrieves the value associated with the unnamed value for a\n"
56" specified key in the registry.\n"
57"QueryValueEx() - Retrieves the type and data for a specified value name\n"
58" associated with an open registry key.\n"
59"QueryInfoKey() - Returns information about the specified key.\n"
60"SaveKey() - Saves the specified key, and all its subkeys a file.\n"
61"SetValue() - Associates a value with a specified key.\n"
62"SetValueEx() - Stores data in the value field of an open registry key.\n"
63"\n"
64"Special objects:\n"
65"\n"
66"HKEYType -- type object for HKEY objects\n"
67"error -- exception raised for Win32 errors\n"
68"\n"
69"Integer constants:\n"
70"Many constants are defined - see the documentation for each function\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000071"to see what constants are used, and where.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +000072
73
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000074PyDoc_STRVAR(CloseKey_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -050075"CloseKey(hkey)\n"
76"Closes a previously opened registry key.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +000077"\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"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000081"closed when the hkey object is destroyed by Python.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +000082
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000083PyDoc_STRVAR(ConnectRegistry_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -050084"ConnectRegistry(computer_name, key) -> key\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +000085"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"
Brian Curtine9aeca72012-10-29 18:16:39 -050088" If None, the local computer is used.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +000089"key is the predefined handle to connect to.\n"
90"\n"
91"The return value is the handle of the opened key.\n"
Andrew Svetlov616f8032012-10-31 19:29:33 +020092"If the function fails, an OSError exception is raised.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +000093
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000094PyDoc_STRVAR(CreateKey_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -050095"CreateKey(key, sub_key) -> key\n"
96"Creates or opens the specified key.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +000097"\n"
Brian Curtine9aeca72012-10-29 18:16:39 -050098"key is an already open key, or one of the predefined HKEY_* constants.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +000099"sub_key is a string that names the key this method opens or creates.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000100"\n"
Brian Curtine9aeca72012-10-29 18:16:39 -0500101"If key is one of the predefined keys, sub_key may be None. In that case,\n"
102"the handle returned is the same key handle passed in to the function.\n"
103"\n"
104"If the key already exists, this function opens the existing key.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000105"\n"
106"The return value is the handle of the opened key.\n"
Andrew Svetlov616f8032012-10-31 19:29:33 +0200107"If the function fails, an OSError exception is raised.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000108
Brian Curtin3035c392010-04-21 23:56:21 +0000109PyDoc_STRVAR(CreateKeyEx_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500110"CreateKeyEx(key, sub_key, reserved=0, access=KEY_WRITE) -> key\n"
111"Creates or opens the specified key.\n"
Brian Curtin3035c392010-04-21 23:56:21 +0000112"\n"
113"key is an already open key, or one of the predefined HKEY_* constants\n"
114"sub_key is a string that names the key this method opens or creates.\n"
Brian Curtine9aeca72012-10-29 18:16:39 -0500115"reserved is a reserved integer, and must be zero. Default is zero.\n"
116"access is an integer that specifies an access mask that describes the \n"
117" desired security access for the key. Default is KEY_WRITE.\n"
118"\n"
119"If key is one of the predefined keys, sub_key may be None. In that case,\n"
120"the handle returned is the same key handle passed in to the function.\n"
Brian Curtin3035c392010-04-21 23:56:21 +0000121"\n"
122"If the key already exists, this function opens the existing key\n"
123"\n"
124"The return value is the handle of the opened key.\n"
Andrew Svetlov616f8032012-10-31 19:29:33 +0200125"If the function fails, an OSError exception is raised.");
Brian Curtin3035c392010-04-21 23:56:21 +0000126
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000127PyDoc_STRVAR(DeleteKey_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500128"DeleteKey(key, sub_key)\n"
129"Deletes the specified key.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000130"\n"
131"key is an already open key, or any one of the predefined HKEY_* constants.\n"
Brian Curtine9aeca72012-10-29 18:16:39 -0500132"sub_key is a string that must be a subkey of the key identified by the key\n"
133" parameter. This value must not be None, and the key may not have\n"
134" subkeys.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000135"\n"
136"This method can not delete keys with subkeys.\n"
137"\n"
Brian Curtine9aeca72012-10-29 18:16:39 -0500138"If the function succeeds, the entire key, including all of its values,\n"
Andrew Svetlov616f8032012-10-31 19:29:33 +0200139"is removed. If the function fails, an OSError exception is raised.");
Brian Curtin3035c392010-04-21 23:56:21 +0000140
141PyDoc_STRVAR(DeleteKeyEx_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500142"DeleteKeyEx(key, sub_key, access=KEY_WOW64_64KEY, reserved=0)\n"
143"Deletes the specified key (64-bit OS only).\n"
Brian Curtin3035c392010-04-21 23:56:21 +0000144"\n"
145"key is an already open key, or any one of the predefined HKEY_* constants.\n"
Brian Curtine9aeca72012-10-29 18:16:39 -0500146"sub_key is a string that must be a subkey of the key identified by the key\n"
147" parameter. This value must not be None, and the key may not have\n"
148" subkeys.\n"
149"reserved is a reserved integer, and must be zero. Default is zero.\n"
150"access is an integer that specifies an access mask that describes the \n"
151" desired security access for the key. Default is KEY_WOW64_64KEY.\n"
Brian Curtin3035c392010-04-21 23:56:21 +0000152"\n"
153"This method can not delete keys with subkeys.\n"
154"\n"
Brian Curtine9aeca72012-10-29 18:16:39 -0500155"If the function succeeds, the entire key, including all of its values,\n"
Andrew Svetlov616f8032012-10-31 19:29:33 +0200156"is removed. If the function fails, an OSError exception is raised.\n"
Brian Curtin3035c392010-04-21 23:56:21 +0000157"On unsupported Windows versions, NotImplementedError is raised.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000158
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000159PyDoc_STRVAR(DeleteValue_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500160"DeleteValue(key, value)\n"
161"Removes a named value from a registry key.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000162"\n"
163"key is an already open key, or any one of the predefined HKEY_* constants.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000164"value is a string that identifies the value to remove.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000165
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000166PyDoc_STRVAR(EnumKey_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500167"EnumKey(key, index) -> string\n"
168"Enumerates subkeys of an open registry key.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000169"\n"
170"key is an already open key, or any one of the predefined HKEY_* constants.\n"
171"index is an integer that identifies the index of the key to retrieve.\n"
172"\n"
173"The function retrieves the name of one subkey each time it is called.\n"
Andrew Svetlov616f8032012-10-31 19:29:33 +0200174"It is typically called repeatedly until an OSError exception is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000175"raised, indicating no more values are available.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000176
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000177PyDoc_STRVAR(EnumValue_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500178"EnumValue(key, index) -> tuple\n"
179"Enumerates values of an open registry key.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000180"key is an already open key, or any one of the predefined HKEY_* constants.\n"
181"index is an integer that identifies the index of the value to retrieve.\n"
182"\n"
183"The function retrieves the name of one subkey each time it is called.\n"
Andrew Svetlov616f8032012-10-31 19:29:33 +0200184"It is typically called repeatedly, until an OSError exception\n"
Mark Hammondb422f952000-06-09 06:01:47 +0000185"is raised, indicating no more values.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000186"\n"
187"The result is a tuple of 3 items:\n"
188"value_name is a string that identifies the value.\n"
189"value_data is an object that holds the value data, and whose type depends\n"
Brian Curtine9aeca72012-10-29 18:16:39 -0500190" on the underlying registry type.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000191"data_type is an integer that identifies the type of the value data.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000192
Christian Heimes2380ac72008-01-09 00:17:24 +0000193PyDoc_STRVAR(ExpandEnvironmentStrings_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500194"ExpandEnvironmentStrings(string) -> string\n"
195"Expand environment vars.\n");
Christian Heimes2380ac72008-01-09 00:17:24 +0000196
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000197PyDoc_STRVAR(FlushKey_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500198"FlushKey(key)\n"
199"Writes all the attributes of a key to the registry.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000200"\n"
201"key is an already open key, or any one of the predefined HKEY_* constants.\n"
202"\n"
Brian Curtine9aeca72012-10-29 18:16:39 -0500203"It is not necessary to call FlushKey to change a key. Registry changes are\n"
204"flushed to disk by the registry using its lazy flusher. Registry changes are\n"
205"also flushed to disk at system shutdown. Unlike CloseKey(), the FlushKey()\n"
206"method returns only when all the data has been written to the registry.\n"
207"\n"
208"An application should only call FlushKey() if it requires absolute certainty\n"
209"that registry changes are on disk. If you don't know whether a FlushKey()\n"
210"call is required, it probably isn't.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000211
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000212PyDoc_STRVAR(LoadKey_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500213"LoadKey(key, sub_key, file_name)\n"
214"Creates a subkey under the specified key and stores registration information\n"
215"from a specified file into that subkey.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000216"\n"
217"key is an already open key, or any one of the predefined HKEY_* constants.\n"
Brian Curtine9aeca72012-10-29 18:16:39 -0500218"sub_key is a string that identifies the sub_key to load.\n"
219"file_name is the name of the file to load registry data from. This file must\n"
220" have been created with the SaveKey() function. Under the file\n"
221" allocation table (FAT) file system, the filename may not have an\n"
222" extension.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000223"\n"
224"A call to LoadKey() fails if the calling process does not have the\n"
225"SE_RESTORE_PRIVILEGE privilege.\n"
226"\n"
227"If key is a handle returned by ConnectRegistry(), then the path specified\n"
228"in fileName is relative to the remote computer.\n"
229"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000230"The docs imply key must be in the HKEY_USER or HKEY_LOCAL_MACHINE tree");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000231
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000232PyDoc_STRVAR(OpenKey_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500233"OpenKey(key, sub_key, reserved=0, access=KEY_READ) -> key\n"
234"Opens the specified key.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000235"\n"
236"key is an already open key, or any one of the predefined HKEY_* constants.\n"
Brian Curtine9aeca72012-10-29 18:16:39 -0500237"sub_key is a string that identifies the sub_key to open.\n"
238"reserved is a reserved integer, and must be zero. Default is zero.\n"
239"access is an integer that specifies an access mask that describes the desired\n"
240" security access for the key. Default is KEY_READ\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000241"\n"
242"The result is a new handle to the specified key\n"
Andrew Svetlov616f8032012-10-31 19:29:33 +0200243"If the function fails, an OSError exception is raised.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000244
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000245PyDoc_STRVAR(OpenKeyEx_doc, "See OpenKey()");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000246
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000247PyDoc_STRVAR(QueryInfoKey_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500248"QueryInfoKey(key) -> tuple\n"
249"Returns information about a key.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000250"\n"
251"key is an already open key, or any one of the predefined HKEY_* constants.\n"
252"\n"
253"The result is a tuple of 3 items:"
254"An integer that identifies the number of sub keys this key has.\n"
255"An integer that identifies the number of values this key has.\n"
Serhiy Storchaka95949422013-08-27 19:40:23 +0300256"An integer that identifies when the key was last modified (if available)\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000257" as 100's of nanoseconds since Jan 1, 1600.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000258
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000259PyDoc_STRVAR(QueryValue_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500260"QueryValue(key, sub_key) -> string\n"
261"Retrieves the unnamed value for a key.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000262"\n"
263"key is an already open key, or any one of the predefined HKEY_* constants.\n"
Mark Hammondb422f952000-06-09 06:01:47 +0000264"sub_key is a string that holds the name of the subkey with which the value\n"
Brian Curtine9aeca72012-10-29 18:16:39 -0500265" is associated. If this parameter is None or empty, the function\n"
266" retrieves the value set by the SetValue() method for the key\n"
267" identified by key."
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000268"\n"
269"Values in the registry have name, type, and data components. This method\n"
270"retrieves the data for a key's first value that has a NULL name.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000271"But the underlying API call doesn't return the type, Lame Lame Lame, DONT USE THIS!!!");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000272
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000273PyDoc_STRVAR(QueryValueEx_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500274"QueryValueEx(key, value_name) -> (value, type_id)\n"
275"Retrieves the type and data for a specified value name associated with an\n"
276"open registry key.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000277"\n"
278"key is an already open key, or any one of the predefined HKEY_* constants.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000279"value_name is a string indicating the value to query");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000280
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000281PyDoc_STRVAR(SaveKey_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500282"SaveKey(key, file_name)\n"
283"Saves the specified key, and all its subkeys to the specified file.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000284"\n"
285"key is an already open key, or any one of the predefined HKEY_* constants.\n"
Brian Curtine9aeca72012-10-29 18:16:39 -0500286"file_name is the name of the file to save registry data to. This file cannot\n"
287" already exist. If this filename includes an extension, it cannot be\n"
288" used on file allocation table (FAT) file systems by the LoadKey(),\n"
289" ReplaceKey() or RestoreKey() methods.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000290"\n"
Brian Curtine9aeca72012-10-29 18:16:39 -0500291"If key represents a key on a remote computer, the path described by file_name\n"
292"is relative to the remote computer.\n"
293"\n"
294"The caller of this method must possess the SeBackupPrivilege security\n"
295"privilege. This function passes NULL for security_attributes to the API.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000296
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000297PyDoc_STRVAR(SetValue_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500298"SetValue(key, sub_key, type, value)\n"
299"Associates a value with a specified key.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000300"\n"
301"key is an already open key, or any one of the predefined HKEY_* constants.\n"
302"sub_key is a string that names the subkey with which the value is associated.\n"
Brian Curtine9aeca72012-10-29 18:16:39 -0500303"type is an integer that specifies the type of the data. Currently this must\n"
304" be REG_SZ, meaning only strings are supported.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000305"value is a string that specifies the new value.\n"
306"\n"
307"If the key specified by the sub_key parameter does not exist, the SetValue\n"
308"function creates it.\n"
309"\n"
310"Value lengths are limited by available memory. Long values (more than\n"
311"2048 bytes) should be stored as files with the filenames stored in \n"
312"the configuration registry. This helps the registry perform efficiently.\n"
313"\n"
314"The key identified by the key parameter must have been opened with\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000315"KEY_SET_VALUE access.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000316
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000317PyDoc_STRVAR(SetValueEx_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500318"SetValueEx(key, value_name, reserved, type, value)\n"
319"Stores data in the value field of an open registry key.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000320"\n"
321"key is an already open key, or any one of the predefined HKEY_* constants.\n"
Brian Curtine9aeca72012-10-29 18:16:39 -0500322"value_name is a string containing the name of the value to set, or None.\n"
323"reserved can be anything - zero is always passed to the API.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000324"type is an integer that specifies the type of the data. This should be one of:\n"
325" REG_BINARY -- Binary data in any form.\n"
326" REG_DWORD -- A 32-bit number.\n"
327" REG_DWORD_LITTLE_ENDIAN -- A 32-bit number in little-endian format.\n"
328" REG_DWORD_BIG_ENDIAN -- A 32-bit number in big-endian format.\n"
329" REG_EXPAND_SZ -- A null-terminated string that contains unexpanded references\n"
330" to environment variables (for example, %PATH%).\n"
331" REG_LINK -- A Unicode symbolic link.\n"
Mark Hammondb422f952000-06-09 06:01:47 +0000332" REG_MULTI_SZ -- An sequence of null-terminated strings, terminated by\n"
333" two null characters. Note that Python handles this\n"
334" termination automatically.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000335" REG_NONE -- No defined value type.\n"
336" REG_RESOURCE_LIST -- A device-driver resource list.\n"
337" REG_SZ -- A null-terminated string.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000338"value is a string that specifies the new value.\n"
339"\n"
340"This method can also set additional value and type information for the\n"
341"specified key. The key identified by the key parameter must have been\n"
342"opened with KEY_SET_VALUE access.\n"
343"\n"
344"To open the key, use the CreateKeyEx() or OpenKeyEx() methods.\n"
345"\n"
346"Value lengths are limited by available memory. Long values (more than\n"
347"2048 bytes) should be stored as files with the filenames stored in \n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000348"the configuration registry. This helps the registry perform efficiently.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000349
Martin v. Löwisd218dc12008-04-07 03:17:54 +0000350PyDoc_STRVAR(DisableReflectionKey_doc,
Christian Heimes5e696852008-04-09 08:37:03 +0000351"Disables registry reflection for 32-bit processes running on a 64-bit\n"
Martin v. Löwisd218dc12008-04-07 03:17:54 +0000352"Operating System. Will generally raise NotImplemented if executed on\n"
Christian Heimes5e696852008-04-09 08:37:03 +0000353"a 32-bit Operating System.\n"
Brian Curtine9aeca72012-10-29 18:16:39 -0500354"\n"
Martin v. Löwisd218dc12008-04-07 03:17:54 +0000355"If the key is not on the reflection list, the function succeeds but has no effect.\n"
356"Disabling reflection for a key does not affect reflection of any subkeys.");
357
358PyDoc_STRVAR(EnableReflectionKey_doc,
359"Restores registry reflection for the specified disabled key.\n"
Christian Heimes5e696852008-04-09 08:37:03 +0000360"Will generally raise NotImplemented if executed on a 32-bit Operating System.\n"
Martin v. Löwisd218dc12008-04-07 03:17:54 +0000361"Restoring reflection for a key does not affect reflection of any subkeys.");
362
363PyDoc_STRVAR(QueryReflectionKey_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500364"QueryReflectionKey(hkey) -> bool\n"
365"Determines the reflection state for the specified key.\n"
Christian Heimes5e696852008-04-09 08:37:03 +0000366"Will generally raise NotImplemented if executed on a 32-bit Operating System.\n");
Martin v. Löwisd218dc12008-04-07 03:17:54 +0000367
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000368/* PyHKEY docstrings */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000369PyDoc_STRVAR(PyHKEY_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000370"PyHKEY Object - A Python object, representing a win32 registry key.\n"
371"\n"
Mark Hammondb422f952000-06-09 06:01:47 +0000372"This object wraps a Windows HKEY object, automatically closing it when\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000373"the object is destroyed. To guarantee cleanup, you can call either\n"
374"the Close() method on the PyHKEY, or the CloseKey() method.\n"
375"\n"
376"All functions which accept a handle object also accept an integer - \n"
377"however, use of the handle object is encouraged.\n"
378"\n"
379"Functions:\n"
380"Close() - Closes the underlying handle.\n"
381"Detach() - Returns the integer Win32 handle, detaching it from the object\n"
382"\n"
383"Properties:\n"
384"handle - The integer Win32 handle.\n"
385"\n"
386"Operations:\n"
Jack Diederich4dafcc42006-11-28 19:15:13 +0000387"__bool__ - Handles with an open object return true, otherwise false.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000388"__int__ - Converting a handle to an integer returns the Win32 handle.\n"
Mark Dickinson211c6252009-02-01 10:28:51 +0000389"rich comparison - Handle objects are compared using the handle value.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000390
391
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000392PyDoc_STRVAR(PyHKEY_Close_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500393"key.Close()\n"
394"Closes the underlying Windows handle.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000395"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000396"If the handle is already closed, no error is raised.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000397
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000398PyDoc_STRVAR(PyHKEY_Detach_doc,
Brian Curtine9aeca72012-10-29 18:16:39 -0500399"key.Detach() -> int\n"
400"Detaches the Windows handle from the handle object.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000401"\n"
402"The result is the value of the handle before it is detached. If the\n"
403"handle is already detached, this will return zero.\n"
404"\n"
405"After calling this function, the handle is effectively invalidated,\n"
406"but the handle is not closed. You would call this function when you\n"
407"need the underlying win32 handle to exist beyond the lifetime of the\n"
Serhiy Storchaka95949422013-08-27 19:40:23 +0300408"handle object.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000409
410
411/************************************************************************
412
413 The PyHKEY object definition
414
415************************************************************************/
416typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 PyObject_VAR_HEAD
418 HKEY hkey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000419} PyHKEYObject;
420
421#define PyHKEY_Check(op) ((op)->ob_type == &PyHKEY_Type)
422
423static char *failMsg = "bad operand type";
424
425static PyObject *
426PyHKEY_unaryFailureFunc(PyObject *ob)
427{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 PyErr_SetString(PyExc_TypeError, failMsg);
429 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000430}
431static PyObject *
432PyHKEY_binaryFailureFunc(PyObject *ob1, PyObject *ob2)
433{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000434 PyErr_SetString(PyExc_TypeError, failMsg);
435 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000436}
437static PyObject *
438PyHKEY_ternaryFailureFunc(PyObject *ob1, PyObject *ob2, PyObject *ob3)
439{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000440 PyErr_SetString(PyExc_TypeError, failMsg);
441 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000442}
443
444static void
445PyHKEY_deallocFunc(PyObject *ob)
446{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 /* Can not call PyHKEY_Close, as the ob->tp_type
448 has already been cleared, thus causing the type
449 check to fail!
450 */
451 PyHKEYObject *obkey = (PyHKEYObject *)ob;
452 if (obkey->hkey)
453 RegCloseKey((HKEY)obkey->hkey);
454 PyObject_DEL(ob);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000455}
456
457static int
Jack Diederich4dafcc42006-11-28 19:15:13 +0000458PyHKEY_boolFunc(PyObject *ob)
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000459{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 return ((PyHKEYObject *)ob)->hkey != 0;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000461}
462
463static PyObject *
464PyHKEY_intFunc(PyObject *ob)
465{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
467 return PyLong_FromVoidPtr(pyhkey->hkey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000468}
469
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000470static PyObject *
471PyHKEY_strFunc(PyObject *ob)
472{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
474 return PyUnicode_FromFormat("<PyHKEY:%p>", pyhkey->hkey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000475}
476
477static int
478PyHKEY_compareFunc(PyObject *ob1, PyObject *ob2)
479{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 PyHKEYObject *pyhkey1 = (PyHKEYObject *)ob1;
481 PyHKEYObject *pyhkey2 = (PyHKEYObject *)ob2;
482 return pyhkey1 == pyhkey2 ? 0 :
483 (pyhkey1 < pyhkey2 ? -1 : 1);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000484}
485
Antoine Pitroufbb1c612010-10-23 17:37:54 +0000486static Py_hash_t
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000487PyHKEY_hashFunc(PyObject *ob)
488{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 /* Just use the address.
490 XXX - should we use the handle value?
491 */
492 return _Py_HashPointer(ob);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000493}
494
495
496static PyNumberMethods PyHKEY_NumberMethods =
497{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 PyHKEY_binaryFailureFunc, /* nb_add */
499 PyHKEY_binaryFailureFunc, /* nb_subtract */
500 PyHKEY_binaryFailureFunc, /* nb_multiply */
501 PyHKEY_binaryFailureFunc, /* nb_remainder */
502 PyHKEY_binaryFailureFunc, /* nb_divmod */
503 PyHKEY_ternaryFailureFunc, /* nb_power */
504 PyHKEY_unaryFailureFunc, /* nb_negative */
505 PyHKEY_unaryFailureFunc, /* nb_positive */
506 PyHKEY_unaryFailureFunc, /* nb_absolute */
507 PyHKEY_boolFunc, /* nb_bool */
508 PyHKEY_unaryFailureFunc, /* nb_invert */
509 PyHKEY_binaryFailureFunc, /* nb_lshift */
510 PyHKEY_binaryFailureFunc, /* nb_rshift */
511 PyHKEY_binaryFailureFunc, /* nb_and */
512 PyHKEY_binaryFailureFunc, /* nb_xor */
513 PyHKEY_binaryFailureFunc, /* nb_or */
514 PyHKEY_intFunc, /* nb_int */
515 0, /* nb_reserved */
516 PyHKEY_unaryFailureFunc, /* nb_float */
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000517};
518
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000519static PyObject *PyHKEY_CloseMethod(PyObject *self, PyObject *args);
520static PyObject *PyHKEY_DetachMethod(PyObject *self, PyObject *args);
521static PyObject *PyHKEY_Enter(PyObject *self);
522static PyObject *PyHKEY_Exit(PyObject *self, PyObject *args);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000523
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000524static struct PyMethodDef PyHKEY_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 {"Close", PyHKEY_CloseMethod, METH_VARARGS, PyHKEY_Close_doc},
526 {"Detach", PyHKEY_DetachMethod, METH_VARARGS, PyHKEY_Detach_doc},
527 {"__enter__", (PyCFunction)PyHKEY_Enter, METH_NOARGS, NULL},
528 {"__exit__", PyHKEY_Exit, METH_VARARGS, NULL},
529 {NULL}
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000530};
531
532#define OFF(e) offsetof(PyHKEYObject, e)
533static PyMemberDef PyHKEY_memberlist[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 {"handle", T_INT, OFF(hkey), READONLY},
535 {NULL} /* Sentinel */
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000536};
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000537
538/* The type itself */
539PyTypeObject PyHKEY_Type =
540{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 PyVarObject_HEAD_INIT(0, 0) /* fill in type at module init */
542 "PyHKEY",
543 sizeof(PyHKEYObject),
544 0,
545 PyHKEY_deallocFunc, /* tp_dealloc */
546 0, /* tp_print */
547 0, /* tp_getattr */
548 0, /* tp_setattr */
549 0, /* tp_reserved */
550 0, /* tp_repr */
551 &PyHKEY_NumberMethods, /* tp_as_number */
552 0, /* tp_as_sequence */
553 0, /* tp_as_mapping */
554 PyHKEY_hashFunc, /* tp_hash */
555 0, /* tp_call */
556 PyHKEY_strFunc, /* tp_str */
557 0, /* tp_getattro */
558 0, /* tp_setattro */
559 0, /* tp_as_buffer */
560 0, /* tp_flags */
561 PyHKEY_doc, /* tp_doc */
562 0, /*tp_traverse*/
563 0, /*tp_clear*/
564 0, /*tp_richcompare*/
565 0, /*tp_weaklistoffset*/
566 0, /*tp_iter*/
567 0, /*tp_iternext*/
568 PyHKEY_methods, /*tp_methods*/
569 PyHKEY_memberlist, /*tp_members*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000570};
571
572/************************************************************************
573
574 The PyHKEY object methods
575
576************************************************************************/
577static PyObject *
578PyHKEY_CloseMethod(PyObject *self, PyObject *args)
579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 if (!PyArg_ParseTuple(args, ":Close"))
581 return NULL;
582 if (!PyHKEY_Close(self))
583 return NULL;
584 Py_INCREF(Py_None);
585 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000586}
587
588static PyObject *
589PyHKEY_DetachMethod(PyObject *self, PyObject *args)
590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 void* ret;
592 PyHKEYObject *pThis = (PyHKEYObject *)self;
593 if (!PyArg_ParseTuple(args, ":Detach"))
594 return NULL;
595 ret = (void*)pThis->hkey;
596 pThis->hkey = 0;
597 return PyLong_FromVoidPtr(ret);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000598}
599
Christian Heimes2380ac72008-01-09 00:17:24 +0000600static PyObject *
601PyHKEY_Enter(PyObject *self)
602{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 Py_XINCREF(self);
604 return self;
Christian Heimes2380ac72008-01-09 00:17:24 +0000605}
606
607static PyObject *
608PyHKEY_Exit(PyObject *self, PyObject *args)
609{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 if (!PyHKEY_Close(self))
611 return NULL;
612 Py_RETURN_NONE;
Christian Heimes2380ac72008-01-09 00:17:24 +0000613}
614
615
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000616/************************************************************************
617 The public PyHKEY API (well, not public yet :-)
618************************************************************************/
619PyObject *
620PyHKEY_New(HKEY hInit)
621{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 PyHKEYObject *key = PyObject_NEW(PyHKEYObject, &PyHKEY_Type);
623 if (key)
624 key->hkey = hInit;
625 return (PyObject *)key;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000626}
627
628BOOL
629PyHKEY_Close(PyObject *ob_handle)
630{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 LONG rc;
632 PyHKEYObject *key;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 if (!PyHKEY_Check(ob_handle)) {
635 PyErr_SetString(PyExc_TypeError, "bad operand type");
636 return FALSE;
637 }
638 key = (PyHKEYObject *)ob_handle;
639 rc = key->hkey ? RegCloseKey((HKEY)key->hkey) : ERROR_SUCCESS;
640 key->hkey = 0;
641 if (rc != ERROR_SUCCESS)
642 PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
643 return rc == ERROR_SUCCESS;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000644}
645
646BOOL
647PyHKEY_AsHKEY(PyObject *ob, HKEY *pHANDLE, BOOL bNoneOK)
648{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 if (ob == Py_None) {
650 if (!bNoneOK) {
651 PyErr_SetString(
652 PyExc_TypeError,
653 "None is not a valid HKEY in this context");
654 return FALSE;
655 }
656 *pHANDLE = (HKEY)0;
657 }
658 else if (PyHKEY_Check(ob)) {
659 PyHKEYObject *pH = (PyHKEYObject *)ob;
660 *pHANDLE = pH->hkey;
661 }
662 else if (PyLong_Check(ob)) {
663 /* We also support integers */
664 PyErr_Clear();
665 *pHANDLE = (HKEY)PyLong_AsVoidPtr(ob);
666 if (PyErr_Occurred())
667 return FALSE;
668 }
669 else {
670 PyErr_SetString(
671 PyExc_TypeError,
672 "The object is not a PyHKEY object");
673 return FALSE;
674 }
675 return TRUE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000676}
677
678PyObject *
679PyHKEY_FromHKEY(HKEY h)
680{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 PyHKEYObject *op;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 /* Inline PyObject_New */
684 op = (PyHKEYObject *) PyObject_MALLOC(sizeof(PyHKEYObject));
685 if (op == NULL)
686 return PyErr_NoMemory();
687 PyObject_INIT(op, &PyHKEY_Type);
688 op->hkey = h;
689 return (PyObject *)op;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000690}
691
692
693/************************************************************************
694 The module methods
695************************************************************************/
696BOOL
697PyWinObject_CloseHKEY(PyObject *obHandle)
698{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 BOOL ok;
700 if (PyHKEY_Check(obHandle)) {
701 ok = PyHKEY_Close(obHandle);
702 }
Fred Drake25e17262000-06-30 17:48:51 +0000703#if SIZEOF_LONG >= SIZEOF_HKEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 else if (PyLong_Check(obHandle)) {
705 long rc = RegCloseKey((HKEY)PyLong_AsLong(obHandle));
706 ok = (rc == ERROR_SUCCESS);
707 if (!ok)
708 PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
709 }
Fred Drake25e17262000-06-30 17:48:51 +0000710#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 else if (PyLong_Check(obHandle)) {
712 long rc = RegCloseKey((HKEY)PyLong_AsVoidPtr(obHandle));
713 ok = (rc == ERROR_SUCCESS);
714 if (!ok)
715 PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
716 }
Fred Drake25e17262000-06-30 17:48:51 +0000717#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 else {
719 PyErr_SetString(
720 PyExc_TypeError,
721 "A handle must be a HKEY object or an integer");
722 return FALSE;
723 }
724 return ok;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000725}
726
727
728/*
729 Private Helper functions for the registry interfaces
730
731** Note that fixupMultiSZ and countString have both had changes
732** made to support "incorrect strings". The registry specification
733** calls for strings to be terminated with 2 null bytes. It seems
Thomas Wouters7e474022000-07-16 12:04:32 +0000734** some commercial packages install strings which dont conform,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000735** causing this code to fail - however, "regedit" etc still work
736** with these strings (ie only we dont!).
737*/
738static void
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000739fixupMultiSZ(wchar_t **str, wchar_t *data, int len)
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000740{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 wchar_t *P;
742 int i;
743 wchar_t *Q;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 Q = data + len;
746 for (P = data, i = 0; P < Q && *P != '\0'; P++, i++) {
747 str[i] = P;
748 for(; *P != '\0'; P++)
749 ;
750 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000751}
752
753static int
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000754countStrings(wchar_t *data, int len)
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000755{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000756 int strings;
757 wchar_t *P;
758 wchar_t *Q = data + len;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 for (P = data, strings = 0; P < Q && *P != '\0'; P++, strings++)
761 for (; P < Q && *P != '\0'; P++)
762 ;
763 return strings;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000764}
765
766/* Convert PyObject into Registry data.
767 Allocates space as needed. */
768static BOOL
769Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
770{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 Py_ssize_t i,j;
772 switch (typ) {
773 case REG_DWORD:
774 if (value != Py_None && !PyLong_Check(value))
775 return FALSE;
776 *retDataBuf = (BYTE *)PyMem_NEW(DWORD, 1);
777 if (*retDataBuf==NULL){
778 PyErr_NoMemory();
779 return FALSE;
780 }
781 *retDataSize = sizeof(DWORD);
782 if (value == Py_None) {
783 DWORD zero = 0;
784 memcpy(*retDataBuf, &zero, sizeof(DWORD));
785 }
786 else {
Brian Curtin12706f22012-12-27 10:12:45 -0600787 DWORD d = PyLong_AsUnsignedLong(value);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 memcpy(*retDataBuf, &d, sizeof(DWORD));
789 }
790 break;
791 case REG_SZ:
792 case REG_EXPAND_SZ:
793 {
Victor Stinnerbe492442011-11-21 12:43:50 +0100794 if (value != Py_None) {
795 Py_ssize_t len;
796 if (!PyUnicode_Check(value))
797 return FALSE;
798 *retDataBuf = (BYTE*)PyUnicode_AsWideCharString(value, &len);
799 if (*retDataBuf == NULL)
800 return FALSE;
801 *retDataSize = Py_SAFE_DOWNCAST(
802 (len + 1) * sizeof(wchar_t),
803 Py_ssize_t, DWORD);
804 }
805 else {
806 *retDataBuf = (BYTE *)PyMem_NEW(wchar_t, 1);
807 if (*retDataBuf == NULL) {
808 PyErr_NoMemory();
809 return FALSE;
810 }
811 ((wchar_t *)*retDataBuf)[0] = L'\0';
812 *retDataSize = 1 * sizeof(wchar_t);
813 }
814 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 }
816 case REG_MULTI_SZ:
817 {
818 DWORD size = 0;
819 wchar_t *P;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 if (value == Py_None)
822 i = 0;
823 else {
824 if (!PyList_Check(value))
825 return FALSE;
826 i = PyList_Size(value);
827 }
828 for (j = 0; j < i; j++)
829 {
830 PyObject *t;
Victor Stinnerbe492442011-11-21 12:43:50 +0100831 wchar_t *wstr;
832 Py_ssize_t len;
833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 t = PyList_GET_ITEM(value, j);
835 if (!PyUnicode_Check(t))
836 return FALSE;
Victor Stinnerbe492442011-11-21 12:43:50 +0100837 wstr = PyUnicode_AsUnicodeAndSize(t, &len);
838 if (wstr == NULL)
839 return FALSE;
840 size += Py_SAFE_DOWNCAST((len + 1) * sizeof(wchar_t),
Brian Curtinabb33512010-08-17 20:08:40 +0000841 size_t, DWORD);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 *retDataSize = size + 2;
845 *retDataBuf = (BYTE *)PyMem_NEW(char,
846 *retDataSize);
847 if (*retDataBuf==NULL){
848 PyErr_NoMemory();
849 return FALSE;
850 }
851 P = (wchar_t *)*retDataBuf;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 for (j = 0; j < i; j++)
854 {
855 PyObject *t;
Victor Stinnerbe492442011-11-21 12:43:50 +0100856 wchar_t *wstr;
857 Py_ssize_t len;
858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 t = PyList_GET_ITEM(value, j);
Victor Stinnerbe492442011-11-21 12:43:50 +0100860 wstr = PyUnicode_AsUnicodeAndSize(t, &len);
861 if (wstr == NULL)
862 return FALSE;
863 wcscpy(P, wstr);
864 P += (len + 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 }
866 /* And doubly-terminate the list... */
867 *P = '\0';
868 break;
869 }
870 case REG_BINARY:
871 /* ALSO handle ALL unknown data types here. Even if we can't
872 support it natively, we should handle the bits. */
873 default:
874 if (value == Py_None)
875 *retDataSize = 0;
876 else {
877 Py_buffer view;
Neal Norwitz1385b892007-08-26 23:07:13 +0000878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 if (!PyObject_CheckBuffer(value)) {
880 PyErr_Format(PyExc_TypeError,
881 "Objects of type '%s' can not "
882 "be used as binary registry values",
883 value->ob_type->tp_name);
884 return FALSE;
885 }
Neal Norwitz1385b892007-08-26 23:07:13 +0000886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 if (PyObject_GetBuffer(value, &view, PyBUF_SIMPLE) < 0)
888 return FALSE;
Neal Norwitz1385b892007-08-26 23:07:13 +0000889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 *retDataBuf = (BYTE *)PyMem_NEW(char, view.len);
891 if (*retDataBuf==NULL){
892 PyBuffer_Release(&view);
893 PyErr_NoMemory();
894 return FALSE;
895 }
Brian Curtinabb33512010-08-17 20:08:40 +0000896 *retDataSize = Py_SAFE_DOWNCAST(view.len, Py_ssize_t, DWORD);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 memcpy(*retDataBuf, view.buf, view.len);
898 PyBuffer_Release(&view);
899 }
900 break;
901 }
902 return TRUE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000903}
904
905/* Convert Registry data into PyObject*/
906static PyObject *
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000907Reg2Py(BYTE *retDataBuf, DWORD retDataSize, DWORD typ)
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000908{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 PyObject *obData;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000910
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 switch (typ) {
912 case REG_DWORD:
913 if (retDataSize == 0)
Brian Curtin172e4222012-12-27 14:04:42 -0600914 obData = PyLong_FromUnsignedLong(0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 else
Brian Curtin172e4222012-12-27 14:04:42 -0600916 obData = PyLong_FromUnsignedLong(*(int *)retDataBuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 break;
918 case REG_SZ:
919 case REG_EXPAND_SZ:
920 {
921 /* the buffer may or may not have a trailing NULL */
922 wchar_t *data = (wchar_t *)retDataBuf;
923 int len = retDataSize / 2;
924 if (retDataSize && data[len-1] == '\0')
925 retDataSize -= 2;
926 if (retDataSize <= 0)
927 data = L"";
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200928 obData = PyUnicode_FromWideChar(data, retDataSize/2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 break;
930 }
931 case REG_MULTI_SZ:
932 if (retDataSize == 0)
933 obData = PyList_New(0);
934 else
935 {
936 int index = 0;
937 wchar_t *data = (wchar_t *)retDataBuf;
938 int len = retDataSize / 2;
939 int s = countStrings(data, len);
Victor Stinnerb6404912013-07-07 16:21:41 +0200940 wchar_t **str = (wchar_t **)PyMem_Malloc(sizeof(wchar_t *)*s);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 if (str == NULL)
942 return PyErr_NoMemory();
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 fixupMultiSZ(str, data, len);
945 obData = PyList_New(s);
946 if (obData == NULL)
947 return NULL;
948 for (index = 0; index < s; index++)
949 {
950 size_t len = wcslen(str[index]);
951 if (len > INT_MAX) {
952 PyErr_SetString(PyExc_OverflowError,
953 "registry string is too long for a Python string");
954 Py_DECREF(obData);
955 return NULL;
956 }
957 PyList_SetItem(obData,
958 index,
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200959 PyUnicode_FromWideChar(str[index], len));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000960 }
Victor Stinnerb6404912013-07-07 16:21:41 +0200961 PyMem_Free(str);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 break;
964 }
965 case REG_BINARY:
966 /* ALSO handle ALL unknown data types here. Even if we can't
967 support it natively, we should handle the bits. */
968 default:
969 if (retDataSize == 0) {
970 Py_INCREF(Py_None);
971 obData = Py_None;
972 }
973 else
974 obData = PyBytes_FromStringAndSize(
975 (char *)retDataBuf, retDataSize);
976 break;
977 }
978 return obData;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000979}
980
981/* The Python methods */
982
983static PyObject *
984PyCloseKey(PyObject *self, PyObject *args)
985{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 PyObject *obKey;
987 if (!PyArg_ParseTuple(args, "O:CloseKey", &obKey))
988 return NULL;
989 if (!PyHKEY_Close(obKey))
990 return NULL;
991 Py_INCREF(Py_None);
992 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000993}
994
995static PyObject *
996PyConnectRegistry(PyObject *self, PyObject *args)
997{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 HKEY hKey;
999 PyObject *obKey;
1000 wchar_t *szCompName = NULL;
1001 HKEY retKey;
1002 long rc;
1003 if (!PyArg_ParseTuple(args, "ZO:ConnectRegistry", &szCompName, &obKey))
1004 return NULL;
1005 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1006 return NULL;
1007 Py_BEGIN_ALLOW_THREADS
1008 rc = RegConnectRegistryW(szCompName, hKey, &retKey);
1009 Py_END_ALLOW_THREADS
1010 if (rc != ERROR_SUCCESS)
1011 return PyErr_SetFromWindowsErrWithFunction(rc,
1012 "ConnectRegistry");
1013 return PyHKEY_FromHKEY(retKey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001014}
1015
1016static PyObject *
1017PyCreateKey(PyObject *self, PyObject *args)
1018{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 HKEY hKey;
1020 PyObject *obKey;
1021 wchar_t *subKey;
1022 HKEY retKey;
1023 long rc;
1024 if (!PyArg_ParseTuple(args, "OZ:CreateKey", &obKey, &subKey))
1025 return NULL;
1026 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1027 return NULL;
1028 rc = RegCreateKeyW(hKey, subKey, &retKey);
1029 if (rc != ERROR_SUCCESS)
1030 return PyErr_SetFromWindowsErrWithFunction(rc, "CreateKey");
1031 return PyHKEY_FromHKEY(retKey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001032}
1033
1034static PyObject *
Brian Curtin1771b542010-09-27 17:56:36 +00001035PyCreateKeyEx(PyObject *self, PyObject *args, PyObject *kwargs)
Brian Curtin3035c392010-04-21 23:56:21 +00001036{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001037 HKEY hKey;
Brian Curtin1771b542010-09-27 17:56:36 +00001038 PyObject *key;
1039 wchar_t *sub_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 HKEY retKey;
Brian Curtin1771b542010-09-27 17:56:36 +00001041 int reserved = 0;
1042 REGSAM access = KEY_WRITE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 long rc;
Brian Curtin1771b542010-09-27 17:56:36 +00001044
1045 char *kwlist[] = {"key", "sub_key", "reserved", "access", NULL};
1046
1047 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OZ|ii:CreateKeyEx", kwlist,
1048 &key, &sub_key, &reserved, &access))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 return NULL;
Brian Curtin1771b542010-09-27 17:56:36 +00001050 if (!PyHKEY_AsHKEY(key, &hKey, FALSE))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 return NULL;
Brian Curtin3035c392010-04-21 23:56:21 +00001052
Brian Curtin1771b542010-09-27 17:56:36 +00001053 rc = RegCreateKeyExW(hKey, sub_key, reserved, NULL, (DWORD)NULL,
1054 access, NULL, &retKey, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 if (rc != ERROR_SUCCESS)
1056 return PyErr_SetFromWindowsErrWithFunction(rc, "CreateKeyEx");
1057 return PyHKEY_FromHKEY(retKey);
Brian Curtin3035c392010-04-21 23:56:21 +00001058}
1059
1060static PyObject *
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001061PyDeleteKey(PyObject *self, PyObject *args)
1062{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 HKEY hKey;
1064 PyObject *obKey;
1065 wchar_t *subKey;
1066 long rc;
1067 if (!PyArg_ParseTuple(args, "Ou:DeleteKey", &obKey, &subKey))
1068 return NULL;
1069 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1070 return NULL;
1071 rc = RegDeleteKeyW(hKey, subKey );
1072 if (rc != ERROR_SUCCESS)
1073 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKey");
1074 Py_INCREF(Py_None);
1075 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001076}
1077
1078static PyObject *
Brian Curtin1771b542010-09-27 17:56:36 +00001079PyDeleteKeyEx(PyObject *self, PyObject *args, PyObject *kwargs)
Brian Curtin3035c392010-04-21 23:56:21 +00001080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 HKEY hKey;
Brian Curtin1771b542010-09-27 17:56:36 +00001082 PyObject *key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 HMODULE hMod;
1084 typedef LONG (WINAPI *RDKEFunc)(HKEY, const wchar_t*, REGSAM, int);
1085 RDKEFunc pfn = NULL;
Brian Curtin1771b542010-09-27 17:56:36 +00001086 wchar_t *sub_key;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 long rc;
Brian Curtin1771b542010-09-27 17:56:36 +00001088 int reserved = 0;
1089 REGSAM access = KEY_WOW64_64KEY;
Brian Curtin3035c392010-04-21 23:56:21 +00001090
Brian Curtin1771b542010-09-27 17:56:36 +00001091 char *kwlist[] = {"key", "sub_key", "access", "reserved", NULL};
1092 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "Ou|ii:DeleteKeyEx", kwlist,
1093 &key, &sub_key, &access, &reserved))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 return NULL;
Brian Curtin1771b542010-09-27 17:56:36 +00001095 if (!PyHKEY_AsHKEY(key, &hKey, FALSE))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 return NULL;
Brian Curtin3035c392010-04-21 23:56:21 +00001097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 /* Only available on 64bit platforms, so we must load it
1099 dynamically. */
Martin v. Löwis50590f12012-01-14 17:54:09 +01001100 hMod = GetModuleHandleW(L"advapi32.dll");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 if (hMod)
1102 pfn = (RDKEFunc)GetProcAddress(hMod,
1103 "RegDeleteKeyExW");
1104 if (!pfn) {
1105 PyErr_SetString(PyExc_NotImplementedError,
1106 "not implemented on this platform");
1107 return NULL;
1108 }
1109 Py_BEGIN_ALLOW_THREADS
Brian Curtin1771b542010-09-27 17:56:36 +00001110 rc = (*pfn)(hKey, sub_key, access, reserved);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 Py_END_ALLOW_THREADS
Brian Curtin3035c392010-04-21 23:56:21 +00001112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 if (rc != ERROR_SUCCESS)
1114 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKeyEx");
1115 Py_INCREF(Py_None);
1116 return Py_None;
Brian Curtin3035c392010-04-21 23:56:21 +00001117}
1118
1119static PyObject *
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001120PyDeleteValue(PyObject *self, PyObject *args)
1121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 HKEY hKey;
1123 PyObject *obKey;
1124 wchar_t *subKey;
1125 long rc;
1126 if (!PyArg_ParseTuple(args, "OZ:DeleteValue", &obKey, &subKey))
1127 return NULL;
1128 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1129 return NULL;
1130 Py_BEGIN_ALLOW_THREADS
1131 rc = RegDeleteValueW(hKey, subKey);
1132 Py_END_ALLOW_THREADS
1133 if (rc !=ERROR_SUCCESS)
1134 return PyErr_SetFromWindowsErrWithFunction(rc,
1135 "RegDeleteValue");
1136 Py_INCREF(Py_None);
1137 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001138}
1139
1140static PyObject *
1141PyEnumKey(PyObject *self, PyObject *args)
1142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 HKEY hKey;
1144 PyObject *obKey;
1145 int index;
1146 long rc;
1147 PyObject *retStr;
Brian Curtin60853212010-05-26 17:43:50 +00001148
1149 /* The Windows docs claim that the max key name length is 255
1150 * characters, plus a terminating nul character. However,
1151 * empirical testing demonstrates that it is possible to
1152 * create a 256 character key that is missing the terminating
1153 * nul. RegEnumKeyEx requires a 257 character buffer to
1154 * retrieve such a key name. */
1155 wchar_t tmpbuf[257];
Kristján Valur Jónsson984dfa72012-04-02 15:23:29 +00001156 DWORD len = sizeof(tmpbuf)/sizeof(wchar_t); /* includes NULL terminator */
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 if (!PyArg_ParseTuple(args, "Oi:EnumKey", &obKey, &index))
1159 return NULL;
1160 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1161 return NULL;
Tim Peters313fcd42006-02-19 04:05:39 +00001162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 Py_BEGIN_ALLOW_THREADS
1164 rc = RegEnumKeyExW(hKey, index, tmpbuf, &len, NULL, NULL, NULL, NULL);
1165 Py_END_ALLOW_THREADS
1166 if (rc != ERROR_SUCCESS)
1167 return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKeyEx");
Tim Peters313fcd42006-02-19 04:05:39 +00001168
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001169 retStr = PyUnicode_FromWideChar(tmpbuf, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 return retStr; /* can be NULL */
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001171}
1172
1173static PyObject *
1174PyEnumValue(PyObject *self, PyObject *args)
1175{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 HKEY hKey;
1177 PyObject *obKey;
1178 int index;
1179 long rc;
1180 wchar_t *retValueBuf;
Amaury Forgeot d'Arcf2b69df2010-08-16 22:11:29 +00001181 BYTE *tmpBuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 BYTE *retDataBuf;
Brian Curtin60853212010-05-26 17:43:50 +00001183 DWORD retValueSize, bufValueSize;
1184 DWORD retDataSize, bufDataSize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001185 DWORD typ;
1186 PyObject *obData;
1187 PyObject *retVal;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 if (!PyArg_ParseTuple(args, "Oi:EnumValue", &obKey, &index))
1190 return NULL;
1191 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1192 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 if ((rc = RegQueryInfoKeyW(hKey, NULL, NULL, NULL, NULL, NULL, NULL,
1195 NULL,
1196 &retValueSize, &retDataSize, NULL, NULL))
1197 != ERROR_SUCCESS)
1198 return PyErr_SetFromWindowsErrWithFunction(rc,
1199 "RegQueryInfoKey");
1200 ++retValueSize; /* include null terminators */
1201 ++retDataSize;
Brian Curtin60853212010-05-26 17:43:50 +00001202 bufDataSize = retDataSize;
1203 bufValueSize = retValueSize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 retValueBuf = (wchar_t *)PyMem_Malloc(sizeof(wchar_t) * retValueSize);
1205 if (retValueBuf == NULL)
1206 return PyErr_NoMemory();
1207 retDataBuf = (BYTE *)PyMem_Malloc(retDataSize);
1208 if (retDataBuf == NULL) {
1209 PyMem_Free(retValueBuf);
1210 return PyErr_NoMemory();
1211 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001212
Brian Curtin60853212010-05-26 17:43:50 +00001213 while (1) {
Brian Curtin60853212010-05-26 17:43:50 +00001214 Py_BEGIN_ALLOW_THREADS
1215 rc = RegEnumValueW(hKey,
1216 index,
1217 retValueBuf,
1218 &retValueSize,
1219 NULL,
1220 &typ,
1221 (BYTE *)retDataBuf,
1222 &retDataSize);
1223 Py_END_ALLOW_THREADS
1224
1225 if (rc != ERROR_MORE_DATA)
1226 break;
1227
1228 bufDataSize *= 2;
Amaury Forgeot d'Arcf2b69df2010-08-16 22:11:29 +00001229 tmpBuf = (BYTE *)PyMem_Realloc(retDataBuf, bufDataSize);
Brian Curtin9b7e2d12010-06-08 20:57:52 +00001230 if (tmpBuf == NULL) {
Brian Curtin60853212010-05-26 17:43:50 +00001231 PyErr_NoMemory();
1232 retVal = NULL;
1233 goto fail;
1234 }
Brian Curtin9b7e2d12010-06-08 20:57:52 +00001235 retDataBuf = tmpBuf;
Brian Curtin60853212010-05-26 17:43:50 +00001236 retDataSize = bufDataSize;
1237 retValueSize = bufValueSize;
1238 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 if (rc != ERROR_SUCCESS) {
1241 retVal = PyErr_SetFromWindowsErrWithFunction(rc,
1242 "PyRegEnumValue");
1243 goto fail;
1244 }
1245 obData = Reg2Py(retDataBuf, retDataSize, typ);
1246 if (obData == NULL) {
1247 retVal = NULL;
1248 goto fail;
1249 }
1250 retVal = Py_BuildValue("uOi", retValueBuf, obData, typ);
1251 Py_DECREF(obData);
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001252 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 PyMem_Free(retValueBuf);
1254 PyMem_Free(retDataBuf);
1255 return retVal;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001256}
1257
1258static PyObject *
Christian Heimes2380ac72008-01-09 00:17:24 +00001259PyExpandEnvironmentStrings(PyObject *self, PyObject *args)
1260{
Victor Stinner9d3b93b2011-11-22 02:27:30 +01001261 wchar_t *retValue = NULL;
1262 wchar_t *src;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 DWORD retValueSize;
1264 DWORD rc;
1265 PyObject *o;
Christian Heimes2380ac72008-01-09 00:17:24 +00001266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 if (!PyArg_ParseTuple(args, "u:ExpandEnvironmentStrings", &src))
1268 return NULL;
Christian Heimes2380ac72008-01-09 00:17:24 +00001269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 retValueSize = ExpandEnvironmentStringsW(src, retValue, 0);
1271 if (retValueSize == 0) {
1272 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1273 "ExpandEnvironmentStrings");
1274 }
Victor Stinner9d3b93b2011-11-22 02:27:30 +01001275 retValue = (wchar_t *)PyMem_Malloc(retValueSize * sizeof(wchar_t));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 if (retValue == NULL) {
1277 return PyErr_NoMemory();
1278 }
Christian Heimes2380ac72008-01-09 00:17:24 +00001279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 rc = ExpandEnvironmentStringsW(src, retValue, retValueSize);
1281 if (rc == 0) {
1282 PyMem_Free(retValue);
1283 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1284 "ExpandEnvironmentStrings");
1285 }
Victor Stinner9d3b93b2011-11-22 02:27:30 +01001286 o = PyUnicode_FromWideChar(retValue, wcslen(retValue));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 PyMem_Free(retValue);
1288 return o;
Christian Heimes2380ac72008-01-09 00:17:24 +00001289}
1290
1291static PyObject *
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001292PyFlushKey(PyObject *self, PyObject *args)
1293{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 HKEY hKey;
1295 PyObject *obKey;
1296 long rc;
1297 if (!PyArg_ParseTuple(args, "O:FlushKey", &obKey))
1298 return NULL;
1299 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1300 return NULL;
1301 Py_BEGIN_ALLOW_THREADS
1302 rc = RegFlushKey(hKey);
1303 Py_END_ALLOW_THREADS
1304 if (rc != ERROR_SUCCESS)
1305 return PyErr_SetFromWindowsErrWithFunction(rc, "RegFlushKey");
1306 Py_INCREF(Py_None);
1307 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001308}
1309static PyObject *
1310PyLoadKey(PyObject *self, PyObject *args)
1311{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 HKEY hKey;
1313 PyObject *obKey;
1314 wchar_t *subKey;
1315 wchar_t *fileName;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 long rc;
1318 if (!PyArg_ParseTuple(args, "Ouu:LoadKey", &obKey, &subKey, &fileName))
1319 return NULL;
1320 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1321 return NULL;
1322 Py_BEGIN_ALLOW_THREADS
1323 rc = RegLoadKeyW(hKey, subKey, fileName );
1324 Py_END_ALLOW_THREADS
1325 if (rc != ERROR_SUCCESS)
1326 return PyErr_SetFromWindowsErrWithFunction(rc, "RegLoadKey");
1327 Py_INCREF(Py_None);
1328 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001329}
1330
1331static PyObject *
Brian Curtin1771b542010-09-27 17:56:36 +00001332PyOpenKey(PyObject *self, PyObject *args, PyObject *kwargs)
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 HKEY hKey;
Brian Curtin1771b542010-09-27 17:56:36 +00001335 PyObject *key;
1336 wchar_t *sub_key;
1337 int reserved = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 HKEY retKey;
1339 long rc;
Brian Curtin1771b542010-09-27 17:56:36 +00001340 REGSAM access = KEY_READ;
1341
1342 char *kwlist[] = {"key", "sub_key", "reserved", "access", NULL};
1343
1344 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OZ|ii:OpenKey", kwlist,
1345 &key, &sub_key, &reserved, &access))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 return NULL;
Brian Curtin1771b542010-09-27 17:56:36 +00001347 if (!PyHKEY_AsHKEY(key, &hKey, FALSE))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 Py_BEGIN_ALLOW_THREADS
Brian Curtin1771b542010-09-27 17:56:36 +00001351 rc = RegOpenKeyExW(hKey, sub_key, reserved, access, &retKey);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001352 Py_END_ALLOW_THREADS
1353 if (rc != ERROR_SUCCESS)
1354 return PyErr_SetFromWindowsErrWithFunction(rc, "RegOpenKeyEx");
1355 return PyHKEY_FromHKEY(retKey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001356}
1357
1358
1359static PyObject *
1360PyQueryInfoKey(PyObject *self, PyObject *args)
1361{
1362 HKEY hKey;
1363 PyObject *obKey;
1364 long rc;
1365 DWORD nSubKeys, nValues;
1366 FILETIME ft;
1367 LARGE_INTEGER li;
1368 PyObject *l;
1369 PyObject *ret;
1370 if (!PyArg_ParseTuple(args, "O:QueryInfoKey", &obKey))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001371 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001372 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001373 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001374 if ((rc = RegQueryInfoKey(hKey, NULL, NULL, 0, &nSubKeys, NULL, NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 &nValues, NULL, NULL, NULL, &ft))
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001376 != ERROR_SUCCESS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001377 return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryInfoKey");
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001378 li.LowPart = ft.dwLowDateTime;
1379 li.HighPart = ft.dwHighDateTime;
1380 l = PyLong_FromLongLong(li.QuadPart);
1381 if (l == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001383 ret = Py_BuildValue("iiO", nSubKeys, nValues, l);
1384 Py_DECREF(l);
1385 return ret;
1386}
1387
1388static PyObject *
1389PyQueryValue(PyObject *self, PyObject *args)
1390{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 HKEY hKey;
1392 PyObject *obKey;
1393 wchar_t *subKey;
1394 long rc;
1395 PyObject *retStr;
1396 wchar_t *retBuf;
Brian Curtin60853212010-05-26 17:43:50 +00001397 DWORD bufSize = 0;
1398 DWORD retSize = 0;
1399 wchar_t *tmp;
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 if (!PyArg_ParseTuple(args, "OZ:QueryValue", &obKey, &subKey))
1402 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1405 return NULL;
Brian Curtin60853212010-05-26 17:43:50 +00001406
1407 rc = RegQueryValueW(hKey, subKey, NULL, &retSize);
1408 if (rc == ERROR_MORE_DATA)
1409 retSize = 256;
1410 else if (rc != ERROR_SUCCESS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 return PyErr_SetFromWindowsErrWithFunction(rc,
1412 "RegQueryValue");
Brian Curtin60853212010-05-26 17:43:50 +00001413
1414 bufSize = retSize;
1415 retBuf = (wchar_t *) PyMem_Malloc(bufSize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 if (retBuf == NULL)
1417 return PyErr_NoMemory();
Guido van Rossuma8c360e2007-07-17 20:50:43 +00001418
Brian Curtin60853212010-05-26 17:43:50 +00001419 while (1) {
1420 retSize = bufSize;
1421 rc = RegQueryValueW(hKey, subKey, retBuf, &retSize);
1422 if (rc != ERROR_MORE_DATA)
1423 break;
1424
1425 bufSize *= 2;
1426 tmp = (wchar_t *) PyMem_Realloc(retBuf, bufSize);
1427 if (tmp == NULL) {
1428 PyMem_Free(retBuf);
1429 return PyErr_NoMemory();
1430 }
1431 retBuf = tmp;
1432 }
1433
1434 if (rc != ERROR_SUCCESS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435 PyMem_Free(retBuf);
1436 return PyErr_SetFromWindowsErrWithFunction(rc,
1437 "RegQueryValue");
1438 }
Guido van Rossuma8c360e2007-07-17 20:50:43 +00001439
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02001440 retStr = PyUnicode_FromWideChar(retBuf, wcslen(retBuf));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 PyMem_Free(retBuf);
1442 return retStr;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001443}
1444
1445static PyObject *
1446PyQueryValueEx(PyObject *self, PyObject *args)
1447{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 HKEY hKey;
1449 PyObject *obKey;
1450 wchar_t *valueName;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 long rc;
Brian Curtin60853212010-05-26 17:43:50 +00001453 BYTE *retBuf, *tmp;
1454 DWORD bufSize = 0, retSize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 DWORD typ;
1456 PyObject *obData;
1457 PyObject *result;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 if (!PyArg_ParseTuple(args, "OZ:QueryValueEx", &obKey, &valueName))
1460 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1463 return NULL;
Brian Curtin60853212010-05-26 17:43:50 +00001464
1465 rc = RegQueryValueExW(hKey, valueName, NULL, NULL, NULL, &bufSize);
1466 if (rc == ERROR_MORE_DATA)
1467 bufSize = 256;
1468 else if (rc != ERROR_SUCCESS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 return PyErr_SetFromWindowsErrWithFunction(rc,
1470 "RegQueryValueEx");
1471 retBuf = (BYTE *)PyMem_Malloc(bufSize);
1472 if (retBuf == NULL)
1473 return PyErr_NoMemory();
Brian Curtin60853212010-05-26 17:43:50 +00001474
1475 while (1) {
1476 retSize = bufSize;
1477 rc = RegQueryValueExW(hKey, valueName, NULL, &typ,
1478 (BYTE *)retBuf, &retSize);
1479 if (rc != ERROR_MORE_DATA)
1480 break;
1481
1482 bufSize *= 2;
1483 tmp = (char *) PyMem_Realloc(retBuf, bufSize);
1484 if (tmp == NULL) {
1485 PyMem_Free(retBuf);
1486 return PyErr_NoMemory();
1487 }
1488 retBuf = tmp;
1489 }
1490
1491 if (rc != ERROR_SUCCESS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 PyMem_Free(retBuf);
1493 return PyErr_SetFromWindowsErrWithFunction(rc,
1494 "RegQueryValueEx");
1495 }
1496 obData = Reg2Py(retBuf, bufSize, typ);
1497 PyMem_Free(retBuf);
1498 if (obData == NULL)
1499 return NULL;
1500 result = Py_BuildValue("Oi", obData, typ);
1501 Py_DECREF(obData);
1502 return result;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001503}
1504
1505
1506static PyObject *
1507PySaveKey(PyObject *self, PyObject *args)
1508{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 HKEY hKey;
1510 PyObject *obKey;
1511 wchar_t *fileName;
1512 LPSECURITY_ATTRIBUTES pSA = NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 long rc;
1515 if (!PyArg_ParseTuple(args, "Ou:SaveKey", &obKey, &fileName))
1516 return NULL;
1517 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1518 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001519/* One day we may get security into the core?
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 if (!PyWinObject_AsSECURITY_ATTRIBUTES(obSA, &pSA, TRUE))
1521 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001522*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 Py_BEGIN_ALLOW_THREADS
1524 rc = RegSaveKeyW(hKey, fileName, pSA );
1525 Py_END_ALLOW_THREADS
1526 if (rc != ERROR_SUCCESS)
1527 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSaveKey");
1528 Py_INCREF(Py_None);
1529 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001530}
1531
1532static PyObject *
1533PySetValue(PyObject *self, PyObject *args)
1534{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 HKEY hKey;
1536 PyObject *obKey;
1537 wchar_t *subKey;
1538 wchar_t *str;
1539 DWORD typ;
1540 DWORD len;
1541 long rc;
1542 if (!PyArg_ParseTuple(args, "OZiu#:SetValue",
1543 &obKey,
1544 &subKey,
1545 &typ,
1546 &str,
1547 &len))
1548 return NULL;
1549 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1550 return NULL;
1551 if (typ != REG_SZ) {
1552 PyErr_SetString(PyExc_TypeError,
1553 "Type must be winreg.REG_SZ");
1554 return NULL;
1555 }
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 Py_BEGIN_ALLOW_THREADS
1558 rc = RegSetValueW(hKey, subKey, REG_SZ, str, len+1);
1559 Py_END_ALLOW_THREADS
1560 if (rc != ERROR_SUCCESS)
1561 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSetValue");
1562 Py_INCREF(Py_None);
1563 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001564}
1565
1566static PyObject *
1567PySetValueEx(PyObject *self, PyObject *args)
1568{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 HKEY hKey;
1570 PyObject *obKey;
Victor Stinner9d3b93b2011-11-22 02:27:30 +01001571 wchar_t *valueName;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 PyObject *obRes;
1573 PyObject *value;
1574 BYTE *data;
1575 DWORD len;
1576 DWORD typ;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 LONG rc;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 if (!PyArg_ParseTuple(args, "OZOiO:SetValueEx",
1581 &obKey,
1582 &valueName,
1583 &obRes,
1584 &typ,
1585 &value))
1586 return NULL;
1587 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1588 return NULL;
1589 if (!Py2Reg(value, typ, &data, &len))
1590 {
1591 if (!PyErr_Occurred())
1592 PyErr_SetString(PyExc_ValueError,
1593 "Could not convert the data to the specified type.");
1594 return NULL;
1595 }
1596 Py_BEGIN_ALLOW_THREADS
1597 rc = RegSetValueExW(hKey, valueName, 0, typ, data, len);
1598 Py_END_ALLOW_THREADS
1599 PyMem_DEL(data);
1600 if (rc != ERROR_SUCCESS)
1601 return PyErr_SetFromWindowsErrWithFunction(rc,
1602 "RegSetValueEx");
1603 Py_INCREF(Py_None);
1604 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001605}
1606
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001607static PyObject *
1608PyDisableReflectionKey(PyObject *self, PyObject *args)
1609{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 HKEY hKey;
1611 PyObject *obKey;
1612 HMODULE hMod;
1613 typedef LONG (WINAPI *RDRKFunc)(HKEY);
1614 RDRKFunc pfn = NULL;
1615 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 if (!PyArg_ParseTuple(args, "O:DisableReflectionKey", &obKey))
1618 return NULL;
1619 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1620 return NULL;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 /* Only available on 64bit platforms, so we must load it
1623 dynamically.*/
Martin v. Löwis50590f12012-01-14 17:54:09 +01001624 hMod = GetModuleHandleW(L"advapi32.dll");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 if (hMod)
1626 pfn = (RDRKFunc)GetProcAddress(hMod,
1627 "RegDisableReflectionKey");
1628 if (!pfn) {
1629 PyErr_SetString(PyExc_NotImplementedError,
1630 "not implemented on this platform");
1631 return NULL;
1632 }
1633 Py_BEGIN_ALLOW_THREADS
1634 rc = (*pfn)(hKey);
1635 Py_END_ALLOW_THREADS
1636 if (rc != ERROR_SUCCESS)
1637 return PyErr_SetFromWindowsErrWithFunction(rc,
1638 "RegDisableReflectionKey");
1639 Py_INCREF(Py_None);
1640 return Py_None;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001641}
1642
1643static PyObject *
1644PyEnableReflectionKey(PyObject *self, PyObject *args)
1645{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 HKEY hKey;
1647 PyObject *obKey;
1648 HMODULE hMod;
1649 typedef LONG (WINAPI *RERKFunc)(HKEY);
1650 RERKFunc pfn = NULL;
1651 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 if (!PyArg_ParseTuple(args, "O:EnableReflectionKey", &obKey))
1654 return NULL;
1655 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1656 return NULL;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 /* Only available on 64bit platforms, so we must load it
1659 dynamically.*/
Martin v. Löwis50590f12012-01-14 17:54:09 +01001660 hMod = GetModuleHandleW(L"advapi32.dll");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001661 if (hMod)
1662 pfn = (RERKFunc)GetProcAddress(hMod,
1663 "RegEnableReflectionKey");
1664 if (!pfn) {
1665 PyErr_SetString(PyExc_NotImplementedError,
1666 "not implemented on this platform");
1667 return NULL;
1668 }
1669 Py_BEGIN_ALLOW_THREADS
1670 rc = (*pfn)(hKey);
1671 Py_END_ALLOW_THREADS
1672 if (rc != ERROR_SUCCESS)
1673 return PyErr_SetFromWindowsErrWithFunction(rc,
1674 "RegEnableReflectionKey");
1675 Py_INCREF(Py_None);
1676 return Py_None;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001677}
1678
1679static PyObject *
1680PyQueryReflectionKey(PyObject *self, PyObject *args)
1681{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 HKEY hKey;
1683 PyObject *obKey;
1684 HMODULE hMod;
1685 typedef LONG (WINAPI *RQRKFunc)(HKEY, BOOL *);
1686 RQRKFunc pfn = NULL;
1687 BOOL result;
1688 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 if (!PyArg_ParseTuple(args, "O:QueryReflectionKey", &obKey))
1691 return NULL;
1692 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1693 return NULL;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 /* Only available on 64bit platforms, so we must load it
1696 dynamically.*/
Martin v. Löwis50590f12012-01-14 17:54:09 +01001697 hMod = GetModuleHandleW(L"advapi32.dll");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 if (hMod)
1699 pfn = (RQRKFunc)GetProcAddress(hMod,
1700 "RegQueryReflectionKey");
1701 if (!pfn) {
1702 PyErr_SetString(PyExc_NotImplementedError,
1703 "not implemented on this platform");
1704 return NULL;
1705 }
1706 Py_BEGIN_ALLOW_THREADS
1707 rc = (*pfn)(hKey, &result);
1708 Py_END_ALLOW_THREADS
1709 if (rc != ERROR_SUCCESS)
1710 return PyErr_SetFromWindowsErrWithFunction(rc,
1711 "RegQueryReflectionKey");
1712 return PyBool_FromLong(result);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001713}
1714
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001715static struct PyMethodDef winreg_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 {"CloseKey", PyCloseKey, METH_VARARGS, CloseKey_doc},
1717 {"ConnectRegistry", PyConnectRegistry, METH_VARARGS, ConnectRegistry_doc},
1718 {"CreateKey", PyCreateKey, METH_VARARGS, CreateKey_doc},
Brian Curtin1771b542010-09-27 17:56:36 +00001719 {"CreateKeyEx", (PyCFunction)PyCreateKeyEx,
1720 METH_VARARGS | METH_KEYWORDS, CreateKeyEx_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 {"DeleteKey", PyDeleteKey, METH_VARARGS, DeleteKey_doc},
Brian Curtin1771b542010-09-27 17:56:36 +00001722 {"DeleteKeyEx", (PyCFunction)PyDeleteKeyEx,
1723 METH_VARARGS | METH_KEYWORDS, DeleteKeyEx_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 {"DeleteValue", PyDeleteValue, METH_VARARGS, DeleteValue_doc},
1725 {"DisableReflectionKey", PyDisableReflectionKey, METH_VARARGS, DisableReflectionKey_doc},
1726 {"EnableReflectionKey", PyEnableReflectionKey, METH_VARARGS, EnableReflectionKey_doc},
1727 {"EnumKey", PyEnumKey, METH_VARARGS, EnumKey_doc},
1728 {"EnumValue", PyEnumValue, METH_VARARGS, EnumValue_doc},
1729 {"ExpandEnvironmentStrings", PyExpandEnvironmentStrings, METH_VARARGS,
1730 ExpandEnvironmentStrings_doc },
1731 {"FlushKey", PyFlushKey, METH_VARARGS, FlushKey_doc},
1732 {"LoadKey", PyLoadKey, METH_VARARGS, LoadKey_doc},
Brian Curtin1771b542010-09-27 17:56:36 +00001733 {"OpenKey", (PyCFunction)PyOpenKey, METH_VARARGS | METH_KEYWORDS,
1734 OpenKey_doc},
1735 {"OpenKeyEx", (PyCFunction)PyOpenKey, METH_VARARGS | METH_KEYWORDS,
1736 OpenKeyEx_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 {"QueryValue", PyQueryValue, METH_VARARGS, QueryValue_doc},
1738 {"QueryValueEx", PyQueryValueEx, METH_VARARGS, QueryValueEx_doc},
1739 {"QueryInfoKey", PyQueryInfoKey, METH_VARARGS, QueryInfoKey_doc},
1740 {"QueryReflectionKey",PyQueryReflectionKey,METH_VARARGS, QueryReflectionKey_doc},
1741 {"SaveKey", PySaveKey, METH_VARARGS, SaveKey_doc},
1742 {"SetValue", PySetValue, METH_VARARGS, SetValue_doc},
1743 {"SetValueEx", PySetValueEx, METH_VARARGS, SetValueEx_doc},
1744 NULL,
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001745};
1746
1747static void
1748insint(PyObject * d, char * name, long value)
1749{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 PyObject *v = PyLong_FromLong(value);
1751 if (!v || PyDict_SetItemString(d, name, v))
1752 PyErr_Clear();
1753 Py_XDECREF(v);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001754}
1755
1756#define ADD_INT(val) insint(d, #val, val)
1757
1758static void
1759inskey(PyObject * d, char * name, HKEY key)
1760{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 PyObject *v = PyLong_FromVoidPtr(key);
1762 if (!v || PyDict_SetItemString(d, name, v))
1763 PyErr_Clear();
1764 Py_XDECREF(v);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001765}
1766
1767#define ADD_KEY(val) inskey(d, #val, val)
1768
Martin v. Löwis1a214512008-06-11 05:26:20 +00001769
1770static struct PyModuleDef winregmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 PyModuleDef_HEAD_INIT,
1772 "winreg",
1773 module_doc,
1774 -1,
1775 winreg_methods,
1776 NULL,
1777 NULL,
1778 NULL,
1779 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001780};
1781
1782PyMODINIT_FUNC PyInit_winreg(void)
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001783{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 PyObject *m, *d;
1785 m = PyModule_Create(&winregmodule);
1786 if (m == NULL)
1787 return NULL;
1788 d = PyModule_GetDict(m);
1789 PyHKEY_Type.tp_doc = PyHKEY_doc;
1790 if (PyType_Ready(&PyHKEY_Type) < 0)
1791 return NULL;
1792 Py_INCREF(&PyHKEY_Type);
1793 if (PyDict_SetItemString(d, "HKEYType",
1794 (PyObject *)&PyHKEY_Type) != 0)
1795 return NULL;
Andrew Svetlov2606a6f2012-12-19 14:33:35 +02001796 Py_INCREF(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 if (PyDict_SetItemString(d, "error",
Andrew Svetlov2606a6f2012-12-19 14:33:35 +02001798 PyExc_OSError) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 /* Add the relevant constants */
1802 ADD_KEY(HKEY_CLASSES_ROOT);
1803 ADD_KEY(HKEY_CURRENT_USER);
1804 ADD_KEY(HKEY_LOCAL_MACHINE);
1805 ADD_KEY(HKEY_USERS);
1806 ADD_KEY(HKEY_PERFORMANCE_DATA);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001807#ifdef HKEY_CURRENT_CONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 ADD_KEY(HKEY_CURRENT_CONFIG);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001809#endif
1810#ifdef HKEY_DYN_DATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 ADD_KEY(HKEY_DYN_DATA);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001812#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 ADD_INT(KEY_QUERY_VALUE);
1814 ADD_INT(KEY_SET_VALUE);
1815 ADD_INT(KEY_CREATE_SUB_KEY);
1816 ADD_INT(KEY_ENUMERATE_SUB_KEYS);
1817 ADD_INT(KEY_NOTIFY);
1818 ADD_INT(KEY_CREATE_LINK);
1819 ADD_INT(KEY_READ);
1820 ADD_INT(KEY_WRITE);
1821 ADD_INT(KEY_EXECUTE);
1822 ADD_INT(KEY_ALL_ACCESS);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001823#ifdef KEY_WOW64_64KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 ADD_INT(KEY_WOW64_64KEY);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001825#endif
1826#ifdef KEY_WOW64_32KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 ADD_INT(KEY_WOW64_32KEY);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001828#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 ADD_INT(REG_OPTION_RESERVED);
1830 ADD_INT(REG_OPTION_NON_VOLATILE);
1831 ADD_INT(REG_OPTION_VOLATILE);
1832 ADD_INT(REG_OPTION_CREATE_LINK);
1833 ADD_INT(REG_OPTION_BACKUP_RESTORE);
1834 ADD_INT(REG_OPTION_OPEN_LINK);
1835 ADD_INT(REG_LEGAL_OPTION);
1836 ADD_INT(REG_CREATED_NEW_KEY);
1837 ADD_INT(REG_OPENED_EXISTING_KEY);
1838 ADD_INT(REG_WHOLE_HIVE_VOLATILE);
1839 ADD_INT(REG_REFRESH_HIVE);
1840 ADD_INT(REG_NO_LAZY_FLUSH);
1841 ADD_INT(REG_NOTIFY_CHANGE_NAME);
1842 ADD_INT(REG_NOTIFY_CHANGE_ATTRIBUTES);
1843 ADD_INT(REG_NOTIFY_CHANGE_LAST_SET);
1844 ADD_INT(REG_NOTIFY_CHANGE_SECURITY);
1845 ADD_INT(REG_LEGAL_CHANGE_FILTER);
1846 ADD_INT(REG_NONE);
1847 ADD_INT(REG_SZ);
1848 ADD_INT(REG_EXPAND_SZ);
1849 ADD_INT(REG_BINARY);
1850 ADD_INT(REG_DWORD);
1851 ADD_INT(REG_DWORD_LITTLE_ENDIAN);
1852 ADD_INT(REG_DWORD_BIG_ENDIAN);
1853 ADD_INT(REG_LINK);
1854 ADD_INT(REG_MULTI_SZ);
1855 ADD_INT(REG_RESOURCE_LIST);
1856 ADD_INT(REG_FULL_RESOURCE_DESCRIPTOR);
1857 ADD_INT(REG_RESOURCE_REQUIREMENTS_LIST);
1858 return m;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001859}
1860
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001861