/*

 Copyright (c) 2000 Microsoft Corporation

 Module Name:

   CUSeeMe4.cpp

 Abstract:

    This DLL fixes a profiles bug in CU-SeeMe Pro 4.0 setup where it only adds some certain
    Reg values to the per-user hive (HKCU) instead of putting them in HKLM.

    We don't actually hook any functions, instead, we just copy the regkeys after setup finishes
    when our process detach is called.

 Notes:

 History:

    08/07/2000  reinerf  Created
    11/29/2000  andyseti Renamed file from setup.cpp into CUSeeMe4.cpp.
                         Converted into AppSpecific shim.
*/

#include "precomp.h"


IMPLEMENT_SHIM_BEGIN(CUSeeMe4)
#include "ShimHookMacro.h"

APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_END


BOOL
NOTIFY_FUNCTION(
    DWORD fdwReason)
{
    if (fdwReason == DLL_PROCESS_DETACH)
    {
        HKEY hkCU;
        HKEY hkLM;

        if ((RegOpenKeyExA(HKEY_CURRENT_USER,
                           "Software\\White Pine\\CU-SeeMe Pro\\4.0\\Installer",
                           0,
                           KEY_QUERY_VALUE,
                           &hkCU) == ERROR_SUCCESS))
        {
            if (RegOpenKeyExA(HKEY_LOCAL_MACHINE,
                              "Software\\White Pine\\CU-SeeMe Pro\\4.0\\Installer",
                              0,
                              KEY_SET_VALUE,
                              &hkLM) == ERROR_SUCCESS)
            {
                // these are the values we want to migrate
                static char* aszValues[] = {"Folder",
                                            "Serial",
                                            "Help",
                                             0,
                                           };
                char** ppszValue = aszValues;

                LOGN( eDbgLevelError, 
                    "Copying values from 'HKCU\\Software\\White Pine\\CU-SeeMe Pro\\4.0\\Installer' into"
                    "'HKLM\\Software\\White Pine\\CU-SeeMe Pro\\4.0\\Installer'.");

                while (*ppszValue)
                {
                    DWORD dwType;
                    DWORD cbData;
                    char szData[MAX_PATH];

                    cbData = sizeof(szData);
                    if (RegQueryValueExA(hkCU,
                                         *ppszValue,
                                         NULL,
                                         &dwType,
                                         (LPBYTE)&szData,
                                         &cbData) == ERROR_SUCCESS)
                    {
                        RegSetValueExA(hkLM, *ppszValue, 0, dwType, (LPBYTE)&szData, cbData);
                    }

                    // get the next value to migrate from hkcu -> hklm
                    ppszValue++;
                }
                
                RegCloseKey(hkLM);
            }
            
            RegCloseKey(hkCU);
        }
    }

    return TRUE;
}

/*++

 Register hooked functions

--*/

HOOK_BEGIN
    CALL_NOTIFY_FUNCTION
HOOK_END

IMPLEMENT_SHIM_END