blob: 5dc5dde1ebb209596de16488c762f941b51a63eb [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"
53"OpenKey() - Alias for <om win32api.RegOpenKeyEx>\n"
54"OpenKeyEx() - Opens the specified key.\n"
55"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,
Guido van Rossum9f3712c2000-03-28 20:37:15 +000075"CloseKey(hkey) - Closes a previously opened registry key.\n"
76"\n"
77"The hkey argument specifies a previously opened key.\n"
78"\n"
79"Note that if the key is not closed using this method, it will be\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000080"closed when the hkey object is destroyed by Python.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +000081
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000082PyDoc_STRVAR(ConnectRegistry_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +000083"key = ConnectRegistry(computer_name, key) - "
84"Establishes a connection to a predefined registry handle on another computer.\n"
85"\n"
86"computer_name is the name of the remote computer, of the form \\\\computername.\n"
87" If None, the local computer is used.\n"
88"key is the predefined handle to connect to.\n"
89"\n"
90"The return value is the handle of the opened key.\n"
Brian Curtin3035c392010-04-21 23:56:21 +000091"If the function fails, a WindowsError exception is raised.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +000092
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000093PyDoc_STRVAR(CreateKey_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +000094"key = CreateKey(key, sub_key) - Creates or opens the specified key.\n"
95"\n"
96"key is an already open key, or one of the predefined HKEY_* constants\n"
97"sub_key is a string that names the key this method opens or creates.\n"
98" If key is one of the predefined keys, sub_key may be None. In that case,\n"
99" the handle returned is the same key handle passed in to the function.\n"
100"\n"
101"If the key already exists, this function opens the existing key\n"
102"\n"
103"The return value is the handle of the opened key.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000104"If the function fails, an exception is raised.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000105
Brian Curtin3035c392010-04-21 23:56:21 +0000106PyDoc_STRVAR(CreateKeyEx_doc,
107"key = CreateKeyEx(key, sub_key, res, sam) - Creates or opens the specified key.\n"
108"\n"
109"key is an already open key, or one of the predefined HKEY_* constants\n"
110"sub_key is a string that names the key this method opens or creates.\n"
111"res is a reserved integer, and must be zero. Default is zero.\n"
112"sam is an integer that specifies an access mask that describes the desired\n"
113" If key is one of the predefined keys, sub_key may be None. In that case,\n"
114" the handle returned is the same key handle passed in to the function.\n"
115"\n"
116"If the key already exists, this function opens the existing key\n"
117"\n"
118"The return value is the handle of the opened key.\n"
119"If the function fails, an exception is raised.");
120
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000121PyDoc_STRVAR(DeleteKey_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000122"DeleteKey(key, sub_key) - Deletes the specified key.\n"
123"\n"
124"key is an already open key, or any one of the predefined HKEY_* constants.\n"
125"sub_key is a string that must be a subkey of the key identified by the key parameter.\n"
126" This value must not be None, and the key may not have subkeys.\n"
127"\n"
128"This method can not delete keys with subkeys.\n"
129"\n"
130"If the method succeeds, the entire key, including all of its values,\n"
Brian Curtin3035c392010-04-21 23:56:21 +0000131"is removed. If the method fails, a WindowsError exception is raised.");
132
133PyDoc_STRVAR(DeleteKeyEx_doc,
134"DeleteKeyEx(key, sub_key, sam, res) - Deletes the specified key.\n"
135"\n"
136"key is an already open key, or any one of the predefined HKEY_* constants.\n"
137"sub_key is a string that must be a subkey of the key identified by the key parameter.\n"
138"res is a reserved integer, and must be zero. Default is zero.\n"
139"sam is an integer that specifies an access mask that describes the desired\n"
140" This value must not be None, and the key may not have subkeys.\n"
141"\n"
142"This method can not delete keys with subkeys.\n"
143"\n"
144"If the method succeeds, the entire key, including all of its values,\n"
145"is removed. If the method fails, a WindowsError exception is raised.\n"
146"On unsupported Windows versions, NotImplementedError is raised.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000147
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000148PyDoc_STRVAR(DeleteValue_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000149"DeleteValue(key, value) - Removes a named value from a registry key.\n"
150"\n"
151"key is an already open key, or any one of the predefined HKEY_* constants.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000152"value is a string that identifies the value to remove.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000153
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000154PyDoc_STRVAR(EnumKey_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000155"string = EnumKey(key, index) - Enumerates subkeys of an open registry key.\n"
156"\n"
157"key is an already open key, or any one of the predefined HKEY_* constants.\n"
158"index is an integer that identifies the index of the key to retrieve.\n"
159"\n"
160"The function retrieves the name of one subkey each time it is called.\n"
Brian Curtin3035c392010-04-21 23:56:21 +0000161"It is typically called repeatedly until a WindowsError exception is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000162"raised, indicating no more values are available.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000163
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000164PyDoc_STRVAR(EnumValue_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000165"tuple = EnumValue(key, index) - Enumerates values of an open registry key.\n"
166"key is an already open key, or any one of the predefined HKEY_* constants.\n"
167"index is an integer that identifies the index of the value to retrieve.\n"
168"\n"
169"The function retrieves the name of one subkey each time it is called.\n"
Brian Curtin3035c392010-04-21 23:56:21 +0000170"It is typically called repeatedly, until a WindowsError exception\n"
Mark Hammondb422f952000-06-09 06:01:47 +0000171"is raised, indicating no more values.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000172"\n"
173"The result is a tuple of 3 items:\n"
174"value_name is a string that identifies the value.\n"
175"value_data is an object that holds the value data, and whose type depends\n"
176" on the underlying registry type.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000177"data_type is an integer that identifies the type of the value data.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000178
Christian Heimes2380ac72008-01-09 00:17:24 +0000179PyDoc_STRVAR(ExpandEnvironmentStrings_doc,
180"string = ExpandEnvironmentStrings(string) - Expand environment vars.\n");
181
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000182PyDoc_STRVAR(FlushKey_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000183"FlushKey(key) - Writes all the attributes of a key to the registry.\n"
184"\n"
185"key is an already open key, or any one of the predefined HKEY_* constants.\n"
186"\n"
187"It is not necessary to call RegFlushKey to change a key.\n"
188"Registry changes are flushed to disk by the registry using its lazy flusher.\n"
189"Registry changes are also flushed to disk at system shutdown.\n"
190"Unlike CloseKey(), the FlushKey() method returns only when all the data has\n"
191"been written to the registry.\n"
192"An application should only call FlushKey() if it requires absolute certainty that registry changes are on disk.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000193"If you don't know whether a FlushKey() call is required, it probably isn't.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000194
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000195PyDoc_STRVAR(LoadKey_doc,
Mark Hammondb422f952000-06-09 06:01:47 +0000196"LoadKey(key, sub_key, file_name) - Creates a subkey under the specified key\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000197"and stores registration information from a specified file into that subkey.\n"
198"\n"
199"key is an already open key, or any one of the predefined HKEY_* constants.\n"
200"sub_key is a string that identifies the sub_key to load\n"
201"file_name is the name of the file to load registry data from.\n"
202" This file must have been created with the SaveKey() function.\n"
203" Under the file allocation table (FAT) file system, the filename may not\n"
204"have an extension.\n"
205"\n"
206"A call to LoadKey() fails if the calling process does not have the\n"
207"SE_RESTORE_PRIVILEGE privilege.\n"
208"\n"
209"If key is a handle returned by ConnectRegistry(), then the path specified\n"
210"in fileName is relative to the remote computer.\n"
211"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000212"The docs imply key must be in the HKEY_USER or HKEY_LOCAL_MACHINE tree");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000213
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000214PyDoc_STRVAR(OpenKey_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000215"key = OpenKey(key, sub_key, res = 0, sam = KEY_READ) - Opens the specified key.\n"
216"\n"
217"key is an already open key, or any one of the predefined HKEY_* constants.\n"
218"sub_key is a string that identifies the sub_key to open\n"
219"res is a reserved integer, and must be zero. Default is zero.\n"
220"sam is an integer that specifies an access mask that describes the desired\n"
221" security access for the key. Default is KEY_READ\n"
222"\n"
223"The result is a new handle to the specified key\n"
Brian Curtin3035c392010-04-21 23:56:21 +0000224"If the function fails, a WindowsError exception is raised.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000225
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000226PyDoc_STRVAR(OpenKeyEx_doc, "See OpenKey()");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000227
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000228PyDoc_STRVAR(QueryInfoKey_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000229"tuple = QueryInfoKey(key) - Returns information about a key.\n"
230"\n"
231"key is an already open key, or any one of the predefined HKEY_* constants.\n"
232"\n"
233"The result is a tuple of 3 items:"
234"An integer that identifies the number of sub keys this key has.\n"
235"An integer that identifies the number of values this key has.\n"
236"A long integer that identifies when the key was last modified (if available)\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000237" as 100's of nanoseconds since Jan 1, 1600.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000238
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000239PyDoc_STRVAR(QueryValue_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000240"string = QueryValue(key, sub_key) - retrieves the unnamed value for a key.\n"
241"\n"
242"key is an already open key, or any one of the predefined HKEY_* constants.\n"
Mark Hammondb422f952000-06-09 06:01:47 +0000243"sub_key is a string that holds the name of the subkey with which the value\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000244" is associated. If this parameter is None or empty, the function retrieves\n"
245" the value set by the SetValue() method for the key identified by key."
246"\n"
247"Values in the registry have name, type, and data components. This method\n"
248"retrieves the data for a key's first value that has a NULL name.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000249"But the underlying API call doesn't return the type, Lame Lame Lame, DONT USE THIS!!!");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000250
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000251PyDoc_STRVAR(QueryValueEx_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000252"value,type_id = QueryValueEx(key, value_name) - Retrieves the type and data for a specified value name associated with an open registry key.\n"
253"\n"
254"key is an already open key, or any one of the predefined HKEY_* constants.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000255"value_name is a string indicating the value to query");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000256
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000257PyDoc_STRVAR(SaveKey_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000258"SaveKey(key, file_name) - Saves the specified key, and all its subkeys to the specified file.\n"
259"\n"
260"key is an already open key, or any one of the predefined HKEY_* constants.\n"
261"file_name is the name of the file to save registry data to.\n"
262" This file cannot already exist. If this filename includes an extension,\n"
263" it cannot be used on file allocation table (FAT) file systems by the\n"
264" LoadKey(), ReplaceKey() or RestoreKey() methods.\n"
265"\n"
266"If key represents a key on a remote computer, the path described by\n"
267"file_name is relative to the remote computer.\n"
268"The caller of this method must possess the SeBackupPrivilege security privilege.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000269"This function passes NULL for security_attributes to the API.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000270
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000271PyDoc_STRVAR(SetValue_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000272"SetValue(key, sub_key, type, value) - Associates a value with a specified key.\n"
273"\n"
274"key is an already open key, or any one of the predefined HKEY_* constants.\n"
275"sub_key is a string that names the subkey with which the value is associated.\n"
276"type is an integer that specifies the type of the data. Currently this\n"
277" must be REG_SZ, meaning only strings are supported.\n"
278"value is a string that specifies the new value.\n"
279"\n"
280"If the key specified by the sub_key parameter does not exist, the SetValue\n"
281"function creates it.\n"
282"\n"
283"Value lengths are limited by available memory. Long values (more than\n"
284"2048 bytes) should be stored as files with the filenames stored in \n"
285"the configuration registry. This helps the registry perform efficiently.\n"
286"\n"
287"The key identified by the key parameter must have been opened with\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000288"KEY_SET_VALUE access.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000289
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000290PyDoc_STRVAR(SetValueEx_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000291"SetValueEx(key, value_name, reserved, type, value) - Stores data in the value field of an open registry key.\n"
292"\n"
293"key is an already open key, or any one of the predefined HKEY_* constants.\n"
Mark Hammondc9083b62003-01-15 23:38:15 +0000294"value_name is a string containing the name of the value to set, or None\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000295"type is an integer that specifies the type of the data. This should be one of:\n"
296" REG_BINARY -- Binary data in any form.\n"
297" REG_DWORD -- A 32-bit number.\n"
298" REG_DWORD_LITTLE_ENDIAN -- A 32-bit number in little-endian format.\n"
299" REG_DWORD_BIG_ENDIAN -- A 32-bit number in big-endian format.\n"
300" REG_EXPAND_SZ -- A null-terminated string that contains unexpanded references\n"
301" to environment variables (for example, %PATH%).\n"
302" REG_LINK -- A Unicode symbolic link.\n"
Mark Hammondb422f952000-06-09 06:01:47 +0000303" REG_MULTI_SZ -- An sequence of null-terminated strings, terminated by\n"
304" two null characters. Note that Python handles this\n"
305" termination automatically.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000306" REG_NONE -- No defined value type.\n"
307" REG_RESOURCE_LIST -- A device-driver resource list.\n"
308" REG_SZ -- A null-terminated string.\n"
309"reserved can be anything - zero is always passed to the API.\n"
310"value is a string that specifies the new value.\n"
311"\n"
312"This method can also set additional value and type information for the\n"
313"specified key. The key identified by the key parameter must have been\n"
314"opened with KEY_SET_VALUE access.\n"
315"\n"
316"To open the key, use the CreateKeyEx() or OpenKeyEx() methods.\n"
317"\n"
318"Value lengths are limited by available memory. Long values (more than\n"
319"2048 bytes) should be stored as files with the filenames stored in \n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000320"the configuration registry. This helps the registry perform efficiently.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000321
Martin v. Löwisd218dc12008-04-07 03:17:54 +0000322PyDoc_STRVAR(DisableReflectionKey_doc,
Christian Heimes5e696852008-04-09 08:37:03 +0000323"Disables registry reflection for 32-bit processes running on a 64-bit\n"
Martin v. Löwisd218dc12008-04-07 03:17:54 +0000324"Operating System. Will generally raise NotImplemented if executed on\n"
Christian Heimes5e696852008-04-09 08:37:03 +0000325"a 32-bit Operating System.\n"
Martin v. Löwisd218dc12008-04-07 03:17:54 +0000326"If the key is not on the reflection list, the function succeeds but has no effect.\n"
327"Disabling reflection for a key does not affect reflection of any subkeys.");
328
329PyDoc_STRVAR(EnableReflectionKey_doc,
330"Restores registry reflection for the specified disabled key.\n"
Christian Heimes5e696852008-04-09 08:37:03 +0000331"Will generally raise NotImplemented if executed on a 32-bit Operating System.\n"
Martin v. Löwisd218dc12008-04-07 03:17:54 +0000332"Restoring reflection for a key does not affect reflection of any subkeys.");
333
334PyDoc_STRVAR(QueryReflectionKey_doc,
335"bool = QueryReflectionKey(hkey) - Determines the reflection state for the specified key.\n"
Christian Heimes5e696852008-04-09 08:37:03 +0000336"Will generally raise NotImplemented if executed on a 32-bit Operating System.\n");
Martin v. Löwisd218dc12008-04-07 03:17:54 +0000337
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000338/* PyHKEY docstrings */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000339PyDoc_STRVAR(PyHKEY_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000340"PyHKEY Object - A Python object, representing a win32 registry key.\n"
341"\n"
Mark Hammondb422f952000-06-09 06:01:47 +0000342"This object wraps a Windows HKEY object, automatically closing it when\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000343"the object is destroyed. To guarantee cleanup, you can call either\n"
344"the Close() method on the PyHKEY, or the CloseKey() method.\n"
345"\n"
346"All functions which accept a handle object also accept an integer - \n"
347"however, use of the handle object is encouraged.\n"
348"\n"
349"Functions:\n"
350"Close() - Closes the underlying handle.\n"
351"Detach() - Returns the integer Win32 handle, detaching it from the object\n"
352"\n"
353"Properties:\n"
354"handle - The integer Win32 handle.\n"
355"\n"
356"Operations:\n"
Jack Diederich4dafcc42006-11-28 19:15:13 +0000357"__bool__ - Handles with an open object return true, otherwise false.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000358"__int__ - Converting a handle to an integer returns the Win32 handle.\n"
Mark Dickinson211c6252009-02-01 10:28:51 +0000359"rich comparison - Handle objects are compared using the handle value.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000360
361
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000362PyDoc_STRVAR(PyHKEY_Close_doc,
Mark Hammondb422f952000-06-09 06:01:47 +0000363"key.Close() - Closes the underlying Windows handle.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000364"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000365"If the handle is already closed, no error is raised.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000366
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000367PyDoc_STRVAR(PyHKEY_Detach_doc,
Mark Hammondb422f952000-06-09 06:01:47 +0000368"int = key.Detach() - Detaches the Windows handle from the handle object.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000369"\n"
370"The result is the value of the handle before it is detached. If the\n"
371"handle is already detached, this will return zero.\n"
372"\n"
373"After calling this function, the handle is effectively invalidated,\n"
374"but the handle is not closed. You would call this function when you\n"
375"need the underlying win32 handle to exist beyond the lifetime of the\n"
Mark Hammondb422f952000-06-09 06:01:47 +0000376"handle object.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000377"On 64 bit windows, the result of this function is a long integer");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000378
379
380/************************************************************************
381
382 The PyHKEY object definition
383
384************************************************************************/
385typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 PyObject_VAR_HEAD
387 HKEY hkey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000388} PyHKEYObject;
389
390#define PyHKEY_Check(op) ((op)->ob_type == &PyHKEY_Type)
391
392static char *failMsg = "bad operand type";
393
394static PyObject *
395PyHKEY_unaryFailureFunc(PyObject *ob)
396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000397 PyErr_SetString(PyExc_TypeError, failMsg);
398 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000399}
400static PyObject *
401PyHKEY_binaryFailureFunc(PyObject *ob1, PyObject *ob2)
402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 PyErr_SetString(PyExc_TypeError, failMsg);
404 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000405}
406static PyObject *
407PyHKEY_ternaryFailureFunc(PyObject *ob1, PyObject *ob2, PyObject *ob3)
408{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409 PyErr_SetString(PyExc_TypeError, failMsg);
410 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000411}
412
413static void
414PyHKEY_deallocFunc(PyObject *ob)
415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 /* Can not call PyHKEY_Close, as the ob->tp_type
417 has already been cleared, thus causing the type
418 check to fail!
419 */
420 PyHKEYObject *obkey = (PyHKEYObject *)ob;
421 if (obkey->hkey)
422 RegCloseKey((HKEY)obkey->hkey);
423 PyObject_DEL(ob);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000424}
425
426static int
Jack Diederich4dafcc42006-11-28 19:15:13 +0000427PyHKEY_boolFunc(PyObject *ob)
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000428{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 return ((PyHKEYObject *)ob)->hkey != 0;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000430}
431
432static PyObject *
433PyHKEY_intFunc(PyObject *ob)
434{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
436 return PyLong_FromVoidPtr(pyhkey->hkey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000437}
438
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000439static PyObject *
440PyHKEY_strFunc(PyObject *ob)
441{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
443 return PyUnicode_FromFormat("<PyHKEY:%p>", pyhkey->hkey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000444}
445
446static int
447PyHKEY_compareFunc(PyObject *ob1, PyObject *ob2)
448{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 PyHKEYObject *pyhkey1 = (PyHKEYObject *)ob1;
450 PyHKEYObject *pyhkey2 = (PyHKEYObject *)ob2;
451 return pyhkey1 == pyhkey2 ? 0 :
452 (pyhkey1 < pyhkey2 ? -1 : 1);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000453}
454
455static long
456PyHKEY_hashFunc(PyObject *ob)
457{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 /* Just use the address.
459 XXX - should we use the handle value?
460 */
461 return _Py_HashPointer(ob);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000462}
463
464
465static PyNumberMethods PyHKEY_NumberMethods =
466{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 PyHKEY_binaryFailureFunc, /* nb_add */
468 PyHKEY_binaryFailureFunc, /* nb_subtract */
469 PyHKEY_binaryFailureFunc, /* nb_multiply */
470 PyHKEY_binaryFailureFunc, /* nb_remainder */
471 PyHKEY_binaryFailureFunc, /* nb_divmod */
472 PyHKEY_ternaryFailureFunc, /* nb_power */
473 PyHKEY_unaryFailureFunc, /* nb_negative */
474 PyHKEY_unaryFailureFunc, /* nb_positive */
475 PyHKEY_unaryFailureFunc, /* nb_absolute */
476 PyHKEY_boolFunc, /* nb_bool */
477 PyHKEY_unaryFailureFunc, /* nb_invert */
478 PyHKEY_binaryFailureFunc, /* nb_lshift */
479 PyHKEY_binaryFailureFunc, /* nb_rshift */
480 PyHKEY_binaryFailureFunc, /* nb_and */
481 PyHKEY_binaryFailureFunc, /* nb_xor */
482 PyHKEY_binaryFailureFunc, /* nb_or */
483 PyHKEY_intFunc, /* nb_int */
484 0, /* nb_reserved */
485 PyHKEY_unaryFailureFunc, /* nb_float */
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000486};
487
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000488static PyObject *PyHKEY_CloseMethod(PyObject *self, PyObject *args);
489static PyObject *PyHKEY_DetachMethod(PyObject *self, PyObject *args);
490static PyObject *PyHKEY_Enter(PyObject *self);
491static PyObject *PyHKEY_Exit(PyObject *self, PyObject *args);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000492
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000493static struct PyMethodDef PyHKEY_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 {"Close", PyHKEY_CloseMethod, METH_VARARGS, PyHKEY_Close_doc},
495 {"Detach", PyHKEY_DetachMethod, METH_VARARGS, PyHKEY_Detach_doc},
496 {"__enter__", (PyCFunction)PyHKEY_Enter, METH_NOARGS, NULL},
497 {"__exit__", PyHKEY_Exit, METH_VARARGS, NULL},
498 {NULL}
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000499};
500
501#define OFF(e) offsetof(PyHKEYObject, e)
502static PyMemberDef PyHKEY_memberlist[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 {"handle", T_INT, OFF(hkey), READONLY},
504 {NULL} /* Sentinel */
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000505};
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000506
507/* The type itself */
508PyTypeObject PyHKEY_Type =
509{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 PyVarObject_HEAD_INIT(0, 0) /* fill in type at module init */
511 "PyHKEY",
512 sizeof(PyHKEYObject),
513 0,
514 PyHKEY_deallocFunc, /* tp_dealloc */
515 0, /* tp_print */
516 0, /* tp_getattr */
517 0, /* tp_setattr */
518 0, /* tp_reserved */
519 0, /* tp_repr */
520 &PyHKEY_NumberMethods, /* tp_as_number */
521 0, /* tp_as_sequence */
522 0, /* tp_as_mapping */
523 PyHKEY_hashFunc, /* tp_hash */
524 0, /* tp_call */
525 PyHKEY_strFunc, /* tp_str */
526 0, /* tp_getattro */
527 0, /* tp_setattro */
528 0, /* tp_as_buffer */
529 0, /* tp_flags */
530 PyHKEY_doc, /* tp_doc */
531 0, /*tp_traverse*/
532 0, /*tp_clear*/
533 0, /*tp_richcompare*/
534 0, /*tp_weaklistoffset*/
535 0, /*tp_iter*/
536 0, /*tp_iternext*/
537 PyHKEY_methods, /*tp_methods*/
538 PyHKEY_memberlist, /*tp_members*/
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000539};
540
541/************************************************************************
542
543 The PyHKEY object methods
544
545************************************************************************/
546static PyObject *
547PyHKEY_CloseMethod(PyObject *self, PyObject *args)
548{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 if (!PyArg_ParseTuple(args, ":Close"))
550 return NULL;
551 if (!PyHKEY_Close(self))
552 return NULL;
553 Py_INCREF(Py_None);
554 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000555}
556
557static PyObject *
558PyHKEY_DetachMethod(PyObject *self, PyObject *args)
559{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 void* ret;
561 PyHKEYObject *pThis = (PyHKEYObject *)self;
562 if (!PyArg_ParseTuple(args, ":Detach"))
563 return NULL;
564 ret = (void*)pThis->hkey;
565 pThis->hkey = 0;
566 return PyLong_FromVoidPtr(ret);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000567}
568
Christian Heimes2380ac72008-01-09 00:17:24 +0000569static PyObject *
570PyHKEY_Enter(PyObject *self)
571{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 Py_XINCREF(self);
573 return self;
Christian Heimes2380ac72008-01-09 00:17:24 +0000574}
575
576static PyObject *
577PyHKEY_Exit(PyObject *self, PyObject *args)
578{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 if (!PyHKEY_Close(self))
580 return NULL;
581 Py_RETURN_NONE;
Christian Heimes2380ac72008-01-09 00:17:24 +0000582}
583
584
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000585/************************************************************************
586 The public PyHKEY API (well, not public yet :-)
587************************************************************************/
588PyObject *
589PyHKEY_New(HKEY hInit)
590{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 PyHKEYObject *key = PyObject_NEW(PyHKEYObject, &PyHKEY_Type);
592 if (key)
593 key->hkey = hInit;
594 return (PyObject *)key;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000595}
596
597BOOL
598PyHKEY_Close(PyObject *ob_handle)
599{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 LONG rc;
601 PyHKEYObject *key;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 if (!PyHKEY_Check(ob_handle)) {
604 PyErr_SetString(PyExc_TypeError, "bad operand type");
605 return FALSE;
606 }
607 key = (PyHKEYObject *)ob_handle;
608 rc = key->hkey ? RegCloseKey((HKEY)key->hkey) : ERROR_SUCCESS;
609 key->hkey = 0;
610 if (rc != ERROR_SUCCESS)
611 PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
612 return rc == ERROR_SUCCESS;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000613}
614
615BOOL
616PyHKEY_AsHKEY(PyObject *ob, HKEY *pHANDLE, BOOL bNoneOK)
617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 if (ob == Py_None) {
619 if (!bNoneOK) {
620 PyErr_SetString(
621 PyExc_TypeError,
622 "None is not a valid HKEY in this context");
623 return FALSE;
624 }
625 *pHANDLE = (HKEY)0;
626 }
627 else if (PyHKEY_Check(ob)) {
628 PyHKEYObject *pH = (PyHKEYObject *)ob;
629 *pHANDLE = pH->hkey;
630 }
631 else if (PyLong_Check(ob)) {
632 /* We also support integers */
633 PyErr_Clear();
634 *pHANDLE = (HKEY)PyLong_AsVoidPtr(ob);
635 if (PyErr_Occurred())
636 return FALSE;
637 }
638 else {
639 PyErr_SetString(
640 PyExc_TypeError,
641 "The object is not a PyHKEY object");
642 return FALSE;
643 }
644 return TRUE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000645}
646
647PyObject *
648PyHKEY_FromHKEY(HKEY h)
649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 PyHKEYObject *op;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 /* Inline PyObject_New */
653 op = (PyHKEYObject *) PyObject_MALLOC(sizeof(PyHKEYObject));
654 if (op == NULL)
655 return PyErr_NoMemory();
656 PyObject_INIT(op, &PyHKEY_Type);
657 op->hkey = h;
658 return (PyObject *)op;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000659}
660
661
662/************************************************************************
663 The module methods
664************************************************************************/
665BOOL
666PyWinObject_CloseHKEY(PyObject *obHandle)
667{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 BOOL ok;
669 if (PyHKEY_Check(obHandle)) {
670 ok = PyHKEY_Close(obHandle);
671 }
Fred Drake25e17262000-06-30 17:48:51 +0000672#if SIZEOF_LONG >= SIZEOF_HKEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 else if (PyLong_Check(obHandle)) {
674 long rc = RegCloseKey((HKEY)PyLong_AsLong(obHandle));
675 ok = (rc == ERROR_SUCCESS);
676 if (!ok)
677 PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
678 }
Fred Drake25e17262000-06-30 17:48:51 +0000679#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 else if (PyLong_Check(obHandle)) {
681 long rc = RegCloseKey((HKEY)PyLong_AsVoidPtr(obHandle));
682 ok = (rc == ERROR_SUCCESS);
683 if (!ok)
684 PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
685 }
Fred Drake25e17262000-06-30 17:48:51 +0000686#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 else {
688 PyErr_SetString(
689 PyExc_TypeError,
690 "A handle must be a HKEY object or an integer");
691 return FALSE;
692 }
693 return ok;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000694}
695
696
697/*
698 Private Helper functions for the registry interfaces
699
700** Note that fixupMultiSZ and countString have both had changes
701** made to support "incorrect strings". The registry specification
702** calls for strings to be terminated with 2 null bytes. It seems
Thomas Wouters7e474022000-07-16 12:04:32 +0000703** some commercial packages install strings which dont conform,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000704** causing this code to fail - however, "regedit" etc still work
705** with these strings (ie only we dont!).
706*/
707static void
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000708fixupMultiSZ(wchar_t **str, wchar_t *data, int len)
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000709{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 wchar_t *P;
711 int i;
712 wchar_t *Q;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000714 Q = data + len;
715 for (P = data, i = 0; P < Q && *P != '\0'; P++, i++) {
716 str[i] = P;
717 for(; *P != '\0'; P++)
718 ;
719 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000720}
721
722static int
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000723countStrings(wchar_t *data, int len)
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000724{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 int strings;
726 wchar_t *P;
727 wchar_t *Q = data + len;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000729 for (P = data, strings = 0; P < Q && *P != '\0'; P++, strings++)
730 for (; P < Q && *P != '\0'; P++)
731 ;
732 return strings;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000733}
734
735/* Convert PyObject into Registry data.
736 Allocates space as needed. */
737static BOOL
738Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 Py_ssize_t i,j;
741 switch (typ) {
742 case REG_DWORD:
743 if (value != Py_None && !PyLong_Check(value))
744 return FALSE;
745 *retDataBuf = (BYTE *)PyMem_NEW(DWORD, 1);
746 if (*retDataBuf==NULL){
747 PyErr_NoMemory();
748 return FALSE;
749 }
750 *retDataSize = sizeof(DWORD);
751 if (value == Py_None) {
752 DWORD zero = 0;
753 memcpy(*retDataBuf, &zero, sizeof(DWORD));
754 }
755 else {
756 DWORD d = PyLong_AsLong(value);
757 memcpy(*retDataBuf, &d, sizeof(DWORD));
758 }
759 break;
760 case REG_SZ:
761 case REG_EXPAND_SZ:
762 {
763 if (value == Py_None)
764 *retDataSize = 1;
765 else {
766 if (!PyUnicode_Check(value))
767 return FALSE;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 *retDataSize = 2 + PyUnicode_GET_DATA_SIZE(value);
770 }
771 *retDataBuf = (BYTE *)PyMem_NEW(DWORD, *retDataSize);
772 if (*retDataBuf==NULL){
773 PyErr_NoMemory();
774 return FALSE;
775 }
776 if (value == Py_None)
777 wcscpy((wchar_t *)*retDataBuf, L"");
778 else
779 wcscpy((wchar_t *)*retDataBuf,
780 PyUnicode_AS_UNICODE(value));
781 break;
782 }
783 case REG_MULTI_SZ:
784 {
785 DWORD size = 0;
786 wchar_t *P;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 if (value == Py_None)
789 i = 0;
790 else {
791 if (!PyList_Check(value))
792 return FALSE;
793 i = PyList_Size(value);
794 }
795 for (j = 0; j < i; j++)
796 {
797 PyObject *t;
798 t = PyList_GET_ITEM(value, j);
799 if (!PyUnicode_Check(t))
800 return FALSE;
801 size += 2 + PyUnicode_GET_DATA_SIZE(t);
802 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 *retDataSize = size + 2;
805 *retDataBuf = (BYTE *)PyMem_NEW(char,
806 *retDataSize);
807 if (*retDataBuf==NULL){
808 PyErr_NoMemory();
809 return FALSE;
810 }
811 P = (wchar_t *)*retDataBuf;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 for (j = 0; j < i; j++)
814 {
815 PyObject *t;
816 t = PyList_GET_ITEM(value, j);
817 wcscpy(P, PyUnicode_AS_UNICODE(t));
818 P += 1 + wcslen(
819 PyUnicode_AS_UNICODE(t));
820 }
821 /* And doubly-terminate the list... */
822 *P = '\0';
823 break;
824 }
825 case REG_BINARY:
826 /* ALSO handle ALL unknown data types here. Even if we can't
827 support it natively, we should handle the bits. */
828 default:
829 if (value == Py_None)
830 *retDataSize = 0;
831 else {
832 Py_buffer view;
Neal Norwitz1385b892007-08-26 23:07:13 +0000833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000834 if (!PyObject_CheckBuffer(value)) {
835 PyErr_Format(PyExc_TypeError,
836 "Objects of type '%s' can not "
837 "be used as binary registry values",
838 value->ob_type->tp_name);
839 return FALSE;
840 }
Neal Norwitz1385b892007-08-26 23:07:13 +0000841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 if (PyObject_GetBuffer(value, &view, PyBUF_SIMPLE) < 0)
843 return FALSE;
Neal Norwitz1385b892007-08-26 23:07:13 +0000844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 *retDataBuf = (BYTE *)PyMem_NEW(char, view.len);
846 if (*retDataBuf==NULL){
847 PyBuffer_Release(&view);
848 PyErr_NoMemory();
849 return FALSE;
850 }
851 *retDataSize = view.len;
852 memcpy(*retDataBuf, view.buf, view.len);
853 PyBuffer_Release(&view);
854 }
855 break;
856 }
857 return TRUE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000858}
859
860/* Convert Registry data into PyObject*/
861static PyObject *
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000862Reg2Py(BYTE *retDataBuf, DWORD retDataSize, DWORD typ)
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000863{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000864 PyObject *obData;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 switch (typ) {
867 case REG_DWORD:
868 if (retDataSize == 0)
869 obData = PyLong_FromLong(0);
870 else
871 obData = PyLong_FromLong(*(int *)retDataBuf);
872 break;
873 case REG_SZ:
874 case REG_EXPAND_SZ:
875 {
876 /* the buffer may or may not have a trailing NULL */
877 wchar_t *data = (wchar_t *)retDataBuf;
878 int len = retDataSize / 2;
879 if (retDataSize && data[len-1] == '\0')
880 retDataSize -= 2;
881 if (retDataSize <= 0)
882 data = L"";
883 obData = PyUnicode_FromUnicode(data, retDataSize/2);
884 break;
885 }
886 case REG_MULTI_SZ:
887 if (retDataSize == 0)
888 obData = PyList_New(0);
889 else
890 {
891 int index = 0;
892 wchar_t *data = (wchar_t *)retDataBuf;
893 int len = retDataSize / 2;
894 int s = countStrings(data, len);
895 wchar_t **str = (wchar_t **)malloc(sizeof(wchar_t *)*s);
896 if (str == NULL)
897 return PyErr_NoMemory();
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 fixupMultiSZ(str, data, len);
900 obData = PyList_New(s);
901 if (obData == NULL)
902 return NULL;
903 for (index = 0; index < s; index++)
904 {
905 size_t len = wcslen(str[index]);
906 if (len > INT_MAX) {
907 PyErr_SetString(PyExc_OverflowError,
908 "registry string is too long for a Python string");
909 Py_DECREF(obData);
910 return NULL;
911 }
912 PyList_SetItem(obData,
913 index,
914 PyUnicode_FromUnicode(str[index], len));
915 }
916 free(str);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000918 break;
919 }
920 case REG_BINARY:
921 /* ALSO handle ALL unknown data types here. Even if we can't
922 support it natively, we should handle the bits. */
923 default:
924 if (retDataSize == 0) {
925 Py_INCREF(Py_None);
926 obData = Py_None;
927 }
928 else
929 obData = PyBytes_FromStringAndSize(
930 (char *)retDataBuf, retDataSize);
931 break;
932 }
933 return obData;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000934}
935
936/* The Python methods */
937
938static PyObject *
939PyCloseKey(PyObject *self, PyObject *args)
940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 PyObject *obKey;
942 if (!PyArg_ParseTuple(args, "O:CloseKey", &obKey))
943 return NULL;
944 if (!PyHKEY_Close(obKey))
945 return NULL;
946 Py_INCREF(Py_None);
947 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000948}
949
950static PyObject *
951PyConnectRegistry(PyObject *self, PyObject *args)
952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000953 HKEY hKey;
954 PyObject *obKey;
955 wchar_t *szCompName = NULL;
956 HKEY retKey;
957 long rc;
958 if (!PyArg_ParseTuple(args, "ZO:ConnectRegistry", &szCompName, &obKey))
959 return NULL;
960 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
961 return NULL;
962 Py_BEGIN_ALLOW_THREADS
963 rc = RegConnectRegistryW(szCompName, hKey, &retKey);
964 Py_END_ALLOW_THREADS
965 if (rc != ERROR_SUCCESS)
966 return PyErr_SetFromWindowsErrWithFunction(rc,
967 "ConnectRegistry");
968 return PyHKEY_FromHKEY(retKey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000969}
970
971static PyObject *
972PyCreateKey(PyObject *self, PyObject *args)
973{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 HKEY hKey;
975 PyObject *obKey;
976 wchar_t *subKey;
977 HKEY retKey;
978 long rc;
979 if (!PyArg_ParseTuple(args, "OZ:CreateKey", &obKey, &subKey))
980 return NULL;
981 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
982 return NULL;
983 rc = RegCreateKeyW(hKey, subKey, &retKey);
984 if (rc != ERROR_SUCCESS)
985 return PyErr_SetFromWindowsErrWithFunction(rc, "CreateKey");
986 return PyHKEY_FromHKEY(retKey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000987}
988
989static PyObject *
Brian Curtin3035c392010-04-21 23:56:21 +0000990PyCreateKeyEx(PyObject *self, PyObject *args)
991{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 HKEY hKey;
993 PyObject *obKey;
994 wchar_t *subKey;
995 HKEY retKey;
996 int res = 0;
997 REGSAM sam = KEY_WRITE;
998 long rc;
999 if (!PyArg_ParseTuple(args, "OZ|ii:CreateKeyEx", &obKey, &subKey,
1000 &res, &sam))
1001 return NULL;
1002 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1003 return NULL;
Brian Curtin3035c392010-04-21 23:56:21 +00001004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 rc = RegCreateKeyExW(hKey, subKey, res, NULL, (DWORD)NULL,
1006 sam, NULL, &retKey, NULL);
1007 if (rc != ERROR_SUCCESS)
1008 return PyErr_SetFromWindowsErrWithFunction(rc, "CreateKeyEx");
1009 return PyHKEY_FromHKEY(retKey);
Brian Curtin3035c392010-04-21 23:56:21 +00001010}
1011
1012static PyObject *
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001013PyDeleteKey(PyObject *self, PyObject *args)
1014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 HKEY hKey;
1016 PyObject *obKey;
1017 wchar_t *subKey;
1018 long rc;
1019 if (!PyArg_ParseTuple(args, "Ou:DeleteKey", &obKey, &subKey))
1020 return NULL;
1021 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1022 return NULL;
1023 rc = RegDeleteKeyW(hKey, subKey );
1024 if (rc != ERROR_SUCCESS)
1025 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKey");
1026 Py_INCREF(Py_None);
1027 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001028}
1029
1030static PyObject *
Brian Curtin3035c392010-04-21 23:56:21 +00001031PyDeleteKeyEx(PyObject *self, PyObject *args)
1032{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001033 HKEY hKey;
1034 PyObject *obKey;
1035 HMODULE hMod;
1036 typedef LONG (WINAPI *RDKEFunc)(HKEY, const wchar_t*, REGSAM, int);
1037 RDKEFunc pfn = NULL;
1038 wchar_t *subKey;
1039 long rc;
1040 int res = 0;
1041 REGSAM sam = KEY_WOW64_64KEY;
Brian Curtin3035c392010-04-21 23:56:21 +00001042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 if (!PyArg_ParseTuple(args, "Ou|ii:DeleteKeyEx",
1044 &obKey, &subKey, &sam, &res))
1045 return NULL;
1046 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1047 return NULL;
Brian Curtin3035c392010-04-21 23:56:21 +00001048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 /* Only available on 64bit platforms, so we must load it
1050 dynamically. */
1051 hMod = GetModuleHandle("advapi32.dll");
1052 if (hMod)
1053 pfn = (RDKEFunc)GetProcAddress(hMod,
1054 "RegDeleteKeyExW");
1055 if (!pfn) {
1056 PyErr_SetString(PyExc_NotImplementedError,
1057 "not implemented on this platform");
1058 return NULL;
1059 }
1060 Py_BEGIN_ALLOW_THREADS
1061 rc = (*pfn)(hKey, subKey, sam, res);
1062 Py_END_ALLOW_THREADS
Brian Curtin3035c392010-04-21 23:56:21 +00001063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 if (rc != ERROR_SUCCESS)
1065 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKeyEx");
1066 Py_INCREF(Py_None);
1067 return Py_None;
Brian Curtin3035c392010-04-21 23:56:21 +00001068}
1069
1070static PyObject *
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001071PyDeleteValue(PyObject *self, PyObject *args)
1072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 HKEY hKey;
1074 PyObject *obKey;
1075 wchar_t *subKey;
1076 long rc;
1077 if (!PyArg_ParseTuple(args, "OZ:DeleteValue", &obKey, &subKey))
1078 return NULL;
1079 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1080 return NULL;
1081 Py_BEGIN_ALLOW_THREADS
1082 rc = RegDeleteValueW(hKey, subKey);
1083 Py_END_ALLOW_THREADS
1084 if (rc !=ERROR_SUCCESS)
1085 return PyErr_SetFromWindowsErrWithFunction(rc,
1086 "RegDeleteValue");
1087 Py_INCREF(Py_None);
1088 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001089}
1090
1091static PyObject *
1092PyEnumKey(PyObject *self, PyObject *args)
1093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 HKEY hKey;
1095 PyObject *obKey;
1096 int index;
1097 long rc;
1098 PyObject *retStr;
1099 wchar_t tmpbuf[256]; /* max key name length is 255 */
1100 DWORD len = sizeof(tmpbuf); /* includes NULL terminator */
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001102 if (!PyArg_ParseTuple(args, "Oi:EnumKey", &obKey, &index))
1103 return NULL;
1104 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1105 return NULL;
Tim Peters313fcd42006-02-19 04:05:39 +00001106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 Py_BEGIN_ALLOW_THREADS
1108 rc = RegEnumKeyExW(hKey, index, tmpbuf, &len, NULL, NULL, NULL, NULL);
1109 Py_END_ALLOW_THREADS
1110 if (rc != ERROR_SUCCESS)
1111 return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKeyEx");
Tim Peters313fcd42006-02-19 04:05:39 +00001112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 retStr = PyUnicode_FromUnicode(tmpbuf, len);
1114 return retStr; /* can be NULL */
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001115}
1116
1117static PyObject *
1118PyEnumValue(PyObject *self, PyObject *args)
1119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 HKEY hKey;
1121 PyObject *obKey;
1122 int index;
1123 long rc;
1124 wchar_t *retValueBuf;
1125 BYTE *retDataBuf;
1126 DWORD retValueSize;
1127 DWORD retDataSize;
1128 DWORD typ;
1129 PyObject *obData;
1130 PyObject *retVal;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 if (!PyArg_ParseTuple(args, "Oi:EnumValue", &obKey, &index))
1133 return NULL;
1134 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1135 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 if ((rc = RegQueryInfoKeyW(hKey, NULL, NULL, NULL, NULL, NULL, NULL,
1138 NULL,
1139 &retValueSize, &retDataSize, NULL, NULL))
1140 != ERROR_SUCCESS)
1141 return PyErr_SetFromWindowsErrWithFunction(rc,
1142 "RegQueryInfoKey");
1143 ++retValueSize; /* include null terminators */
1144 ++retDataSize;
1145 retValueBuf = (wchar_t *)PyMem_Malloc(sizeof(wchar_t) * retValueSize);
1146 if (retValueBuf == NULL)
1147 return PyErr_NoMemory();
1148 retDataBuf = (BYTE *)PyMem_Malloc(retDataSize);
1149 if (retDataBuf == NULL) {
1150 PyMem_Free(retValueBuf);
1151 return PyErr_NoMemory();
1152 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 Py_BEGIN_ALLOW_THREADS
1155 rc = RegEnumValueW(hKey,
1156 index,
1157 retValueBuf,
1158 &retValueSize,
1159 NULL,
1160 &typ,
1161 retDataBuf,
1162 &retDataSize);
1163 Py_END_ALLOW_THREADS
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 if (rc != ERROR_SUCCESS) {
1166 retVal = PyErr_SetFromWindowsErrWithFunction(rc,
1167 "PyRegEnumValue");
1168 goto fail;
1169 }
1170 obData = Reg2Py(retDataBuf, retDataSize, typ);
1171 if (obData == NULL) {
1172 retVal = NULL;
1173 goto fail;
1174 }
1175 retVal = Py_BuildValue("uOi", retValueBuf, obData, typ);
1176 Py_DECREF(obData);
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001177 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 PyMem_Free(retValueBuf);
1179 PyMem_Free(retDataBuf);
1180 return retVal;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001181}
1182
1183static PyObject *
Christian Heimes2380ac72008-01-09 00:17:24 +00001184PyExpandEnvironmentStrings(PyObject *self, PyObject *args)
1185{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 Py_UNICODE *retValue = NULL;
1187 Py_UNICODE *src;
1188 DWORD retValueSize;
1189 DWORD rc;
1190 PyObject *o;
Christian Heimes2380ac72008-01-09 00:17:24 +00001191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 if (!PyArg_ParseTuple(args, "u:ExpandEnvironmentStrings", &src))
1193 return NULL;
Christian Heimes2380ac72008-01-09 00:17:24 +00001194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 retValueSize = ExpandEnvironmentStringsW(src, retValue, 0);
1196 if (retValueSize == 0) {
1197 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1198 "ExpandEnvironmentStrings");
1199 }
1200 retValue = (Py_UNICODE *)PyMem_Malloc(retValueSize * sizeof(Py_UNICODE));
1201 if (retValue == NULL) {
1202 return PyErr_NoMemory();
1203 }
Christian Heimes2380ac72008-01-09 00:17:24 +00001204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 rc = ExpandEnvironmentStringsW(src, retValue, retValueSize);
1206 if (rc == 0) {
1207 PyMem_Free(retValue);
1208 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1209 "ExpandEnvironmentStrings");
1210 }
1211 o = PyUnicode_FromUnicode(retValue, wcslen(retValue));
1212 PyMem_Free(retValue);
1213 return o;
Christian Heimes2380ac72008-01-09 00:17:24 +00001214}
1215
1216static PyObject *
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001217PyFlushKey(PyObject *self, PyObject *args)
1218{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 HKEY hKey;
1220 PyObject *obKey;
1221 long rc;
1222 if (!PyArg_ParseTuple(args, "O:FlushKey", &obKey))
1223 return NULL;
1224 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1225 return NULL;
1226 Py_BEGIN_ALLOW_THREADS
1227 rc = RegFlushKey(hKey);
1228 Py_END_ALLOW_THREADS
1229 if (rc != ERROR_SUCCESS)
1230 return PyErr_SetFromWindowsErrWithFunction(rc, "RegFlushKey");
1231 Py_INCREF(Py_None);
1232 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001233}
1234static PyObject *
1235PyLoadKey(PyObject *self, PyObject *args)
1236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 HKEY hKey;
1238 PyObject *obKey;
1239 wchar_t *subKey;
1240 wchar_t *fileName;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 long rc;
1243 if (!PyArg_ParseTuple(args, "Ouu:LoadKey", &obKey, &subKey, &fileName))
1244 return NULL;
1245 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1246 return NULL;
1247 Py_BEGIN_ALLOW_THREADS
1248 rc = RegLoadKeyW(hKey, subKey, fileName );
1249 Py_END_ALLOW_THREADS
1250 if (rc != ERROR_SUCCESS)
1251 return PyErr_SetFromWindowsErrWithFunction(rc, "RegLoadKey");
1252 Py_INCREF(Py_None);
1253 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001254}
1255
1256static PyObject *
1257PyOpenKey(PyObject *self, PyObject *args)
1258{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 HKEY hKey;
1260 PyObject *obKey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 wchar_t *subKey;
1263 int res = 0;
1264 HKEY retKey;
1265 long rc;
1266 REGSAM sam = KEY_READ;
1267 if (!PyArg_ParseTuple(args, "OZ|ii:OpenKey", &obKey, &subKey,
1268 &res, &sam))
1269 return NULL;
1270 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1271 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 Py_BEGIN_ALLOW_THREADS
1274 rc = RegOpenKeyExW(hKey, subKey, res, sam, &retKey);
1275 Py_END_ALLOW_THREADS
1276 if (rc != ERROR_SUCCESS)
1277 return PyErr_SetFromWindowsErrWithFunction(rc, "RegOpenKeyEx");
1278 return PyHKEY_FromHKEY(retKey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001279}
1280
1281
1282static PyObject *
1283PyQueryInfoKey(PyObject *self, PyObject *args)
1284{
1285 HKEY hKey;
1286 PyObject *obKey;
1287 long rc;
1288 DWORD nSubKeys, nValues;
1289 FILETIME ft;
1290 LARGE_INTEGER li;
1291 PyObject *l;
1292 PyObject *ret;
1293 if (!PyArg_ParseTuple(args, "O:QueryInfoKey", &obKey))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001295 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001297 if ((rc = RegQueryInfoKey(hKey, NULL, NULL, 0, &nSubKeys, NULL, NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 &nValues, NULL, NULL, NULL, &ft))
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001299 != ERROR_SUCCESS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryInfoKey");
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001301 li.LowPart = ft.dwLowDateTime;
1302 li.HighPart = ft.dwHighDateTime;
1303 l = PyLong_FromLongLong(li.QuadPart);
1304 if (l == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001306 ret = Py_BuildValue("iiO", nSubKeys, nValues, l);
1307 Py_DECREF(l);
1308 return ret;
1309}
1310
1311static PyObject *
1312PyQueryValue(PyObject *self, PyObject *args)
1313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 HKEY hKey;
1315 PyObject *obKey;
1316 wchar_t *subKey;
1317 long rc;
1318 PyObject *retStr;
1319 wchar_t *retBuf;
1320 long bufSize = 0;
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 if (!PyArg_ParseTuple(args, "OZ:QueryValue", &obKey, &subKey))
1323 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1326 return NULL;
1327 if ((rc = RegQueryValueW(hKey, subKey, NULL, &bufSize))
1328 != ERROR_SUCCESS)
1329 return PyErr_SetFromWindowsErrWithFunction(rc,
1330 "RegQueryValue");
1331 retBuf = (wchar_t *)PyMem_Malloc(bufSize);
1332 if (retBuf == NULL)
1333 return PyErr_NoMemory();
Guido van Rossuma8c360e2007-07-17 20:50:43 +00001334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 if ((rc = RegQueryValueW(hKey, subKey, retBuf, &bufSize))
1336 != ERROR_SUCCESS) {
1337 PyMem_Free(retBuf);
1338 return PyErr_SetFromWindowsErrWithFunction(rc,
1339 "RegQueryValue");
1340 }
Guido van Rossuma8c360e2007-07-17 20:50:43 +00001341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 retStr = PyUnicode_FromUnicode(retBuf, wcslen(retBuf));
1343 PyMem_Free(retBuf);
1344 return retStr;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001345}
1346
1347static PyObject *
1348PyQueryValueEx(PyObject *self, PyObject *args)
1349{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 HKEY hKey;
1351 PyObject *obKey;
1352 wchar_t *valueName;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 long rc;
1355 BYTE *retBuf;
1356 DWORD bufSize = 0;
1357 DWORD typ;
1358 PyObject *obData;
1359 PyObject *result;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 if (!PyArg_ParseTuple(args, "OZ:QueryValueEx", &obKey, &valueName))
1362 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1365 return NULL;
1366 if ((rc = RegQueryValueExW(hKey, valueName,
1367 NULL, NULL, NULL,
1368 &bufSize))
1369 != ERROR_SUCCESS)
1370 return PyErr_SetFromWindowsErrWithFunction(rc,
1371 "RegQueryValueEx");
1372 retBuf = (BYTE *)PyMem_Malloc(bufSize);
1373 if (retBuf == NULL)
1374 return PyErr_NoMemory();
1375 if ((rc = RegQueryValueExW(hKey, valueName, NULL,
1376 &typ, retBuf, &bufSize))
1377 != ERROR_SUCCESS) {
1378 PyMem_Free(retBuf);
1379 return PyErr_SetFromWindowsErrWithFunction(rc,
1380 "RegQueryValueEx");
1381 }
1382 obData = Reg2Py(retBuf, bufSize, typ);
1383 PyMem_Free(retBuf);
1384 if (obData == NULL)
1385 return NULL;
1386 result = Py_BuildValue("Oi", obData, typ);
1387 Py_DECREF(obData);
1388 return result;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001389}
1390
1391
1392static PyObject *
1393PySaveKey(PyObject *self, PyObject *args)
1394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 HKEY hKey;
1396 PyObject *obKey;
1397 wchar_t *fileName;
1398 LPSECURITY_ATTRIBUTES pSA = NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 long rc;
1401 if (!PyArg_ParseTuple(args, "Ou:SaveKey", &obKey, &fileName))
1402 return NULL;
1403 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1404 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001405/* One day we may get security into the core?
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 if (!PyWinObject_AsSECURITY_ATTRIBUTES(obSA, &pSA, TRUE))
1407 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001408*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 Py_BEGIN_ALLOW_THREADS
1410 rc = RegSaveKeyW(hKey, fileName, pSA );
1411 Py_END_ALLOW_THREADS
1412 if (rc != ERROR_SUCCESS)
1413 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSaveKey");
1414 Py_INCREF(Py_None);
1415 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001416}
1417
1418static PyObject *
1419PySetValue(PyObject *self, PyObject *args)
1420{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 HKEY hKey;
1422 PyObject *obKey;
1423 wchar_t *subKey;
1424 wchar_t *str;
1425 DWORD typ;
1426 DWORD len;
1427 long rc;
1428 if (!PyArg_ParseTuple(args, "OZiu#:SetValue",
1429 &obKey,
1430 &subKey,
1431 &typ,
1432 &str,
1433 &len))
1434 return NULL;
1435 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1436 return NULL;
1437 if (typ != REG_SZ) {
1438 PyErr_SetString(PyExc_TypeError,
1439 "Type must be winreg.REG_SZ");
1440 return NULL;
1441 }
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 Py_BEGIN_ALLOW_THREADS
1444 rc = RegSetValueW(hKey, subKey, REG_SZ, str, len+1);
1445 Py_END_ALLOW_THREADS
1446 if (rc != ERROR_SUCCESS)
1447 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSetValue");
1448 Py_INCREF(Py_None);
1449 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001450}
1451
1452static PyObject *
1453PySetValueEx(PyObject *self, PyObject *args)
1454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 HKEY hKey;
1456 PyObject *obKey;
1457 Py_UNICODE *valueName;
1458 PyObject *obRes;
1459 PyObject *value;
1460 BYTE *data;
1461 DWORD len;
1462 DWORD typ;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 LONG rc;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 if (!PyArg_ParseTuple(args, "OZOiO:SetValueEx",
1467 &obKey,
1468 &valueName,
1469 &obRes,
1470 &typ,
1471 &value))
1472 return NULL;
1473 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1474 return NULL;
1475 if (!Py2Reg(value, typ, &data, &len))
1476 {
1477 if (!PyErr_Occurred())
1478 PyErr_SetString(PyExc_ValueError,
1479 "Could not convert the data to the specified type.");
1480 return NULL;
1481 }
1482 Py_BEGIN_ALLOW_THREADS
1483 rc = RegSetValueExW(hKey, valueName, 0, typ, data, len);
1484 Py_END_ALLOW_THREADS
1485 PyMem_DEL(data);
1486 if (rc != ERROR_SUCCESS)
1487 return PyErr_SetFromWindowsErrWithFunction(rc,
1488 "RegSetValueEx");
1489 Py_INCREF(Py_None);
1490 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001491}
1492
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001493static PyObject *
1494PyDisableReflectionKey(PyObject *self, PyObject *args)
1495{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 HKEY hKey;
1497 PyObject *obKey;
1498 HMODULE hMod;
1499 typedef LONG (WINAPI *RDRKFunc)(HKEY);
1500 RDRKFunc pfn = NULL;
1501 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 if (!PyArg_ParseTuple(args, "O:DisableReflectionKey", &obKey))
1504 return NULL;
1505 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1506 return NULL;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 /* Only available on 64bit platforms, so we must load it
1509 dynamically.*/
1510 hMod = GetModuleHandle("advapi32.dll");
1511 if (hMod)
1512 pfn = (RDRKFunc)GetProcAddress(hMod,
1513 "RegDisableReflectionKey");
1514 if (!pfn) {
1515 PyErr_SetString(PyExc_NotImplementedError,
1516 "not implemented on this platform");
1517 return NULL;
1518 }
1519 Py_BEGIN_ALLOW_THREADS
1520 rc = (*pfn)(hKey);
1521 Py_END_ALLOW_THREADS
1522 if (rc != ERROR_SUCCESS)
1523 return PyErr_SetFromWindowsErrWithFunction(rc,
1524 "RegDisableReflectionKey");
1525 Py_INCREF(Py_None);
1526 return Py_None;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001527}
1528
1529static PyObject *
1530PyEnableReflectionKey(PyObject *self, PyObject *args)
1531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 HKEY hKey;
1533 PyObject *obKey;
1534 HMODULE hMod;
1535 typedef LONG (WINAPI *RERKFunc)(HKEY);
1536 RERKFunc pfn = NULL;
1537 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 if (!PyArg_ParseTuple(args, "O:EnableReflectionKey", &obKey))
1540 return NULL;
1541 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1542 return NULL;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 /* Only available on 64bit platforms, so we must load it
1545 dynamically.*/
1546 hMod = GetModuleHandle("advapi32.dll");
1547 if (hMod)
1548 pfn = (RERKFunc)GetProcAddress(hMod,
1549 "RegEnableReflectionKey");
1550 if (!pfn) {
1551 PyErr_SetString(PyExc_NotImplementedError,
1552 "not implemented on this platform");
1553 return NULL;
1554 }
1555 Py_BEGIN_ALLOW_THREADS
1556 rc = (*pfn)(hKey);
1557 Py_END_ALLOW_THREADS
1558 if (rc != ERROR_SUCCESS)
1559 return PyErr_SetFromWindowsErrWithFunction(rc,
1560 "RegEnableReflectionKey");
1561 Py_INCREF(Py_None);
1562 return Py_None;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001563}
1564
1565static PyObject *
1566PyQueryReflectionKey(PyObject *self, PyObject *args)
1567{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 HKEY hKey;
1569 PyObject *obKey;
1570 HMODULE hMod;
1571 typedef LONG (WINAPI *RQRKFunc)(HKEY, BOOL *);
1572 RQRKFunc pfn = NULL;
1573 BOOL result;
1574 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 if (!PyArg_ParseTuple(args, "O:QueryReflectionKey", &obKey))
1577 return NULL;
1578 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1579 return NULL;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 /* Only available on 64bit platforms, so we must load it
1582 dynamically.*/
1583 hMod = GetModuleHandle("advapi32.dll");
1584 if (hMod)
1585 pfn = (RQRKFunc)GetProcAddress(hMod,
1586 "RegQueryReflectionKey");
1587 if (!pfn) {
1588 PyErr_SetString(PyExc_NotImplementedError,
1589 "not implemented on this platform");
1590 return NULL;
1591 }
1592 Py_BEGIN_ALLOW_THREADS
1593 rc = (*pfn)(hKey, &result);
1594 Py_END_ALLOW_THREADS
1595 if (rc != ERROR_SUCCESS)
1596 return PyErr_SetFromWindowsErrWithFunction(rc,
1597 "RegQueryReflectionKey");
1598 return PyBool_FromLong(result);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001599}
1600
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001601static struct PyMethodDef winreg_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 {"CloseKey", PyCloseKey, METH_VARARGS, CloseKey_doc},
1603 {"ConnectRegistry", PyConnectRegistry, METH_VARARGS, ConnectRegistry_doc},
1604 {"CreateKey", PyCreateKey, METH_VARARGS, CreateKey_doc},
1605 {"CreateKeyEx", PyCreateKeyEx, METH_VARARGS, CreateKeyEx_doc},
1606 {"DeleteKey", PyDeleteKey, METH_VARARGS, DeleteKey_doc},
1607 {"DeleteKeyEx", PyDeleteKeyEx, METH_VARARGS, DeleteKeyEx_doc},
1608 {"DeleteValue", PyDeleteValue, METH_VARARGS, DeleteValue_doc},
1609 {"DisableReflectionKey", PyDisableReflectionKey, METH_VARARGS, DisableReflectionKey_doc},
1610 {"EnableReflectionKey", PyEnableReflectionKey, METH_VARARGS, EnableReflectionKey_doc},
1611 {"EnumKey", PyEnumKey, METH_VARARGS, EnumKey_doc},
1612 {"EnumValue", PyEnumValue, METH_VARARGS, EnumValue_doc},
1613 {"ExpandEnvironmentStrings", PyExpandEnvironmentStrings, METH_VARARGS,
1614 ExpandEnvironmentStrings_doc },
1615 {"FlushKey", PyFlushKey, METH_VARARGS, FlushKey_doc},
1616 {"LoadKey", PyLoadKey, METH_VARARGS, LoadKey_doc},
1617 {"OpenKey", PyOpenKey, METH_VARARGS, OpenKey_doc},
1618 {"OpenKeyEx", PyOpenKey, METH_VARARGS, OpenKeyEx_doc},
1619 {"QueryValue", PyQueryValue, METH_VARARGS, QueryValue_doc},
1620 {"QueryValueEx", PyQueryValueEx, METH_VARARGS, QueryValueEx_doc},
1621 {"QueryInfoKey", PyQueryInfoKey, METH_VARARGS, QueryInfoKey_doc},
1622 {"QueryReflectionKey",PyQueryReflectionKey,METH_VARARGS, QueryReflectionKey_doc},
1623 {"SaveKey", PySaveKey, METH_VARARGS, SaveKey_doc},
1624 {"SetValue", PySetValue, METH_VARARGS, SetValue_doc},
1625 {"SetValueEx", PySetValueEx, METH_VARARGS, SetValueEx_doc},
1626 NULL,
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001627};
1628
1629static void
1630insint(PyObject * d, char * name, long value)
1631{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 PyObject *v = PyLong_FromLong(value);
1633 if (!v || PyDict_SetItemString(d, name, v))
1634 PyErr_Clear();
1635 Py_XDECREF(v);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001636}
1637
1638#define ADD_INT(val) insint(d, #val, val)
1639
1640static void
1641inskey(PyObject * d, char * name, HKEY key)
1642{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 PyObject *v = PyLong_FromVoidPtr(key);
1644 if (!v || PyDict_SetItemString(d, name, v))
1645 PyErr_Clear();
1646 Py_XDECREF(v);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001647}
1648
1649#define ADD_KEY(val) inskey(d, #val, val)
1650
Martin v. Löwis1a214512008-06-11 05:26:20 +00001651
1652static struct PyModuleDef winregmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001653 PyModuleDef_HEAD_INIT,
1654 "winreg",
1655 module_doc,
1656 -1,
1657 winreg_methods,
1658 NULL,
1659 NULL,
1660 NULL,
1661 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001662};
1663
1664PyMODINIT_FUNC PyInit_winreg(void)
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001665{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 PyObject *m, *d;
1667 m = PyModule_Create(&winregmodule);
1668 if (m == NULL)
1669 return NULL;
1670 d = PyModule_GetDict(m);
1671 PyHKEY_Type.tp_doc = PyHKEY_doc;
1672 if (PyType_Ready(&PyHKEY_Type) < 0)
1673 return NULL;
1674 Py_INCREF(&PyHKEY_Type);
1675 if (PyDict_SetItemString(d, "HKEYType",
1676 (PyObject *)&PyHKEY_Type) != 0)
1677 return NULL;
1678 Py_INCREF(PyExc_WindowsError);
1679 if (PyDict_SetItemString(d, "error",
1680 PyExc_WindowsError) != 0)
1681 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 /* Add the relevant constants */
1684 ADD_KEY(HKEY_CLASSES_ROOT);
1685 ADD_KEY(HKEY_CURRENT_USER);
1686 ADD_KEY(HKEY_LOCAL_MACHINE);
1687 ADD_KEY(HKEY_USERS);
1688 ADD_KEY(HKEY_PERFORMANCE_DATA);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001689#ifdef HKEY_CURRENT_CONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 ADD_KEY(HKEY_CURRENT_CONFIG);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001691#endif
1692#ifdef HKEY_DYN_DATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 ADD_KEY(HKEY_DYN_DATA);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001694#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 ADD_INT(KEY_QUERY_VALUE);
1696 ADD_INT(KEY_SET_VALUE);
1697 ADD_INT(KEY_CREATE_SUB_KEY);
1698 ADD_INT(KEY_ENUMERATE_SUB_KEYS);
1699 ADD_INT(KEY_NOTIFY);
1700 ADD_INT(KEY_CREATE_LINK);
1701 ADD_INT(KEY_READ);
1702 ADD_INT(KEY_WRITE);
1703 ADD_INT(KEY_EXECUTE);
1704 ADD_INT(KEY_ALL_ACCESS);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001705#ifdef KEY_WOW64_64KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 ADD_INT(KEY_WOW64_64KEY);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001707#endif
1708#ifdef KEY_WOW64_32KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 ADD_INT(KEY_WOW64_32KEY);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001710#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 ADD_INT(REG_OPTION_RESERVED);
1712 ADD_INT(REG_OPTION_NON_VOLATILE);
1713 ADD_INT(REG_OPTION_VOLATILE);
1714 ADD_INT(REG_OPTION_CREATE_LINK);
1715 ADD_INT(REG_OPTION_BACKUP_RESTORE);
1716 ADD_INT(REG_OPTION_OPEN_LINK);
1717 ADD_INT(REG_LEGAL_OPTION);
1718 ADD_INT(REG_CREATED_NEW_KEY);
1719 ADD_INT(REG_OPENED_EXISTING_KEY);
1720 ADD_INT(REG_WHOLE_HIVE_VOLATILE);
1721 ADD_INT(REG_REFRESH_HIVE);
1722 ADD_INT(REG_NO_LAZY_FLUSH);
1723 ADD_INT(REG_NOTIFY_CHANGE_NAME);
1724 ADD_INT(REG_NOTIFY_CHANGE_ATTRIBUTES);
1725 ADD_INT(REG_NOTIFY_CHANGE_LAST_SET);
1726 ADD_INT(REG_NOTIFY_CHANGE_SECURITY);
1727 ADD_INT(REG_LEGAL_CHANGE_FILTER);
1728 ADD_INT(REG_NONE);
1729 ADD_INT(REG_SZ);
1730 ADD_INT(REG_EXPAND_SZ);
1731 ADD_INT(REG_BINARY);
1732 ADD_INT(REG_DWORD);
1733 ADD_INT(REG_DWORD_LITTLE_ENDIAN);
1734 ADD_INT(REG_DWORD_BIG_ENDIAN);
1735 ADD_INT(REG_LINK);
1736 ADD_INT(REG_MULTI_SZ);
1737 ADD_INT(REG_RESOURCE_LIST);
1738 ADD_INT(REG_FULL_RESOURCE_DESCRIPTOR);
1739 ADD_INT(REG_RESOURCE_REQUIREMENTS_LIST);
1740 return m;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001741}
1742
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001743