RegLoadKey Privilege Problem

I try to use RegLoadKey with HKEY_LOCAL_MACHINE hive, but it returns ERROR_ACCESS_DENIED ,
the code below works for HKEY_CURRENT_USER hive , i couldnt figure out why it didnt for also HKEY_LOCAL_MACHINE
although i am setting privilige defined as msdn ( http://msdn2.microsoft.com/en-us/library/ms724889.aspx )

Can you help me ?

HKEY hive ;
LONG lReturn ;
char sFileName[12] = “c:\test.dat”;

SetPrivilege(SE_BACKUP_NAME,TRUE);
SetPrivilege(SE_RESTORE_NAME,TRUE);

RegOpenKeyEx(HKEY_LOCAL_MACHINE, “”,0,KEY_READ, &hHive);
RegSaveKey(hHive,sFileName,NULL);
lReturn = RegLoadKey(HKEY_LOCAL_MACHINE,“newhklm\”,sFileName);

// lReturn becomes 5L which means ERROR_ACCESS_DENIED

My privilige function :

BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
TOKEN_PRIVILEGES tp;
LUID luid;
HANDLE hToken;

OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
if ( !LookupPrivilegeValue(NULL, lpszPrivilege, &luid) )
return FALSE;

tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;

if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;

AdjustTokenPrivileges(hToken, FALSE, &tp, 0, (PTOKEN_PRIVILEGES) NULL, 0);

return ( (GetLastError()!=ERROR_SUCCESS)?FALSE:TRUE);
}

Check first if the file really does get created, note that on most OS you
need to open a key with RegCreateKeyEx (not RegOpenKey) with option flag
REG_OPTION_BACKUP_RESTORE specified before you can call RegSaveKey. The
keyname passed to RegLoadKey should not include any slashes (\). This API
is very quirky, on some OSes the RegSaveKey/RegLoadKey may fail if it takes
place on another volume than the system drive or if it includes a long file
name.

/Daniel

wrote in message news:xxxxx@ntdev…
>I try to use RegLoadKey with HKEY_LOCAL_MACHINE hive, but it returns
>ERROR_ACCESS_DENIED ,
> the code below works for HKEY_CURRENT_USER hive , i couldnt figure out
> why it didnt for also HKEY_LOCAL_MACHINE
> although i am setting privilige defined as msdn (
> http://msdn2.microsoft.com/en-us/library/ms724889.aspx )
>
> Can you help me ?
>
> HKEY hive ;
> LONG lReturn ;
> char sFileName[12] = “c:\test.dat”;
>
> SetPrivilege(SE_BACKUP_NAME,TRUE);
> SetPrivilege(SE_RESTORE_NAME,TRUE);
>
> RegOpenKeyEx(HKEY_LOCAL_MACHINE, “”,0,KEY_READ, &hHive);
> RegSaveKey(hHive,sFileName,NULL);
> lReturn = RegLoadKey(HKEY_LOCAL_MACHINE,“newhklm\”,sFileName);
>
> // lReturn becomes 5L which means ERROR_ACCESS_DENIED
>
> My privilige function :
>
> BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
> {
> TOKEN_PRIVILEGES tp;
> LUID luid;
> HANDLE hToken;
>
> OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES |
> TOKEN_QUERY, &hToken);
> if ( !LookupPrivilegeValue(NULL, lpszPrivilege, &luid) )
> return FALSE;
>
> tp.PrivilegeCount = 1;
> tp.Privileges[0].Luid = luid;
>
> if (bEnablePrivilege)
> tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
> else
> tp.Privileges[0].Attributes = 0;
>
> AdjustTokenPrivileges(hToken, FALSE, &tp, 0, (PTOKEN_PRIVILEGES) NULL, 0);
>
> return ( (GetLastError()!=ERROR_SUCCESS)?FALSE:TRUE);
> }
>

BTW I forgot to mention that it is not possible to call RegSaveKey for a
complete rootkey. You need to open an existing registry hive first (for
instance SOFTWARE).

/Daniel

wrote in message news:xxxxx@ntdev…
>I try to use RegLoadKey with HKEY_LOCAL_MACHINE hive, but it returns
>ERROR_ACCESS_DENIED ,
> the code below works for HKEY_CURRENT_USER hive , i couldnt figure out
> why it didnt for also HKEY_LOCAL_MACHINE
> although i am setting privilige defined as msdn (
> http://msdn2.microsoft.com/en-us/library/ms724889.aspx )
>
> Can you help me ?
>
> HKEY hive ;
> LONG lReturn ;
> char sFileName[12] = “c:\test.dat”;
>
> SetPrivilege(SE_BACKUP_NAME,TRUE);
> SetPrivilege(SE_RESTORE_NAME,TRUE);
>
> RegOpenKeyEx(HKEY_LOCAL_MACHINE, “”,0,KEY_READ, &hHive);
> RegSaveKey(hHive,sFileName,NULL);
> lReturn = RegLoadKey(HKEY_LOCAL_MACHINE,“newhklm\”,sFileName);
>
> // lReturn becomes 5L which means ERROR_ACCESS_DENIED
>
> My privilige function :
>
> BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
> {
> TOKEN_PRIVILEGES tp;
> LUID luid;
> HANDLE hToken;
>
> OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES |
> TOKEN_QUERY, &hToken);
> if ( !LookupPrivilegeValue(NULL, lpszPrivilege, &luid) )
> return FALSE;
>
> tp.PrivilegeCount = 1;
> tp.Privileges[0].Luid = luid;
>
> if (bEnablePrivilege)
> tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
> else
> tp.Privileges[0].Attributes = 0;
>
> AdjustTokenPrivileges(hToken, FALSE, &tp, 0, (PTOKEN_PRIVILEGES) NULL, 0);
>
> return ( (GetLastError()!=ERROR_SUCCESS)?FALSE:TRUE);
> }
>