怎么设定访问注册表的权限

如何设定访问注册表的权限?
我查找了MSDN,其中有一个示例代码,但是,无法达到我要的效果,不知原因何在?
我想达到的目的:设定某个注册表键及其子键的everyone或者system用户访问权限,使其拥有完全控制的权限或者只有读取的权限,应该如何实现呢?MSDN中的示例代码我看得也不是很懂,不知哪位能详细解释一下,以及如何利用示例代码传递变量?示例代码我贴在下面:
C/C++ code
//************************************************************* 
// 设定某个对象的访问权限
//*************************************************************
DWORD CUSBCleanerApp::AddAceToObjectsSecurityDescriptor (
    LPTSTR pszObjName,          // 对象名 // hkey
    SE_OBJECT_TYPE ObjectType,  // 对象类型 // SE_REGISTRY_KEY,若用预定义键必须用如下"CLASSES_ROOT", "CURRENT_USER", "MACHINE", and "USERS".
    LPTSTR pszTrustee,          // trustee for new ACE // TRUSTEE_IS_NAME or TRUSTEE_IS_SID
    TRUSTEE_FORM TrusteeForm,  // format of trustee structure // TRUSTEE_IS_SID or TRUSTEE_IS_NAME
    DWORD dwAccessRights,      // access mask for new ACE // GENERIC_ALL,访问的权限设置
    ACCESS_MODE AccessMode,    // type of ACE // SET_ACCESS
    DWORD dwInheritance        // inheritance flags for new ACE // CONTAINER_INHERIT_ACE
)
{
DWORD dwRes = 0;
PACL pOldDACL = NULL, pNewDACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea;

if (NULL == pszObjName)
    return ERROR_INVALID_PARAMETER;

// Get a pointer to the existing DACL.
// 获取已存在的DACL
dwRes = GetNamedSecurityInfo(pszObjName, ObjectType,
      DACL_SECURITY_INFORMATION,
      NULL, NULL, &pOldDACL, NULL, &pSD);
if (ERROR_SUCCESS != dwRes) {
    printf( "GetNamedSecurityInfo Error %u\n", dwRes );
    goto Cleanup;


// Initialize an EXPLICIT_ACCESS structure for the new ACE.

ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
ea.grfAccessPermissions = dwAccessRights;
ea.grfAccessMode = AccessMode;
ea.grfInheritance= dwInheritance;
ea.Trustee.TrusteeForm = TrusteeForm;
ea.Trustee.ptstrName = pszTrustee;

// Create a new ACL that merges the new ACE
// into the existing DACL.

dwRes = SetEntriesInAcl(1, &ea, pOldDACL, &pNewDACL);
if (ERROR_SUCCESS != dwRes)  {
    printf( "SetEntriesInAcl Error %u\n", dwRes );
    goto Cleanup;


// Attach the new ACL as the object's DACL.

dwRes = SetNamedSecurityInfo(pszObjName, ObjectType,
      DACL_SECURITY_INFORMATION,
      NULL, NULL, pNewDACL, NULL);
if (ERROR_SUCCESS != dwRes)  {
    printf( "SetNamedSecurityInfo Error %u\n", dwRes );
    goto Cleanup;


Cleanup:

    if(pSD != NULL)
        LocalFree((HLOCAL) pSD);
    if(pNewDACL != NULL)
        LocalFree((HLOCAL) pNewDACL);

    return dwRes;
}




------解决方案--------------------
帮你顶~我不会
你把分给多点就有人答拉~