blob: e37256d6bd9b1fdf7adfdd14000adbab4d3036c2 [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
7 module circa 1995.
8 * Bill Tutt expanded the support significantly not long after.
9 * Numerous other people have submitted patches since then.
10 * Ripped from win32api module 03-Feb-2000 by Mark Hammond, and
11 basic Unicode support added.
12
13*/
14
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) \
31 PyErr_SetFromWindowsErr(rc)
32
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 {
386 PyObject_VAR_HEAD
387 HKEY hkey;
388} 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{
397 PyErr_SetString(PyExc_TypeError, failMsg);
398 return NULL;
399}
400static PyObject *
401PyHKEY_binaryFailureFunc(PyObject *ob1, PyObject *ob2)
402{
403 PyErr_SetString(PyExc_TypeError, failMsg);
404 return NULL;
405}
406static PyObject *
407PyHKEY_ternaryFailureFunc(PyObject *ob1, PyObject *ob2, PyObject *ob3)
408{
409 PyErr_SetString(PyExc_TypeError, failMsg);
410 return NULL;
411}
412
413static void
414PyHKEY_deallocFunc(PyObject *ob)
415{
416 /* 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);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000423 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{
429 return ((PyHKEYObject *)ob)->hkey != 0;
430}
431
432static PyObject *
433PyHKEY_intFunc(PyObject *ob)
434{
435 PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
436 return PyLong_FromVoidPtr(pyhkey->hkey);
437}
438
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000439static PyObject *
440PyHKEY_strFunc(PyObject *ob)
441{
442 PyHKEYObject *pyhkey = (PyHKEYObject *)ob;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000443 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{
449 PyHKEYObject *pyhkey1 = (PyHKEYObject *)ob1;
450 PyHKEYObject *pyhkey2 = (PyHKEYObject *)ob2;
451 return pyhkey1 == pyhkey2 ? 0 :
452 (pyhkey1 < pyhkey2 ? -1 : 1);
453}
454
455static long
456PyHKEY_hashFunc(PyObject *ob)
457{
458 /* Just use the address.
459 XXX - should we use the handle value?
460 */
Fred Drake13634cf2000-06-29 19:17:04 +0000461 return _Py_HashPointer(ob);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000462}
463
464
465static PyNumberMethods PyHKEY_NumberMethods =
466{
467 PyHKEY_binaryFailureFunc, /* nb_add */
468 PyHKEY_binaryFailureFunc, /* nb_subtract */
469 PyHKEY_binaryFailureFunc, /* nb_multiply */
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000470 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 */
Jack Diederich4dafcc42006-11-28 19:15:13 +0000476 PyHKEY_boolFunc, /* nb_bool */
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000477 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 */
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000483 PyHKEY_intFunc, /* nb_int */
Mark Dickinson8055afd2009-01-17 10:04:45 +0000484 0, /* nb_reserved */
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000485 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[] = {
494 {"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}
499};
500
501#define OFF(e) offsetof(PyHKEYObject, e)
502static PyMemberDef PyHKEY_memberlist[] = {
503 {"handle", T_INT, OFF(hkey), READONLY},
504 {NULL} /* Sentinel */
505};
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000506
507/* The type itself */
508PyTypeObject PyHKEY_Type =
509{
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000510 PyVarObject_HEAD_INIT(0, 0) /* fill in type at module init */
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000511 "PyHKEY",
512 sizeof(PyHKEYObject),
513 0,
514 PyHKEY_deallocFunc, /* tp_dealloc */
Guido van Rossum346f1a82007-08-07 19:58:47 +0000515 0, /* tp_print */
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000516 0, /* tp_getattr */
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000517 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000518 0, /* tp_reserved */
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000519 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 */
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +0000531 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{
549 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;
555}
556
557static PyObject *
558PyHKEY_DetachMethod(PyObject *self, PyObject *args)
559{
560 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);
567}
568
Christian Heimes2380ac72008-01-09 00:17:24 +0000569static PyObject *
570PyHKEY_Enter(PyObject *self)
571{
572 Py_XINCREF(self);
573 return self;
574}
575
576static PyObject *
577PyHKEY_Exit(PyObject *self, PyObject *args)
578{
579 if (!PyHKEY_Close(self))
580 return NULL;
581 Py_RETURN_NONE;
582}
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{
591 PyHKEYObject *key = PyObject_NEW(PyHKEYObject, &PyHKEY_Type);
592 if (key)
593 key->hkey = hInit;
594 return (PyObject *)key;
595}
596
597BOOL
598PyHKEY_Close(PyObject *ob_handle)
599{
600 LONG rc;
601 PyHKEYObject *key;
602
603 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;
613}
614
615BOOL
616PyHKEY_AsHKEY(PyObject *ob, HKEY *pHANDLE, BOOL bNoneOK)
617{
618 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 }
Neal Norwitz1fe5f382007-08-31 04:32:55 +0000631 else if (PyLong_Check(ob)) {
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000632 /* We also support integers */
633 PyErr_Clear();
634 *pHANDLE = (HKEY)PyLong_AsVoidPtr(ob);
635 if (PyErr_Occurred())
636 return FALSE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000637 }
638 else {
639 PyErr_SetString(
640 PyExc_TypeError,
641 "The object is not a PyHKEY object");
642 return FALSE;
643 }
644 return TRUE;
645}
646
647PyObject *
648PyHKEY_FromHKEY(HKEY h)
649{
Guido van Rossumb18618d2000-05-03 23:44:39 +0000650 PyHKEYObject *op;
651
Guido van Rossume3a8e7e2002-08-19 19:26:42 +0000652 /* Inline PyObject_New */
Guido van Rossumb18618d2000-05-03 23:44:39 +0000653 op = (PyHKEYObject *) PyObject_MALLOC(sizeof(PyHKEYObject));
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000654 if (op == NULL)
655 return PyErr_NoMemory();
Guido van Rossumb18618d2000-05-03 23:44:39 +0000656 PyObject_INIT(op, &PyHKEY_Type);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000657 op->hkey = h;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000658 return (PyObject *)op;
659}
660
661
662/************************************************************************
663 The module methods
664************************************************************************/
665BOOL
666PyWinObject_CloseHKEY(PyObject *obHandle)
667{
668 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
Christian Heimes217cfd12007-12-02 14:31:20 +0000673 else if (PyLong_Check(obHandle)) {
674 long rc = RegCloseKey((HKEY)PyLong_AsLong(obHandle));
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000675 ok = (rc == ERROR_SUCCESS);
676 if (!ok)
677 PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey");
678 }
Fred Drake25e17262000-06-30 17:48:51 +0000679#else
680 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 }
686#endif
Guido van Rossum9f3712c2000-03-28 20:37:15 +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;
694}
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{
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000710 wchar_t *P;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000711 int i;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000712 wchar_t *Q;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000713
714 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 }
720}
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{
725 int strings;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000726 wchar_t *P;
727 wchar_t *Q = data + len;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000728
729 for (P = data, strings = 0; P < Q && *P != '\0'; P++, strings++)
730 for (; P < Q && *P != '\0'; P++)
731 ;
732 return strings;
733}
734
735/* Convert PyObject into Registry data.
736 Allocates space as needed. */
737static BOOL
738Py2Reg(PyObject *value, DWORD typ, BYTE **retDataBuf, DWORD *retDataSize)
739{
Christian Heimescc47b052008-03-25 14:56:36 +0000740 Py_ssize_t i,j;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000741 switch (typ) {
742 case REG_DWORD:
Guido van Rossum7eaf8222007-06-18 17:58:50 +0000743 if (value != Py_None && !PyLong_Check(value))
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000744 return FALSE;
Guido van Rossumd8faa362007-04-27 19:54:29 +0000745 *retDataBuf = (BYTE *)PyMem_NEW(DWORD, 1);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000746 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 }
Guido van Rossum7eaf8222007-06-18 17:58:50 +0000755 else {
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000756 DWORD d = PyLong_AsLong(value);
Guido van Rossum7eaf8222007-06-18 17:58:50 +0000757 memcpy(*retDataBuf, &d, sizeof(DWORD));
758 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000759 break;
760 case REG_SZ:
761 case REG_EXPAND_SZ:
762 {
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000763 if (value == Py_None)
764 *retDataSize = 1;
765 else {
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000766 if (!PyUnicode_Check(value))
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000767 return FALSE;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000768
769 *retDataSize = 2 + PyUnicode_GET_DATA_SIZE(value);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000770 }
771 *retDataBuf = (BYTE *)PyMem_NEW(DWORD, *retDataSize);
772 if (*retDataBuf==NULL){
773 PyErr_NoMemory();
774 return FALSE;
775 }
776 if (value == Py_None)
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000777 wcscpy((wchar_t *)*retDataBuf, L"");
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000778 else
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000779 wcscpy((wchar_t *)*retDataBuf,
780 PyUnicode_AS_UNICODE(value));
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000781 break;
782 }
783 case REG_MULTI_SZ:
784 {
785 DWORD size = 0;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000786 wchar_t *P;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000787
788 if (value == Py_None)
789 i = 0;
790 else {
791 if (!PyList_Check(value))
792 return FALSE;
793 i = PyList_Size(value);
794 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000795 for (j = 0; j < i; j++)
796 {
797 PyObject *t;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000798 t = PyList_GET_ITEM(value, j);
799 if (!PyUnicode_Check(t))
800 return FALSE;
801 size += 2 + PyUnicode_GET_DATA_SIZE(t);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000802 }
803
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000804 *retDataSize = size + 2;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000805 *retDataBuf = (BYTE *)PyMem_NEW(char,
806 *retDataSize);
807 if (*retDataBuf==NULL){
808 PyErr_NoMemory();
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000809 return FALSE;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000810 }
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000811 P = (wchar_t *)*retDataBuf;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000812
813 for (j = 0; j < i; j++)
814 {
815 PyObject *t;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000816 t = PyList_GET_ITEM(value, j);
817 wcscpy(P, PyUnicode_AS_UNICODE(t));
818 P += 1 + wcslen(
819 PyUnicode_AS_UNICODE(t));
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000820 }
821 /* And doubly-terminate the list... */
822 *P = '\0';
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000823 break;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000824 }
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 {
Thomas Heller39763a12007-09-24 14:43:56 +0000832 Py_buffer view;
Neal Norwitz1385b892007-08-26 23:07:13 +0000833
834 if (!PyObject_CheckBuffer(value)) {
Tim Peters313fcd42006-02-19 04:05:39 +0000835 PyErr_Format(PyExc_TypeError,
Mark Hammond4e80bb52000-07-28 03:44:41 +0000836 "Objects of type '%s' can not "
Tim Peters313fcd42006-02-19 04:05:39 +0000837 "be used as binary registry values",
Mark Hammond4e80bb52000-07-28 03:44:41 +0000838 value->ob_type->tp_name);
839 return FALSE;
840 }
Neal Norwitz1385b892007-08-26 23:07:13 +0000841
842 if (PyObject_GetBuffer(value, &view, PyBUF_SIMPLE) < 0)
843 return FALSE;
844
845 *retDataBuf = (BYTE *)PyMem_NEW(char, view.len);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000846 if (*retDataBuf==NULL){
Martin v. Löwis423be952008-08-13 15:53:07 +0000847 PyBuffer_Release(&view);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000848 PyErr_NoMemory();
849 return FALSE;
850 }
Neal Norwitz1385b892007-08-26 23:07:13 +0000851 *retDataSize = view.len;
852 memcpy(*retDataBuf, view.buf, view.len);
Martin v. Löwis423be952008-08-13 15:53:07 +0000853 PyBuffer_Release(&view);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000854 }
855 break;
856 }
857 return TRUE;
858}
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{
864 PyObject *obData;
865
866 switch (typ) {
867 case REG_DWORD:
868 if (retDataSize == 0)
Christian Heimes217cfd12007-12-02 14:31:20 +0000869 obData = PyLong_FromLong(0);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000870 else
Christian Heimes217cfd12007-12-02 14:31:20 +0000871 obData = PyLong_FromLong(*(int *)retDataBuf);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000872 break;
873 case REG_SZ:
874 case REG_EXPAND_SZ:
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000875 {
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 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000886 case REG_MULTI_SZ:
887 if (retDataSize == 0)
888 obData = PyList_New(0);
889 else
890 {
891 int index = 0;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000892 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);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000896 if (str == NULL)
897 return PyErr_NoMemory();
898
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000899 fixupMultiSZ(str, data, len);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000900 obData = PyList_New(s);
Fred Drake25e17262000-06-30 17:48:51 +0000901 if (obData == NULL)
902 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000903 for (index = 0; index < s; index++)
904 {
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000905 size_t len = wcslen(str[index]);
Fred Drake25e17262000-06-30 17:48:51 +0000906 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 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000912 PyList_SetItem(obData,
913 index,
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000914 PyUnicode_FromUnicode(str[index], len));
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000915 }
916 free(str);
917
918 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
Gregory P. Smith0a608fd2008-09-06 21:34:51 +0000929 obData = PyBytes_FromStringAndSize(
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000930 (char *)retDataBuf, retDataSize);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000931 break;
932 }
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000933 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{
941 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;
948}
949
950static PyObject *
951PyConnectRegistry(PyObject *self, PyObject *args)
952{
953 HKEY hKey;
954 PyObject *obKey;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000955 wchar_t *szCompName = NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000956 HKEY retKey;
957 long rc;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000958 if (!PyArg_ParseTuple(args, "ZO:ConnectRegistry", &szCompName, &obKey))
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000959 return NULL;
960 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
961 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000962 Py_BEGIN_ALLOW_THREADS
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000963 rc = RegConnectRegistryW(szCompName, hKey, &retKey);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000964 Py_END_ALLOW_THREADS
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000965 if (rc != ERROR_SUCCESS)
966 return PyErr_SetFromWindowsErrWithFunction(rc,
967 "ConnectRegistry");
968 return PyHKEY_FromHKEY(retKey);
969}
970
971static PyObject *
972PyCreateKey(PyObject *self, PyObject *args)
973{
974 HKEY hKey;
975 PyObject *obKey;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000976 wchar_t *subKey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000977 HKEY retKey;
978 long rc;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000979 if (!PyArg_ParseTuple(args, "OZ:CreateKey", &obKey, &subKey))
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000980 return NULL;
981 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
982 return NULL;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +0000983 rc = RegCreateKeyW(hKey, subKey, &retKey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +0000984 if (rc != ERROR_SUCCESS)
985 return PyErr_SetFromWindowsErrWithFunction(rc, "CreateKey");
986 return PyHKEY_FromHKEY(retKey);
987}
988
989static PyObject *
Brian Curtin3035c392010-04-21 23:56:21 +0000990PyCreateKeyEx(PyObject *self, PyObject *args)
991{
992 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;
1004
1005 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);
1010}
1011
1012static PyObject *
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001013PyDeleteKey(PyObject *self, PyObject *args)
1014{
1015 HKEY hKey;
1016 PyObject *obKey;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001017 wchar_t *subKey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001018 long rc;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001019 if (!PyArg_ParseTuple(args, "Ou:DeleteKey", &obKey, &subKey))
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001020 return NULL;
1021 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1022 return NULL;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001023 rc = RegDeleteKeyW(hKey, subKey );
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001024 if (rc != ERROR_SUCCESS)
1025 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKey");
1026 Py_INCREF(Py_None);
1027 return Py_None;
1028}
1029
1030static PyObject *
Brian Curtin3035c392010-04-21 23:56:21 +00001031PyDeleteKeyEx(PyObject *self, PyObject *args)
1032{
1033 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;
1042
1043 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;
1048
1049 /* 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
1063
1064 if (rc != ERROR_SUCCESS)
1065 return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKeyEx");
1066 Py_INCREF(Py_None);
1067 return Py_None;
1068}
1069
1070static PyObject *
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001071PyDeleteValue(PyObject *self, PyObject *args)
1072{
1073 HKEY hKey;
1074 PyObject *obKey;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001075 wchar_t *subKey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001076 long rc;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001077 if (!PyArg_ParseTuple(args, "OZ:DeleteValue", &obKey, &subKey))
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001078 return NULL;
1079 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1080 return NULL;
1081 Py_BEGIN_ALLOW_THREADS
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001082 rc = RegDeleteValueW(hKey, subKey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001083 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;
1089}
1090
1091static PyObject *
1092PyEnumKey(PyObject *self, PyObject *args)
1093{
1094 HKEY hKey;
1095 PyObject *obKey;
1096 int index;
1097 long rc;
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001098 PyObject *retStr;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001099 wchar_t tmpbuf[256]; /* max key name length is 255 */
Georg Brandlb2699b22006-02-18 23:44:24 +00001100 DWORD len = sizeof(tmpbuf); /* includes NULL terminator */
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001101
1102 if (!PyArg_ParseTuple(args, "Oi:EnumKey", &obKey, &index))
1103 return NULL;
1104 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1105 return NULL;
Tim Peters313fcd42006-02-19 04:05:39 +00001106
Georg Brandl9a928e72006-02-18 23:35:11 +00001107 Py_BEGIN_ALLOW_THREADS
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001108 rc = RegEnumKeyExW(hKey, index, tmpbuf, &len, NULL, NULL, NULL, NULL);
Georg Brandl9a928e72006-02-18 23:35:11 +00001109 Py_END_ALLOW_THREADS
1110 if (rc != ERROR_SUCCESS)
1111 return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKeyEx");
Tim Peters313fcd42006-02-19 04:05:39 +00001112
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001113 retStr = PyUnicode_FromUnicode(tmpbuf, len);
Georg Brandl9a928e72006-02-18 23:35:11 +00001114 return retStr; /* can be NULL */
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001115}
1116
1117static PyObject *
1118PyEnumValue(PyObject *self, PyObject *args)
1119{
1120 HKEY hKey;
1121 PyObject *obKey;
1122 int index;
1123 long rc;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001124 wchar_t *retValueBuf;
1125 BYTE *retDataBuf;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001126 DWORD retValueSize;
1127 DWORD retDataSize;
1128 DWORD typ;
1129 PyObject *obData;
1130 PyObject *retVal;
1131
1132 if (!PyArg_ParseTuple(args, "Oi:EnumValue", &obKey, &index))
1133 return NULL;
1134 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1135 return NULL;
1136
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001137 if ((rc = RegQueryInfoKeyW(hKey, NULL, NULL, NULL, NULL, NULL, NULL,
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001138 NULL,
1139 &retValueSize, &retDataSize, NULL, NULL))
1140 != ERROR_SUCCESS)
1141 return PyErr_SetFromWindowsErrWithFunction(rc,
1142 "RegQueryInfoKey");
1143 ++retValueSize; /* include null terminators */
1144 ++retDataSize;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001145 retValueBuf = (wchar_t *)PyMem_Malloc(sizeof(wchar_t) * retValueSize);
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001146 if (retValueBuf == NULL)
1147 return PyErr_NoMemory();
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001148 retDataBuf = (BYTE *)PyMem_Malloc(retDataSize);
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001149 if (retDataBuf == NULL) {
1150 PyMem_Free(retValueBuf);
1151 return PyErr_NoMemory();
1152 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001153
1154 Py_BEGIN_ALLOW_THREADS
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001155 rc = RegEnumValueW(hKey,
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001156 index,
1157 retValueBuf,
1158 &retValueSize,
1159 NULL,
1160 &typ,
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001161 retDataBuf,
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001162 &retDataSize);
1163 Py_END_ALLOW_THREADS
1164
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001165 if (rc != ERROR_SUCCESS) {
1166 retVal = PyErr_SetFromWindowsErrWithFunction(rc,
1167 "PyRegEnumValue");
1168 goto fail;
1169 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001170 obData = Reg2Py(retDataBuf, retDataSize, typ);
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001171 if (obData == NULL) {
1172 retVal = NULL;
1173 goto fail;
1174 }
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001175 retVal = Py_BuildValue("uOi", retValueBuf, obData, typ);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001176 Py_DECREF(obData);
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001177 fail:
1178 PyMem_Free(retValueBuf);
1179 PyMem_Free(retDataBuf);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001180 return retVal;
1181}
1182
1183static PyObject *
Christian Heimes2380ac72008-01-09 00:17:24 +00001184PyExpandEnvironmentStrings(PyObject *self, PyObject *args)
1185{
1186 Py_UNICODE *retValue = NULL;
1187 Py_UNICODE *src;
1188 DWORD retValueSize;
1189 DWORD rc;
1190 PyObject *o;
1191
1192 if (!PyArg_ParseTuple(args, "u:ExpandEnvironmentStrings", &src))
1193 return NULL;
1194
1195 retValueSize = ExpandEnvironmentStringsW(src, retValue, 0);
1196 if (retValueSize == 0) {
1197 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1198 "ExpandEnvironmentStrings");
1199 }
1200 retValue = (Py_UNICODE *)PyMem_Malloc(retValueSize * sizeof(Py_UNICODE));
1201 if (retValue == NULL) {
1202 return PyErr_NoMemory();
1203 }
1204
1205 rc = ExpandEnvironmentStringsW(src, retValue, retValueSize);
1206 if (rc == 0) {
1207 PyMem_Free(retValue);
1208 return PyErr_SetFromWindowsErrWithFunction(retValueSize,
1209 "ExpandEnvironmentStrings");
1210 }
1211 o = PyUnicode_FromUnicode(retValue, wcslen(retValue));
1212 PyMem_Free(retValue);
1213 return o;
1214}
1215
1216static PyObject *
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001217PyFlushKey(PyObject *self, PyObject *args)
1218{
1219 HKEY hKey;
1220 PyObject *obKey;
1221 long rc;
1222 if (!PyArg_ParseTuple(args, "O:FlushKey", &obKey))
1223 return NULL;
1224 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1225 return NULL;
1226 Py_BEGIN_ALLOW_THREADS
1227 rc = RegFlushKey(hKey);
1228 Py_END_ALLOW_THREADS
1229 if (rc != ERROR_SUCCESS)
1230 return PyErr_SetFromWindowsErrWithFunction(rc, "RegFlushKey");
1231 Py_INCREF(Py_None);
1232 return Py_None;
1233}
1234static PyObject *
1235PyLoadKey(PyObject *self, PyObject *args)
1236{
1237 HKEY hKey;
1238 PyObject *obKey;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001239 wchar_t *subKey;
1240 wchar_t *fileName;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001241
1242 long rc;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001243 if (!PyArg_ParseTuple(args, "Ouu:LoadKey", &obKey, &subKey, &fileName))
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001244 return NULL;
1245 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1246 return NULL;
1247 Py_BEGIN_ALLOW_THREADS
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001248 rc = RegLoadKeyW(hKey, subKey, fileName );
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001249 Py_END_ALLOW_THREADS
1250 if (rc != ERROR_SUCCESS)
1251 return PyErr_SetFromWindowsErrWithFunction(rc, "RegLoadKey");
1252 Py_INCREF(Py_None);
1253 return Py_None;
1254}
1255
1256static PyObject *
1257PyOpenKey(PyObject *self, PyObject *args)
1258{
1259 HKEY hKey;
1260 PyObject *obKey;
1261
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001262 wchar_t *subKey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001263 int res = 0;
1264 HKEY retKey;
1265 long rc;
1266 REGSAM sam = KEY_READ;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001267 if (!PyArg_ParseTuple(args, "OZ|ii:OpenKey", &obKey, &subKey,
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001268 &res, &sam))
1269 return NULL;
1270 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1271 return NULL;
1272
1273 Py_BEGIN_ALLOW_THREADS
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001274 rc = RegOpenKeyExW(hKey, subKey, res, sam, &retKey);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001275 Py_END_ALLOW_THREADS
1276 if (rc != ERROR_SUCCESS)
1277 return PyErr_SetFromWindowsErrWithFunction(rc, "RegOpenKeyEx");
1278 return PyHKEY_FromHKEY(retKey);
1279}
1280
1281
1282static PyObject *
1283PyQueryInfoKey(PyObject *self, PyObject *args)
1284{
1285 HKEY hKey;
1286 PyObject *obKey;
1287 long rc;
1288 DWORD nSubKeys, nValues;
1289 FILETIME ft;
1290 LARGE_INTEGER li;
1291 PyObject *l;
1292 PyObject *ret;
1293 if (!PyArg_ParseTuple(args, "O:QueryInfoKey", &obKey))
1294 return NULL;
1295 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1296 return NULL;
1297 if ((rc = RegQueryInfoKey(hKey, NULL, NULL, 0, &nSubKeys, NULL, NULL,
1298 &nValues, NULL, NULL, NULL, &ft))
1299 != ERROR_SUCCESS)
1300 return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryInfoKey");
1301 li.LowPart = ft.dwLowDateTime;
1302 li.HighPart = ft.dwHighDateTime;
1303 l = PyLong_FromLongLong(li.QuadPart);
1304 if (l == NULL)
1305 return NULL;
1306 ret = Py_BuildValue("iiO", nSubKeys, nValues, l);
1307 Py_DECREF(l);
1308 return ret;
1309}
1310
1311static PyObject *
1312PyQueryValue(PyObject *self, PyObject *args)
1313{
1314 HKEY hKey;
1315 PyObject *obKey;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001316 wchar_t *subKey;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001317 long rc;
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001318 PyObject *retStr;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001319 wchar_t *retBuf;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001320 long bufSize = 0;
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001321
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001322 if (!PyArg_ParseTuple(args, "OZ:QueryValue", &obKey, &subKey))
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001323 return NULL;
1324
1325 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1326 return NULL;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001327 if ((rc = RegQueryValueW(hKey, subKey, NULL, &bufSize))
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001328 != ERROR_SUCCESS)
1329 return PyErr_SetFromWindowsErrWithFunction(rc,
1330 "RegQueryValue");
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001331 retBuf = (wchar_t *)PyMem_Malloc(bufSize);
Guido van Rossuma8c360e2007-07-17 20:50:43 +00001332 if (retBuf == NULL)
1333 return PyErr_NoMemory();
1334
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001335 if ((rc = RegQueryValueW(hKey, subKey, retBuf, &bufSize))
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001336 != ERROR_SUCCESS) {
Guido van Rossuma8c360e2007-07-17 20:50:43 +00001337 PyMem_Free(retBuf);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001338 return PyErr_SetFromWindowsErrWithFunction(rc,
1339 "RegQueryValue");
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001340 }
Guido van Rossuma8c360e2007-07-17 20:50:43 +00001341
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001342 retStr = PyUnicode_FromUnicode(retBuf, wcslen(retBuf));
Guido van Rossuma8c360e2007-07-17 20:50:43 +00001343 PyMem_Free(retBuf);
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001344 return retStr;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001345}
1346
1347static PyObject *
1348PyQueryValueEx(PyObject *self, PyObject *args)
1349{
1350 HKEY hKey;
1351 PyObject *obKey;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001352 wchar_t *valueName;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001353
1354 long rc;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001355 BYTE *retBuf;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001356 DWORD bufSize = 0;
1357 DWORD typ;
1358 PyObject *obData;
1359 PyObject *result;
1360
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001361 if (!PyArg_ParseTuple(args, "OZ:QueryValueEx", &obKey, &valueName))
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001362 return NULL;
1363
1364 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1365 return NULL;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001366 if ((rc = RegQueryValueExW(hKey, valueName,
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001367 NULL, NULL, NULL,
1368 &bufSize))
1369 != ERROR_SUCCESS)
1370 return PyErr_SetFromWindowsErrWithFunction(rc,
1371 "RegQueryValueEx");
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001372 retBuf = (BYTE *)PyMem_Malloc(bufSize);
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001373 if (retBuf == NULL)
1374 return PyErr_NoMemory();
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001375 if ((rc = RegQueryValueExW(hKey, valueName, NULL,
1376 &typ, retBuf, &bufSize))
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001377 != ERROR_SUCCESS) {
1378 PyMem_Free(retBuf);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001379 return PyErr_SetFromWindowsErrWithFunction(rc,
1380 "RegQueryValueEx");
Guido van Rossuma6a38ad2003-11-30 22:01:43 +00001381 }
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001382 obData = Reg2Py(retBuf, bufSize, typ);
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001383 PyMem_Free(retBuf);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001384 if (obData == NULL)
1385 return NULL;
1386 result = Py_BuildValue("Oi", obData, typ);
1387 Py_DECREF(obData);
1388 return result;
1389}
1390
1391
1392static PyObject *
1393PySaveKey(PyObject *self, PyObject *args)
1394{
1395 HKEY hKey;
1396 PyObject *obKey;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001397 wchar_t *fileName;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001398 LPSECURITY_ATTRIBUTES pSA = NULL;
1399
1400 long rc;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001401 if (!PyArg_ParseTuple(args, "Ou:SaveKey", &obKey, &fileName))
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001402 return NULL;
1403 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1404 return NULL;
1405/* One day we may get security into the core?
1406 if (!PyWinObject_AsSECURITY_ATTRIBUTES(obSA, &pSA, TRUE))
1407 return NULL;
1408*/
1409 Py_BEGIN_ALLOW_THREADS
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001410 rc = RegSaveKeyW(hKey, fileName, pSA );
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001411 Py_END_ALLOW_THREADS
1412 if (rc != ERROR_SUCCESS)
1413 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSaveKey");
1414 Py_INCREF(Py_None);
1415 return Py_None;
1416}
1417
1418static PyObject *
1419PySetValue(PyObject *self, PyObject *args)
1420{
1421 HKEY hKey;
1422 PyObject *obKey;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001423 wchar_t *subKey;
1424 wchar_t *str;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001425 DWORD typ;
1426 DWORD len;
1427 long rc;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001428 if (!PyArg_ParseTuple(args, "OZiu#:SetValue",
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001429 &obKey,
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001430 &subKey,
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001431 &typ,
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001432 &str,
1433 &len))
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001434 return NULL;
1435 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1436 return NULL;
1437 if (typ != REG_SZ) {
1438 PyErr_SetString(PyExc_TypeError,
Georg Brandl38feaf02008-05-25 07:45:51 +00001439 "Type must be winreg.REG_SZ");
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001440 return NULL;
1441 }
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001442
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001443 Py_BEGIN_ALLOW_THREADS
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001444 rc = RegSetValueW(hKey, subKey, REG_SZ, str, len+1);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001445 Py_END_ALLOW_THREADS
1446 if (rc != ERROR_SUCCESS)
1447 return PyErr_SetFromWindowsErrWithFunction(rc, "RegSetValue");
1448 Py_INCREF(Py_None);
1449 return Py_None;
1450}
1451
1452static PyObject *
1453PySetValueEx(PyObject *self, PyObject *args)
1454{
1455 HKEY hKey;
1456 PyObject *obKey;
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001457 Py_UNICODE *valueName;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001458 PyObject *obRes;
1459 PyObject *value;
1460 BYTE *data;
1461 DWORD len;
1462 DWORD typ;
1463
1464 LONG rc;
1465
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001466 if (!PyArg_ParseTuple(args, "OZOiO:SetValueEx",
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001467 &obKey,
1468 &valueName,
1469 &obRes,
1470 &typ,
1471 &value))
1472 return NULL;
1473 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1474 return NULL;
1475 if (!Py2Reg(value, typ, &data, &len))
1476 {
1477 if (!PyErr_Occurred())
1478 PyErr_SetString(PyExc_ValueError,
1479 "Could not convert the data to the specified type.");
1480 return NULL;
1481 }
1482 Py_BEGIN_ALLOW_THREADS
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001483 rc = RegSetValueExW(hKey, valueName, 0, typ, data, len);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001484 Py_END_ALLOW_THREADS
Guido van Rossumb18618d2000-05-03 23:44:39 +00001485 PyMem_DEL(data);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001486 if (rc != ERROR_SUCCESS)
1487 return PyErr_SetFromWindowsErrWithFunction(rc,
1488 "RegSetValueEx");
1489 Py_INCREF(Py_None);
1490 return Py_None;
1491}
1492
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001493static PyObject *
1494PyDisableReflectionKey(PyObject *self, PyObject *args)
1495{
1496 HKEY hKey;
1497 PyObject *obKey;
1498 HMODULE hMod;
1499 typedef LONG (WINAPI *RDRKFunc)(HKEY);
1500 RDRKFunc pfn = NULL;
1501 LONG rc;
1502
1503 if (!PyArg_ParseTuple(args, "O:DisableReflectionKey", &obKey))
1504 return NULL;
1505 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1506 return NULL;
1507
Brian Curtin3035c392010-04-21 23:56:21 +00001508 /* Only available on 64bit platforms, so we must load it
1509 dynamically.*/
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001510 hMod = GetModuleHandle("advapi32.dll");
1511 if (hMod)
1512 pfn = (RDRKFunc)GetProcAddress(hMod,
1513 "RegDisableReflectionKey");
1514 if (!pfn) {
1515 PyErr_SetString(PyExc_NotImplementedError,
1516 "not implemented on this platform");
1517 return NULL;
1518 }
1519 Py_BEGIN_ALLOW_THREADS
1520 rc = (*pfn)(hKey);
1521 Py_END_ALLOW_THREADS
1522 if (rc != ERROR_SUCCESS)
1523 return PyErr_SetFromWindowsErrWithFunction(rc,
1524 "RegDisableReflectionKey");
1525 Py_INCREF(Py_None);
1526 return Py_None;
1527}
1528
1529static PyObject *
1530PyEnableReflectionKey(PyObject *self, PyObject *args)
1531{
1532 HKEY hKey;
1533 PyObject *obKey;
1534 HMODULE hMod;
1535 typedef LONG (WINAPI *RERKFunc)(HKEY);
1536 RERKFunc pfn = NULL;
1537 LONG rc;
1538
1539 if (!PyArg_ParseTuple(args, "O:EnableReflectionKey", &obKey))
1540 return NULL;
1541 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1542 return NULL;
1543
Brian Curtin3035c392010-04-21 23:56:21 +00001544 /* Only available on 64bit platforms, so we must load it
1545 dynamically.*/
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001546 hMod = GetModuleHandle("advapi32.dll");
1547 if (hMod)
1548 pfn = (RERKFunc)GetProcAddress(hMod,
1549 "RegEnableReflectionKey");
1550 if (!pfn) {
1551 PyErr_SetString(PyExc_NotImplementedError,
1552 "not implemented on this platform");
1553 return NULL;
1554 }
1555 Py_BEGIN_ALLOW_THREADS
1556 rc = (*pfn)(hKey);
1557 Py_END_ALLOW_THREADS
1558 if (rc != ERROR_SUCCESS)
1559 return PyErr_SetFromWindowsErrWithFunction(rc,
1560 "RegEnableReflectionKey");
1561 Py_INCREF(Py_None);
1562 return Py_None;
1563}
1564
1565static PyObject *
1566PyQueryReflectionKey(PyObject *self, PyObject *args)
1567{
1568 HKEY hKey;
1569 PyObject *obKey;
1570 HMODULE hMod;
1571 typedef LONG (WINAPI *RQRKFunc)(HKEY, BOOL *);
1572 RQRKFunc pfn = NULL;
1573 BOOL result;
1574 LONG rc;
1575
1576 if (!PyArg_ParseTuple(args, "O:QueryReflectionKey", &obKey))
1577 return NULL;
1578 if (!PyHKEY_AsHKEY(obKey, &hKey, FALSE))
1579 return NULL;
1580
Brian Curtin3035c392010-04-21 23:56:21 +00001581 /* Only available on 64bit platforms, so we must load it
1582 dynamically.*/
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001583 hMod = GetModuleHandle("advapi32.dll");
1584 if (hMod)
1585 pfn = (RQRKFunc)GetProcAddress(hMod,
1586 "RegQueryReflectionKey");
1587 if (!pfn) {
1588 PyErr_SetString(PyExc_NotImplementedError,
1589 "not implemented on this platform");
1590 return NULL;
1591 }
1592 Py_BEGIN_ALLOW_THREADS
1593 rc = (*pfn)(hKey, &result);
1594 Py_END_ALLOW_THREADS
1595 if (rc != ERROR_SUCCESS)
1596 return PyErr_SetFromWindowsErrWithFunction(rc,
1597 "RegQueryReflectionKey");
Brian Curtin3035c392010-04-21 23:56:21 +00001598 return PyBool_FromLong(result);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001599}
1600
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001601static struct PyMethodDef winreg_methods[] = {
Neal Norwitz031829d2002-03-31 14:37:44 +00001602 {"CloseKey", PyCloseKey, METH_VARARGS, CloseKey_doc},
1603 {"ConnectRegistry", PyConnectRegistry, METH_VARARGS, ConnectRegistry_doc},
1604 {"CreateKey", PyCreateKey, METH_VARARGS, CreateKey_doc},
Brian Curtin3035c392010-04-21 23:56:21 +00001605 {"CreateKeyEx", PyCreateKeyEx, METH_VARARGS, CreateKeyEx_doc},
Neal Norwitz031829d2002-03-31 14:37:44 +00001606 {"DeleteKey", PyDeleteKey, METH_VARARGS, DeleteKey_doc},
Brian Curtin3035c392010-04-21 23:56:21 +00001607 {"DeleteKeyEx", PyDeleteKeyEx, METH_VARARGS, DeleteKeyEx_doc},
Neal Norwitz031829d2002-03-31 14:37:44 +00001608 {"DeleteValue", PyDeleteValue, METH_VARARGS, DeleteValue_doc},
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001609 {"DisableReflectionKey", PyDisableReflectionKey, METH_VARARGS, DisableReflectionKey_doc},
1610 {"EnableReflectionKey", PyEnableReflectionKey, METH_VARARGS, EnableReflectionKey_doc},
Neal Norwitz031829d2002-03-31 14:37:44 +00001611 {"EnumKey", PyEnumKey, METH_VARARGS, EnumKey_doc},
1612 {"EnumValue", PyEnumValue, METH_VARARGS, EnumValue_doc},
Christian Heimes2380ac72008-01-09 00:17:24 +00001613 {"ExpandEnvironmentStrings", PyExpandEnvironmentStrings, METH_VARARGS,
1614 ExpandEnvironmentStrings_doc },
Neal Norwitz031829d2002-03-31 14:37:44 +00001615 {"FlushKey", PyFlushKey, METH_VARARGS, FlushKey_doc},
1616 {"LoadKey", PyLoadKey, METH_VARARGS, LoadKey_doc},
1617 {"OpenKey", PyOpenKey, METH_VARARGS, OpenKey_doc},
1618 {"OpenKeyEx", PyOpenKey, METH_VARARGS, OpenKeyEx_doc},
1619 {"QueryValue", PyQueryValue, METH_VARARGS, QueryValue_doc},
1620 {"QueryValueEx", PyQueryValueEx, METH_VARARGS, QueryValueEx_doc},
1621 {"QueryInfoKey", PyQueryInfoKey, METH_VARARGS, QueryInfoKey_doc},
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001622 {"QueryReflectionKey",PyQueryReflectionKey,METH_VARARGS, QueryReflectionKey_doc},
Neal Norwitz031829d2002-03-31 14:37:44 +00001623 {"SaveKey", PySaveKey, METH_VARARGS, SaveKey_doc},
1624 {"SetValue", PySetValue, METH_VARARGS, SetValue_doc},
1625 {"SetValueEx", PySetValueEx, METH_VARARGS, SetValueEx_doc},
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001626 NULL,
1627};
1628
1629static void
1630insint(PyObject * d, char * name, long value)
1631{
Christian Heimes217cfd12007-12-02 14:31:20 +00001632 PyObject *v = PyLong_FromLong(value);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001633 if (!v || PyDict_SetItemString(d, name, v))
1634 PyErr_Clear();
1635 Py_XDECREF(v);
1636}
1637
1638#define ADD_INT(val) insint(d, #val, val)
1639
1640static void
1641inskey(PyObject * d, char * name, HKEY key)
1642{
1643 PyObject *v = PyLong_FromVoidPtr(key);
1644 if (!v || PyDict_SetItemString(d, name, v))
1645 PyErr_Clear();
1646 Py_XDECREF(v);
1647}
1648
1649#define ADD_KEY(val) inskey(d, #val, val)
1650
Martin v. Löwis1a214512008-06-11 05:26:20 +00001651
1652static struct PyModuleDef winregmodule = {
1653 PyModuleDef_HEAD_INIT,
1654 "winreg",
1655 module_doc,
1656 -1,
1657 winreg_methods,
1658 NULL,
1659 NULL,
1660 NULL,
1661 NULL
1662};
1663
1664PyMODINIT_FUNC PyInit_winreg(void)
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001665{
1666 PyObject *m, *d;
Martin v. Löwis1a214512008-06-11 05:26:20 +00001667 m = PyModule_Create(&winregmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001668 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001669 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001670 d = PyModule_GetDict(m);
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001671 PyHKEY_Type.tp_doc = PyHKEY_doc;
Amaury Forgeot d'Arce43d33a2008-07-02 20:50:16 +00001672 if (PyType_Ready(&PyHKEY_Type) < 0)
1673 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001674 Py_INCREF(&PyHKEY_Type);
1675 if (PyDict_SetItemString(d, "HKEYType",
1676 (PyObject *)&PyHKEY_Type) != 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001677 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001678 Py_INCREF(PyExc_WindowsError);
1679 if (PyDict_SetItemString(d, "error",
1680 PyExc_WindowsError) != 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00001681 return NULL;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001682
1683 /* Add the relevant constants */
1684 ADD_KEY(HKEY_CLASSES_ROOT);
1685 ADD_KEY(HKEY_CURRENT_USER);
1686 ADD_KEY(HKEY_LOCAL_MACHINE);
1687 ADD_KEY(HKEY_USERS);
1688 ADD_KEY(HKEY_PERFORMANCE_DATA);
1689#ifdef HKEY_CURRENT_CONFIG
1690 ADD_KEY(HKEY_CURRENT_CONFIG);
1691#endif
1692#ifdef HKEY_DYN_DATA
1693 ADD_KEY(HKEY_DYN_DATA);
1694#endif
1695 ADD_INT(KEY_QUERY_VALUE);
1696 ADD_INT(KEY_SET_VALUE);
1697 ADD_INT(KEY_CREATE_SUB_KEY);
1698 ADD_INT(KEY_ENUMERATE_SUB_KEYS);
1699 ADD_INT(KEY_NOTIFY);
1700 ADD_INT(KEY_CREATE_LINK);
1701 ADD_INT(KEY_READ);
1702 ADD_INT(KEY_WRITE);
1703 ADD_INT(KEY_EXECUTE);
1704 ADD_INT(KEY_ALL_ACCESS);
Martin v. Löwisd218dc12008-04-07 03:17:54 +00001705#ifdef KEY_WOW64_64KEY
1706 ADD_INT(KEY_WOW64_64KEY);
1707#endif
1708#ifdef KEY_WOW64_32KEY
1709 ADD_INT(KEY_WOW64_32KEY);
1710#endif
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001711 ADD_INT(REG_OPTION_RESERVED);
1712 ADD_INT(REG_OPTION_NON_VOLATILE);
1713 ADD_INT(REG_OPTION_VOLATILE);
1714 ADD_INT(REG_OPTION_CREATE_LINK);
1715 ADD_INT(REG_OPTION_BACKUP_RESTORE);
1716 ADD_INT(REG_OPTION_OPEN_LINK);
1717 ADD_INT(REG_LEGAL_OPTION);
1718 ADD_INT(REG_CREATED_NEW_KEY);
1719 ADD_INT(REG_OPENED_EXISTING_KEY);
1720 ADD_INT(REG_WHOLE_HIVE_VOLATILE);
1721 ADD_INT(REG_REFRESH_HIVE);
1722 ADD_INT(REG_NO_LAZY_FLUSH);
1723 ADD_INT(REG_NOTIFY_CHANGE_NAME);
1724 ADD_INT(REG_NOTIFY_CHANGE_ATTRIBUTES);
1725 ADD_INT(REG_NOTIFY_CHANGE_LAST_SET);
1726 ADD_INT(REG_NOTIFY_CHANGE_SECURITY);
1727 ADD_INT(REG_LEGAL_CHANGE_FILTER);
1728 ADD_INT(REG_NONE);
1729 ADD_INT(REG_SZ);
1730 ADD_INT(REG_EXPAND_SZ);
1731 ADD_INT(REG_BINARY);
1732 ADD_INT(REG_DWORD);
1733 ADD_INT(REG_DWORD_LITTLE_ENDIAN);
1734 ADD_INT(REG_DWORD_BIG_ENDIAN);
1735 ADD_INT(REG_LINK);
1736 ADD_INT(REG_MULTI_SZ);
1737 ADD_INT(REG_RESOURCE_LIST);
1738 ADD_INT(REG_FULL_RESOURCE_DESCRIPTOR);
1739 ADD_INT(REG_RESOURCE_REQUIREMENTS_LIST);
Martin v. Löwis1a214512008-06-11 05:26:20 +00001740 return m;
Guido van Rossum9f3712c2000-03-28 20:37:15 +00001741}
1742
Martin v. Löwisf82d9b52007-09-03 07:43:05 +00001743