Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 6 additions & 12 deletions Doc/library/winreg.rst
Original file line number Diff line number Diff line change
Expand Up @@ -144,12 +144,6 @@ This module offers the following functions:

Deletes the specified key.

.. note::
The :func:`DeleteKeyEx` function is implemented with the RegDeleteKeyEx
Windows API function, which is specific to 64-bit versions of Windows.
See the `RegDeleteKeyEx documentation
<https://msdn.microsoft.com/en-us/library/ms724847%28VS.85%29.aspx>`__.

*key* is an already open key, or one of the predefined
:ref:`HKEY_* constants <hkey-constants>`.

Expand All @@ -159,9 +153,10 @@ This module offers the following functions:

*reserved* is a reserved integer, and must be zero. The default is zero.

*access* is an integer that specifies an access mask that describes the desired
security access for the key. Default is :const:`KEY_WOW64_64KEY`. See
:ref:`Access Rights <access-rights>` for other allowed values.
*access* is an integer that specifies an access mask that describes the
desired security access for the key. Default is :const:`KEY_WOW64_64KEY`.
On 32-bit Windows, the WOW64 constants are ignored.
See :ref:`Access Rights <access-rights>` for other allowed values.

*This method can not delete keys with subkeys.*

Expand Down Expand Up @@ -658,13 +653,12 @@ For more information, see `Accessing an Alternate Registry View
.. data:: KEY_WOW64_64KEY

Indicates that an application on 64-bit Windows should operate on
the 64-bit registry view.
the 64-bit registry view. On 32-bit Windows, this constant is ignored.

.. data:: KEY_WOW64_32KEY

Indicates that an application on 64-bit Windows should operate on
the 32-bit registry view.

the 32-bit registry view. On 32-bit Windows, this constant is ignored.

.. _value-types:

Expand Down
1 change: 1 addition & 0 deletions Misc/ACKS
Original file line number Diff line number Diff line change
Expand Up @@ -917,6 +917,7 @@ Sanyam Khurana
Tyler Kieft
Mads Kiilerich
Jason Killen
Derek D. Kim
Jan Kim
Taek Joo Kim
Sam Kimbrel
Expand Down
7 changes: 5 additions & 2 deletions PC/clinic/winreg.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 9 additions & 21 deletions PC/winreg.c
Original file line number Diff line number Diff line change
Expand Up @@ -991,7 +991,9 @@ winreg_DeleteKey_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key)
(Py_ssize_t)0) < 0) {
return NULL;
}
rc = RegDeleteKeyW(key, sub_key );
Py_BEGIN_ALLOW_THREADS
rc = RegDeleteKeyW(key, sub_key);
Py_END_ALLOW_THREADS
if (rc != ERROR_SUCCESS)
return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKey");
Py_RETURN_NONE;
Expand All @@ -1012,7 +1014,10 @@ winreg.DeleteKeyEx
reserved: int = 0
A reserved integer, and must be zero. Default is zero.

Deletes the specified key (64-bit OS only).
Deletes the specified key (intended for 64-bit OS).

While this function is intended to be used for 64-bit OS, it is also
available on 32-bit systems.

This method can not delete keys with subkeys.

Expand All @@ -1025,34 +1030,17 @@ static PyObject *
winreg_DeleteKeyEx_impl(PyObject *module, HKEY key,
const Py_UNICODE *sub_key, REGSAM access,
int reserved)
/*[clinic end generated code: output=52a1c8b374ebc003 input=711d9d89e7ecbed7]*/
/*[clinic end generated code: output=52a1c8b374ebc003 input=a3186db079b3bf85]*/
{
HMODULE hMod;
typedef LONG (WINAPI *RDKEFunc)(HKEY, const wchar_t*, REGSAM, int);
RDKEFunc pfn = NULL;
long rc;

if (PySys_Audit("winreg.DeleteKey", "nun",
(Py_ssize_t)key, sub_key,
(Py_ssize_t)access) < 0) {
return NULL;
}
/* Only available on 64bit platforms, so we must load it
dynamically. */
Py_BEGIN_ALLOW_THREADS
hMod = GetModuleHandleW(L"advapi32.dll");
if (hMod)
pfn = (RDKEFunc)GetProcAddress(hMod, "RegDeleteKeyExW");
rc = RegDeleteKeyExW(key, sub_key, access, reserved);
Py_END_ALLOW_THREADS
if (!pfn) {
PyErr_SetString(PyExc_NotImplementedError,
"not implemented on this platform");
return NULL;
}
Py_BEGIN_ALLOW_THREADS
rc = (*pfn)(key, sub_key, access, reserved);
Py_END_ALLOW_THREADS

if (rc != ERROR_SUCCESS)
return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKeyEx");
Py_RETURN_NONE;
Expand Down