키워드 [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

+ Recent posts