키워드 [Programming][VC++][Regsitry]
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=7471&ref=7471
// 레지스트리를 설정한 후 키이름을 변경할 만한 방법이 없어서 구현해봤습니다.
// 직접적으로 이름의 변경이 가능한건 아니고, 현재 열린 키를 포함 하위를 몽땅
// 파일로 백업한 다음에, 변경할 새 키로 몽땅 리스토어 한후, 기존 키를 지웁니다.
// 대상 키는 미리 만들어 주셔야 하며, 그게 귀찬을 경우
// 소스를 조금 수정하시면 없을 경우는 만들고 동작하도록 구성하시면 됩니다.
BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege = TRUE)
{
HANDLE hToken;
if(!::OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
return FALSE;
TOKEN_PRIVILEGES tp;
LUID luid;
if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid )) {
TRACE("LookupPrivilegeValue error: %u\n", GetLastError() );
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;
if ( !AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL) ) {
TRACE("AdjustTokenPrivileges error: %u\n", GetLastError() );
return FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) {
TRACE("The token does not have the specified privilege. \n");
return FALSE;
}
return TRUE;
}
#define TEMP_BACK_FILE "_#temp"
BOOL RegRenameKey(HKEY srcROOT, const char* srcSUB, HKEY dstROOT, const char* dstSUB)
{
HKEY hKeySrc=0, hKeyDst=0;
DWORD Ret;
// 저장할 때는 SeBackupPrivilege, 복구할 때는 SeRestorePrivilege 권한이 필요하다. msdn 발췌
if( !SetPrivilege("SeBackupPrivilege") || !SetPrivilege("SeRestorePrivilege") )
return FALSE;
if( RegOpenKeyEx(srcROOT, srcSUB, 0, KEY_ALL_ACCESS, &hKeySrc) != ERROR_SUCCESS ||
RegOpenKeyEx(dstROOT, dstSUB, 0, KEY_ALL_ACCESS, &hKeyDst) != ERROR_SUCCESS )
return FALSE;
Ret = RegSaveKey(hKeySrc, TEMP_BACK_FILE, NULL);
if(ERROR_SUCCESS != Ret)
{
RegCloseKey(hKeySrc);
DeleteFile(TEMP_BACK_FILE);
return FALSE;
}
RegCloseKey(hKeySrc);
hKeySrc = 0;
Ret = RegRestoreKey(hKeyDst, TEMP_BACK_FILE, REG_FORCE_RESTORE | REG_NO_LAZY_FLUSH);
if(ERROR_SUCCESS != Ret)
{
RegCloseKey(hKeyDst);
DeleteFile(TEMP_BACK_FILE);
return FALSE;
}
RegCloseKey(hKeyDst);
SHDeleteKey(srcROOT, srcSUB);
return TRUE;
}
----------------------------------------------------------------------------------------------
오승우 (Ċhobits) 61.75.68.12 | |
참고로 XP이상에선 NtDll.dll에 native API NtRenameKey가 있습니다. http://www.codeproject.com/system/NtRegistry.asp |