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_STRINGRtlInitUnicodeString(&RegUnicodeStr, MY_REG_SOFTWARE_KEY_NAME);OBJECT_ATTRIBUTES objectAttributes;// 初始化objectAttributesInitializeObjectAttributes(&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);