Programming/C

C언어로 Windows 시스템 레지스트리에 값 저장하기

moxie2ks 2025. 4. 17. 18:01
728x90
반응형

개요

Windows 운영체제는 시스템 설정과 애플리케이션 데이터를 저장하기 위한 중앙 집중식 데이터베이스인 레지스트리를 제공한다. 이 레지스트리는 소프트웨어 설정, 하드웨어 구성, 사용자 기본 설정 등 다양한 정보를 저장하는 핵심 구성 요소로, 애플리케이션 개발자는 이를 활용하여 프로그램 설정이나 라이선스 정보와 같은 중요 데이터를 안전하게 보관할 수 있다. 본 글에서는 Windows API를 사용하여 레지스트리에 값을 저장하고 검색하는 방법을 예제 코드와 함께 살펴본다.

설명

Windows 레지스트리는 계층적 구조를 가진 데이터베이스로, 키(Key)와 값(Value)의 형태로 정보를 관리한다. 레지스트리는 다음과 같은 주요 루트 키(Root Key)로 구성된다:

  1. HKEY_CURRENT_USER (HKCU): 현재 로그인한 사용자의 설정
  2. HKEY_LOCAL_MACHINE (HKLM): 시스템 전체에 적용되는 설정
  3. HKEY_CLASSES_ROOT (HKCR): 파일 확장자 관련 정보와 COM 객체 등록 정보
  4. HKEY_USERS (HKU): 시스템의 모든 사용자 프로필
  5. HKEY_CURRENT_CONFIG: 현재 하드웨어 프로필 구성

레지스트리 데이터 타입은 다양하며, 주요 타입으로는 REG_SZ(문자열), REG_DWORD(32비트 정수), REG_BINARY(이진 데이터), REG_MULTI_SZ(문자열 배열) 등이 있다. 레지스트리 접근 및 조작은 Windows API 함수를 통해 이루어지며, 주요 함수로는 RegCreateKeyEx(), RegOpenKeyEx(), RegSetValueEx(), RegQueryValueEx(), RegDeleteKey(), RegCloseKey() 등이 있다.

특징

Windows 레지스트리 조작의 주요 특징은 다음과 같다:

  1. 지속성: 레지스트리에 저장된 데이터는 시스템 재부팅 후에도 유지되므로 영구적인 설정 저장에 적합하다.
  2. 보안성: 레지스트리는 접근 제어 목록(ACL)을 통한 보안 기능을 제공하여 권한이 없는 사용자나 프로그램의 접근을 제한할 수 있다.
  3. 계층적 구조: 트리 형태의 구조로 데이터를 체계적으로 관리할 수 있어 애플리케이션별, 사용자별 설정 분리가 용이하다.
  4. 다양한 데이터 타입: 문자열, 숫자, 이진 데이터 등 다양한 형식의 데이터를 저장할 수 있다.
  5. 오류 처리: 모든 레지스트리 관련 함수는 작업 성공 여부를 나타내는 반환 값을 제공하여 오류 처리가 용이하다.
  6. 권한 요구: 일부 레지스트리 영역은 관리자 권한이 필요하므로, 권한 요구 사항을 고려한 설계가 필요하다.

예시

다음은 라이선스 ID를 Windows 레지스트리에 저장하고 확인하는 예제 코드이다:

#include <stdio.h>
#include <sys/stat.h>
#include <string.h>
#include <Windows.h>

int check_license_id(const char* licenseID)
{
    HKEY hKey;
    DWORD value = 0;
    DWORD dataSize = sizeof(DWORD);
    char savedLicenseID[64] = {'\0',};
    dataSize = sizeof(savedLicenseID);

    // 레지스트리 키 열기 또는 생성
    if (RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\myregistry", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL) != ERROR_SUCCESS) {
        printf("Failed to open or create registry key.\n");
        return -1;
    }

    // 저장된 licenseID 검사
    if (RegQueryValueEx(hKey, "LicenseID", NULL, NULL, (LPBYTE)savedLicenseID, &dataSize) == ERROR_SUCCESS) {
        if (strncmp(savedLicenseID, licenseID, 64) != 0)
        {
            printf("New license ID does not match the saved license ID.\n");
            return -1;
        }
        printf("License has already been activated.\n");
    }
    else
    {
        // 새 라이선스 ID 설정
        if (RegSetValueEx(hKey, "LicenseID", 0, REG_SZ, (const BYTE*)licenseID, dataSize) != ERROR_SUCCESS) {
            printf("Failed to set registry value.\n");
            return -1;
        }
        printf("License activation complete.\n");
    }

    // 레지스트리 키 닫기
    RegCloseKey(hKey);

    return 0;
}

int main(void)
{
    const char* licenseID = "9daffa46-252f-11ee-be56-022ac120002";

    check_license_id(licenseID);

    return 0;
}

이 코드는 다음과 같은 주요 단계를 수행한다:

  1. 레지스트리 키 생성 또는 열기: RegCreateKeyEx() 함수를 사용하여 'HKEY_CURRENT_USER\Software\myregistry' 경로에 레지스트리 키를 생성하거나 이미 존재하는 경우 열기
  2. 기존 값 확인: RegQueryValueEx() 함수를 사용하여 'LicenseID'라는 이름의 값이 이미 존재하는지 확인
  3. 조건부 처리:
    • 값이 이미 존재하는 경우: 새 라이선스 ID와 저장된 값 비교
    • 값이 존재하지 않는 경우: RegSetValueEx() 함수를 사용하여 새 라이선스 ID 저장
  4. 리소스 정리: RegCloseKey() 함수를 사용하여 열린 레지스트리 키 핸들 닫기

이 코드는 다음과 같은 상황을 처리한다:

  • 라이선스가 아직 활성화되지 않은 경우: 새 라이선스 ID를 레지스트리에 저장
  • 라이선스가 이미 활성화된 경우: 기존 ID와 새 ID가 일치하는지 확인
  • 레지스트리 접근 오류: 적절한 오류 메시지 출력 및 처리

결론

Windows 레지스트리는 애플리케이션 설정, 라이선스 정보, 사용자 기본 설정 등을 저장하기 위한 강력한 메커니즘을 제공한다. Windows API의 레지스트리 함수들을 통해 레지스트리 값을 생성, 읽기, 수정, 삭제할 수 있으며, 이를 통해 프로그램 실행 간에 데이터를 영구적으로 보존할 수 있다.

레지스트리 사용 시 주의해야 할 점은 다음과 같다:

  1. 적절한 권한 관리: 필요한 최소한의 권한만 요청
  2. 오류 처리: 모든 레지스트리 함수 호출 후 반환 값 확인
  3. 리소스 관리: 사용이 끝난 레지스트리 핸들은 반드시 닫기
  4. 보안 고려: 민감한 정보는 암호화하여 저장
  5. 클린업: 애플리케이션 제거 시 생성한 레지스트리 키와 값 정리

레지스트리는 강력한 기능을 제공하지만, 잘못된 사용은 시스템 안정성에 영향을 줄 수 있으므로 신중한 접근이 필요하다. 특히 시스템 전체에 영향을 미치는 HKEY_LOCAL_MACHINE 영역은 관리자 권한이 필요하며, 변경 시 특별한 주의가 요구된다.

참고문헌

  1. Microsoft 문서 - 레지스트리 함수: https://docs.microsoft.com/ko-kr/windows/win32/sysinfo/registry-functions
  2. Windows 레지스트리 프로그래밍 가이드: https://docs.microsoft.com/ko-kr/windows/win32/sysinfo/registry
  3. 레지스트리 데이터 타입: https://docs.microsoft.com/ko-kr/windows/win32/sysinfo/registry-value-types
  4. Windows 시스템 프로그래밍 가이드: https://docs.microsoft.com/ko-kr/windows/win32/sysinfo/windows-system-information
728x90
반응형