我使用了RegSetKeySecurity设置Windows2000下注册表权限,使系统键可写,不想我的想器是XP,运行后把我系统中HKEY_LOCAL_MACHINE整个键都不见了,系统瘫患了。

2000下注册表权限在Regedit下无法设置,但在regedt32下有安全菜单项

XP下无论使用Regedit还是regedt32,都是一个样

不知那位用过这个函数?帮我看看

下面是代码:

SID_IDENTIFIER_AUTHORITY sia;

PSID pInteractiveSid=NULL;

PSID pAdministratorsSid=NULL;

SECURITY_DESCRIPTOR sd;

PACL pDacl=NULL;

DWORD dwAclSize;


CRegistry reg;


if (!AllocateAndInitializeSid(&sia,SECURITY_INTERACTIVE_RID,

0,0,0,0,0,0,0,0,&pInteractiveSid))

{


}


if (!AllocateAndInitializeSid(&sia,SECURITY_BUILTIN_DOMAIN_RID,

DOMAIN_ALIAS_RID_ADMINS,0,0,0,0,0,0,0,&pAdministratorsSid))

{

}


dwAclSize = sizeof(ACL) + 2 * ( sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) ) + GetLengthSid(pInteractiveSid) +  GetLengthSid(pAdministratorsSid) ;


pDacl = (PACL)HeapAlloc(GetProcessHeap(), 0, dwAclSize); 

if(pDacl == NULL) 

{

TRACE0("pDacl=NULL");


if(!InitializeAcl(pDacl, dwAclSize, ACL_REVISION)) 


if(!AddAccessAllowedAce( pDacl, ACL_REVISION, KEY_ALL_ACCESS, pInteractiveSid))



if(!AddAccessAllowedAce( pDacl, ACL_REVISION, KEY_ALL_ACCESS, pAdministratorsSid)) 



if(!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION)) 



if(!SetSecurityDescriptorDacl(&sd, TRUE, pDacl, FALSE)) 



reg.Open(HKEY_LOCAL_MACHINE,"HARDWARE");


long lRetCode = RegSetKeySecurity(reg.m_hKey,(SECURITY_INFORMATION)DACL_SECURITY_INFORMATION, &sd); 



return;