blob: d60b15119291b0641b16d5a8b7e01e1ac2b94b83 [file] [log] [blame]
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001/*
Fred Drake270e19b2000-06-29 16:14:14 +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 Pitrouc83ea132010-05-09 14:46:46 +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"
17#include "malloc.h" /* for alloca */
Kristján Valur Jónsson629ec262007-05-26 19:31:39 +000018#include "windows.h"
Guido van Rossum9f3712c2000-03-28 20:37:15 +000019
20static BOOL PyHKEY_AsHKEY(PyObject *ob, HKEY *pRes, BOOL bNoneOK);
21static PyObject *PyHKEY_FromHKEY(HKEY h);
22static BOOL PyHKEY_Close(PyObject *obHandle);
23
24static char errNotAHandle[] = "Object is not a handle";
25
26/* The win32api module reports the function name that failed,
27 but this concept is not in the Python core.
Mark Dickinson3e4caeb2009-02-21 20:27:01 +000028 Hopefully it will one day, and in the meantime I don't
Guido van Rossum9f3712c2000-03-28 20:37:15 +000029 want to lose this info...
30*/
31#define PyErr_SetFromWindowsErrWithFunction(rc, fnname) \
Antoine Pitrouc83ea132010-05-09 14:46:46 +000032 PyErr_SetFromWindowsErr(rc)
Guido van Rossum9f3712c2000-03-28 20:37:15 +000033
34/* Forward declares */
35
36/* Doc strings */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000037PyDoc_STRVAR(module_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +000038"This module provides access to the Windows registry API.\n"
39"\n"
40"Functions:\n"
41"\n"
42"CloseKey() - Closes a registry key.\n"
43"ConnectRegistry() - Establishes a connection to a predefined registry handle\n"
44" on another computer.\n"
45"CreateKey() - Creates the specified key, or opens it if it already exists.\n"
46"DeleteKey() - Deletes the specified key.\n"
47"DeleteValue() - Removes a named value from the specified registry key.\n"
48"EnumKey() - Enumerates subkeys of the specified open registry key.\n"
49"EnumValue() - Enumerates values of the specified open registry key.\n"
Christian Heimesb39a7562008-01-08 15:46:10 +000050"ExpandEnvironmentStrings() - Expand the env strings in a REG_EXPAND_SZ string.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +000051"FlushKey() - Writes all the attributes of the specified key to the registry.\n"
52"LoadKey() - Creates a subkey under HKEY_USER or HKEY_LOCAL_MACHINE and stores\n"
53" registration information from a specified file into that subkey.\n"
54"OpenKey() - Alias for <om win32api.RegOpenKeyEx>\n"
55"OpenKeyEx() - Opens the specified key.\n"
56"QueryValue() - Retrieves the value associated with the unnamed value for a\n"
57" specified key in the registry.\n"
58"QueryValueEx() - Retrieves the type and data for a specified value name\n"
59" associated with an open registry key.\n"
60"QueryInfoKey() - Returns information about the specified key.\n"
61"SaveKey() - Saves the specified key, and all its subkeys a file.\n"
62"SetValue() - Associates a value with a specified key.\n"
63"SetValueEx() - Stores data in the value field of an open registry key.\n"
64"\n"
65"Special objects:\n"
66"\n"
67"HKEYType -- type object for HKEY objects\n"
68"error -- exception raised for Win32 errors\n"
69"\n"
70"Integer constants:\n"
71"Many constants are defined - see the documentation for each function\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000072"to see what constants are used, and where.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +000073
74
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000075PyDoc_STRVAR(CloseKey_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +000076"CloseKey(hkey) - Closes a previously opened registry key.\n"
77"\n"
78"The hkey argument specifies a previously opened key.\n"
79"\n"
80"Note that if the key is not closed using this method, it will be\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000081"closed when the hkey object is destroyed by Python.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +000082
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000083PyDoc_STRVAR(ConnectRegistry_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +000084"key = ConnectRegistry(computer_name, key) - "
85"Establishes a connection to a predefined registry handle on another computer.\n"
86"\n"
87"computer_name is the name of the remote computer, of the form \\\\computername.\n"
88" If None, the local computer is used.\n"
89"key is the predefined handle to connect to.\n"
90"\n"
91"The return value is the handle of the opened key.\n"
Brian Curtine33fa882010-04-02 21:18:14 +000092"If the function fails, a WindowsError exception is raised.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +000093
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000094PyDoc_STRVAR(CreateKey_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +000095"key = CreateKey(key, sub_key) - Creates or opens the specified key.\n"
96"\n"
97"key is an already open key, or one of the predefined HKEY_* constants\n"
98"sub_key is a string that names the key this method opens or creates.\n"
99" If key is one of the predefined keys, sub_key may be None. In that case,\n"
100" the handle returned is the same key handle passed in to the function.\n"
101"\n"
102"If the key already exists, this function opens the existing key\n"
103"\n"
104"The return value is the handle of the opened key.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000105"If the function fails, an exception is raised.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000106
Brian Curtine33fa882010-04-02 21:18:14 +0000107PyDoc_STRVAR(CreateKeyEx_doc,
108"key = CreateKeyEx(key, sub_key, res, sam) - Creates or opens the specified key.\n"
109"\n"
110"key is an already open key, or one of the predefined HKEY_* constants\n"
111"sub_key is a string that names the key this method opens or creates.\n"
112"res is a reserved integer, and must be zero. Default is zero.\n"
113"sam is an integer that specifies an access mask that describes the desired\n"
114" If key is one of the predefined keys, sub_key may be None. In that case,\n"
115" the handle returned is the same key handle passed in to the function.\n"
116"\n"
117"If the key already exists, this function opens the existing key\n"
118"\n"
119"The return value is the handle of the opened key.\n"
120"If the function fails, an exception is raised.");
121
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000122PyDoc_STRVAR(DeleteKey_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000123"DeleteKey(key, sub_key) - Deletes the specified key.\n"
124"\n"
125"key is an already open key, or any one of the predefined HKEY_* constants.\n"
126"sub_key is a string that must be a subkey of the key identified by the key parameter.\n"
127" This value must not be None, and the key may not have subkeys.\n"
128"\n"
129"This method can not delete keys with subkeys.\n"
130"\n"
131"If the method succeeds, the entire key, including all of its values,\n"
Brian Curtine33fa882010-04-02 21:18:14 +0000132"is removed. If the method fails, a WindowsError exception is raised.");
133
134PyDoc_STRVAR(DeleteKeyEx_doc,
135"DeleteKeyEx(key, sub_key, sam, res) - Deletes the specified key.\n"
136"\n"
137"key is an already open key, or any one of the predefined HKEY_* constants.\n"
138"sub_key is a string that must be a subkey of the key identified by the key parameter.\n"
139"res is a reserved integer, and must be zero. Default is zero.\n"
140"sam is an integer that specifies an access mask that describes the desired\n"
141" This value must not be None, and the key may not have subkeys.\n"
142"\n"
143"This method can not delete keys with subkeys.\n"
144"\n"
145"If the method succeeds, the entire key, including all of its values,\n"
146"is removed. If the method fails, a WindowsError exception is raised.\n"
147"On unsupported Windows versions, NotImplementedError is raised.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000148
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000149PyDoc_STRVAR(DeleteValue_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000150"DeleteValue(key, value) - Removes a named value from a registry key.\n"
151"\n"
152"key is an already open key, or any one of the predefined HKEY_* constants.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000153"value is a string that identifies the value to remove.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000154
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000155PyDoc_STRVAR(EnumKey_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000156"string = EnumKey(key, index) - Enumerates subkeys of an open registry key.\n"
157"\n"
158"key is an already open key, or any one of the predefined HKEY_* constants.\n"
159"index is an integer that identifies the index of the key to retrieve.\n"
160"\n"
161"The function retrieves the name of one subkey each time it is called.\n"
Brian Curtine33fa882010-04-02 21:18:14 +0000162"It is typically called repeatedly until a WindowsError exception is\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000163"raised, indicating no more values are available.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000164
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000165PyDoc_STRVAR(EnumValue_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000166"tuple = EnumValue(key, index) - Enumerates values of an open registry key.\n"
167"key is an already open key, or any one of the predefined HKEY_* constants.\n"
168"index is an integer that identifies the index of the value to retrieve.\n"
169"\n"
170"The function retrieves the name of one subkey each time it is called.\n"
Brian Curtine33fa882010-04-02 21:18:14 +0000171"It is typically called repeatedly, until a WindowsError exception\n"
Mark Hammondb422f952000-06-09 06:01:47 +0000172"is raised, indicating no more values.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000173"\n"
174"The result is a tuple of 3 items:\n"
175"value_name is a string that identifies the value.\n"
176"value_data is an object that holds the value data, and whose type depends\n"
177" on the underlying registry type.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000178"data_type is an integer that identifies the type of the value data.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000179
Christian Heimesb39a7562008-01-08 15:46:10 +0000180PyDoc_STRVAR(ExpandEnvironmentStrings_doc,
181"string = ExpandEnvironmentStrings(string) - Expand environment vars.\n");
182
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000183PyDoc_STRVAR(FlushKey_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000184"FlushKey(key) - Writes all the attributes of a key to the registry.\n"
185"\n"
186"key is an already open key, or any one of the predefined HKEY_* constants.\n"
187"\n"
188"It is not necessary to call RegFlushKey to change a key.\n"
189"Registry changes are flushed to disk by the registry using its lazy flusher.\n"
190"Registry changes are also flushed to disk at system shutdown.\n"
191"Unlike CloseKey(), the FlushKey() method returns only when all the data has\n"
192"been written to the registry.\n"
193"An application should only call FlushKey() if it requires absolute certainty that registry changes are on disk.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000194"If you don't know whether a FlushKey() call is required, it probably isn't.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000195
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000196PyDoc_STRVAR(LoadKey_doc,
Mark Hammondb422f952000-06-09 06:01:47 +0000197"LoadKey(key, sub_key, file_name) - Creates a subkey under the specified key\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000198"and stores registration information from a specified file into that subkey.\n"
199"\n"
200"key is an already open key, or any one of the predefined HKEY_* constants.\n"
201"sub_key is a string that identifies the sub_key to load\n"
202"file_name is the name of the file to load registry data from.\n"
203" This file must have been created with the SaveKey() function.\n"
204" Under the file allocation table (FAT) file system, the filename may not\n"
205"have an extension.\n"
206"\n"
207"A call to LoadKey() fails if the calling process does not have the\n"
208"SE_RESTORE_PRIVILEGE privilege.\n"
209"\n"
210"If key is a handle returned by ConnectRegistry(), then the path specified\n"
211"in fileName is relative to the remote computer.\n"
212"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000213"The docs imply key must be in the HKEY_USER or HKEY_LOCAL_MACHINE tree");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000214
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000215PyDoc_STRVAR(OpenKey_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000216"key = OpenKey(key, sub_key, res = 0, sam = KEY_READ) - Opens the specified key.\n"
217"\n"
218"key is an already open key, or any one of the predefined HKEY_* constants.\n"
219"sub_key is a string that identifies the sub_key to open\n"
220"res is a reserved integer, and must be zero. Default is zero.\n"
221"sam is an integer that specifies an access mask that describes the desired\n"
222" security access for the key. Default is KEY_READ\n"
223"\n"
224"The result is a new handle to the specified key\n"
Brian Curtine33fa882010-04-02 21:18:14 +0000225"If the function fails, a WindowsError exception is raised.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000226
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000227PyDoc_STRVAR(OpenKeyEx_doc, "See OpenKey()");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000228
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000229PyDoc_STRVAR(QueryInfoKey_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000230"tuple = QueryInfoKey(key) - Returns information about a key.\n"
231"\n"
232"key is an already open key, or any one of the predefined HKEY_* constants.\n"
233"\n"
234"The result is a tuple of 3 items:"
235"An integer that identifies the number of sub keys this key has.\n"
236"An integer that identifies the number of values this key has.\n"
237"A long integer that identifies when the key was last modified (if available)\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000238" as 100's of nanoseconds since Jan 1, 1600.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000239
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000240PyDoc_STRVAR(QueryValue_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000241"string = QueryValue(key, sub_key) - retrieves the unnamed value for a key.\n"
242"\n"
243"key is an already open key, or any one of the predefined HKEY_* constants.\n"
Mark Hammondb422f952000-06-09 06:01:47 +0000244"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 +0000245" is associated. If this parameter is None or empty, the function retrieves\n"
246" the value set by the SetValue() method for the key identified by key."
247"\n"
248"Values in the registry have name, type, and data components. This method\n"
249"retrieves the data for a key's first value that has a NULL name.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000250"But the underlying API call doesn't return the type, Lame Lame Lame, DONT USE THIS!!!");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000251
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000252PyDoc_STRVAR(QueryValueEx_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000253"value,type_id = QueryValueEx(key, value_name) - Retrieves the type and data for a specified value name associated with an open registry key.\n"
254"\n"
255"key is an already open key, or any one of the predefined HKEY_* constants.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000256"value_name is a string indicating the value to query");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000257
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000258PyDoc_STRVAR(SaveKey_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000259"SaveKey(key, file_name) - Saves the specified key, and all its subkeys to the specified file.\n"
260"\n"
261"key is an already open key, or any one of the predefined HKEY_* constants.\n"
262"file_name is the name of the file to save registry data to.\n"
263" This file cannot already exist. If this filename includes an extension,\n"
264" it cannot be used on file allocation table (FAT) file systems by the\n"
265" LoadKey(), ReplaceKey() or RestoreKey() methods.\n"
266"\n"
267"If key represents a key on a remote computer, the path described by\n"
268"file_name is relative to the remote computer.\n"
269"The caller of this method must possess the SeBackupPrivilege security privilege.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000270"This function passes NULL for security_attributes to the API.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000271
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000272PyDoc_STRVAR(SetValue_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000273"SetValue(key, sub_key, type, value) - Associates a value with a specified key.\n"
274"\n"
275"key is an already open key, or any one of the predefined HKEY_* constants.\n"
276"sub_key is a string that names the subkey with which the value is associated.\n"
277"type is an integer that specifies the type of the data. Currently this\n"
278" must be REG_SZ, meaning only strings are supported.\n"
279"value is a string that specifies the new value.\n"
280"\n"
281"If the key specified by the sub_key parameter does not exist, the SetValue\n"
282"function creates it.\n"
283"\n"
284"Value lengths are limited by available memory. Long values (more than\n"
285"2048 bytes) should be stored as files with the filenames stored in \n"
286"the configuration registry. This helps the registry perform efficiently.\n"
287"\n"
288"The key identified by the key parameter must have been opened with\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000289"KEY_SET_VALUE access.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000290
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000291PyDoc_STRVAR(SetValueEx_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000292"SetValueEx(key, value_name, reserved, type, value) - Stores data in the value field of an open registry key.\n"
293"\n"
294"key is an already open key, or any one of the predefined HKEY_* constants.\n"
Mark Hammondc9083b62003-01-15 23:38:15 +0000295"value_name is a string containing the name of the value to set, or None\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000296"type is an integer that specifies the type of the data. This should be one of:\n"
297" REG_BINARY -- Binary data in any form.\n"
298" REG_DWORD -- A 32-bit number.\n"
299" REG_DWORD_LITTLE_ENDIAN -- A 32-bit number in little-endian format.\n"
300" REG_DWORD_BIG_ENDIAN -- A 32-bit number in big-endian format.\n"
301" REG_EXPAND_SZ -- A null-terminated string that contains unexpanded references\n"
302" to environment variables (for example, %PATH%).\n"
303" REG_LINK -- A Unicode symbolic link.\n"
Mark Hammondb422f952000-06-09 06:01:47 +0000304" REG_MULTI_SZ -- An sequence of null-terminated strings, terminated by\n"
305" two null characters. Note that Python handles this\n"
306" termination automatically.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000307" REG_NONE -- No defined value type.\n"
308" REG_RESOURCE_LIST -- A device-driver resource list.\n"
309" REG_SZ -- A null-terminated string.\n"
310"reserved can be anything - zero is always passed to the API.\n"
311"value is a string that specifies the new value.\n"
312"\n"
313"This method can also set additional value and type information for the\n"
314"specified key. The key identified by the key parameter must have been\n"
315"opened with KEY_SET_VALUE access.\n"
316"\n"
317"To open the key, use the CreateKeyEx() or OpenKeyEx() methods.\n"
318"\n"
319"Value lengths are limited by available memory. Long values (more than\n"
320"2048 bytes) should be stored as files with the filenames stored in \n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000321"the configuration registry. This helps the registry perform efficiently.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000322
Mark Hammond8a3c8712008-04-06 01:42:06 +0000323PyDoc_STRVAR(DisableReflectionKey_doc,
Andrew M. Kuchlingeba00042008-04-08 01:33:10 +0000324"Disables registry reflection for 32-bit processes running on a 64-bit\n"
Mark Hammond8a3c8712008-04-06 01:42:06 +0000325"Operating System. Will generally raise NotImplemented if executed on\n"
Andrew M. Kuchlingeba00042008-04-08 01:33:10 +0000326"a 32-bit Operating System.\n"
Mark Hammond8a3c8712008-04-06 01:42:06 +0000327"If the key is not on the reflection list, the function succeeds but has no effect.\n"
328"Disabling reflection for a key does not affect reflection of any subkeys.");
329
330PyDoc_STRVAR(EnableReflectionKey_doc,
331"Restores registry reflection for the specified disabled key.\n"
Andrew M. Kuchlingeba00042008-04-08 01:33:10 +0000332"Will generally raise NotImplemented if executed on a 32-bit Operating System.\n"
Mark Hammond8a3c8712008-04-06 01:42:06 +0000333"Restoring reflection for a key does not affect reflection of any subkeys.");
334
335PyDoc_STRVAR(QueryReflectionKey_doc,
336"bool = QueryReflectionKey(hkey) - Determines the reflection state for the specified key.\n"
Andrew M. Kuchlingeba00042008-04-08 01:33:10 +0000337"Will generally raise NotImplemented if executed on a 32-bit Operating System.\n");
Mark Hammond8a3c8712008-04-06 01:42:06 +0000338
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000339/* PyHKEY docstrings */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000340PyDoc_STRVAR(PyHKEY_doc,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000341"PyHKEY Object - A Python object, representing a win32 registry key.\n"
342"\n"
Mark Hammondb422f952000-06-09 06:01:47 +0000343"This object wraps a Windows HKEY object, automatically closing it when\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000344"the object is destroyed. To guarantee cleanup, you can call either\n"
345"the Close() method on the PyHKEY, or the CloseKey() method.\n"
346"\n"
347"All functions which accept a handle object also accept an integer - \n"
348"however, use of the handle object is encouraged.\n"
349"\n"
350"Functions:\n"
351"Close() - Closes the underlying handle.\n"
352"Detach() - Returns the integer Win32 handle, detaching it from the object\n"
353"\n"
354"Properties:\n"
355"handle - The integer Win32 handle.\n"
356"\n"
357"Operations:\n"
358"__nonzero__ - Handles with an open object return true, otherwise false.\n"
359"__int__ - Converting a handle to an integer returns the Win32 handle.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000360"__cmp__ - Handle objects are compared using the handle value.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000361
362
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000363PyDoc_STRVAR(PyHKEY_Close_doc,
Mark Hammondb422f952000-06-09 06:01:47 +0000364"key.Close() - Closes the underlying Windows handle.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000365"\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000366"If the handle is already closed, no error is raised.");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000367
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000368PyDoc_STRVAR(PyHKEY_Detach_doc,
Mark Hammondb422f952000-06-09 06:01:47 +0000369"int = key.Detach() - Detaches the Windows handle from the handle object.\n"
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000370"\n"
371"The result is the value of the handle before it is detached. If the\n"
372"handle is already detached, this will return zero.\n"
373"\n"
374"After calling this function, the handle is effectively invalidated,\n"
375"but the handle is not closed. You would call this function when you\n"
376"need the underlying win32 handle to exist beyond the lifetime of the\n"
Mark Hammondb422f952000-06-09 06:01:47 +0000377"handle object.\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000378"On 64 bit windows, the result of this function is a long integer");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000379
380
381/************************************************************************
382
383 The PyHKEY object definition
384
385************************************************************************/
386typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000387 PyObject_VAR_HEAD
388 HKEY hkey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000389} PyHKEYObject;
390
391#define PyHKEY_Check(op) ((op)->ob_type == &PyHKEY_Type)
392
393static char *failMsg = "bad operand type";
394
395static PyObject *
396PyHKEY_unaryFailureFunc(PyObject *ob)
397{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000398 PyErr_SetString(PyExc_TypeError, failMsg);
399 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000400}
401static PyObject *
402PyHKEY_binaryFailureFunc(PyObject *ob1, PyObject *ob2)
403{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000404 PyErr_SetString(PyExc_TypeError, failMsg);
405 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000406}
407static PyObject *
408PyHKEY_ternaryFailureFunc(PyObject *ob1, PyObject *ob2, PyObject *ob3)
409{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000410 PyErr_SetString(PyExc_TypeError, failMsg);
411 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000412}
413
414static void
415PyHKEY_deallocFunc(PyObject *ob)
416{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000417 /* Can not call PyHKEY_Close, as the ob->tp_type
418 has already been cleared, thus causing the type
419 check to fail!
420 */
421 PyHKEYObject *obkey = (PyHKEYObject *)ob;
422 if (obkey->hkey)
423 RegCloseKey((HKEY)obkey->hkey);
424 PyObject_DEL(ob);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000425}
426
427static int
428PyHKEY_nonzeroFunc(PyObject *ob)
429{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000430 return ((PyHKEYObject *)ob)->hkey != 0;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000431}
432
433static PyObject *
434PyHKEY_intFunc(PyObject *ob)
435{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000436 PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
437 return PyLong_FromVoidPtr(pyhkey->hkey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000438}
439
440static int
441PyHKEY_printFunc(PyObject *ob, FILE *fp, int flags)
442{
Amaury Forgeot d'Arca18392a2009-01-13 23:19:08 +0000443 PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
444 fprintf(fp, "<PyHKEY at %p (%p)>",
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000445 ob, pyhkey->hkey);
Amaury Forgeot d'Arca18392a2009-01-13 23:19:08 +0000446 return 0;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000447}
448
449static PyObject *
450PyHKEY_strFunc(PyObject *ob)
451{
Amaury Forgeot d'Arca18392a2009-01-13 23:19:08 +0000452 PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
453 return PyString_FromFormat("<PyHKEY:%p>", pyhkey->hkey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000454}
455
456static int
457PyHKEY_compareFunc(PyObject *ob1, PyObject *ob2)
458{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000459 PyHKEYObject *pyhkey1 = (PyHKEYObject *)ob1;
460 PyHKEYObject *pyhkey2 = (PyHKEYObject *)ob2;
461 return pyhkey1 == pyhkey2 ? 0 :
462 (pyhkey1 < pyhkey2 ? -1 : 1);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000463}
464
465static long
466PyHKEY_hashFunc(PyObject *ob)
467{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000468 /* Just use the address.
469 XXX - should we use the handle value?
470 */
471 return _Py_HashPointer(ob);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000472}
473
474
475static PyNumberMethods PyHKEY_NumberMethods =
476{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000477 PyHKEY_binaryFailureFunc, /* nb_add */
478 PyHKEY_binaryFailureFunc, /* nb_subtract */
479 PyHKEY_binaryFailureFunc, /* nb_multiply */
480 PyHKEY_binaryFailureFunc, /* nb_divide */
481 PyHKEY_binaryFailureFunc, /* nb_remainder */
482 PyHKEY_binaryFailureFunc, /* nb_divmod */
483 PyHKEY_ternaryFailureFunc, /* nb_power */
484 PyHKEY_unaryFailureFunc, /* nb_negative */
485 PyHKEY_unaryFailureFunc, /* nb_positive */
486 PyHKEY_unaryFailureFunc, /* nb_absolute */
487 PyHKEY_nonzeroFunc, /* nb_nonzero */
488 PyHKEY_unaryFailureFunc, /* nb_invert */
489 PyHKEY_binaryFailureFunc, /* nb_lshift */
490 PyHKEY_binaryFailureFunc, /* nb_rshift */
491 PyHKEY_binaryFailureFunc, /* nb_and */
492 PyHKEY_binaryFailureFunc, /* nb_xor */
493 PyHKEY_binaryFailureFunc, /* nb_or */
494 0, /* nb_coerce (allowed to be zero) */
495 PyHKEY_intFunc, /* nb_int */
496 PyHKEY_unaryFailureFunc, /* nb_long */
497 PyHKEY_unaryFailureFunc, /* nb_float */
498 PyHKEY_unaryFailureFunc, /* nb_oct */
499 PyHKEY_unaryFailureFunc, /* nb_hex */
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000500};
501
Amaury Forgeot d'Arc901f2002009-06-09 23:08:13 +0000502static PyObject *PyHKEY_CloseMethod(PyObject *self, PyObject *args);
503static PyObject *PyHKEY_DetachMethod(PyObject *self, PyObject *args);
504static PyObject *PyHKEY_Enter(PyObject *self);
505static PyObject *PyHKEY_Exit(PyObject *self, PyObject *args);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000506
Amaury Forgeot d'Arc901f2002009-06-09 23:08:13 +0000507static struct PyMethodDef PyHKEY_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000508 {"Close", PyHKEY_CloseMethod, METH_VARARGS, PyHKEY_Close_doc},
509 {"Detach", PyHKEY_DetachMethod, METH_VARARGS, PyHKEY_Detach_doc},
510 {"__enter__", (PyCFunction)PyHKEY_Enter, METH_NOARGS, NULL},
511 {"__exit__", PyHKEY_Exit, METH_VARARGS, NULL},
512 {NULL}
Amaury Forgeot d'Arc901f2002009-06-09 23:08:13 +0000513};
514
515static PyMemberDef PyHKEY_memberlist[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000516 {"handle", T_PYSSIZET, offsetof(PyHKEYObject, hkey), READONLY},
517 {NULL} /* Sentinel */
Amaury Forgeot d'Arc901f2002009-06-09 23:08:13 +0000518};
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000519
520/* The type itself */
521PyTypeObject PyHKEY_Type =
522{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000523 PyVarObject_HEAD_INIT(0, 0) /* fill in type at module init */
524 "PyHKEY",
525 sizeof(PyHKEYObject),
526 0,
527 PyHKEY_deallocFunc, /* tp_dealloc */
528 PyHKEY_printFunc, /* tp_print */
529 0, /* tp_getattr */
530 0, /* tp_setattr */
531 PyHKEY_compareFunc, /* tp_compare */
532 0, /* tp_repr */
533 &PyHKEY_NumberMethods, /* tp_as_number */
534 0, /* tp_as_sequence */
535 0, /* tp_as_mapping */
536 PyHKEY_hashFunc, /* tp_hash */
537 0, /* tp_call */
538 PyHKEY_strFunc, /* tp_str */
539 0, /* tp_getattro */
540 0, /* tp_setattro */
541 0, /* tp_as_buffer */
542 Py_TPFLAGS_DEFAULT, /* tp_flags */
543 PyHKEY_doc, /* tp_doc */
544 0, /* tp_traverse */
545 0, /* tp_clear */
546 0, /* tp_richcompare */
547 0, /* tp_weaklistoffset */
548 0, /* tp_iter */
549 0, /* tp_iternext */
550 PyHKEY_methods, /* tp_methods */
551 PyHKEY_memberlist, /* tp_members */
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000552};
553
554/************************************************************************
555
556 The PyHKEY object methods
557
558************************************************************************/
559static PyObject *
560PyHKEY_CloseMethod(PyObject *self, PyObject *args)
561{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000562 if (!PyArg_ParseTuple(args, ":Close"))
563 return NULL;
564 if (!PyHKEY_Close(self))
565 return NULL;
566 Py_INCREF(Py_None);
567 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000568}
569
570static PyObject *
571PyHKEY_DetachMethod(PyObject *self, PyObject *args)
572{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000573 void* ret;
574 PyHKEYObject *pThis = (PyHKEYObject *)self;
575 if (!PyArg_ParseTuple(args, ":Detach"))
576 return NULL;
577 ret = (void*)pThis->hkey;
578 pThis->hkey = 0;
579 return PyLong_FromVoidPtr(ret);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000580}
581
Christian Heimesb39a7562008-01-08 15:46:10 +0000582static PyObject *
583PyHKEY_Enter(PyObject *self)
584{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000585 Py_XINCREF(self);
586 return self;
Christian Heimesb39a7562008-01-08 15:46:10 +0000587}
588
589static PyObject *
590PyHKEY_Exit(PyObject *self, PyObject *args)
591{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000592 if (!PyHKEY_Close(self))
593 return NULL;
594 Py_RETURN_NONE;
Christian Heimesb39a7562008-01-08 15:46:10 +0000595}
596
597
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000598/************************************************************************
599 The public PyHKEY API (well, not public yet :-)
600************************************************************************/
601PyObject *
602PyHKEY_New(HKEY hInit)
603{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000604 PyHKEYObject *key = PyObject_NEW(PyHKEYObject, &PyHKEY_Type);
605 if (key)
606 key->hkey = hInit;
607 return (PyObject *)key;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000608}
609
610BOOL
611PyHKEY_Close(PyObject *ob_handle)
612{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000613 LONG rc;
614 PyHKEYObject *key;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000615
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000616 if (!PyHKEY_Check(ob_handle)) {
617 PyErr_SetString(PyExc_TypeError, "bad operand type");
618 return FALSE;
619 }
620 key = (PyHKEYObject *)ob_handle;
621 rc = key->hkey ? RegCloseKey((HKEY)key->hkey) : ERROR_SUCCESS;
622 key->hkey = 0;
623 if (rc != ERROR_SUCCESS)
624 PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
625 return rc == ERROR_SUCCESS;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000626}
627
628BOOL
629PyHKEY_AsHKEY(PyObject *ob, HKEY *pHANDLE, BOOL bNoneOK)
630{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000631 if (ob == Py_None) {
632 if (!bNoneOK) {
633 PyErr_SetString(
634 PyExc_TypeError,
635 "None is not a valid HKEY in this context");
636 return FALSE;
637 }
638 *pHANDLE = (HKEY)0;
639 }
640 else if (PyHKEY_Check(ob)) {
641 PyHKEYObject *pH = (PyHKEYObject *)ob;
642 *pHANDLE = pH->hkey;
643 }
644 else if (PyInt_Check(ob) || PyLong_Check(ob)) {
645 /* We also support integers */
646 PyErr_Clear();
647 *pHANDLE = (HKEY)PyLong_AsVoidPtr(ob);
648 if (PyErr_Occurred())
649 return FALSE;
650 }
651 else {
652 PyErr_SetString(
653 PyExc_TypeError,
654 "The object is not a PyHKEY object");
655 return FALSE;
656 }
657 return TRUE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000658}
659
660PyObject *
661PyHKEY_FromHKEY(HKEY h)
662{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000663 PyHKEYObject *op;
Guido van Rossumb18618d2000-05-03 23:44:39 +0000664
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000665 /* Inline PyObject_New */
666 op = (PyHKEYObject *) PyObject_MALLOC(sizeof(PyHKEYObject));
667 if (op == NULL)
668 return PyErr_NoMemory();
669 PyObject_INIT(op, &PyHKEY_Type);
670 op->hkey = h;
671 return (PyObject *)op;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000672}
673
674
675/************************************************************************
676 The module methods
677************************************************************************/
678BOOL
679PyWinObject_CloseHKEY(PyObject *obHandle)
680{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000681 BOOL ok;
682 if (PyHKEY_Check(obHandle)) {
683 ok = PyHKEY_Close(obHandle);
684 }
Fred Drake25e17262000-06-30 17:48:51 +0000685#if SIZEOF_LONG >= SIZEOF_HKEY
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000686 else if (PyInt_Check(obHandle)) {
687 long rc = RegCloseKey((HKEY)PyInt_AsLong(obHandle));
688 ok = (rc == ERROR_SUCCESS);
689 if (!ok)
690 PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
691 }
Fred Drake25e17262000-06-30 17:48:51 +0000692#else
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000693 else if (PyLong_Check(obHandle)) {
694 long rc = RegCloseKey((HKEY)PyLong_AsVoidPtr(obHandle));
695 ok = (rc == ERROR_SUCCESS);
696 if (!ok)
697 PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
698 }
Fred Drake25e17262000-06-30 17:48:51 +0000699#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000700 else {
701 PyErr_SetString(
702 PyExc_TypeError,
703 "A handle must be a HKEY object or an integer");
704 return FALSE;
705 }
706 return ok;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000707}
708
709
710/*
711 Private Helper functions for the registry interfaces
712
713** Note that fixupMultiSZ and countString have both had changes
714** made to support "incorrect strings". The registry specification
715** calls for strings to be terminated with 2 null bytes. It seems
Mark Dickinson3e4caeb2009-02-21 20:27:01 +0000716** some commercial packages install strings which don't conform,
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000717** causing this code to fail - however, "regedit" etc still work
Mark Dickinson3e4caeb2009-02-21 20:27:01 +0000718** with these strings (ie only we don't!).
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000719*/
720static void
721fixupMultiSZ(char **str, char *data, int len)
722{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000723 char *P;
724 int i;
725 char *Q;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000726
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000727 Q = data + len;
728 for (P = data, i = 0; P < Q && *P != '\0'; P++, i++) {
729 str[i] = P;
730 for(; *P != '\0'; P++)
731 ;
732 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000733}
734
735static int
736countStrings(char *data, int len)
737{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000738 int strings;
739 char *P;
740 char *Q = data + len;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000741
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000742 for (P = data, strings = 0; P < Q && *P != '\0'; P++, strings++)
743 for (; P < Q && *P != '\0'; P++)
744 ;
745 return strings;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000746}
747
748/* Convert PyObject into Registry data.
749 Allocates space as needed. */
750static BOOL
751Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
752{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000753 Py_ssize_t i,j;
754 switch (typ) {
755 case REG_DWORD:
Brian Curtin0e091b02012-12-27 12:28:51 -0600756 if (value != Py_None &&
757 !(PyInt_Check(value) || PyLong_Check(value)))
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000758 return FALSE;
759 *retDataBuf = (BYTE *)PyMem_NEW(DWORD, 1);
760 if (*retDataBuf==NULL){
761 PyErr_NoMemory();
762 return FALSE;
763 }
764 *retDataSize = sizeof(DWORD);
765 if (value == Py_None) {
766 DWORD zero = 0;
767 memcpy(*retDataBuf, &zero, sizeof(DWORD));
768 }
Brian Curtin0e091b02012-12-27 12:28:51 -0600769 else {
770 DWORD d = PyLong_AsUnsignedLong(value);
771 memcpy(*retDataBuf, &d, sizeof(DWORD));
772 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000773 break;
774 case REG_SZ:
775 case REG_EXPAND_SZ:
776 {
777 int need_decref = 0;
778 if (value == Py_None)
779 *retDataSize = 1;
780 else {
781 if (PyUnicode_Check(value)) {
782 value = PyUnicode_AsEncodedString(
783 value,
784 "mbcs",
785 NULL);
786 if (value==NULL)
787 return FALSE;
788 need_decref = 1;
789 }
790 if (!PyString_Check(value))
791 return FALSE;
792 *retDataSize = 1 + strlen(
793 PyString_AS_STRING(
794 (PyStringObject *)value));
795 }
796 *retDataBuf = (BYTE *)PyMem_NEW(DWORD, *retDataSize);
797 if (*retDataBuf==NULL){
798 PyErr_NoMemory();
799 return FALSE;
800 }
801 if (value == Py_None)
802 strcpy((char *)*retDataBuf, "");
803 else
804 strcpy((char *)*retDataBuf,
805 PyString_AS_STRING(
806 (PyStringObject *)value));
807 if (need_decref)
808 Py_DECREF(value);
809 break;
810 }
811 case REG_MULTI_SZ:
812 {
813 DWORD size = 0;
814 char *P;
815 PyObject **obs = NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000816
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000817 if (value == Py_None)
818 i = 0;
819 else {
820 if (!PyList_Check(value))
821 return FALSE;
822 i = PyList_Size(value);
823 }
824 obs = malloc(sizeof(PyObject *) * i);
825 memset(obs, 0, sizeof(PyObject *) * i);
826 for (j = 0; j < i; j++)
827 {
828 PyObject *t;
829 t = PyList_GET_ITEM(
830 (PyListObject *)value,j);
831 if (PyString_Check(t)) {
832 obs[j] = t;
833 Py_INCREF(t);
834 } else if (PyUnicode_Check(t)) {
835 obs[j] = PyUnicode_AsEncodedString(
836 t,
837 "mbcs",
838 NULL);
839 if (obs[j]==NULL)
840 goto reg_multi_fail;
841 } else
842 goto reg_multi_fail;
843 size += 1 + strlen(
844 PyString_AS_STRING(
845 (PyStringObject *)obs[j]));
846 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000847
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000848 *retDataSize = size + 1;
849 *retDataBuf = (BYTE *)PyMem_NEW(char,
850 *retDataSize);
851 if (*retDataBuf==NULL){
852 PyErr_NoMemory();
853 goto reg_multi_fail;
854 }
855 P = (char *)*retDataBuf;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000856
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000857 for (j = 0; j < i; j++)
858 {
859 PyObject *t;
860 t = obs[j];
861 strcpy(P,
862 PyString_AS_STRING(
863 (PyStringObject *)t));
864 P += 1 + strlen(
865 PyString_AS_STRING(
866 (PyStringObject *)t));
867 Py_DECREF(obs[j]);
868 }
869 /* And doubly-terminate the list... */
870 *P = '\0';
871 free(obs);
872 break;
873 reg_multi_fail:
874 if (obs) {
875 for (j = 0; j < i; j++)
876 Py_XDECREF(obs[j]);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000877
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000878 free(obs);
879 }
880 return FALSE;
881 }
882 case REG_BINARY:
883 /* ALSO handle ALL unknown data types here. Even if we can't
884 support it natively, we should handle the bits. */
885 default:
886 if (value == Py_None)
887 *retDataSize = 0;
888 else {
889 void *src_buf;
890 PyBufferProcs *pb = value->ob_type->tp_as_buffer;
891 if (pb==NULL) {
892 PyErr_Format(PyExc_TypeError,
893 "Objects of type '%s' can not "
894 "be used as binary registry values",
895 value->ob_type->tp_name);
896 return FALSE;
897 }
898 *retDataSize = (*pb->bf_getreadbuffer)(value, 0, &src_buf);
899 *retDataBuf = (BYTE *)PyMem_NEW(char,
900 *retDataSize);
901 if (*retDataBuf==NULL){
902 PyErr_NoMemory();
903 return FALSE;
904 }
905 memcpy(*retDataBuf, src_buf, *retDataSize);
906 }
907 break;
908 }
909 return TRUE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000910}
911
912/* Convert Registry data into PyObject*/
913static PyObject *
914Reg2Py(char *retDataBuf, DWORD retDataSize, DWORD typ)
915{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000916 PyObject *obData;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000917
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000918 switch (typ) {
919 case REG_DWORD:
920 if (retDataSize == 0)
Brian Curtin33e05e72012-12-27 14:37:06 -0600921 obData = Py_BuildValue("k", 0);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000922 else
Brian Curtin33e05e72012-12-27 14:37:06 -0600923 obData = Py_BuildValue("k",
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000924 *(int *)retDataBuf);
925 break;
926 case REG_SZ:
927 case REG_EXPAND_SZ:
928 /* retDataBuf may or may not have a trailing NULL in
929 the buffer. */
930 if (retDataSize && retDataBuf[retDataSize-1] == '\0')
931 --retDataSize;
932 if (retDataSize ==0)
933 retDataBuf = "";
934 obData = PyUnicode_DecodeMBCS(retDataBuf,
935 retDataSize,
936 NULL);
937 break;
938 case REG_MULTI_SZ:
939 if (retDataSize == 0)
940 obData = PyList_New(0);
941 else
942 {
943 int index = 0;
944 int s = countStrings(retDataBuf, retDataSize);
945 char **str = (char **)malloc(sizeof(char *)*s);
946 if (str == NULL)
947 return PyErr_NoMemory();
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000948
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000949 fixupMultiSZ(str, retDataBuf, retDataSize);
950 obData = PyList_New(s);
951 if (obData == NULL)
952 return NULL;
953 for (index = 0; index < s; index++)
954 {
955 size_t len = _mbstrlen(str[index]);
956 if (len > INT_MAX) {
957 PyErr_SetString(PyExc_OverflowError,
958 "registry string is too long for a Python string");
959 Py_DECREF(obData);
960 return NULL;
961 }
962 PyList_SetItem(obData,
963 index,
964 PyUnicode_DecodeMBCS(
965 (const char *)str[index],
966 (int)len,
967 NULL)
968 );
969 }
970 free(str);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000971
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000972 break;
973 }
974 case REG_BINARY:
975 /* ALSO handle ALL unknown data types here. Even if we can't
976 support it natively, we should handle the bits. */
977 default:
978 if (retDataSize == 0) {
979 Py_INCREF(Py_None);
980 obData = Py_None;
981 }
982 else
983 obData = Py_BuildValue("s#",
984 (char *)retDataBuf,
985 retDataSize);
986 break;
987 }
988 if (obData == NULL)
989 return NULL;
990 else
991 return obData;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000992}
993
994/* The Python methods */
995
996static PyObject *
997PyCloseKey(PyObject *self, PyObject *args)
998{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000999 PyObject *obKey;
1000 if (!PyArg_ParseTuple(args, "O:CloseKey", &obKey))
1001 return NULL;
1002 if (!PyHKEY_Close(obKey))
1003 return NULL;
1004 Py_INCREF(Py_None);
1005 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001006}
1007
1008static PyObject *
1009PyConnectRegistry(PyObject *self, PyObject *args)
1010{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001011 HKEY hKey;
1012 PyObject *obKey;
1013 char *szCompName = NULL;
1014 HKEY retKey;
1015 long rc;
1016 if (!PyArg_ParseTuple(args, "zO:ConnectRegistry", &szCompName, &obKey))
1017 return NULL;
1018 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1019 return NULL;
1020 Py_BEGIN_ALLOW_THREADS
1021 rc = RegConnectRegistry(szCompName, hKey, &retKey);
1022 Py_END_ALLOW_THREADS
1023 if (rc != ERROR_SUCCESS)
1024 return PyErr_SetFromWindowsErrWithFunction(rc,
1025 "ConnectRegistry");
1026 return PyHKEY_FromHKEY(retKey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001027}
1028
1029static PyObject *
1030PyCreateKey(PyObject *self, PyObject *args)
1031{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001032 HKEY hKey;
1033 PyObject *obKey;
1034 char *subKey;
1035 HKEY retKey;
1036 long rc;
1037 if (!PyArg_ParseTuple(args, "Oz:CreateKey", &obKey, &subKey))
1038 return NULL;
1039 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1040 return NULL;
1041 rc = RegCreateKey(hKey, subKey, &retKey);
1042 if (rc != ERROR_SUCCESS)
1043 return PyErr_SetFromWindowsErrWithFunction(rc, "CreateKey");
1044 return PyHKEY_FromHKEY(retKey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001045}
1046
1047static PyObject *
Brian Curtine33fa882010-04-02 21:18:14 +00001048PyCreateKeyEx(PyObject *self, PyObject *args)
1049{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001050 HKEY hKey;
1051 PyObject *obKey;
1052 char *subKey;
1053 HKEY retKey;
1054 int res = 0;
1055 REGSAM sam = KEY_WRITE;
1056 long rc;
1057 if (!PyArg_ParseTuple(args, "Oz|ii:CreateKeyEx", &obKey, &subKey,
1058 &res, &sam))
1059 return NULL;
1060 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1061 return NULL;
Brian Curtine33fa882010-04-02 21:18:14 +00001062
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001063 rc = RegCreateKeyEx(hKey, subKey, res, NULL, (DWORD)NULL,
1064 sam, NULL, &retKey, NULL);
1065 if (rc != ERROR_SUCCESS)
1066 return PyErr_SetFromWindowsErrWithFunction(rc, "CreateKeyEx");
1067 return PyHKEY_FromHKEY(retKey);
Brian Curtine33fa882010-04-02 21:18:14 +00001068}
1069
1070static PyObject *
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001071PyDeleteKey(PyObject *self, PyObject *args)
1072{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001073 HKEY hKey;
1074 PyObject *obKey;
1075 char *subKey;
1076 long rc;
1077 if (!PyArg_ParseTuple(args, "Os:DeleteKey", &obKey, &subKey))
1078 return NULL;
1079 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1080 return NULL;
1081 rc = RegDeleteKey(hKey, subKey );
1082 if (rc != ERROR_SUCCESS)
1083 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKey");
1084 Py_INCREF(Py_None);
1085 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001086}
1087
1088static PyObject *
Brian Curtine33fa882010-04-02 21:18:14 +00001089PyDeleteKeyEx(PyObject *self, PyObject *args)
1090{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001091 HKEY hKey;
1092 PyObject *obKey;
1093 HMODULE hMod;
1094 typedef LONG (WINAPI *RDKEFunc)(HKEY, const char*, REGSAM, int);
1095 RDKEFunc pfn = NULL;
1096 char *subKey;
1097 long rc;
1098 int res = 0;
1099 REGSAM sam = KEY_WOW64_64KEY;
Brian Curtine33fa882010-04-02 21:18:14 +00001100
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001101 if (!PyArg_ParseTuple(args, "Os|ii:DeleteKeyEx",
1102 &obKey, &subKey, &sam, &res))
1103 return NULL;
1104 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1105 return NULL;
Brian Curtine33fa882010-04-02 21:18:14 +00001106
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001107 /* Only available on 64bit platforms, so we must load it
1108 dynamically. */
1109 hMod = GetModuleHandle("advapi32.dll");
1110 if (hMod)
1111 pfn = (RDKEFunc)GetProcAddress(hMod,
1112 "RegDeleteKeyExA");
1113 if (!pfn) {
1114 PyErr_SetString(PyExc_NotImplementedError,
1115 "not implemented on this platform");
1116 return NULL;
1117 }
1118 Py_BEGIN_ALLOW_THREADS
1119 rc = (*pfn)(hKey, subKey, sam, res);
1120 Py_END_ALLOW_THREADS
Brian Curtine33fa882010-04-02 21:18:14 +00001121
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001122 if (rc != ERROR_SUCCESS)
1123 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKeyEx");
1124 Py_INCREF(Py_None);
1125 return Py_None;
Brian Curtine33fa882010-04-02 21:18:14 +00001126}
1127
1128static PyObject *
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001129PyDeleteValue(PyObject *self, PyObject *args)
1130{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001131 HKEY hKey;
1132 PyObject *obKey;
1133 char *subKey;
1134 long rc;
1135 if (!PyArg_ParseTuple(args, "Oz:DeleteValue", &obKey, &subKey))
1136 return NULL;
1137 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1138 return NULL;
1139 Py_BEGIN_ALLOW_THREADS
1140 rc = RegDeleteValue(hKey, subKey);
1141 Py_END_ALLOW_THREADS
1142 if (rc !=ERROR_SUCCESS)
1143 return PyErr_SetFromWindowsErrWithFunction(rc,
1144 "RegDeleteValue");
1145 Py_INCREF(Py_None);
1146 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001147}
1148
1149static PyObject *
1150PyEnumKey(PyObject *self, PyObject *args)
1151{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001152 HKEY hKey;
1153 PyObject *obKey;
1154 int index;
1155 long rc;
1156 PyObject *retStr;
Brian Curtinb64c89b2010-05-25 15:06:15 +00001157
1158 /* The Windows docs claim that the max key name length is 255
1159 * characters, plus a terminating nul character. However,
1160 * empirical testing demonstrates that it is possible to
1161 * create a 256 character key that is missing the terminating
1162 * nul. RegEnumKeyEx requires a 257 character buffer to
1163 * retrieve such a key name. */
1164 char tmpbuf[257];
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001165 DWORD len = sizeof(tmpbuf); /* includes NULL terminator */
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001166
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001167 if (!PyArg_ParseTuple(args, "Oi:EnumKey", &obKey, &index))
1168 return NULL;
1169 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1170 return NULL;
Tim Peters313fcd42006-02-19 04:05:39 +00001171
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001172 Py_BEGIN_ALLOW_THREADS
1173 rc = RegEnumKeyEx(hKey, index, tmpbuf, &len, NULL, NULL, NULL, NULL);
1174 Py_END_ALLOW_THREADS
1175 if (rc != ERROR_SUCCESS)
1176 return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKeyEx");
Tim Peters313fcd42006-02-19 04:05:39 +00001177
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001178 retStr = PyString_FromStringAndSize(tmpbuf, len);
1179 return retStr; /* can be NULL */
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001180}
1181
1182static PyObject *
1183PyEnumValue(PyObject *self, PyObject *args)
1184{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001185 HKEY hKey;
1186 PyObject *obKey;
1187 int index;
1188 long rc;
1189 char *retValueBuf;
1190 char *retDataBuf;
Brian Curtind7afd312010-06-08 21:15:06 +00001191 char *tmpBuf;
Brian Curtinb64c89b2010-05-25 15:06:15 +00001192 DWORD retValueSize, bufValueSize;
1193 DWORD retDataSize, bufDataSize;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001194 DWORD typ;
1195 PyObject *obData;
1196 PyObject *retVal;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001197
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001198 if (!PyArg_ParseTuple(args, "Oi:EnumValue", &obKey, &index))
1199 return NULL;
1200 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1201 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001202
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001203 if ((rc = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL,
1204 NULL,
1205 &retValueSize, &retDataSize, NULL, NULL))
1206 != ERROR_SUCCESS)
1207 return PyErr_SetFromWindowsErrWithFunction(rc,
1208 "RegQueryInfoKey");
1209 ++retValueSize; /* include null terminators */
1210 ++retDataSize;
Brian Curtinb64c89b2010-05-25 15:06:15 +00001211 bufDataSize = retDataSize;
1212 bufValueSize = retValueSize;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001213 retValueBuf = (char *)PyMem_Malloc(retValueSize);
1214 if (retValueBuf == NULL)
1215 return PyErr_NoMemory();
1216 retDataBuf = (char *)PyMem_Malloc(retDataSize);
1217 if (retDataBuf == NULL) {
1218 PyMem_Free(retValueBuf);
1219 return PyErr_NoMemory();
1220 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001221
Brian Curtinb64c89b2010-05-25 15:06:15 +00001222 while (1) {
Brian Curtinb64c89b2010-05-25 15:06:15 +00001223 Py_BEGIN_ALLOW_THREADS
1224 rc = RegEnumValue(hKey,
1225 index,
1226 retValueBuf,
1227 &retValueSize,
1228 NULL,
1229 &typ,
1230 (BYTE *)retDataBuf,
1231 &retDataSize);
1232 Py_END_ALLOW_THREADS
1233
1234 if (rc != ERROR_MORE_DATA)
1235 break;
1236
1237 bufDataSize *= 2;
Brian Curtind7afd312010-06-08 21:15:06 +00001238 tmpBuf = (char *)PyMem_Realloc(retDataBuf, bufDataSize);
1239 if (tmpBuf == NULL) {
Brian Curtinb64c89b2010-05-25 15:06:15 +00001240 PyErr_NoMemory();
1241 retVal = NULL;
1242 goto fail;
1243 }
Brian Curtind7afd312010-06-08 21:15:06 +00001244 retDataBuf = tmpBuf;
Brian Curtinb64c89b2010-05-25 15:06:15 +00001245 retDataSize = bufDataSize;
1246 retValueSize = bufValueSize;
1247 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001248
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001249 if (rc != ERROR_SUCCESS) {
1250 retVal = PyErr_SetFromWindowsErrWithFunction(rc,
1251 "PyRegEnumValue");
1252 goto fail;
1253 }
1254 obData = Reg2Py(retDataBuf, retDataSize, typ);
1255 if (obData == NULL) {
1256 retVal = NULL;
1257 goto fail;
1258 }
1259 retVal = Py_BuildValue("sOi", retValueBuf, obData, typ);
1260 Py_DECREF(obData);
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001261 fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001262 PyMem_Free(retValueBuf);
1263 PyMem_Free(retDataBuf);
1264 return retVal;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001265}
1266
1267static PyObject *
Christian Heimesb39a7562008-01-08 15:46:10 +00001268PyExpandEnvironmentStrings(PyObject *self, PyObject *args)
1269{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001270 Py_UNICODE *retValue = NULL;
1271 Py_UNICODE *src;
1272 DWORD retValueSize;
1273 DWORD rc;
1274 PyObject *o;
Christian Heimesb39a7562008-01-08 15:46:10 +00001275
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001276 if (!PyArg_ParseTuple(args, "u:ExpandEnvironmentStrings", &src))
1277 return NULL;
Christian Heimesb39a7562008-01-08 15:46:10 +00001278
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001279 retValueSize = ExpandEnvironmentStringsW(src, retValue, 0);
1280 if (retValueSize == 0) {
1281 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1282 "ExpandEnvironmentStrings");
1283 }
1284 retValue = (Py_UNICODE *)PyMem_Malloc(retValueSize * sizeof(Py_UNICODE));
1285 if (retValue == NULL) {
1286 return PyErr_NoMemory();
1287 }
Christian Heimesb39a7562008-01-08 15:46:10 +00001288
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001289 rc = ExpandEnvironmentStringsW(src, retValue, retValueSize);
1290 if (rc == 0) {
1291 PyMem_Free(retValue);
1292 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1293 "ExpandEnvironmentStrings");
1294 }
1295 o = PyUnicode_FromUnicode(retValue, wcslen(retValue));
1296 PyMem_Free(retValue);
1297 return o;
Christian Heimesb39a7562008-01-08 15:46:10 +00001298}
1299
1300static PyObject *
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001301PyFlushKey(PyObject *self, PyObject *args)
1302{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001303 HKEY hKey;
1304 PyObject *obKey;
1305 long rc;
1306 if (!PyArg_ParseTuple(args, "O:FlushKey", &obKey))
1307 return NULL;
1308 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1309 return NULL;
1310 Py_BEGIN_ALLOW_THREADS
1311 rc = RegFlushKey(hKey);
1312 Py_END_ALLOW_THREADS
1313 if (rc != ERROR_SUCCESS)
1314 return PyErr_SetFromWindowsErrWithFunction(rc, "RegFlushKey");
1315 Py_INCREF(Py_None);
1316 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001317}
1318static PyObject *
1319PyLoadKey(PyObject *self, PyObject *args)
1320{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001321 HKEY hKey;
1322 PyObject *obKey;
1323 char *subKey;
1324 char *fileName;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001325
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001326 long rc;
1327 if (!PyArg_ParseTuple(args, "Oss:LoadKey", &obKey, &subKey, &fileName))
1328 return NULL;
1329 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1330 return NULL;
1331 Py_BEGIN_ALLOW_THREADS
1332 rc = RegLoadKey(hKey, subKey, fileName );
1333 Py_END_ALLOW_THREADS
1334 if (rc != ERROR_SUCCESS)
1335 return PyErr_SetFromWindowsErrWithFunction(rc, "RegLoadKey");
1336 Py_INCREF(Py_None);
1337 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001338}
1339
1340static PyObject *
1341PyOpenKey(PyObject *self, PyObject *args)
1342{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001343 HKEY hKey;
1344 PyObject *obKey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001345
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001346 char *subKey;
1347 int res = 0;
1348 HKEY retKey;
1349 long rc;
1350 REGSAM sam = KEY_READ;
1351 if (!PyArg_ParseTuple(args, "Oz|ii:OpenKey", &obKey, &subKey,
1352 &res, &sam))
1353 return NULL;
1354 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1355 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001356
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001357 Py_BEGIN_ALLOW_THREADS
1358 rc = RegOpenKeyEx(hKey, subKey, res, sam, &retKey);
1359 Py_END_ALLOW_THREADS
1360 if (rc != ERROR_SUCCESS)
1361 return PyErr_SetFromWindowsErrWithFunction(rc, "RegOpenKeyEx");
1362 return PyHKEY_FromHKEY(retKey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001363}
1364
1365
1366static PyObject *
1367PyQueryInfoKey(PyObject *self, PyObject *args)
1368{
1369 HKEY hKey;
1370 PyObject *obKey;
1371 long rc;
1372 DWORD nSubKeys, nValues;
1373 FILETIME ft;
1374 LARGE_INTEGER li;
1375 PyObject *l;
1376 PyObject *ret;
1377 if (!PyArg_ParseTuple(args, "O:QueryInfoKey", &obKey))
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001378 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001379 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001380 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001381 if ((rc = RegQueryInfoKey(hKey, NULL, NULL, 0, &nSubKeys, NULL, NULL,
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001382 &nValues, NULL, NULL, NULL, &ft))
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001383 != ERROR_SUCCESS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001384 return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryInfoKey");
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001385 li.LowPart = ft.dwLowDateTime;
1386 li.HighPart = ft.dwHighDateTime;
1387 l = PyLong_FromLongLong(li.QuadPart);
1388 if (l == NULL)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001389 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001390 ret = Py_BuildValue("iiO", nSubKeys, nValues, l);
1391 Py_DECREF(l);
1392 return ret;
1393}
1394
1395static PyObject *
1396PyQueryValue(PyObject *self, PyObject *args)
1397{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001398 HKEY hKey;
1399 PyObject *obKey;
1400 char *subKey;
1401 long rc;
1402 PyObject *retStr;
1403 char *retBuf;
Brian Curtinb64c89b2010-05-25 15:06:15 +00001404 DWORD bufSize = 0;
1405 DWORD retSize = 0;
1406 char *tmp;
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001407
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001408 if (!PyArg_ParseTuple(args, "Oz:QueryValue", &obKey, &subKey))
1409 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001410
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001411 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1412 return NULL;
Brian Curtinb64c89b2010-05-25 15:06:15 +00001413
1414 rc = RegQueryValue(hKey, subKey, NULL, &retSize);
1415 if (rc == ERROR_MORE_DATA)
1416 retSize = 256;
1417 else if (rc != ERROR_SUCCESS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001418 return PyErr_SetFromWindowsErrWithFunction(rc,
1419 "RegQueryValue");
Brian Curtinb64c89b2010-05-25 15:06:15 +00001420
1421 bufSize = retSize;
1422 retBuf = (char *) PyMem_Malloc(bufSize);
1423 if (retBuf == NULL)
1424 return PyErr_NoMemory();
1425
1426 while (1) {
1427 retSize = bufSize;
1428 rc = RegQueryValue(hKey, subKey, retBuf, &retSize);
1429 if (rc != ERROR_MORE_DATA)
1430 break;
1431
1432 bufSize *= 2;
1433 tmp = (char *) PyMem_Realloc(retBuf, bufSize);
1434 if (tmp == NULL) {
1435 PyMem_Free(retBuf);
1436 return PyErr_NoMemory();
1437 }
1438 retBuf = tmp;
1439 }
1440
1441 if (rc != ERROR_SUCCESS) {
1442 PyMem_Free(retBuf);
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001443 return PyErr_SetFromWindowsErrWithFunction(rc,
1444 "RegQueryValue");
1445 }
Brian Curtinb64c89b2010-05-25 15:06:15 +00001446
1447 if (retBuf[retSize-1] == '\x00')
1448 retSize--;
1449 retStr = PyString_FromStringAndSize(retBuf, retSize);
1450 if (retStr == NULL) {
1451 PyMem_Free(retBuf);
1452 return NULL;
1453 }
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001454 return retStr;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001455}
1456
1457static PyObject *
1458PyQueryValueEx(PyObject *self, PyObject *args)
1459{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001460 HKEY hKey;
1461 PyObject *obKey;
1462 char *valueName;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001463
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001464 long rc;
Brian Curtinb64c89b2010-05-25 15:06:15 +00001465 char *retBuf, *tmp;
1466 DWORD bufSize = 0, retSize;
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001467 DWORD typ;
1468 PyObject *obData;
1469 PyObject *result;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001470
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001471 if (!PyArg_ParseTuple(args, "Oz:QueryValueEx", &obKey, &valueName))
1472 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001473
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001474 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1475 return NULL;
Brian Curtinb64c89b2010-05-25 15:06:15 +00001476
1477 rc = RegQueryValueEx(hKey, valueName, NULL, NULL, NULL, &bufSize);
1478 if (rc == ERROR_MORE_DATA)
1479 bufSize = 256;
1480 else if (rc != ERROR_SUCCESS)
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001481 return PyErr_SetFromWindowsErrWithFunction(rc,
1482 "RegQueryValueEx");
1483 retBuf = (char *)PyMem_Malloc(bufSize);
1484 if (retBuf == NULL)
1485 return PyErr_NoMemory();
Brian Curtinb64c89b2010-05-25 15:06:15 +00001486
1487 while (1) {
1488 retSize = bufSize;
1489 rc = RegQueryValueEx(hKey, valueName, NULL, &typ,
1490 (BYTE *)retBuf, &retSize);
1491 if (rc != ERROR_MORE_DATA)
1492 break;
1493
1494 bufSize *= 2;
1495 tmp = (char *) PyMem_Realloc(retBuf, bufSize);
1496 if (tmp == NULL) {
1497 PyMem_Free(retBuf);
1498 return PyErr_NoMemory();
1499 }
1500 retBuf = tmp;
1501 }
1502
1503 if (rc != ERROR_SUCCESS) {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001504 PyMem_Free(retBuf);
1505 return PyErr_SetFromWindowsErrWithFunction(rc,
1506 "RegQueryValueEx");
1507 }
1508 obData = Reg2Py(retBuf, bufSize, typ);
1509 PyMem_Free((void *)retBuf);
1510 if (obData == NULL)
1511 return NULL;
1512 result = Py_BuildValue("Oi", obData, typ);
1513 Py_DECREF(obData);
1514 return result;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001515}
1516
1517
1518static PyObject *
1519PySaveKey(PyObject *self, PyObject *args)
1520{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001521 HKEY hKey;
1522 PyObject *obKey;
1523 char *fileName;
1524 LPSECURITY_ATTRIBUTES pSA = NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001525
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001526 long rc;
1527 if (!PyArg_ParseTuple(args, "Os:SaveKey", &obKey, &fileName))
1528 return NULL;
1529 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1530 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001531/* One day we may get security into the core?
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001532 if (!PyWinObject_AsSECURITY_ATTRIBUTES(obSA, &pSA, TRUE))
1533 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001534*/
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001535 Py_BEGIN_ALLOW_THREADS
1536 rc = RegSaveKey(hKey, fileName, pSA );
1537 Py_END_ALLOW_THREADS
1538 if (rc != ERROR_SUCCESS)
1539 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSaveKey");
1540 Py_INCREF(Py_None);
1541 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001542}
1543
1544static PyObject *
1545PySetValue(PyObject *self, PyObject *args)
1546{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001547 HKEY hKey;
1548 PyObject *obKey;
1549 char *subKey;
1550 char *str;
1551 DWORD typ;
1552 DWORD len;
1553 long rc;
1554 PyObject *obStrVal;
1555 PyObject *obSubKey;
1556 if (!PyArg_ParseTuple(args, "OOiO:SetValue",
1557 &obKey,
1558 &obSubKey,
1559 &typ,
1560 &obStrVal))
1561 return NULL;
1562 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1563 return NULL;
1564 if (typ != REG_SZ) {
1565 PyErr_SetString(PyExc_TypeError,
1566 "Type must be _winreg.REG_SZ");
1567 return NULL;
1568 }
1569 /* XXX - need Unicode support */
1570 str = PyString_AsString(obStrVal);
1571 if (str == NULL)
1572 return NULL;
1573 len = PyString_Size(obStrVal);
1574 if (obSubKey == Py_None)
1575 subKey = NULL;
1576 else {
1577 subKey = PyString_AsString(obSubKey);
1578 if (subKey == NULL)
1579 return NULL;
1580 }
1581 Py_BEGIN_ALLOW_THREADS
1582 rc = RegSetValue(hKey, subKey, REG_SZ, str, len+1);
1583 Py_END_ALLOW_THREADS
1584 if (rc != ERROR_SUCCESS)
1585 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSetValue");
1586 Py_INCREF(Py_None);
1587 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001588}
1589
1590static PyObject *
1591PySetValueEx(PyObject *self, PyObject *args)
1592{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001593 HKEY hKey;
1594 PyObject *obKey;
1595 char *valueName;
1596 PyObject *obRes;
1597 PyObject *value;
1598 BYTE *data;
1599 DWORD len;
1600 DWORD typ;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001601
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001602 LONG rc;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001603
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001604 if (!PyArg_ParseTuple(args, "OzOiO:SetValueEx",
1605 &obKey,
1606 &valueName,
1607 &obRes,
1608 &typ,
1609 &value))
1610 return NULL;
1611 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1612 return NULL;
1613 if (!Py2Reg(value, typ, &data, &len))
1614 {
1615 if (!PyErr_Occurred())
1616 PyErr_SetString(PyExc_ValueError,
1617 "Could not convert the data to the specified type.");
1618 return NULL;
1619 }
1620 Py_BEGIN_ALLOW_THREADS
1621 rc = RegSetValueEx(hKey, valueName, 0, typ, data, len);
1622 Py_END_ALLOW_THREADS
1623 PyMem_DEL(data);
1624 if (rc != ERROR_SUCCESS)
1625 return PyErr_SetFromWindowsErrWithFunction(rc,
1626 "RegSetValueEx");
1627 Py_INCREF(Py_None);
1628 return Py_None;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001629}
1630
Mark Hammond8a3c8712008-04-06 01:42:06 +00001631static PyObject *
1632PyDisableReflectionKey(PyObject *self, PyObject *args)
1633{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001634 HKEY hKey;
1635 PyObject *obKey;
1636 HMODULE hMod;
1637 typedef LONG (WINAPI *RDRKFunc)(HKEY);
1638 RDRKFunc pfn = NULL;
1639 LONG rc;
Mark Hammond8a3c8712008-04-06 01:42:06 +00001640
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001641 if (!PyArg_ParseTuple(args, "O:DisableReflectionKey", &obKey))
1642 return NULL;
1643 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1644 return NULL;
Mark Hammond8a3c8712008-04-06 01:42:06 +00001645
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001646 /* Only available on 64bit platforms, so we must load it
1647 dynamically. */
1648 hMod = GetModuleHandle("advapi32.dll");
1649 if (hMod)
1650 pfn = (RDRKFunc)GetProcAddress(hMod,
1651 "RegDisableReflectionKey");
1652 if (!pfn) {
1653 PyErr_SetString(PyExc_NotImplementedError,
1654 "not implemented on this platform");
1655 return NULL;
1656 }
1657 Py_BEGIN_ALLOW_THREADS
1658 rc = (*pfn)(hKey);
1659 Py_END_ALLOW_THREADS
1660 if (rc != ERROR_SUCCESS)
1661 return PyErr_SetFromWindowsErrWithFunction(rc,
1662 "RegDisableReflectionKey");
1663 Py_INCREF(Py_None);
1664 return Py_None;
Mark Hammond8a3c8712008-04-06 01:42:06 +00001665}
1666
1667static PyObject *
1668PyEnableReflectionKey(PyObject *self, PyObject *args)
1669{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001670 HKEY hKey;
1671 PyObject *obKey;
1672 HMODULE hMod;
1673 typedef LONG (WINAPI *RERKFunc)(HKEY);
1674 RERKFunc pfn = NULL;
1675 LONG rc;
Mark Hammond8a3c8712008-04-06 01:42:06 +00001676
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001677 if (!PyArg_ParseTuple(args, "O:EnableReflectionKey", &obKey))
1678 return NULL;
1679 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1680 return NULL;
Mark Hammond8a3c8712008-04-06 01:42:06 +00001681
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001682 /* Only available on 64bit platforms, so we must load it
1683 dynamically. */
1684 hMod = GetModuleHandle("advapi32.dll");
1685 if (hMod)
1686 pfn = (RERKFunc)GetProcAddress(hMod,
1687 "RegEnableReflectionKey");
1688 if (!pfn) {
1689 PyErr_SetString(PyExc_NotImplementedError,
1690 "not implemented on this platform");
1691 return NULL;
1692 }
1693 Py_BEGIN_ALLOW_THREADS
1694 rc = (*pfn)(hKey);
1695 Py_END_ALLOW_THREADS
1696 if (rc != ERROR_SUCCESS)
1697 return PyErr_SetFromWindowsErrWithFunction(rc,
1698 "RegEnableReflectionKey");
1699 Py_INCREF(Py_None);
1700 return Py_None;
Mark Hammond8a3c8712008-04-06 01:42:06 +00001701}
1702
1703static PyObject *
1704PyQueryReflectionKey(PyObject *self, PyObject *args)
1705{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001706 HKEY hKey;
1707 PyObject *obKey;
1708 HMODULE hMod;
1709 typedef LONG (WINAPI *RQRKFunc)(HKEY, BOOL *);
1710 RQRKFunc pfn = NULL;
1711 BOOL result;
1712 LONG rc;
Mark Hammond8a3c8712008-04-06 01:42:06 +00001713
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001714 if (!PyArg_ParseTuple(args, "O:QueryReflectionKey", &obKey))
1715 return NULL;
1716 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1717 return NULL;
Mark Hammond8a3c8712008-04-06 01:42:06 +00001718
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001719 /* Only available on 64bit platforms, so we must load it
1720 dynamically. */
1721 hMod = GetModuleHandle("advapi32.dll");
1722 if (hMod)
1723 pfn = (RQRKFunc)GetProcAddress(hMod,
1724 "RegQueryReflectionKey");
1725 if (!pfn) {
1726 PyErr_SetString(PyExc_NotImplementedError,
1727 "not implemented on this platform");
1728 return NULL;
1729 }
1730 Py_BEGIN_ALLOW_THREADS
1731 rc = (*pfn)(hKey, &result);
1732 Py_END_ALLOW_THREADS
1733 if (rc != ERROR_SUCCESS)
1734 return PyErr_SetFromWindowsErrWithFunction(rc,
1735 "RegQueryReflectionKey");
1736 return PyBool_FromLong(result);
Mark Hammond8a3c8712008-04-06 01:42:06 +00001737}
1738
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001739static struct PyMethodDef winreg_methods[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001740 {"CloseKey", PyCloseKey, METH_VARARGS, CloseKey_doc},
1741 {"ConnectRegistry", PyConnectRegistry, METH_VARARGS, ConnectRegistry_doc},
1742 {"CreateKey", PyCreateKey, METH_VARARGS, CreateKey_doc},
1743 {"CreateKeyEx", PyCreateKeyEx, METH_VARARGS, CreateKeyEx_doc},
1744 {"DeleteKey", PyDeleteKey, METH_VARARGS, DeleteKey_doc},
1745 {"DeleteKeyEx", PyDeleteKeyEx, METH_VARARGS, DeleteKeyEx_doc},
1746 {"DeleteValue", PyDeleteValue, METH_VARARGS, DeleteValue_doc},
1747 {"DisableReflectionKey", PyDisableReflectionKey, METH_VARARGS, DisableReflectionKey_doc},
1748 {"EnableReflectionKey", PyEnableReflectionKey, METH_VARARGS, EnableReflectionKey_doc},
1749 {"EnumKey", PyEnumKey, METH_VARARGS, EnumKey_doc},
1750 {"EnumValue", PyEnumValue, METH_VARARGS, EnumValue_doc},
1751 {"ExpandEnvironmentStrings", PyExpandEnvironmentStrings, METH_VARARGS,
1752 ExpandEnvironmentStrings_doc },
1753 {"FlushKey", PyFlushKey, METH_VARARGS, FlushKey_doc},
1754 {"LoadKey", PyLoadKey, METH_VARARGS, LoadKey_doc},
1755 {"OpenKey", PyOpenKey, METH_VARARGS, OpenKey_doc},
1756 {"OpenKeyEx", PyOpenKey, METH_VARARGS, OpenKeyEx_doc},
1757 {"QueryValue", PyQueryValue, METH_VARARGS, QueryValue_doc},
1758 {"QueryValueEx", PyQueryValueEx, METH_VARARGS, QueryValueEx_doc},
1759 {"QueryInfoKey", PyQueryInfoKey, METH_VARARGS, QueryInfoKey_doc},
1760 {"QueryReflectionKey",PyQueryReflectionKey,METH_VARARGS, QueryReflectionKey_doc},
1761 {"SaveKey", PySaveKey, METH_VARARGS, SaveKey_doc},
1762 {"SetValue", PySetValue, METH_VARARGS, SetValue_doc},
1763 {"SetValueEx", PySetValueEx, METH_VARARGS, SetValueEx_doc},
1764 NULL,
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001765};
1766
1767static void
1768insint(PyObject * d, char * name, long value)
1769{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001770 PyObject *v = PyInt_FromLong(value);
1771 if (!v || PyDict_SetItemString(d, name, v))
1772 PyErr_Clear();
1773 Py_XDECREF(v);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001774}
1775
1776#define ADD_INT(val) insint(d, #val, val)
1777
1778static void
1779inskey(PyObject * d, char * name, HKEY key)
1780{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001781 PyObject *v = PyLong_FromVoidPtr(key);
1782 if (!v || PyDict_SetItemString(d, name, v))
1783 PyErr_Clear();
1784 Py_XDECREF(v);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001785}
1786
1787#define ADD_KEY(val) inskey(d, #val, val)
1788
Mark Hammond8235ea12002-07-19 06:55:41 +00001789PyMODINIT_FUNC init_winreg(void)
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001790{
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001791 PyObject *m, *d;
1792 m = Py_InitModule3("_winreg", winreg_methods, module_doc);
1793 if (m == NULL)
1794 return;
1795 d = PyModule_GetDict(m);
1796 if (PyType_Ready(&PyHKEY_Type) < 0)
1797 return;
1798 PyHKEY_Type.tp_doc = PyHKEY_doc;
1799 Py_INCREF(&PyHKEY_Type);
1800 if (PyDict_SetItemString(d, "HKEYType",
1801 (PyObject *)&PyHKEY_Type) != 0)
1802 return;
1803 Py_INCREF(PyExc_WindowsError);
1804 if (PyDict_SetItemString(d, "error",
1805 PyExc_WindowsError) != 0)
1806 return;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001807
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001808 /* Add the relevant constants */
1809 ADD_KEY(HKEY_CLASSES_ROOT);
1810 ADD_KEY(HKEY_CURRENT_USER);
1811 ADD_KEY(HKEY_LOCAL_MACHINE);
1812 ADD_KEY(HKEY_USERS);
1813 ADD_KEY(HKEY_PERFORMANCE_DATA);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001814#ifdef HKEY_CURRENT_CONFIG
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001815 ADD_KEY(HKEY_CURRENT_CONFIG);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001816#endif
1817#ifdef HKEY_DYN_DATA
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001818 ADD_KEY(HKEY_DYN_DATA);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001819#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001820 ADD_INT(KEY_QUERY_VALUE);
1821 ADD_INT(KEY_SET_VALUE);
1822 ADD_INT(KEY_CREATE_SUB_KEY);
1823 ADD_INT(KEY_ENUMERATE_SUB_KEYS);
1824 ADD_INT(KEY_NOTIFY);
1825 ADD_INT(KEY_CREATE_LINK);
1826 ADD_INT(KEY_READ);
1827 ADD_INT(KEY_WRITE);
1828 ADD_INT(KEY_EXECUTE);
1829 ADD_INT(KEY_ALL_ACCESS);
Mark Hammond8a3c8712008-04-06 01:42:06 +00001830#ifdef KEY_WOW64_64KEY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001831 ADD_INT(KEY_WOW64_64KEY);
Mark Hammond8a3c8712008-04-06 01:42:06 +00001832#endif
1833#ifdef KEY_WOW64_32KEY
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001834 ADD_INT(KEY_WOW64_32KEY);
Mark Hammond8a3c8712008-04-06 01:42:06 +00001835#endif
Antoine Pitrouc83ea132010-05-09 14:46:46 +00001836 ADD_INT(REG_OPTION_RESERVED);
1837 ADD_INT(REG_OPTION_NON_VOLATILE);
1838 ADD_INT(REG_OPTION_VOLATILE);
1839 ADD_INT(REG_OPTION_CREATE_LINK);
1840 ADD_INT(REG_OPTION_BACKUP_RESTORE);
1841 ADD_INT(REG_OPTION_OPEN_LINK);
1842 ADD_INT(REG_LEGAL_OPTION);
1843 ADD_INT(REG_CREATED_NEW_KEY);
1844 ADD_INT(REG_OPENED_EXISTING_KEY);
1845 ADD_INT(REG_WHOLE_HIVE_VOLATILE);
1846 ADD_INT(REG_REFRESH_HIVE);
1847 ADD_INT(REG_NO_LAZY_FLUSH);
1848 ADD_INT(REG_NOTIFY_CHANGE_NAME);
1849 ADD_INT(REG_NOTIFY_CHANGE_ATTRIBUTES);
1850 ADD_INT(REG_NOTIFY_CHANGE_LAST_SET);
1851 ADD_INT(REG_NOTIFY_CHANGE_SECURITY);
1852 ADD_INT(REG_LEGAL_CHANGE_FILTER);
1853 ADD_INT(REG_NONE);
1854 ADD_INT(REG_SZ);
1855 ADD_INT(REG_EXPAND_SZ);
1856 ADD_INT(REG_BINARY);
1857 ADD_INT(REG_DWORD);
1858 ADD_INT(REG_DWORD_LITTLE_ENDIAN);
1859 ADD_INT(REG_DWORD_BIG_ENDIAN);
1860 ADD_INT(REG_LINK);
1861 ADD_INT(REG_MULTI_SZ);
1862 ADD_INT(REG_RESOURCE_LIST);
1863 ADD_INT(REG_FULL_RESOURCE_DESCRIPTOR);
1864 ADD_INT(REG_RESOURCE_REQUIREMENTS_LIST);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001865}
1866