SAVECFG.C
/*++ 
 
Copyright (c) 1997 Microsoft Corporation 
 
Module Name: 
 
    savecfg.c 
 
Abstract: 
 
    This source file implements code to save the Win9x environment to 
    a settings file.  It writes a copy of all screen saver settings on 
    a per-user basis. 
 
Author: 
 
    Jim Schmidt (jimschm) 11-Apr-1997 
 
Revision History: 
 
 
--*/ 
 
#include "pch.h" 
 
BOOL 
SaveDatFileKeyAndVal ( 
    IN      LPCSTR Key, 
    IN      LPCSTR Val 
    ) 
{ 
    // 
    // This function is a wrapper to simplify writing to our settings file 
    // 
 
    return WritePrivateProfileString (g_User, Key, Val, g_SettingsFile); 
} 
 
 
BOOL 
CopyRegValueToDatFile ( 
    IN      HKEY RegKey, 
    IN      LPCSTR ValueName 
    ) 
{ 
    LPCSTR DataPtr; 
    DWORD rc; 
 
    // 
    // Obtain registry value data and copy it to our settings file 
    // 
 
    DataPtr = GetRegValueString (RegKey, ValueName); 
    if (DataPtr) { 
        return SaveDatFileKeyAndVal (ValueName, DataPtr); 
    } 
 
    // If not found or wrong data type, don't sweat it 
    rc = GetLastError(); 
    return rc == ERROR_FILE_NOT_FOUND || rc == ERROR_SUCCESS; 
} 
 
 
#define WIN9X_MAX_SECTION  32768 
 
BOOL 
SaveControlIniSection ( 
    IN      LPCSTR ControlIniSection, 
    IN      LPCSTR ScreenSaverName 
    ) 
{ 
    LPSTR Buffer; 
    LPSTR p; 
    CHAR NewKey[MAX_PATH]; 
    BOOL b = TRUE; 
    CHAR DataBuf[MAX_PATH]; 
 
    // 
    // This function copies an entire section in control.ini to our 
    // settings file.  It may not be necessary because control.ini will 
    // still be around, but this guarantees if someone modifies 
    // control.ini later, our migration will not break. 
    // 
 
    // 
    // Allocate a generous buffer to hold all key names 
    // 
 
    Buffer = HeapAlloc (g_hHeap, 0, WIN9X_MAX_SECTION); 
    if (!Buffer) { 
        return FALSE; 
    } 
 
    // 
    // Retrieve the key names 
    // 
 
    GetPrivateProfileString ( 
        ControlIniSection,  
        NULL,  
        S_EMPTY, 
        Buffer, 
        WIN9X_MAX_SECTION,  
        S_CONTROL_INI 
        ); 
 
    // 
    // For each key name, copy it to our settings file 
    // 
 
    p = Buffer; 
 
    while (*p) { 
        if (CreateScreenSaverParamKey (ScreenSaverName, p, NewKey)) { 
            GetPrivateProfileString ( 
                    ControlIniSection,  
                    p,  
                    S_EMPTY,  
                    DataBuf,  
                    MAX_PATH,  
                    S_CONTROL_INI 
                    ); 
 
            if (!SaveDatFileKeyAndVal (NewKey, DataBuf)) { 
                b = FALSE; 
                break; 
            } 
        } 
 
        p = _mbschr (p, 0); 
        p++; 
    } 
 
    // 
    // Cleanup 
    // 
 
    HeapFree (g_hHeap, 0, Buffer); 
    return b; 
}