Added regkey.empty() based on RegDeleteTreeW

This commit is contained in:
hakril
2019-08-13 14:57:56 +02:00
parent 1e42553112
commit 6bd45e8503
5 changed files with 1470 additions and 1431 deletions
@@ -243,4 +243,14 @@ LSTATUS RegEnumValueW(
LPDWORD lpType,
LPBYTE lpData,
LPDWORD lpcbData
);
LSTATUS RegDeleteTreeA(
HKEY hKey,
LPCSTR lpSubKey
);
LSTATUS RegDeleteTreeW(
HKEY hKey,
LPCWSTR lpSubKey
);
+19 -12
View File
@@ -7,7 +7,7 @@ import windows
testbasekeypath = r"HKEY_CURRENT_USER\SOFTWARE\PythonForWindows\Test"
basekeytest = windows.system.registry(testbasekeypath, gdef.KEY_WOW64_64KEY | gdef.KEY_READ | gdef.KEY_WRITE)
basekeytest = windows.system.registry(testbasekeypath, gdef.KEY_WOW64_64KEY | gdef.KEY_ALL_ACCESS)
if not basekeytest.exists:
basekeytest.create()
@@ -15,13 +15,8 @@ if not basekeytest.exists:
@pytest.fixture()
def empty_test_base_key():
assert basekeytest.exists
for subkey in basekeytest.subkeys:
subkey.delete()
# Use of lowlevel_value_enum allow deleting value with NULL bytes
for value in basekeytest.values:
del basekeytest[value.name]
assert not basekeytest.subkeys
assert not basekeytest.values
# Depends on test_registry_key_empty :)
basekeytest.empty()
# Clean registry before everytest
pytestmark = pytest.mark.usefixtures("empty_test_base_key")
@@ -143,6 +138,22 @@ def test_registry_get_key_info():
assert other_info[1] == 2 # Nb values
assert isinstance(other_info[2], (int, long)) # Last write
def test_registry_key_empty():
subname = "MyTestKeyEmpty"
subkey = basekeytest(subname).create()
# Add some non-empty subkeys
subkey("AAA").create()["LOL"] = 2
subkey("BBBB").create()["value"] = "hello"
# Add some values
subkey["42"] = 43
subkey["XXX"] = "42_42"
assert subkey.values
assert subkey.subkeys
subkey.empty()
# Check everythin disappeared
assert not subkey.values
assert not subkey.subkeys
def test_registry_unicode_value_name_enumerate():
name1 = u"enum_" + UNICODE_PATH_NAME
@@ -216,9 +227,5 @@ def test_registry_unicode_subkeys_enumerate():
assert name2 in subkey_names
# Test Py<->REG conversion bug
# [99, 0, 58, 0, 92, 0, 117, 0, 115, 0, 101, 0, 114, 0, 115, 0, 92, 0, 104, 0, 97, 0, 107, 0, 114, 0, 105, 0, 108, 0, 92, 0, 97, 0, 112, 0, 112, 0, 100, 0, 97, 0, 116, 0, 97, 0, 92, 0, 108, 0, 111, 0, 99, 0, 97, 0, 108, 0, 92, 0, 116, 0, 101, 0, 109, 0, 112, 0, 92, 0, 116, 0, 101, 0, 115, 0, 116, 0, 95, 0, 117, 0, 110, 0, 105, 0, 99, 0, 111, 0, 100, 0, 101, 0, 95, 0, 45, 78, 253, 86, 246, 148, 76, 136, 81, 127, 246, 148, 169, 82, 75, 98, 100, 0, 98, 0, 113, 0, 115, 0, 109, 0, 51, 0, 0]
# 124
# def test_registry_Reg2Py_SZ(
File diff suppressed because it is too large Load Diff
+4
View File
@@ -343,12 +343,16 @@ class PyHKey(object):
def delete(self):
"""Delete the registry key"""
# Allow a 'recursive' param to empty before delete ?
try:
windows.winproxy.RegDeleteKeyExW(self.surkey.phkey, self.name, self.sam, 0)
except WindowsError as e:
raise WindowsError(e.winerror, "Could not delete registry key <{0}> ({1})".format(self.fullname, e.strerror))
return None
def empty(self):
windows.winproxy.RegDeleteTreeW(self.phkey, None)
def __setitem__(self, name, value):
+8
View File
@@ -336,6 +336,14 @@ def RegDeleteValueA(hKey, lpValueName):
def RegDeleteValueW(hKey, lpValueName):
return RegDeleteValueW.ctypes_function(hKey, lpValueName)
@Advapi32Proxy(error_check=result_is_error_code)
def RegDeleteTreeA(hKey, lpSubKey):
return RegDeleteTreeA.ctypes_function(hKey, lpSubKey)
@Advapi32Proxy(error_check=result_is_error_code)
def RegDeleteTreeW(hKey, lpSubKey):
return RegDeleteTreeW.ctypes_function(hKey, lpSubKey)
@Advapi32Proxy(error_check=result_is_error_code)
def RegEnumValueA(hKey, dwIndex, lpValueName, lpcchValueName, lpReserved, lpType, lpData, lpcbData):
return RegEnumValueA.ctypes_function(hKey, dwIndex, lpValueName, lpcchValueName, lpReserved, lpType, lpData, lpcbData)