blob: c134a352e0351962f5faa2b0e78bd34224a662ba [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;
Brian Curtin60853212010-05-26 17:43:50 +00001099
1100 /* The Windows docs claim that the max key name length is 255
1101 * characters, plus a terminating nul character. However,
1102 * empirical testing demonstrates that it is possible to
1103 * create a 256 character key that is missing the terminating
1104 * nul. RegEnumKeyEx requires a 257 character buffer to
1105 * retrieve such a key name. */
1106 wchar_t tmpbuf[257];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 DWORD len = sizeof(tmpbuf); /* includes NULL terminator */
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 if (!PyArg_ParseTuple(args, "Oi:EnumKey", &obKey, &index))
1110 return NULL;
1111 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1112 return NULL;
Tim Peters313fcd42006-02-19 04:05:39 +00001113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 Py_BEGIN_ALLOW_THREADS
1115 rc = RegEnumKeyExW(hKey, index, tmpbuf, &len, NULL, NULL, NULL, NULL);
1116 Py_END_ALLOW_THREADS
1117 if (rc != ERROR_SUCCESS)
1118 return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKeyEx");
Tim Peters313fcd42006-02-19 04:05:39 +00001119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 retStr = PyUnicode_FromUnicode(tmpbuf, len);
1121 return retStr; /* can be NULL */
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001122}
1123
1124static PyObject *
1125PyEnumValue(PyObject *self, PyObject *args)
1126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 HKEY hKey;
1128 PyObject *obKey;
1129 int index;
1130 long rc;
1131 wchar_t *retValueBuf;
Brian Curtin9b7e2d12010-06-08 20:57:52 +00001132 wchar_t *tmpBuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 BYTE *retDataBuf;
Brian Curtin60853212010-05-26 17:43:50 +00001134 DWORD retValueSize, bufValueSize;
1135 DWORD retDataSize, bufDataSize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 DWORD typ;
1137 PyObject *obData;
1138 PyObject *retVal;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 if (!PyArg_ParseTuple(args, "Oi:EnumValue", &obKey, &index))
1141 return NULL;
1142 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1143 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 if ((rc = RegQueryInfoKeyW(hKey, NULL, NULL, NULL, NULL, NULL, NULL,
1146 NULL,
1147 &retValueSize, &retDataSize, NULL, NULL))
1148 != ERROR_SUCCESS)
1149 return PyErr_SetFromWindowsErrWithFunction(rc,
1150 "RegQueryInfoKey");
1151 ++retValueSize; /* include null terminators */
1152 ++retDataSize;
Brian Curtin60853212010-05-26 17:43:50 +00001153 bufDataSize = retDataSize;
1154 bufValueSize = retValueSize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 retValueBuf = (wchar_t *)PyMem_Malloc(sizeof(wchar_t) * retValueSize);
1156 if (retValueBuf == NULL)
1157 return PyErr_NoMemory();
1158 retDataBuf = (BYTE *)PyMem_Malloc(retDataSize);
1159 if (retDataBuf == NULL) {
1160 PyMem_Free(retValueBuf);
1161 return PyErr_NoMemory();
1162 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001163
Brian Curtin60853212010-05-26 17:43:50 +00001164 while (1) {
Brian Curtin60853212010-05-26 17:43:50 +00001165 Py_BEGIN_ALLOW_THREADS
1166 rc = RegEnumValueW(hKey,
1167 index,
1168 retValueBuf,
1169 &retValueSize,
1170 NULL,
1171 &typ,
1172 (BYTE *)retDataBuf,
1173 &retDataSize);
1174 Py_END_ALLOW_THREADS
1175
1176 if (rc != ERROR_MORE_DATA)
1177 break;
1178
1179 bufDataSize *= 2;
Brian Curtin9b7e2d12010-06-08 20:57:52 +00001180 tmpBuf = (wchar_t *)PyMem_Realloc(retDataBuf, bufDataSize);
1181 if (tmpBuf == NULL) {
Brian Curtin60853212010-05-26 17:43:50 +00001182 PyErr_NoMemory();
1183 retVal = NULL;
1184 goto fail;
1185 }
Brian Curtin9b7e2d12010-06-08 20:57:52 +00001186 retDataBuf = tmpBuf;
Brian Curtin60853212010-05-26 17:43:50 +00001187 retDataSize = bufDataSize;
1188 retValueSize = bufValueSize;
1189 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 if (rc != ERROR_SUCCESS) {
1192 retVal = PyErr_SetFromWindowsErrWithFunction(rc,
1193 "PyRegEnumValue");
1194 goto fail;
1195 }
1196 obData = Reg2Py(retDataBuf, retDataSize, typ);
1197 if (obData == NULL) {
1198 retVal = NULL;
1199 goto fail;
1200 }
1201 retVal = Py_BuildValue("uOi", retValueBuf, obData, typ);
1202 Py_DECREF(obData);
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001203 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 PyMem_Free(retValueBuf);
1205 PyMem_Free(retDataBuf);
1206 return retVal;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001207}
1208
1209static PyObject *
Christian Heimes2380ac72008-01-09 00:17:24 +00001210PyExpandEnvironmentStrings(PyObject *self, PyObject *args)
1211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 Py_UNICODE *retValue = NULL;
1213 Py_UNICODE *src;
1214 DWORD retValueSize;
1215 DWORD rc;
1216 PyObject *o;
Christian Heimes2380ac72008-01-09 00:17:24 +00001217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 if (!PyArg_ParseTuple(args, "u:ExpandEnvironmentStrings", &src))
1219 return NULL;
Christian Heimes2380ac72008-01-09 00:17:24 +00001220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 retValueSize = ExpandEnvironmentStringsW(src, retValue, 0);
1222 if (retValueSize == 0) {
1223 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1224 "ExpandEnvironmentStrings");
1225 }
1226 retValue = (Py_UNICODE *)PyMem_Malloc(retValueSize * sizeof(Py_UNICODE));
1227 if (retValue == NULL) {
1228 return PyErr_NoMemory();
1229 }
Christian Heimes2380ac72008-01-09 00:17:24 +00001230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 rc = ExpandEnvironmentStringsW(src, retValue, retValueSize);
1232 if (rc == 0) {
1233 PyMem_Free(retValue);
1234 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1235 "ExpandEnvironmentStrings");
1236 }
1237 o = PyUnicode_FromUnicode(retValue, wcslen(retValue));
1238 PyMem_Free(retValue);
1239 return o;
Christian Heimes2380ac72008-01-09 00:17:24 +00001240}
1241
1242static PyObject *
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001243PyFlushKey(PyObject *self, PyObject *args)
1244{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 HKEY hKey;
1246 PyObject *obKey;
1247 long rc;
1248 if (!PyArg_ParseTuple(args, "O:FlushKey", &obKey))
1249 return NULL;
1250 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1251 return NULL;
1252 Py_BEGIN_ALLOW_THREADS
1253 rc = RegFlushKey(hKey);
1254 Py_END_ALLOW_THREADS
1255 if (rc != ERROR_SUCCESS)
1256 return PyErr_SetFromWindowsErrWithFunction(rc, "RegFlushKey");
1257 Py_INCREF(Py_None);
1258 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001259}
1260static PyObject *
1261PyLoadKey(PyObject *self, PyObject *args)
1262{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 HKEY hKey;
1264 PyObject *obKey;
1265 wchar_t *subKey;
1266 wchar_t *fileName;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 long rc;
1269 if (!PyArg_ParseTuple(args, "Ouu:LoadKey", &obKey, &subKey, &fileName))
1270 return NULL;
1271 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1272 return NULL;
1273 Py_BEGIN_ALLOW_THREADS
1274 rc = RegLoadKeyW(hKey, subKey, fileName );
1275 Py_END_ALLOW_THREADS
1276 if (rc != ERROR_SUCCESS)
1277 return PyErr_SetFromWindowsErrWithFunction(rc, "RegLoadKey");
1278 Py_INCREF(Py_None);
1279 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001280}
1281
1282static PyObject *
1283PyOpenKey(PyObject *self, PyObject *args)
1284{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 HKEY hKey;
1286 PyObject *obKey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 wchar_t *subKey;
1289 int res = 0;
1290 HKEY retKey;
1291 long rc;
1292 REGSAM sam = KEY_READ;
1293 if (!PyArg_ParseTuple(args, "OZ|ii:OpenKey", &obKey, &subKey,
1294 &res, &sam))
1295 return NULL;
1296 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1297 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 Py_BEGIN_ALLOW_THREADS
1300 rc = RegOpenKeyExW(hKey, subKey, res, sam, &retKey);
1301 Py_END_ALLOW_THREADS
1302 if (rc != ERROR_SUCCESS)
1303 return PyErr_SetFromWindowsErrWithFunction(rc, "RegOpenKeyEx");
1304 return PyHKEY_FromHKEY(retKey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001305}
1306
1307
1308static PyObject *
1309PyQueryInfoKey(PyObject *self, PyObject *args)
1310{
1311 HKEY hKey;
1312 PyObject *obKey;
1313 long rc;
1314 DWORD nSubKeys, nValues;
1315 FILETIME ft;
1316 LARGE_INTEGER li;
1317 PyObject *l;
1318 PyObject *ret;
1319 if (!PyArg_ParseTuple(args, "O:QueryInfoKey", &obKey))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001321 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001323 if ((rc = RegQueryInfoKey(hKey, NULL, NULL, 0, &nSubKeys, NULL, NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 &nValues, NULL, NULL, NULL, &ft))
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001325 != ERROR_SUCCESS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryInfoKey");
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001327 li.LowPart = ft.dwLowDateTime;
1328 li.HighPart = ft.dwHighDateTime;
1329 l = PyLong_FromLongLong(li.QuadPart);
1330 if (l == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001332 ret = Py_BuildValue("iiO", nSubKeys, nValues, l);
1333 Py_DECREF(l);
1334 return ret;
1335}
1336
1337static PyObject *
1338PyQueryValue(PyObject *self, PyObject *args)
1339{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 HKEY hKey;
1341 PyObject *obKey;
1342 wchar_t *subKey;
1343 long rc;
1344 PyObject *retStr;
1345 wchar_t *retBuf;
Brian Curtin60853212010-05-26 17:43:50 +00001346 DWORD bufSize = 0;
1347 DWORD retSize = 0;
1348 wchar_t *tmp;
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 if (!PyArg_ParseTuple(args, "OZ:QueryValue", &obKey, &subKey))
1351 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1354 return NULL;
Brian Curtin60853212010-05-26 17:43:50 +00001355
1356 rc = RegQueryValueW(hKey, subKey, NULL, &retSize);
1357 if (rc == ERROR_MORE_DATA)
1358 retSize = 256;
1359 else if (rc != ERROR_SUCCESS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 return PyErr_SetFromWindowsErrWithFunction(rc,
1361 "RegQueryValue");
Brian Curtin60853212010-05-26 17:43:50 +00001362
1363 bufSize = retSize;
1364 retBuf = (wchar_t *) PyMem_Malloc(bufSize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 if (retBuf == NULL)
1366 return PyErr_NoMemory();
Guido van Rossuma8c360e2007-07-17 20:50:43 +00001367
Brian Curtin60853212010-05-26 17:43:50 +00001368 while (1) {
1369 retSize = bufSize;
1370 rc = RegQueryValueW(hKey, subKey, retBuf, &retSize);
1371 if (rc != ERROR_MORE_DATA)
1372 break;
1373
1374 bufSize *= 2;
1375 tmp = (wchar_t *) PyMem_Realloc(retBuf, bufSize);
1376 if (tmp == NULL) {
1377 PyMem_Free(retBuf);
1378 return PyErr_NoMemory();
1379 }
1380 retBuf = tmp;
1381 }
1382
1383 if (rc != ERROR_SUCCESS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 PyMem_Free(retBuf);
1385 return PyErr_SetFromWindowsErrWithFunction(rc,
1386 "RegQueryValue");
1387 }
Guido van Rossuma8c360e2007-07-17 20:50:43 +00001388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 retStr = PyUnicode_FromUnicode(retBuf, wcslen(retBuf));
1390 PyMem_Free(retBuf);
1391 return retStr;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001392}
1393
1394static PyObject *
1395PyQueryValueEx(PyObject *self, PyObject *args)
1396{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001397 HKEY hKey;
1398 PyObject *obKey;
1399 wchar_t *valueName;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 long rc;
Brian Curtin60853212010-05-26 17:43:50 +00001402 BYTE *retBuf, *tmp;
1403 DWORD bufSize = 0, retSize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 DWORD typ;
1405 PyObject *obData;
1406 PyObject *result;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001408 if (!PyArg_ParseTuple(args, "OZ:QueryValueEx", &obKey, &valueName))
1409 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1412 return NULL;
Brian Curtin60853212010-05-26 17:43:50 +00001413
1414 rc = RegQueryValueExW(hKey, valueName, NULL, NULL, NULL, &bufSize);
1415 if (rc == ERROR_MORE_DATA)
1416 bufSize = 256;
1417 else if (rc != ERROR_SUCCESS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001418 return PyErr_SetFromWindowsErrWithFunction(rc,
1419 "RegQueryValueEx");
1420 retBuf = (BYTE *)PyMem_Malloc(bufSize);
1421 if (retBuf == NULL)
1422 return PyErr_NoMemory();
Brian Curtin60853212010-05-26 17:43:50 +00001423
1424 while (1) {
1425 retSize = bufSize;
1426 rc = RegQueryValueExW(hKey, valueName, NULL, &typ,
1427 (BYTE *)retBuf, &retSize);
1428 if (rc != ERROR_MORE_DATA)
1429 break;
1430
1431 bufSize *= 2;
1432 tmp = (char *) PyMem_Realloc(retBuf, bufSize);
1433 if (tmp == NULL) {
1434 PyMem_Free(retBuf);
1435 return PyErr_NoMemory();
1436 }
1437 retBuf = tmp;
1438 }
1439
1440 if (rc != ERROR_SUCCESS) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 PyMem_Free(retBuf);
1442 return PyErr_SetFromWindowsErrWithFunction(rc,
1443 "RegQueryValueEx");
1444 }
1445 obData = Reg2Py(retBuf, bufSize, typ);
1446 PyMem_Free(retBuf);
1447 if (obData == NULL)
1448 return NULL;
1449 result = Py_BuildValue("Oi", obData, typ);
1450 Py_DECREF(obData);
1451 return result;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001452}
1453
1454
1455static PyObject *
1456PySaveKey(PyObject *self, PyObject *args)
1457{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 HKEY hKey;
1459 PyObject *obKey;
1460 wchar_t *fileName;
1461 LPSECURITY_ATTRIBUTES pSA = NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 long rc;
1464 if (!PyArg_ParseTuple(args, "Ou:SaveKey", &obKey, &fileName))
1465 return NULL;
1466 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1467 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001468/* One day we may get security into the core?
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 if (!PyWinObject_AsSECURITY_ATTRIBUTES(obSA, &pSA, TRUE))
1470 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001471*/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 Py_BEGIN_ALLOW_THREADS
1473 rc = RegSaveKeyW(hKey, fileName, pSA );
1474 Py_END_ALLOW_THREADS
1475 if (rc != ERROR_SUCCESS)
1476 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSaveKey");
1477 Py_INCREF(Py_None);
1478 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001479}
1480
1481static PyObject *
1482PySetValue(PyObject *self, PyObject *args)
1483{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 HKEY hKey;
1485 PyObject *obKey;
1486 wchar_t *subKey;
1487 wchar_t *str;
1488 DWORD typ;
1489 DWORD len;
1490 long rc;
1491 if (!PyArg_ParseTuple(args, "OZiu#:SetValue",
1492 &obKey,
1493 &subKey,
1494 &typ,
1495 &str,
1496 &len))
1497 return NULL;
1498 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1499 return NULL;
1500 if (typ != REG_SZ) {
1501 PyErr_SetString(PyExc_TypeError,
1502 "Type must be winreg.REG_SZ");
1503 return NULL;
1504 }
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 Py_BEGIN_ALLOW_THREADS
1507 rc = RegSetValueW(hKey, subKey, REG_SZ, str, len+1);
1508 Py_END_ALLOW_THREADS
1509 if (rc != ERROR_SUCCESS)
1510 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSetValue");
1511 Py_INCREF(Py_None);
1512 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001513}
1514
1515static PyObject *
1516PySetValueEx(PyObject *self, PyObject *args)
1517{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 HKEY hKey;
1519 PyObject *obKey;
1520 Py_UNICODE *valueName;
1521 PyObject *obRes;
1522 PyObject *value;
1523 BYTE *data;
1524 DWORD len;
1525 DWORD typ;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 LONG rc;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 if (!PyArg_ParseTuple(args, "OZOiO:SetValueEx",
1530 &obKey,
1531 &valueName,
1532 &obRes,
1533 &typ,
1534 &value))
1535 return NULL;
1536 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1537 return NULL;
1538 if (!Py2Reg(value, typ, &data, &len))
1539 {
1540 if (!PyErr_Occurred())
1541 PyErr_SetString(PyExc_ValueError,
1542 "Could not convert the data to the specified type.");
1543 return NULL;
1544 }
1545 Py_BEGIN_ALLOW_THREADS
1546 rc = RegSetValueExW(hKey, valueName, 0, typ, data, len);
1547 Py_END_ALLOW_THREADS
1548 PyMem_DEL(data);
1549 if (rc != ERROR_SUCCESS)
1550 return PyErr_SetFromWindowsErrWithFunction(rc,
1551 "RegSetValueEx");
1552 Py_INCREF(Py_None);
1553 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001554}
1555
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001556static PyObject *
1557PyDisableReflectionKey(PyObject *self, PyObject *args)
1558{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 HKEY hKey;
1560 PyObject *obKey;
1561 HMODULE hMod;
1562 typedef LONG (WINAPI *RDRKFunc)(HKEY);
1563 RDRKFunc pfn = NULL;
1564 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 if (!PyArg_ParseTuple(args, "O:DisableReflectionKey", &obKey))
1567 return NULL;
1568 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1569 return NULL;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001571 /* Only available on 64bit platforms, so we must load it
1572 dynamically.*/
1573 hMod = GetModuleHandle("advapi32.dll");
1574 if (hMod)
1575 pfn = (RDRKFunc)GetProcAddress(hMod,
1576 "RegDisableReflectionKey");
1577 if (!pfn) {
1578 PyErr_SetString(PyExc_NotImplementedError,
1579 "not implemented on this platform");
1580 return NULL;
1581 }
1582 Py_BEGIN_ALLOW_THREADS
1583 rc = (*pfn)(hKey);
1584 Py_END_ALLOW_THREADS
1585 if (rc != ERROR_SUCCESS)
1586 return PyErr_SetFromWindowsErrWithFunction(rc,
1587 "RegDisableReflectionKey");
1588 Py_INCREF(Py_None);
1589 return Py_None;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001590}
1591
1592static PyObject *
1593PyEnableReflectionKey(PyObject *self, PyObject *args)
1594{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001595 HKEY hKey;
1596 PyObject *obKey;
1597 HMODULE hMod;
1598 typedef LONG (WINAPI *RERKFunc)(HKEY);
1599 RERKFunc pfn = NULL;
1600 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 if (!PyArg_ParseTuple(args, "O:EnableReflectionKey", &obKey))
1603 return NULL;
1604 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1605 return NULL;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 /* Only available on 64bit platforms, so we must load it
1608 dynamically.*/
1609 hMod = GetModuleHandle("advapi32.dll");
1610 if (hMod)
1611 pfn = (RERKFunc)GetProcAddress(hMod,
1612 "RegEnableReflectionKey");
1613 if (!pfn) {
1614 PyErr_SetString(PyExc_NotImplementedError,
1615 "not implemented on this platform");
1616 return NULL;
1617 }
1618 Py_BEGIN_ALLOW_THREADS
1619 rc = (*pfn)(hKey);
1620 Py_END_ALLOW_THREADS
1621 if (rc != ERROR_SUCCESS)
1622 return PyErr_SetFromWindowsErrWithFunction(rc,
1623 "RegEnableReflectionKey");
1624 Py_INCREF(Py_None);
1625 return Py_None;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001626}
1627
1628static PyObject *
1629PyQueryReflectionKey(PyObject *self, PyObject *args)
1630{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 HKEY hKey;
1632 PyObject *obKey;
1633 HMODULE hMod;
1634 typedef LONG (WINAPI *RQRKFunc)(HKEY, BOOL *);
1635 RQRKFunc pfn = NULL;
1636 BOOL result;
1637 LONG rc;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 if (!PyArg_ParseTuple(args, "O:QueryReflectionKey", &obKey))
1640 return NULL;
1641 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1642 return NULL;
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001644 /* Only available on 64bit platforms, so we must load it
1645 dynamically.*/
1646 hMod = GetModuleHandle("advapi32.dll");
1647 if (hMod)
1648 pfn = (RQRKFunc)GetProcAddress(hMod,
1649 "RegQueryReflectionKey");
1650 if (!pfn) {
1651 PyErr_SetString(PyExc_NotImplementedError,
1652 "not implemented on this platform");
1653 return NULL;
1654 }
1655 Py_BEGIN_ALLOW_THREADS
1656 rc = (*pfn)(hKey, &result);
1657 Py_END_ALLOW_THREADS
1658 if (rc != ERROR_SUCCESS)
1659 return PyErr_SetFromWindowsErrWithFunction(rc,
1660 "RegQueryReflectionKey");
1661 return PyBool_FromLong(result);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001662}
1663
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001664static struct PyMethodDef winreg_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 {"CloseKey", PyCloseKey, METH_VARARGS, CloseKey_doc},
1666 {"ConnectRegistry", PyConnectRegistry, METH_VARARGS, ConnectRegistry_doc},
1667 {"CreateKey", PyCreateKey, METH_VARARGS, CreateKey_doc},
1668 {"CreateKeyEx", PyCreateKeyEx, METH_VARARGS, CreateKeyEx_doc},
1669 {"DeleteKey", PyDeleteKey, METH_VARARGS, DeleteKey_doc},
1670 {"DeleteKeyEx", PyDeleteKeyEx, METH_VARARGS, DeleteKeyEx_doc},
1671 {"DeleteValue", PyDeleteValue, METH_VARARGS, DeleteValue_doc},
1672 {"DisableReflectionKey", PyDisableReflectionKey, METH_VARARGS, DisableReflectionKey_doc},
1673 {"EnableReflectionKey", PyEnableReflectionKey, METH_VARARGS, EnableReflectionKey_doc},
1674 {"EnumKey", PyEnumKey, METH_VARARGS, EnumKey_doc},
1675 {"EnumValue", PyEnumValue, METH_VARARGS, EnumValue_doc},
1676 {"ExpandEnvironmentStrings", PyExpandEnvironmentStrings, METH_VARARGS,
1677 ExpandEnvironmentStrings_doc },
1678 {"FlushKey", PyFlushKey, METH_VARARGS, FlushKey_doc},
1679 {"LoadKey", PyLoadKey, METH_VARARGS, LoadKey_doc},
1680 {"OpenKey", PyOpenKey, METH_VARARGS, OpenKey_doc},
1681 {"OpenKeyEx", PyOpenKey, METH_VARARGS, OpenKeyEx_doc},
1682 {"QueryValue", PyQueryValue, METH_VARARGS, QueryValue_doc},
1683 {"QueryValueEx", PyQueryValueEx, METH_VARARGS, QueryValueEx_doc},
1684 {"QueryInfoKey", PyQueryInfoKey, METH_VARARGS, QueryInfoKey_doc},
1685 {"QueryReflectionKey",PyQueryReflectionKey,METH_VARARGS, QueryReflectionKey_doc},
1686 {"SaveKey", PySaveKey, METH_VARARGS, SaveKey_doc},
1687 {"SetValue", PySetValue, METH_VARARGS, SetValue_doc},
1688 {"SetValueEx", PySetValueEx, METH_VARARGS, SetValueEx_doc},
1689 NULL,
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001690};
1691
1692static void
1693insint(PyObject * d, char * name, long value)
1694{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 PyObject *v = PyLong_FromLong(value);
1696 if (!v || PyDict_SetItemString(d, name, v))
1697 PyErr_Clear();
1698 Py_XDECREF(v);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001699}
1700
1701#define ADD_INT(val) insint(d, #val, val)
1702
1703static void
1704inskey(PyObject * d, char * name, HKEY key)
1705{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 PyObject *v = PyLong_FromVoidPtr(key);
1707 if (!v || PyDict_SetItemString(d, name, v))
1708 PyErr_Clear();
1709 Py_XDECREF(v);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001710}
1711
1712#define ADD_KEY(val) inskey(d, #val, val)
1713
Martin v. Löwis1a214512008-06-11 05:26:20 +00001714
1715static struct PyModuleDef winregmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 PyModuleDef_HEAD_INIT,
1717 "winreg",
1718 module_doc,
1719 -1,
1720 winreg_methods,
1721 NULL,
1722 NULL,
1723 NULL,
1724 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00001725};
1726
1727PyMODINIT_FUNC PyInit_winreg(void)
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001728{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 PyObject *m, *d;
1730 m = PyModule_Create(&winregmodule);
1731 if (m == NULL)
1732 return NULL;
1733 d = PyModule_GetDict(m);
1734 PyHKEY_Type.tp_doc = PyHKEY_doc;
1735 if (PyType_Ready(&PyHKEY_Type) < 0)
1736 return NULL;
1737 Py_INCREF(&PyHKEY_Type);
1738 if (PyDict_SetItemString(d, "HKEYType",
1739 (PyObject *)&PyHKEY_Type) != 0)
1740 return NULL;
1741 Py_INCREF(PyExc_WindowsError);
1742 if (PyDict_SetItemString(d, "error",
1743 PyExc_WindowsError) != 0)
1744 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 /* Add the relevant constants */
1747 ADD_KEY(HKEY_CLASSES_ROOT);
1748 ADD_KEY(HKEY_CURRENT_USER);
1749 ADD_KEY(HKEY_LOCAL_MACHINE);
1750 ADD_KEY(HKEY_USERS);
1751 ADD_KEY(HKEY_PERFORMANCE_DATA);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001752#ifdef HKEY_CURRENT_CONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 ADD_KEY(HKEY_CURRENT_CONFIG);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001754#endif
1755#ifdef HKEY_DYN_DATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 ADD_KEY(HKEY_DYN_DATA);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001757#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001758 ADD_INT(KEY_QUERY_VALUE);
1759 ADD_INT(KEY_SET_VALUE);
1760 ADD_INT(KEY_CREATE_SUB_KEY);
1761 ADD_INT(KEY_ENUMERATE_SUB_KEYS);
1762 ADD_INT(KEY_NOTIFY);
1763 ADD_INT(KEY_CREATE_LINK);
1764 ADD_INT(KEY_READ);
1765 ADD_INT(KEY_WRITE);
1766 ADD_INT(KEY_EXECUTE);
1767 ADD_INT(KEY_ALL_ACCESS);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001768#ifdef KEY_WOW64_64KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 ADD_INT(KEY_WOW64_64KEY);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001770#endif
1771#ifdef KEY_WOW64_32KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 ADD_INT(KEY_WOW64_32KEY);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001773#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 ADD_INT(REG_OPTION_RESERVED);
1775 ADD_INT(REG_OPTION_NON_VOLATILE);
1776 ADD_INT(REG_OPTION_VOLATILE);
1777 ADD_INT(REG_OPTION_CREATE_LINK);
1778 ADD_INT(REG_OPTION_BACKUP_RESTORE);
1779 ADD_INT(REG_OPTION_OPEN_LINK);
1780 ADD_INT(REG_LEGAL_OPTION);
1781 ADD_INT(REG_CREATED_NEW_KEY);
1782 ADD_INT(REG_OPENED_EXISTING_KEY);
1783 ADD_INT(REG_WHOLE_HIVE_VOLATILE);
1784 ADD_INT(REG_REFRESH_HIVE);
1785 ADD_INT(REG_NO_LAZY_FLUSH);
1786 ADD_INT(REG_NOTIFY_CHANGE_NAME);
1787 ADD_INT(REG_NOTIFY_CHANGE_ATTRIBUTES);
1788 ADD_INT(REG_NOTIFY_CHANGE_LAST_SET);
1789 ADD_INT(REG_NOTIFY_CHANGE_SECURITY);
1790 ADD_INT(REG_LEGAL_CHANGE_FILTER);
1791 ADD_INT(REG_NONE);
1792 ADD_INT(REG_SZ);
1793 ADD_INT(REG_EXPAND_SZ);
1794 ADD_INT(REG_BINARY);
1795 ADD_INT(REG_DWORD);
1796 ADD_INT(REG_DWORD_LITTLE_ENDIAN);
1797 ADD_INT(REG_DWORD_BIG_ENDIAN);
1798 ADD_INT(REG_LINK);
1799 ADD_INT(REG_MULTI_SZ);
1800 ADD_INT(REG_RESOURCE_LIST);
1801 ADD_INT(REG_FULL_RESOURCE_DESCRIPTOR);
1802 ADD_INT(REG_RESOURCE_REQUIREMENTS_LIST);
1803 return m;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001804}
1805
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001806