DDK同样提供了删除子项的内核函数,它就是ZwDeleteKey。其声明是:
NTSTATUS ZwDeleteKey(
IN HANDLE KeyHandle
);
// KeyHandle: 打开的文件句柄
// 返回值: 指示是否删除成功
需要指出,该函数只能删除没有子项的项目。如果项中还有子项,则不能删除。这时候需要先将该项中的所有子项全部删除后,再删除该项。下面的例子演示了如何在驱动程序中删除子项。
UNICODE_STRING RegUnicodeStr;
HANDLE hRegister;
#define MY_REG_SOFTWARE_KEY_NAME L"\\Registry\\Machine\\Software\\MyBOOKS\\SubItem"
// 初始化 UNICODE_STRING
RtlInitUnicodeString(&RegUnicodeStr, MY_REG_SOFTWARE_KEY_NAME);
OBJECT_ATTRIBUTES objectAttributes;
// 初始化objectAttributes
InitializeObjectAttributes(&objectAttributes,
&RegUnicodeStr,
OBJ_CASE_INSENSITIVE, // 对大小写敏感
NULL,
NULL
);
// 打开注册表项
NTSTATUS ntStatus = ZwOpenKey(&hRegister,
KEY_ALL_ACCESS,
&objectAttributes);
// 判断操作是否成功
if (NT_SUCCESS(ntStatus))
{
KdPrint(("Open register successfully. \n"));
}
// 删除注册表键
ntStatus = ZwDeleteKey(hRegister);
if (NT_SUCCESS(ntStatus))
{
KdPrint(("Delete the item successfully. \n"));
}
else if (ntStatus == STATUS_ACCESS_DENIED)
{
KdPrint(("STATUS_ACCESS_DENIED. \n"));
}
else if (ntStatus == STATUS_INVALID_HANDLE)
{
KdPrint(("STATUS_INVALID_HANDLE. \n"));
}
else
{
KdPrint(("Maybe the item has sub item to delete. \n"));
}
// 关闭句柄
ZwClose(hRegister);