1979 lines
66 KiB
C
1979 lines
66 KiB
C
/****************************** Module Header ******************************\
|
|
* Module Name: jpn.c
|
|
*
|
|
* Copyright (c) 1985 - 1999, Microsoft Corporation
|
|
*
|
|
* FEMGRATE, JPN speciific functions
|
|
*
|
|
\***************************************************************************/
|
|
#include "femgrate.h"
|
|
#include <tchar.h>
|
|
|
|
BOOL FixSpecificFolder(HINF hInf)
|
|
{
|
|
BOOL bRet = FALSE;
|
|
|
|
INFCONTEXT InfContext;
|
|
UINT LineCount,LineNo;
|
|
LPCTSTR szSectionName = TEXT("Folder.SpecificObjectToRename");
|
|
LPCTSTR RegName;
|
|
LPCTSTR NT4Name;
|
|
LPCTSTR NT5Name;
|
|
LPCTSTR MoveIt;
|
|
|
|
TCHAR szUSFRegKey[MAX_PATH];
|
|
TCHAR szNTUSF[MAX_PATH];
|
|
TCHAR szExpNT4USF[MAX_PATH];
|
|
TCHAR szExpNT5USF[MAX_PATH];
|
|
DWORD dwSize, dwType;
|
|
LONG lResult;
|
|
UINT uiCount;
|
|
HKEY hKey;
|
|
|
|
|
|
if(hInf == INVALID_HANDLE_VALUE) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSpecificFolder] Open femgrate.inf failed !\n")));
|
|
return FALSE;
|
|
}
|
|
|
|
LineCount = (UINT)SetupGetLineCount(hInf,szSectionName);
|
|
|
|
if((LONG)LineCount <= 0) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSpecificFolder] line count == 0 !\n")));
|
|
goto err1;
|
|
}
|
|
|
|
for(LineNo=0; LineNo<LineCount; LineNo++) {
|
|
if (SetupGetLineByIndex(hInf,szSectionName,LineNo,&InfContext)
|
|
&& (RegName = pSetupGetField(&InfContext,1))
|
|
&& (NT4Name = pSetupGetField(&InfContext,2))
|
|
&& (NT5Name = pSetupGetField(&InfContext,3))) {
|
|
|
|
DebugMsg((DM_VERBOSE,TEXT("FixSpecificFolder: RegName = %s !\n"),RegName));
|
|
DebugMsg((DM_VERBOSE,TEXT("FixSpecificFolder: NT4Name = %s !\n"),NT4Name));
|
|
DebugMsg((DM_VERBOSE,TEXT("FixSpecificFolder: NT5Name = %s !\n"),NT5Name));
|
|
|
|
//
|
|
// Query for the user's current "Folder" location.
|
|
//
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSpecificFolder] FixUserFolder, [%d] !\n"),LineNo));
|
|
|
|
lResult = RegOpenKeyEx (HKEY_CURRENT_USER,
|
|
USER_SHELL_FOLDER,
|
|
0,
|
|
KEY_READ,
|
|
&hKey);
|
|
|
|
if (lResult != ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSpecificFolder] , Open User Shell Folders failed!\n")));
|
|
continue;
|
|
}
|
|
|
|
lstrcpy(szUSFRegKey,RegName);
|
|
|
|
dwSize = sizeof(szNTUSF);
|
|
lResult = RegQueryValueEx (hKey,
|
|
szUSFRegKey,
|
|
NULL,
|
|
&dwType,
|
|
(LPBYTE) szNTUSF,
|
|
&dwSize);
|
|
|
|
DebugMsg((DM_VERBOSE,TEXT("FixSpecificFolder: Current Value (%s) = %s !\n"),szUSFRegKey,szNTUSF));
|
|
|
|
if (lResult != ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixUserFolders] Query User Shell Folders failed!\n")));
|
|
RegCloseKey (hKey);
|
|
continue;
|
|
}
|
|
|
|
|
|
ExpandEnvironmentStrings (szNTUSF, szExpNT4USF, MAX_PATH);
|
|
ExpandEnvironmentStrings (szNTUSF, szExpNT5USF, MAX_PATH);
|
|
|
|
ConcatenatePaths(szExpNT4USF,NT4Name,MAX_PATH);
|
|
ConcatenatePaths(szExpNT5USF,NT5Name,MAX_PATH);
|
|
|
|
|
|
lResult = GetFileAttributes(szExpNT4USF);
|
|
|
|
if (lResult == 0xFFFFFFFF) {
|
|
//
|
|
// Directory does not exist.
|
|
//
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixSpecificFolder] - File is not existed [%s] !\n"),szExpNT4USF));
|
|
} else if ((lResult & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) {
|
|
//
|
|
// this isn't a directory
|
|
//
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixSpecificFolder] This is a directory [%s] !\n"),szExpNT4USF));
|
|
} else if (MoveFile(szExpNT4USF, szExpNT5USF)) {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixSpecificFolder] Move %s to %s OK !\n"),szExpNT4USF, szExpNT5USF));
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixSpecificFolder] Failed to change folder name:\n%s\n%s"),szExpNT4USF,szExpNT5USF));
|
|
}
|
|
|
|
RegCloseKey (hKey);
|
|
}
|
|
|
|
}
|
|
|
|
bRet = TRUE;
|
|
|
|
err1:
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
|
BOOL FixUserFolders(HINF hInf)
|
|
{
|
|
BOOL bRet = FALSE;
|
|
|
|
INFCONTEXT InfContext;
|
|
UINT LineCount,LineNo;
|
|
LPCTSTR szSectionName = TEXT("Folder.ObjectToRename");
|
|
LPCTSTR RegName;
|
|
LPCTSTR NT4Name;
|
|
LPCTSTR NT5Name;
|
|
LPCTSTR MoveIt;
|
|
|
|
TCHAR szUSFRegKey[MAX_PATH];
|
|
TCHAR szNT4USF[MAX_PATH];
|
|
TCHAR szExpNT4USF[MAX_PATH];
|
|
TCHAR szExpNT5USF[MAX_PATH];
|
|
DWORD dwSize, dwType;
|
|
LONG lResult;
|
|
UINT uiCount;
|
|
HKEY hKey;
|
|
|
|
|
|
if(hInf == INVALID_HANDLE_VALUE) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixUserFolders] Open femgrate.inf failed !\n")));
|
|
return FALSE;
|
|
}
|
|
|
|
LineCount = (UINT)SetupGetLineCount(hInf,szSectionName);
|
|
|
|
if((LONG)LineCount <= 0) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixUserFolders] line count == 0 !\n")));
|
|
goto err1;
|
|
}
|
|
|
|
for(LineNo=0; LineNo<LineCount; LineNo++) {
|
|
if (SetupGetLineByIndex(hInf,szSectionName,LineNo,&InfContext)
|
|
&& (RegName = pSetupGetField(&InfContext,1))
|
|
&& (NT4Name = pSetupGetField(&InfContext,2))
|
|
&& (NT5Name = pSetupGetField(&InfContext,3))
|
|
&& (MoveIt = pSetupGetField(&InfContext,4))) {
|
|
|
|
DebugMsg((DM_VERBOSE,TEXT("FEGRPCV: RegName = %s !\n"),RegName));
|
|
DebugMsg((DM_VERBOSE,TEXT("FEGRPCV: NT4Name = %s !\n"),NT4Name));
|
|
DebugMsg((DM_VERBOSE,TEXT("FEGRPCV: NT5Name = %s !\n"),NT5Name));
|
|
DebugMsg((DM_VERBOSE,TEXT("FEGRPCV: MoveIt = %s !\n"),MoveIt));
|
|
|
|
//
|
|
// Query for the user's current "Folder" location.
|
|
//
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixUserFolders] FixUserFolder, [%d] !\n"),LineNo));
|
|
|
|
lResult = RegOpenKeyEx (HKEY_CURRENT_USER,
|
|
USER_SHELL_FOLDER,
|
|
0,
|
|
KEY_READ | KEY_WRITE,
|
|
&hKey);
|
|
|
|
if (lResult != ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixUserFolders] , Open User Shell Folders failed!\n")));
|
|
continue;
|
|
}
|
|
|
|
lstrcpy(szUSFRegKey,RegName);
|
|
|
|
dwSize = sizeof(szNT4USF);
|
|
lResult = RegQueryValueEx (hKey,
|
|
szUSFRegKey,
|
|
NULL,
|
|
&dwType,
|
|
(LPBYTE) szNT4USF,
|
|
&dwSize);
|
|
|
|
DebugMsg((DM_VERBOSE,TEXT("FEGRPCV: Current Value (%s) = %s !\n"),szUSFRegKey,szNT4USF));
|
|
|
|
if (lResult != ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixUserFolders] Query User Shell Folders failed!\n")));
|
|
RegCloseKey (hKey);
|
|
continue;
|
|
}
|
|
|
|
|
|
if (lstrcmpi(NT4Name, szNT4USF) != 0) {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixUserFolders] NT4Name <> szFolder :\n%s\n"),szExpNT4USF));
|
|
RegCloseKey (hKey);
|
|
continue;
|
|
}
|
|
//
|
|
// MoveIt == 1, we want move it to new folder
|
|
// else, we just update registry
|
|
//
|
|
if (lstrcmp(MoveIt,TEXT("1")) == 0) {
|
|
|
|
ExpandEnvironmentStrings (NT4Name, szExpNT4USF, MAX_PATH);
|
|
ExpandEnvironmentStrings (NT5Name, szExpNT5USF, MAX_PATH);
|
|
if (CopyProfileDirectory (szExpNT4USF, szExpNT5USF, CPD_IGNOREHIVE)) {
|
|
DebugMsg((DM_VERBOSE, TEXT("Fix Folder: Successfully changed folder name:\n%s\n%s"),szExpNT4USF,szExpNT5USF));
|
|
if (Delnode (szExpNT4USF)) {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixUserFolders] Successfully remove folder:\n%s\n"),szExpNT4USF));
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixUserFolders] Failed remove folder:\n%s\n"),szExpNT4USF));
|
|
}
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixUserFolders] Failed to change folder name:\n%s\n%s"),szExpNT4USF,szExpNT5USF));
|
|
}
|
|
}
|
|
|
|
//
|
|
// Set CSIDL_PERSONAL to point to this directory.
|
|
//
|
|
|
|
lResult = RegSetValueEx (hKey, szUSFRegKey, 0, REG_EXPAND_SZ,
|
|
(LPBYTE) NT5Name, (lstrlen(NT5Name) + 1) * sizeof(TCHAR));
|
|
|
|
if (lResult != ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixUserFolders] Set Registry faile, %s,%s\n"),szUSFRegKey,NT5Name));
|
|
}
|
|
|
|
RegCloseKey (hKey);
|
|
}
|
|
|
|
}
|
|
|
|
bRet = TRUE;
|
|
|
|
err1:
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
|
BOOL FixFoldersInSetup(HINF hInf,BOOL bCommonGroup)
|
|
{
|
|
BOOL bRet = FALSE;
|
|
|
|
INFCONTEXT InfContext;
|
|
UINT LineCount,LineNo;
|
|
LPCTSTR szSectionName = TEXT("Folder.ObjectToRenameInSetup");
|
|
|
|
LPCTSTR RegName;
|
|
LPCTSTR NT4Name;
|
|
LPCTSTR NT5Name;
|
|
|
|
TCHAR szUSFRegKey[MAX_PATH];
|
|
|
|
TCHAR szNT5USF[MAX_PATH];
|
|
TCHAR szNT4USF[MAX_PATH];
|
|
TCHAR szExpNT4USF[MAX_PATH];
|
|
TCHAR szExpNT5USF[MAX_PATH];
|
|
|
|
DWORD dwSize, dwType;
|
|
LONG lResult;
|
|
HKEY hKey;
|
|
|
|
|
|
if(hInf == INVALID_HANDLE_VALUE) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixFoldersInSetup] Open femgrate.inf failed !\n")));
|
|
return FALSE;
|
|
}
|
|
|
|
LineCount = (UINT)SetupGetLineCount(hInf,szSectionName);
|
|
|
|
if((LONG)LineCount <= 0) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixFoldersInSetup] line count == 0 !\n")));
|
|
goto err1;
|
|
}
|
|
|
|
for(LineNo=0; LineNo<LineCount; LineNo++) {
|
|
if (SetupGetLineByIndex(hInf,szSectionName,LineNo,&InfContext)
|
|
&& (RegName = pSetupGetField(&InfContext,1))
|
|
&& (NT4Name = pSetupGetField(&InfContext,2))
|
|
&& (NT5Name = pSetupGetField(&InfContext,3))) {
|
|
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixFoldersInSetup] Line# [%d] !\n"),LineNo));
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixFoldersInSetup] RegName = %s !\n"),RegName));
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixFoldersInSetup] NT4Name = %s !\n"),NT4Name));
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixFoldersInSetup] NT5Name = %s !\n"),NT5Name));
|
|
|
|
//
|
|
// Query for the user's current "Folder" location.
|
|
//
|
|
|
|
lResult = RegOpenKeyEx ((bCommonGroup ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER),
|
|
USER_SHELL_FOLDER, 0, KEY_READ | KEY_WRITE, &hKey);
|
|
|
|
if (lResult != ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixFoldersInSetup] FixSpecialFolder, Open User Shell Folders failed!\n")));
|
|
continue;
|
|
}
|
|
|
|
|
|
if (bCommonGroup) {
|
|
lstrcpy (szUSFRegKey,TEXT("Common "));
|
|
lstrcat (szUSFRegKey,RegName);
|
|
} else {
|
|
lstrcpy (szUSFRegKey,RegName);
|
|
}
|
|
|
|
dwSize = sizeof(szNT5USF);
|
|
lResult = RegQueryValueEx (hKey,
|
|
szUSFRegKey,
|
|
NULL,
|
|
&dwType,
|
|
(LPBYTE) szNT5USF,
|
|
&dwSize);
|
|
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixFoldersInSetup] Current Registry Value (%s) = %s !\n"),szUSFRegKey,szNT5USF));
|
|
|
|
if (lResult != ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixFoldersInSetup] Query User Shell Folders failed!\n")));
|
|
RegCloseKey(hKey);
|
|
continue;
|
|
}
|
|
|
|
|
|
if (_tcsstr(szNT5USF,NT4Name)) {
|
|
//
|
|
// it means the value is still in SB
|
|
//
|
|
lstrcpy(szNT4USF,szNT5USF);
|
|
|
|
if (ReplaceString(szNT4USF,NT4Name,NT5Name,szNT5USF)) {
|
|
ExpandEnvironmentStrings (szNT4USF, szExpNT4USF, MAX_PATH);
|
|
ExpandEnvironmentStrings (szNT5USF, szExpNT5USF, MAX_PATH);
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixFoldersInSetup] szExpNT4USF = %s\n"),szExpNT4USF));
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixFoldersInSetup] case 1 szExpNT5USF = %s\n"),szExpNT5USF));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixFoldersInSetup] case 1 The replace string got error \n")));
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixFoldersInSetup] %s\n %s\n %s\n%s\n"),szNT5USF,NT5Name,NT4Name,szNT4USF));
|
|
}
|
|
|
|
lResult = RegSetValueEx (hKey,
|
|
szUSFRegKey,
|
|
0,
|
|
REG_SZ,
|
|
(LPBYTE) szNT5USF,
|
|
(lstrlen(szNT5USF)+1)*sizeof(TCHAR));
|
|
|
|
if (lResult == ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixFoldersInSetup] set registry value %s = %s \n"),szUSFRegKey,szNT5USF));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixFoldersInSetup] failed set registry value %s = %s \n"),szUSFRegKey,szNT5USF));
|
|
}
|
|
} else {
|
|
//
|
|
// it means the value has been changed to DB
|
|
//
|
|
if (ReplaceString(szNT5USF,NT5Name,NT4Name,szNT4USF)) {
|
|
ExpandEnvironmentStrings (szNT4USF, szExpNT4USF, MAX_PATH);
|
|
ExpandEnvironmentStrings (szNT5USF, szExpNT5USF, MAX_PATH);
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixFoldersInSetup] case 2 szExpNT4USF = %s\n"),szExpNT4USF));
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixFoldersInSetup] case 2 szExpNT5USF = %s\n"),szExpNT5USF));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixFoldersInSetup] The replace string got error \n")));
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixFoldersInSetup] %s\n %s\n %s\n%s\n"),szNT5USF,NT5Name,NT4Name,szNT4USF));
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// here is a bug in build before 2072 that the ACLS of "all users" has no read access to "everyone"
|
|
//
|
|
// The new created directory will inherit this attributes, and it caused access denied.
|
|
//
|
|
// so we apply old directory's ACL to new one
|
|
//
|
|
// this is compatibile with US version
|
|
//
|
|
if (bCommonGroup) {
|
|
if (CreateSecurityDirectory(szExpNT4USF, szExpNT5USF)) {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixFoldersInSetup] CreateSecurityDirectory %s %s OK \n"),szExpNT4USF, szExpNT5USF));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixFoldersInSetup] CreateSecurityDirectory %s %s Failed \n"),szExpNT4USF, szExpNT5USF));
|
|
}
|
|
}
|
|
|
|
if (CopyProfileDirectory (szExpNT4USF, szExpNT5USF, CPD_IGNOREHIVE)) {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixFoldersInSetup] Successfully copied folder\nFrom:%s\nTo :%s\n"),szExpNT4USF,szExpNT5USF));
|
|
if (Delnode (szExpNT4USF)) {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixFoldersInSetup] Successfully removed folder:%s\n"),szExpNT4USF));
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE, TEXT("Fix Folder: Failed remove folder:\n%s\n"),szExpNT4USF));
|
|
}
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE, TEXT("Fix Folder: Failed to change folder name:\n%s\n%s"),szExpNT4USF,szExpNT5USF));
|
|
}
|
|
RegCloseKey (hKey);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
bRet = TRUE;
|
|
|
|
err1:
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
|
BOOL FixCommon(HINF hInf)
|
|
{
|
|
|
|
TCHAR szCommon[MAX_PATH];
|
|
TCHAR szProgramFolderPath[MAX_PATH];
|
|
TCHAR szExpProgramFolderPath[MAX_PATH];
|
|
|
|
BOOL bRet = FALSE;
|
|
HANDLE hFile;
|
|
|
|
DWORD RequiredSize;
|
|
WIN32_FIND_DATA fd;
|
|
UINT nCommon, nFileName;
|
|
LPTSTR lpTag, lpEnd, lpEnd2;
|
|
|
|
szExpProgramFolderPath[0] = 0;
|
|
//
|
|
// Loop through all the program groups in the All Users profile
|
|
// and remove the " (Common)" tag.
|
|
//
|
|
if(hInf == INVALID_HANDLE_VALUE) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixCommon] Open femgrate.inf failed !\n")));
|
|
return FALSE;
|
|
}
|
|
if (! SetupGetLineText(NULL,
|
|
hInf,
|
|
TEXT("Misc"),
|
|
TEXT("Common"),
|
|
szCommon,
|
|
sizeof(szCommon),
|
|
&RequiredSize)) {
|
|
goto err1;
|
|
}
|
|
|
|
nCommon = lstrlen(szCommon);
|
|
GetProgramsDirectory(TRUE,szProgramFolderPath);
|
|
ExpandEnvironmentStrings (szProgramFolderPath, szExpProgramFolderPath, MAX_PATH);
|
|
|
|
lstrcpy(szProgramFolderPath,szExpProgramFolderPath);
|
|
|
|
//
|
|
// From here, szProgramFolderPath used for Folder name without "Common"
|
|
//
|
|
lpEnd = CheckSlash (szExpProgramFolderPath);
|
|
lpEnd2 = CheckSlash (szProgramFolderPath);
|
|
|
|
lstrcpy (lpEnd, c_szStarDotStar);
|
|
|
|
hFile = FindFirstFile (szExpProgramFolderPath, &fd);
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixCommon] Find %s\n"),szExpProgramFolderPath));
|
|
|
|
if (hFile != INVALID_HANDLE_VALUE) {
|
|
|
|
do {
|
|
|
|
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
|
|
|
nFileName = lstrlen (fd.cFileName);
|
|
DebugMsg((DM_VERBOSE, TEXT("Find %s\n"),fd.cFileName));
|
|
|
|
if (nFileName > nCommon) {
|
|
lpTag = fd.cFileName + nFileName - nCommon;
|
|
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixCommon] lpTag=%s szCommon=%s\n"),lpTag, szCommon));
|
|
if (!lstrcmpi(lpTag, szCommon)) {
|
|
|
|
lstrcpy (lpEnd, fd.cFileName);
|
|
*lpTag = TEXT('\0');
|
|
lstrcpy (lpEnd2, fd.cFileName);
|
|
|
|
if (CopyProfileDirectory (szExpProgramFolderPath, szProgramFolderPath, CPD_IGNOREHIVE)) {
|
|
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixCommon] : Successfully changed group name:\n")));
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixCommon] : Orginial: %s\n"), szExpProgramFolderPath));
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixCommon] : New: %s\n"), szProgramFolderPath));
|
|
if (Delnode (szExpProgramFolderPath)) {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixCommon] : Successfully remove folder:\n%s\n"),szExpProgramFolderPath));
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixCommon] : Failed remove folder:\n%s\n"),szExpProgramFolderPath));
|
|
}
|
|
|
|
|
|
} else {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixCommon] : Failed to change group name with error %d.\n"), GetLastError()));
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixCommon] : Orginial: %s\n"), szExpProgramFolderPath));
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixCommon] : New: %s\n"), szProgramFolderPath));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
} while (FindNextFile(hFile, &fd));
|
|
|
|
FindClose (hFile);
|
|
}
|
|
|
|
bRet = TRUE;
|
|
err1:
|
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
BOOL RenameLink(
|
|
BOOL bCommonGroup,
|
|
LPCTSTR ObjSrcName,
|
|
LPCTSTR ObjDstName,
|
|
LPCTSTR ObjPath)
|
|
{
|
|
TCHAR szSrcPath[MAX_PATH];
|
|
TCHAR szDstPath[MAX_PATH];
|
|
LONG lResult;
|
|
BOOL bRet=FALSE;
|
|
|
|
|
|
DebugMsg((DM_VERBOSE,TEXT("[RenameLink] \nOld = %s\nNew = %s\nPath = %s\n"),ObjSrcName,ObjDstName,ObjPath));
|
|
|
|
if (!GetProgramsDirectory(bCommonGroup,szSrcPath))
|
|
return bRet;
|
|
|
|
if ( !GetProgramsDirectory(bCommonGroup,szDstPath))
|
|
return bRet;
|
|
|
|
if (ObjPath && *ObjPath) {
|
|
ConcatenatePaths(szSrcPath,ObjPath,MAX_PATH);
|
|
ConcatenatePaths(szDstPath,ObjPath,MAX_PATH);
|
|
}
|
|
|
|
ConcatenatePaths(szSrcPath,ObjSrcName,MAX_PATH);
|
|
ConcatenatePaths(szDstPath,ObjDstName,MAX_PATH);
|
|
|
|
lstrcat(szSrcPath,TEXT(".lnk"));
|
|
lstrcat(szDstPath,TEXT(".lnk"));
|
|
|
|
|
|
lResult = GetFileAttributes(szSrcPath);
|
|
|
|
if (lResult == 0xFFFFFFFF) {
|
|
//
|
|
// Directory does not exist.
|
|
//
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameLink] File is not existed [%s] !\n"),szSrcPath));
|
|
goto err1;
|
|
}
|
|
|
|
if (lResult & FILE_ATTRIBUTE_DIRECTORY) {
|
|
//
|
|
// this is a directory, but we want a file.
|
|
//
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameLink] This is a directory [%s] !\n"),szSrcPath));
|
|
goto err1;
|
|
}
|
|
|
|
//
|
|
// if destination file existed, it's not good !
|
|
//
|
|
lResult = GetFileAttributes(szDstPath);
|
|
|
|
if (lResult == 0xFFFFFFFF) {
|
|
|
|
if (MoveFile (szSrcPath, szDstPath)) {
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameLink] Successfully changed link name:\n%s\n%s\n"),szSrcPath,szDstPath));
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameLink] Failed to change link name with error %d.\n%s\n%s\n"), GetLastError(),szSrcPath,szDstPath));
|
|
goto err1;
|
|
}
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameLink] Destination file existed, maybe we don't want to overwrite ,%s\n"),szDstPath));
|
|
goto err1;
|
|
}
|
|
|
|
bRet = TRUE;
|
|
|
|
err1:
|
|
return bRet;
|
|
|
|
}
|
|
|
|
BOOL RenameFolder(
|
|
BOOL bCommonGroup,
|
|
LPCTSTR ObjSrcName,
|
|
LPCTSTR ObjDstName)
|
|
{
|
|
TCHAR szSrcPath[MAX_PATH];
|
|
TCHAR szDstPath[MAX_PATH];
|
|
LONG lResult;
|
|
BOOL bRet=FALSE;
|
|
|
|
DebugMsg((DM_VERBOSE,TEXT("[RenameFolder]\nOld = %s\nNew = %s\n"),ObjSrcName,ObjDstName));
|
|
|
|
GetProgramsDirectory(bCommonGroup,szSrcPath);
|
|
GetProgramsDirectory(bCommonGroup,szDstPath);
|
|
|
|
ConcatenatePaths(szSrcPath,ObjSrcName,MAX_PATH);
|
|
ConcatenatePaths(szDstPath,ObjDstName,MAX_PATH);
|
|
|
|
lResult = GetFileAttributes(szSrcPath);
|
|
|
|
if (lResult == 0xFFFFFFFF) {
|
|
//
|
|
// Directory does not exist.
|
|
//
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameFolder] Directory is not existed [%s] !\n"),szSrcPath));
|
|
goto err1;
|
|
}
|
|
|
|
if (!(lResult & FILE_ATTRIBUTE_DIRECTORY)) {
|
|
//
|
|
// this is not a directory.
|
|
//
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameFolder] This is not a directory [%s] !\n"),szSrcPath));
|
|
goto err1;
|
|
}
|
|
|
|
if (CopyProfileDirectory (szSrcPath, szDstPath, CPD_IGNOREHIVE)) {
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameFolder] Successfully changed folder name:\n%s\n%s"),szSrcPath,szDstPath));
|
|
if (! Delnode(szSrcPath)) {
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameFolder] Delete old folder (%s) failed !"), szSrcPath));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameFolder] Delete old folder (%s) successfully !"), szSrcPath));
|
|
}
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameFolder] Convert Folder: Failed to change group name with error %d\n.%s\n%s\n"), GetLastError(),szSrcPath,szDstPath));
|
|
goto err1;
|
|
}
|
|
|
|
bRet = TRUE;
|
|
|
|
err1:
|
|
return bRet;
|
|
|
|
}
|
|
|
|
BOOL RenameProgramFolderOrLink(HINF hInf,BOOL bCommon)
|
|
{
|
|
BOOL bRet = FALSE;
|
|
|
|
INFCONTEXT InfContext;
|
|
UINT LineCount,LineNo;
|
|
LPCTSTR szSectionName = TEXT("StartMenu.ObjectToRename");
|
|
LPCTSTR ObjectType;
|
|
LPCTSTR ObjectSrcName;
|
|
LPCTSTR ObjectDstName;
|
|
LPCTSTR ObjectPath;
|
|
LPCTSTR GroupAttribute;
|
|
BOOL CommonGroup;
|
|
BOOL IsMenuItem;
|
|
|
|
|
|
if(hInf == INVALID_HANDLE_VALUE) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FEGRPCV: Open femgrate.inf failed !\n")));
|
|
return FALSE;
|
|
}
|
|
|
|
LineCount = (UINT)SetupGetLineCount(hInf,szSectionName);
|
|
|
|
if((LONG)LineCount <= 0) {
|
|
goto err1;
|
|
}
|
|
|
|
for(LineNo=0; LineNo<LineCount; LineNo++) {
|
|
if(SetupGetLineByIndex(hInf,szSectionName,LineNo,&InfContext)
|
|
&& (ObjectType = pSetupGetField(&InfContext,1))
|
|
&& (ObjectSrcName = pSetupGetField(&InfContext,2))
|
|
&& (ObjectDstName = pSetupGetField(&InfContext,3))
|
|
&& (GroupAttribute = pSetupGetField(&InfContext,5))) {
|
|
|
|
ObjectPath = pSetupGetField(&InfContext,4);
|
|
|
|
IsMenuItem = A2I(ObjectType);
|
|
CommonGroup = A2I(GroupAttribute);
|
|
|
|
|
|
if ((bCommon && (CommonGroup == 0)) ||
|
|
(!bCommon && (CommonGroup == 1))) {
|
|
|
|
// DebugMsg((DM_VERBOSE,TEXT("Eject this line(%d) .....................................\n"),LineNo));
|
|
// DebugMsg((DM_VERBOSE,TEXT("ObjectType = %s\n"),ObjectType));
|
|
// DebugMsg((DM_VERBOSE,TEXT("ObjectSrcName = %s\n"),ObjectSrcName));
|
|
// DebugMsg((DM_VERBOSE,TEXT("ObjectDstName = %s\n"),ObjectDstName));
|
|
// DebugMsg((DM_VERBOSE,TEXT("GroupAttribute= %s\n"),GroupAttribute));
|
|
// DebugMsg((DM_VERBOSE,TEXT("bCommon = %d\n"),bCommon));
|
|
continue;
|
|
}
|
|
|
|
if (IsMenuItem) {
|
|
// DebugMsg((DM_VERBOSE,TEXT("RenameLink (%d).....................................\n"),LineNo));
|
|
// DebugMsg((DM_VERBOSE,TEXT("ObjectType = %s\n"),ObjectType));
|
|
// DebugMsg((DM_VERBOSE,TEXT("ObjectSrcName = %s\n"),ObjectSrcName));
|
|
// DebugMsg((DM_VERBOSE,TEXT("ObjectDstName = %s\n"),ObjectDstName));
|
|
// DebugMsg((DM_VERBOSE,TEXT("GroupAttribute= %s\n"),GroupAttribute));
|
|
// DebugMsg((DM_VERBOSE,TEXT("bCommon = %d\n"),bCommon));
|
|
|
|
RenameLink(bCommon,ObjectSrcName,ObjectDstName,ObjectPath);
|
|
|
|
}
|
|
else {
|
|
// DebugMsg((DM_VERBOSE,TEXT("RenameFolder (%d) .....................................\n"),LineNo));
|
|
// DebugMsg((DM_VERBOSE,TEXT("ObjectType = %s\n"),ObjectType));
|
|
// DebugMsg((DM_VERBOSE,TEXT("ObjectSrcName = %s\n"),ObjectSrcName));
|
|
// DebugMsg((DM_VERBOSE,TEXT("ObjectDstName = %s\n"),ObjectDstName));
|
|
// DebugMsg((DM_VERBOSE,TEXT("GroupAttribute= %s\n"),GroupAttribute));
|
|
// DebugMsg((DM_VERBOSE,TEXT("bCommon = %d\n"),bCommon));
|
|
RenameFolder(bCommon,ObjectSrcName,ObjectDstName);
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
bRet = TRUE;
|
|
err1:
|
|
return bRet;
|
|
|
|
}
|
|
|
|
//
|
|
// Fix Sound scheme that originally is SB katana
|
|
//
|
|
BOOL MapSBtoDBKana(HINF hInf,LPCTSTR lpszSectionName,LPTSTR lpszSoundName)
|
|
{
|
|
LPCTSTR szSBKana,szDBKana;
|
|
|
|
LONG LineCount,LineNo;
|
|
DWORD dwSize,dwType;
|
|
INFCONTEXT InfContext;
|
|
|
|
|
|
if(hInf == INVALID_HANDLE_VALUE) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[MapSBtoDBKana] Open femgrate.inf failed !\n")));
|
|
return FALSE;
|
|
}
|
|
|
|
LineCount = (UINT)SetupGetLineCount(hInf,lpszSectionName);
|
|
|
|
if((LONG)LineCount <= 0) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[MapSBtoDBKana] line count == 0 !\n")));
|
|
return FALSE;
|
|
}
|
|
|
|
for(LineNo=0; LineNo<LineCount; LineNo++) {
|
|
if (SetupGetLineByIndex(hInf,lpszSectionName,LineNo,&InfContext)
|
|
&& (szSBKana = pSetupGetField(&InfContext,1))) {
|
|
|
|
if (lstrcmpi(szSBKana,lpszSoundName) == 0) {
|
|
if (szDBKana = pSetupGetField(&InfContext,2)) {
|
|
lstrcpy(lpszSoundName,szDBKana);
|
|
return TRUE;
|
|
}
|
|
else {
|
|
//
|
|
// inf error, no second data
|
|
//
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL NameSubstitution(HINF hInf,LPTSTR lpszOrgName,LPTSTR lpszDir,LPTSTR lpszSection)
|
|
{
|
|
TCHAR szExpDir[MAX_PATH];
|
|
LPTSTR lpszAnchor;
|
|
TCHAR szOnlyName[MAX_PATH];
|
|
|
|
if (_tcsstr(lpszOrgName,TEXT("\\"))) {
|
|
if (ExpandEnvironmentStrings(lpszDir,szExpDir,MAX_PATH) == 0) {
|
|
return FALSE;
|
|
}
|
|
|
|
_tcsupr(lpszOrgName);
|
|
_tcsupr(szExpDir);
|
|
lpszAnchor = _tcsstr(lpszOrgName,szExpDir);
|
|
if ((lpszAnchor == NULL ) || (lpszAnchor != lpszOrgName)) {
|
|
return FALSE;
|
|
}
|
|
|
|
lstrcpy(szOnlyName,lpszAnchor+lstrlen(szExpDir));
|
|
DebugMsg((DM_VERBOSE,TEXT("We want to find %s !\n"),szOnlyName));
|
|
|
|
if (MapSBtoDBKana(hInf,lpszSection,szOnlyName)) {
|
|
lstrcpy(lpszAnchor+lstrlen(szExpDir),szOnlyName);
|
|
return TRUE;
|
|
}
|
|
}
|
|
else {
|
|
if (MapSBtoDBKana(hInf,lpszSection,lpszOrgName)) {
|
|
return TRUE;
|
|
}
|
|
|
|
}
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
BOOL EnumSoundSchemeApps(HKEY hKey,HINF hInf)
|
|
{
|
|
HKEY hSubKey;
|
|
DWORD dwIndex;
|
|
DWORD dwKeyNameSize;
|
|
TCHAR szKeyName[MAX_PATH];
|
|
DWORD dwSoundValue;
|
|
TCHAR szSoundValue[MAX_PATH];
|
|
LONG lResult;
|
|
|
|
dwKeyNameSize = sizeof(szKeyName)/sizeof(szKeyName[0]);
|
|
for (dwIndex = 0;
|
|
RegEnumKey(hKey, dwIndex, szKeyName, dwKeyNameSize) == ERROR_SUCCESS;
|
|
dwIndex++) {
|
|
lResult = RegOpenKey(hKey,
|
|
szKeyName,
|
|
&hSubKey);
|
|
if (lResult == ERROR_SUCCESS) {
|
|
EnumSoundSchemeApps(hSubKey,hInf);
|
|
RegCloseKey(hSubKey);
|
|
}
|
|
}
|
|
|
|
//
|
|
// no sub-key, then just get the value
|
|
//
|
|
|
|
if (dwIndex == 0) {
|
|
dwSoundValue = sizeof(szSoundValue);
|
|
lResult = RegQueryValue(hKey,
|
|
NULL,
|
|
szSoundValue,
|
|
&dwSoundValue);
|
|
|
|
if (lResult == ERROR_SUCCESS) {
|
|
if (szSoundValue[0]) {
|
|
if (NameSubstitution(hInf,szSoundValue,TEXT("%SystemRoot%\\Media\\"),TEXT("Sound.Files"))) {
|
|
RegSetValue(hKey,
|
|
NULL,
|
|
REG_SZ,
|
|
szSoundValue,
|
|
(lstrlen(szSoundValue)+1)*sizeof(TCHAR));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL FixSoundRegValue(HINF hInf)
|
|
{
|
|
LONG lResult;
|
|
BOOL bRet=FALSE;
|
|
HKEY hKey;
|
|
|
|
if(hInf == INVALID_HANDLE_VALUE) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSoundRegValue] Open femgrate.inf failed !\n")));
|
|
goto Err0;
|
|
}
|
|
|
|
lResult = RegOpenKeyEx (HKEY_CURRENT_USER,
|
|
REGSTR_PATH_APPS,
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hKey);
|
|
|
|
if (lResult != ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixAppearanceScheme] Open REGSTR_PATH_APPEARANCE failed !\n")));
|
|
goto Err0;
|
|
}
|
|
|
|
EnumSoundSchemeApps(hKey,hInf);
|
|
|
|
if (! DoInstallationFromSection(hInf, TEXT("Sound.Reg.Update"))) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSoundRegValue] DoInstallationFromSection failed !\n")));
|
|
goto Err1;
|
|
}
|
|
|
|
bRet = TRUE;
|
|
Err1:
|
|
RegCloseKey(hKey);
|
|
Err0:
|
|
return bRet;
|
|
}
|
|
|
|
//
|
|
// Search the registry and find SB value then replace with DB value
|
|
//
|
|
BOOL FixSBKanaRegValue(HINF hInf)
|
|
{
|
|
LPCTSTR szRegRoot,szRegPath;
|
|
LPCTSTR szRegSBVal,szRegDBVal;
|
|
LPCTSTR szRegSBData,szRegDBData;
|
|
|
|
LONG LineCount,LineNo;
|
|
DWORD dwSize,dwType;
|
|
INFCONTEXT InfContext;
|
|
HKEY hKey,hKeyRoot;
|
|
BOOL bOK;
|
|
TCHAR szRegCurData[MAX_PATH];
|
|
LONG lResult;
|
|
|
|
LPCTSTR lpszSectionName = TEXT("Reg.UpdateIfExsit");
|
|
|
|
if(hInf == INVALID_HANDLE_VALUE) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSBKanaRegValue] Open femgrate.inf failed !\n")));
|
|
return FALSE;
|
|
}
|
|
|
|
LineCount = (UINT)SetupGetLineCount(hInf,lpszSectionName);
|
|
|
|
if((LONG)LineCount <= 0) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSBKanaRegValue] line count == 0 !\n")));
|
|
return FALSE;
|
|
}
|
|
|
|
for(LineNo=0; LineNo<LineCount; LineNo++) {
|
|
if (SetupGetLineByIndex(hInf,lpszSectionName,LineNo,&InfContext)
|
|
&& (szRegRoot = pSetupGetField(&InfContext,1))
|
|
&& (szRegPath = pSetupGetField(&InfContext,2))
|
|
&& (szRegSBData = pSetupGetField(&InfContext,4))
|
|
&& (szRegDBData = pSetupGetField(&InfContext,6))) {
|
|
|
|
szRegSBVal = pSetupGetField(&InfContext,3);
|
|
szRegDBVal = pSetupGetField(&InfContext,5);
|
|
|
|
if (!LookUpStringInTable(InfRegSpecTohKey,szRegRoot,(PUINT)&hKeyRoot)) {
|
|
continue;
|
|
}
|
|
|
|
lResult = RegOpenKeyEx( hKeyRoot,
|
|
szRegPath,
|
|
0,
|
|
KEY_READ | KEY_WRITE,
|
|
&hKey);
|
|
if (lResult != ERROR_SUCCESS) {
|
|
continue;
|
|
}
|
|
|
|
dwSize = sizeof(szRegCurData);
|
|
lResult = RegQueryValueEx (hKey,
|
|
szRegSBVal,
|
|
NULL,
|
|
&dwType,
|
|
(LPBYTE) szRegCurData,
|
|
&dwSize);
|
|
|
|
if (lResult != ERROR_SUCCESS) {
|
|
goto Err1;
|
|
}
|
|
|
|
if ((dwType != REG_SZ) && (dwType != REG_EXPAND_SZ)) {
|
|
goto Err1;
|
|
}
|
|
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSBKanaRegValue] szRegPath = %s, old data = %s, SB data = %s!\n"),szRegPath,szRegCurData,szRegSBData));
|
|
if (lstrcmp(szRegCurData,szRegSBData ) == 0) {
|
|
#if 1
|
|
lResult = RegSetValueEx (hKey,
|
|
szRegSBVal,
|
|
0,
|
|
dwType,
|
|
(LPBYTE) szRegDBData,
|
|
(lstrlen(szRegDBData)+1) * sizeof (TCHAR));
|
|
#endif
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSBKanaRegValue] Set reg value %s,%s,%s!\n"),szRegPath,szRegSBVal,szRegDBData));
|
|
|
|
if (lResult != ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSBKanaRegValue] Set reg value error %s,%s == 0 !\n"),szRegSBVal,szRegDBData));
|
|
}
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSBKanaRegValue] szRegPath = %s, old data = %s, SB data = %s , comparing result is different !\n"),szRegPath,szRegCurData,szRegSBData));
|
|
}
|
|
Err1:
|
|
RegCloseKey(hKey);
|
|
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//
|
|
// Fix Patterns
|
|
//
|
|
BOOL FixPatterns(HINF hInf)
|
|
{
|
|
LONG lResult;
|
|
BOOL bRet=FALSE;
|
|
HKEY hKey;
|
|
LONG LineNo,LineCount;
|
|
LPCTSTR pszOldValName;
|
|
LPCTSTR pszNewValName;
|
|
LPCTSTR szSectionName = TEXT("Patterns");
|
|
INFCONTEXT InfContext;
|
|
|
|
if(hInf == INVALID_HANDLE_VALUE) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixPatterns] Open femgrate.inf failed !\n")));
|
|
goto Err0;
|
|
}
|
|
|
|
lResult = RegOpenKeyEx (HKEY_CURRENT_USER,
|
|
TEXT("Control Panel\\Patterns"),
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hKey);
|
|
|
|
if (lResult != ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixPatterns] Open Control Panel\\Patterns failed !\n")));
|
|
goto Err0;
|
|
}
|
|
|
|
LineCount = (UINT)SetupGetLineCount(hInf,szSectionName);
|
|
|
|
if((LONG)LineCount <= 0) {
|
|
goto Err1;
|
|
}
|
|
|
|
for(LineNo=0; LineNo<LineCount; LineNo++) {
|
|
if (SetupGetLineByIndex(hInf,szSectionName,LineNo,&InfContext)
|
|
&& (pszOldValName = pSetupGetField(&InfContext,1))
|
|
&& (pszNewValName = pSetupGetField(&InfContext,2))) {
|
|
|
|
if (RegReplaceIfExisting(hKey,pszOldValName,pszNewValName)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixPatterns] Replace pattern %s with %s OK !\n"),pszOldValName,pszNewValName));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixPatterns] Replace pattern %s with %s Failed !\n"),pszOldValName,pszNewValName));
|
|
}
|
|
}
|
|
}
|
|
bRet = TRUE;
|
|
Err1:
|
|
RegCloseKey(hKey);
|
|
Err0:
|
|
return bRet;
|
|
|
|
}
|
|
|
|
//
|
|
// FixCurrentWallPaperInDeskTop
|
|
//
|
|
|
|
BOOL FixCurrentWallPaperInDeskTop(HINF hInf)
|
|
{
|
|
HKEY hKey;
|
|
LONG lResult;
|
|
DWORD dwType,dwSize;
|
|
TCHAR szData[MAX_PATH];
|
|
BOOL bRet = FALSE;
|
|
|
|
|
|
lResult = RegOpenKeyEx (HKEY_CURRENT_USER,
|
|
TEXT("Control Panel\\Desktop"),
|
|
0,
|
|
KEY_READ | KEY_WRITE,
|
|
&hKey);
|
|
|
|
if (lResult != ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixCurrentWallPaperInDeskTop] , Open Control Panel\\Desktop failed!\n")));
|
|
goto Err0;
|
|
}
|
|
|
|
dwSize = sizeof(szData);
|
|
lResult = RegQueryValueEx (hKey,
|
|
TEXT("Wallpaper"),
|
|
NULL,
|
|
&dwType,
|
|
(LPBYTE) szData,
|
|
&dwSize);
|
|
|
|
DebugMsg((DM_VERBOSE,TEXT("FixCurrentWallPaperInDeskTop: Current WallPaperValue is %s !\n"),szData));
|
|
|
|
if (lResult != ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixCurrentWallPaperInDeskTop] Query Current WallPaperValue failed!\n")));
|
|
goto Err1;
|
|
}
|
|
|
|
if (NameSubstitution(hInf,szData,TEXT("%systemroot%\\"),TEXT("WallPaper.Reg"))) {
|
|
lResult = RegSetValueEx(hKey,
|
|
TEXT("Wallpaper"),
|
|
0,
|
|
REG_SZ,
|
|
(LPBYTE) szData,
|
|
(lstrlen(szData) + 1) * sizeof(TCHAR));
|
|
|
|
if (lResult != ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixCurrentWallPaperInDeskTop] RegSetValue WallPaperValue failed!\n")));
|
|
goto Err1;
|
|
}
|
|
}
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixCurrentWallPaperInDeskTop] Current WallPaper has been changed to %s!\n"),szData));
|
|
bRet = TRUE;
|
|
Err1:
|
|
RegCloseKey(hKey);
|
|
Err0:
|
|
return bRet;
|
|
}
|
|
|
|
|
|
//
|
|
// FixAppearanceScheme
|
|
//
|
|
BOOL FixAppearanceScheme(HINF hInf)
|
|
{
|
|
HKEY hAppearanceKey,hSchemeKey;
|
|
LONG lResult;
|
|
LPCTSTR szSectionName = TEXT("Apperance Scheme");
|
|
TCHAR szCurrentScheme[MAX_PATH];
|
|
LPCTSTR NT4SchemeName;
|
|
LPCTSTR NT5SchemeName;
|
|
LONG LineCount,LineNo;
|
|
DWORD dwSize,dwType;
|
|
INFCONTEXT InfContext;
|
|
|
|
BOOL bRet = FALSE;
|
|
|
|
if(hInf == INVALID_HANDLE_VALUE) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixAppearanceScheme] Open femgrate.inf failed !\n")));
|
|
goto Err0;
|
|
}
|
|
|
|
lResult = RegOpenKeyEx (HKEY_CURRENT_USER,
|
|
REGSTR_PATH_APPEARANCE,
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hAppearanceKey);
|
|
|
|
if (lResult != ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixAppearanceScheme] Open REGSTR_PATH_APPEARANCE failed !\n")));
|
|
goto Err0;
|
|
}
|
|
|
|
//
|
|
// Now query for the programs directory
|
|
//
|
|
|
|
dwSize = MAX_PATH * sizeof(TCHAR);
|
|
szCurrentScheme[0] = TEXT('\0');
|
|
|
|
|
|
lResult = RegQueryValueEx (hAppearanceKey,
|
|
TEXT("Current"),
|
|
NULL,
|
|
&dwType,
|
|
(LPBYTE) szCurrentScheme,
|
|
&dwSize);
|
|
|
|
if (lResult != ERROR_SUCCESS) {
|
|
//
|
|
// this case is fine
|
|
//
|
|
szCurrentScheme[0] = TEXT('\0');
|
|
}
|
|
|
|
|
|
lResult = RegOpenKeyEx (HKEY_CURRENT_USER,
|
|
REGSTR_PATH_LOOKSCHEMES,
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hSchemeKey);
|
|
|
|
if (lResult != ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixAppearanceScheme] Open REGSTR_PATH_APPEARANCE failed !\n")));
|
|
goto Err1;
|
|
}
|
|
|
|
|
|
LineCount = (UINT)SetupGetLineCount(hInf,szSectionName);
|
|
|
|
if((LONG)LineCount <= 0) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixAppearanceScheme] line count == 0 !\n")));
|
|
goto Err2;
|
|
}
|
|
|
|
for(LineNo=0; LineNo<LineCount; LineNo++) {
|
|
if (SetupGetLineByIndex(hInf,szSectionName,LineNo,&InfContext)
|
|
&& (NT4SchemeName = pSetupGetField(&InfContext,1))) {
|
|
|
|
if (szCurrentScheme[0] != '\0') {
|
|
if (lstrcmp(szCurrentScheme,NT4SchemeName) == 0) {
|
|
if (NT5SchemeName = pSetupGetField(&InfContext,2)) {
|
|
lResult = RegSetValueEx(hAppearanceKey,
|
|
TEXT("Current"),
|
|
0,
|
|
REG_SZ,
|
|
(LPBYTE) NT5SchemeName,
|
|
(lstrlen(NT5SchemeName)+1)*sizeof(TCHAR));
|
|
if (lResult != ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixAppearanceScheme] Set Appearance current scheme fail ! \n")));
|
|
}
|
|
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixAppearanceScheme] NT5's scheme missed!\n")));
|
|
}
|
|
}
|
|
|
|
}
|
|
lResult = RegDeleteValue(hSchemeKey,
|
|
NT4SchemeName);
|
|
if (lResult != ERROR_SUCCESS) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixAppearanceScheme] ----------------------- Delete scheme [%d], %s failed !\n"),LineNo,NT4SchemeName));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixAppearanceScheme] ----------------------- Delete scheme [%d], %s OK !\n"),LineNo,NT4SchemeName));
|
|
}
|
|
}
|
|
}
|
|
|
|
bRet = TRUE;
|
|
|
|
Err2:
|
|
RegCloseKey(hSchemeKey);
|
|
Err1:
|
|
RegCloseKey(hAppearanceKey);
|
|
Err0:
|
|
return bRet;
|
|
|
|
}
|
|
|
|
//
|
|
//ntbug#113976,#113007
|
|
//
|
|
// SB section in win.ini and entpack.ini
|
|
//
|
|
// replace SB section name with DB section name
|
|
//
|
|
BOOL FixSBIniSectionWithDBIniSection(HINF hInf)
|
|
{
|
|
LONG lResult;
|
|
LPCTSTR szSectionName = TEXT("INISectionRename");
|
|
LONG LineCount,LineNo;
|
|
DWORD dwSize,dwType;
|
|
INFCONTEXT InfContext;
|
|
LPCTSTR pszIniFile,pszSBName,pszDBName;
|
|
BOOL bRet = FALSE;
|
|
|
|
if(hInf == INVALID_HANDLE_VALUE) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSBIniSectionWithDBIniSection] Open femgrate.inf failed !\n")));
|
|
goto Err0;
|
|
}
|
|
|
|
LineCount = (UINT)SetupGetLineCount(hInf,szSectionName);
|
|
|
|
if((LONG)LineCount <= 0) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSBIniSectionWithDBIniSection] line count == 0 !\n")));
|
|
goto Err0;
|
|
}
|
|
|
|
for(LineNo=0; LineNo<LineCount; LineNo++) {
|
|
if (SetupGetLineByIndex(hInf,szSectionName,LineNo,&InfContext) &&
|
|
(pszIniFile = pSetupGetField(&InfContext,1)) &&
|
|
(pszSBName = pSetupGetField(&InfContext,2)) &&
|
|
(pszDBName = pSetupGetField(&InfContext,3))) {
|
|
|
|
if (INIFile_ChangeSectionName (pszIniFile,pszSBName,pszDBName)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSBIniSectionWithDBIniSection] INIFile_ChangeSectionName %s,%s,%s OK !\n"),
|
|
pszIniFile,pszSBName,pszDBName));
|
|
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSBIniSectionWithDBIniSection] INIFile_ChangeSectionName %s,%s,%s Failed !\n"),
|
|
pszIniFile,pszSBName,pszDBName));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
bRet = TRUE;
|
|
|
|
Err0:
|
|
return bRet;
|
|
|
|
}
|
|
|
|
BOOL FixSBIniKeyWithDBIniKey(HINF hInf)
|
|
{
|
|
LONG lResult;
|
|
LPCTSTR szSectionName = TEXT("INIKeyRename");
|
|
LONG LineCount,LineNo;
|
|
DWORD dwSize,dwType;
|
|
INFCONTEXT InfContext;
|
|
LPCTSTR pszIniFile,pszSection,pszSBName,pszDBName;
|
|
BOOL bRet = FALSE;
|
|
|
|
if(hInf == INVALID_HANDLE_VALUE) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSBIniKeyWithDBIniKey] Open femgrate.inf failed !\n")));
|
|
goto Err0;
|
|
}
|
|
|
|
LineCount = (UINT)SetupGetLineCount(hInf,szSectionName);
|
|
|
|
if((LONG)LineCount <= 0) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSBIniKeyWithDBIniKey] line count == 0 !\n")));
|
|
goto Err0;
|
|
}
|
|
|
|
for(LineNo=0; LineNo<LineCount; LineNo++) {
|
|
if (SetupGetLineByIndex(hInf,szSectionName,LineNo,&InfContext) &&
|
|
(pszIniFile = pSetupGetField(&InfContext,1)) &&
|
|
(pszSection = pSetupGetField(&InfContext,2)) &&
|
|
(pszSBName = pSetupGetField(&InfContext,3)) &&
|
|
(pszDBName = pSetupGetField(&InfContext,4))) {
|
|
|
|
if (INIFile_ChangeKeyName (pszIniFile,pszSection,pszSBName,pszDBName)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSBIniKeyWithDBIniKey] INIFile_ChangeSectionName %s,%s,%s OK !\n"),
|
|
pszIniFile,pszSBName,pszDBName));
|
|
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixSBIniKeyWithDBIniKey] INIFile_ChangeSectionName %s,%s,%s Failed !\n"),
|
|
pszIniFile,pszSBName,pszDBName));
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
bRet = TRUE;
|
|
|
|
Err0:
|
|
return bRet;
|
|
|
|
}
|
|
|
|
//
|
|
// this is a dup of RenameLink, should unify them later
|
|
//
|
|
BOOL RenameGenericLink(
|
|
LPCTSTR FolderName,
|
|
LPCTSTR ObjSrcName,
|
|
LPCTSTR ObjDstName)
|
|
{
|
|
TCHAR szSrcPath[MAX_PATH];
|
|
TCHAR szDstPath[MAX_PATH];
|
|
LONG lResult;
|
|
BOOL bRet=FALSE;
|
|
|
|
DebugMsg((DM_VERBOSE,TEXT("[RenameGenericLink] Folder = %s\n \nOld = %s\nSrc = %s\n"),FolderName,ObjSrcName,ObjDstName));
|
|
|
|
GetGenericUserFolderDirectory(FolderName,szSrcPath);
|
|
GetGenericUserFolderDirectory(FolderName,szDstPath);
|
|
|
|
ConcatenatePaths(szSrcPath,ObjSrcName,MAX_PATH);
|
|
ConcatenatePaths(szDstPath,ObjDstName,MAX_PATH);
|
|
|
|
lResult = GetFileAttributes(szSrcPath);
|
|
|
|
if (lResult == 0xFFFFFFFF) {
|
|
//
|
|
// Directory does not exist.
|
|
//
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameLink] File is not existed [%s] !\n"),szSrcPath));
|
|
goto err1;
|
|
}
|
|
|
|
if (lResult & FILE_ATTRIBUTE_DIRECTORY) {
|
|
//
|
|
// this is a directory, but we want a file.
|
|
//
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameLink] This is a directory [%s] !\n"),szSrcPath));
|
|
goto err1;
|
|
}
|
|
|
|
if (RenameFile(szSrcPath, szDstPath))
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameLink] Successfully changed link name:\n%s\n%s\n"),szSrcPath,szDstPath));
|
|
|
|
else {
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameLink] Failed changed link name:\n%s\n%s\n"),szSrcPath,szDstPath));
|
|
goto err1;
|
|
}
|
|
|
|
bRet = TRUE;
|
|
|
|
err1:
|
|
return bRet;
|
|
|
|
}
|
|
|
|
BOOL FixGenericLink(HINF hInf)
|
|
{
|
|
BOOL bRet = FALSE;
|
|
|
|
INFCONTEXT InfContext;
|
|
UINT LineCount,LineNo;
|
|
LPCTSTR szSectionName = TEXT("Generic.LinkToRename");
|
|
LPCTSTR FolderName;
|
|
LPCTSTR NT4Name;
|
|
LPCTSTR NT5Name;
|
|
LPCTSTR MoveIt;
|
|
|
|
TCHAR szUSFRegKey[MAX_PATH];
|
|
TCHAR szNTUSF[MAX_PATH];
|
|
TCHAR szExpNT4USF[MAX_PATH];
|
|
TCHAR szExpNT5USF[MAX_PATH];
|
|
DWORD dwSize, dwType;
|
|
LONG lResult;
|
|
UINT uiCount;
|
|
HKEY hKey;
|
|
|
|
|
|
if(hInf == INVALID_HANDLE_VALUE) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixGenericLink] Open femgrate.inf failed !\n")));
|
|
return FALSE;
|
|
}
|
|
|
|
LineCount = (UINT)SetupGetLineCount(hInf,szSectionName);
|
|
|
|
if((LONG)LineCount <= 0) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixGenericLink] line count == 0 !\n")));
|
|
goto err1;
|
|
}
|
|
|
|
for(LineNo=0; LineNo<LineCount; LineNo++) {
|
|
if (SetupGetLineByIndex(hInf,szSectionName,LineNo,&InfContext)
|
|
&& (FolderName = pSetupGetField(&InfContext,1))
|
|
&& (NT4Name = pSetupGetField(&InfContext,2))
|
|
&& (NT5Name = pSetupGetField(&InfContext,3))) {
|
|
|
|
DebugMsg((DM_VERBOSE,TEXT("FixGenericLink: RegName = %s !\n"),FolderName));
|
|
DebugMsg((DM_VERBOSE,TEXT("FixGenericLink: NT4Name = %s !\n"),NT4Name));
|
|
DebugMsg((DM_VERBOSE,TEXT("FixGenericLink: NT5Name = %s !\n"),NT5Name));
|
|
|
|
RenameGenericLink(FolderName,NT4Name,NT5Name);
|
|
}
|
|
}
|
|
|
|
bRet = TRUE;
|
|
|
|
err1:
|
|
return bRet;
|
|
|
|
}
|
|
|
|
BOOL FixPathInProfileLink(HINF hInf)
|
|
{
|
|
BOOL bRet = FALSE;
|
|
|
|
INFCONTEXT InfContext;
|
|
UINT LineCount,LineNo;
|
|
LPCTSTR szSectionName = TEXT("RenamePathInProfileLink");
|
|
LPCTSTR FolderName;
|
|
LPCTSTR LinkFileName;
|
|
LPCTSTR NT4SubStr;
|
|
LPCTSTR NT5SubStr;
|
|
|
|
LPCTSTR MoveIt;
|
|
|
|
TCHAR szSrcPath[MAX_PATH];
|
|
TCHAR szNTUSF[MAX_PATH];
|
|
TCHAR szExpNT4USF[MAX_PATH];
|
|
TCHAR szExpNT5USF[MAX_PATH];
|
|
DWORD dwSize, dwType;
|
|
LONG lResult;
|
|
UINT uiCount;
|
|
HKEY hKey;
|
|
|
|
if(hInf == INVALID_HANDLE_VALUE) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixPathInProfileLink] Open femgrate.inf failed !\n")));
|
|
return FALSE;
|
|
}
|
|
|
|
LineCount = (UINT)SetupGetLineCount(hInf,szSectionName);
|
|
|
|
if((LONG)LineCount <= 0) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixPathInProfileLink] line count == 0 !\n")));
|
|
goto err1;
|
|
}
|
|
|
|
for(LineNo=0; LineNo<LineCount; LineNo++) {
|
|
if (SetupGetLineByIndex(hInf,szSectionName,LineNo,&InfContext)
|
|
&& (FolderName = pSetupGetField(&InfContext,1))
|
|
&& (LinkFileName = pSetupGetField(&InfContext,2))
|
|
&& (NT4SubStr = pSetupGetField(&InfContext,3))
|
|
&& (NT5SubStr = pSetupGetField(&InfContext,4))) {
|
|
|
|
DebugMsg((DM_VERBOSE,TEXT("FixPathInProfileLink: FolderName = %s !\n") ,FolderName));
|
|
DebugMsg((DM_VERBOSE,TEXT("FixPathInProfileLink: LinkFileName = %s !\n"),LinkFileName));
|
|
DebugMsg((DM_VERBOSE,TEXT("FixPathInProfileLink: NT4SubStr = %s !\n") ,NT4SubStr));
|
|
DebugMsg((DM_VERBOSE,TEXT("FixPathInProfileLink: NT5SubStr = %s !\n") ,NT5SubStr));
|
|
|
|
if ( !GetGenericUserFolderDirectory(FolderName,szSrcPath))
|
|
goto err1;
|
|
|
|
ConcatenatePaths(szSrcPath,LinkFileName,MAX_PATH);
|
|
|
|
if (SUCCEEDED (FixPathInLink(szSrcPath,NT4SubStr,NT5SubStr))) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixPathInProfileLink: FixPathInLink OK ! %s,%s,%s!\n") ,szSrcPath,NT4SubStr,NT5SubStr));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixPathInProfileLink: FixPathInLink Failed !%s,%s,%s!\n") ,szSrcPath,NT4SubStr,NT5SubStr));
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
bRet = TRUE;
|
|
|
|
err1:
|
|
return bRet;
|
|
|
|
}
|
|
|
|
BOOL FixGenericDirectory(HINF hInf)
|
|
{
|
|
BOOL bRet = FALSE;
|
|
|
|
INFCONTEXT InfContext;
|
|
UINT LineCount,LineNo;
|
|
LPCTSTR SectionName = TEXT("DirectoryToRename");
|
|
|
|
LPCTSTR SrcName;
|
|
LPCTSTR DstName;
|
|
|
|
TCHAR ExpSrcName[MAX_PATH];
|
|
TCHAR ExpDstName[MAX_PATH];
|
|
|
|
DWORD dwSize, dwType;
|
|
LONG lResult;
|
|
|
|
|
|
if(hInf == INVALID_HANDLE_VALUE) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixGenericDirectory] Open femgrate.inf failed !\n")));
|
|
return FALSE;
|
|
}
|
|
|
|
LineCount = (UINT)SetupGetLineCount(hInf,SectionName);
|
|
|
|
if((LONG)LineCount <= 0) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixGenericDirectory] line count == 0 !\n")));
|
|
goto err1;
|
|
}
|
|
|
|
for(LineNo=0; LineNo<LineCount; LineNo++) {
|
|
if (SetupGetLineByIndex(hInf,SectionName,LineNo,&InfContext)
|
|
&& (SrcName = pSetupGetField(&InfContext,1))
|
|
&& (DstName = pSetupGetField(&InfContext,2))) {
|
|
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixGenericDirectory] Line# [%d] !\n"),LineNo));
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixGenericDirectory] SrcName = %s !\n"),SrcName));
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixGenericDirectory] DstName = %s !\n"),DstName));
|
|
|
|
ExpandEnvironmentStrings (SrcName, ExpSrcName, MAX_PATH);
|
|
ExpandEnvironmentStrings (DstName, ExpDstName, MAX_PATH);
|
|
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixGenericDirectory] szExpSrcName = %s\n"),ExpSrcName));
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixGenericDirectory] szExpDstName = %s\n"),ExpDstName));
|
|
|
|
if (! IsDirExisting(ExpSrcName)) {
|
|
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixGenericDirectory] szExpSrcName doesn't exist, do nothing ! %s\n"),ExpSrcName));
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (RenameDirectory(ExpSrcName,ExpDstName)) {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixGenericDirectory] Rename %s to %s OK !\n"),ExpSrcName,ExpDstName));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE, TEXT("[FixGenericDirectory] Rename %s to %s FAIL!\n"),ExpSrcName,ExpDstName));
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
bRet = TRUE;
|
|
|
|
err1:
|
|
return bRet;
|
|
|
|
}
|
|
|
|
BOOL FixPartialFileName(HINF hInf)
|
|
{
|
|
BOOL bRet = FALSE;
|
|
|
|
INFCONTEXT InfContext;
|
|
UINT LineCount,LineNo;
|
|
LPCTSTR SectionName = TEXT("Generic.PartialRename");
|
|
|
|
LPCTSTR DirName;
|
|
LPCTSTR SrcName;
|
|
LPCTSTR DstName;
|
|
LPCTSTR ExtName;
|
|
|
|
TCHAR SrcPathName[MAX_PATH];
|
|
TCHAR CurPathName[MAX_PATH];
|
|
TCHAR DstPathName[MAX_PATH];
|
|
|
|
DWORD dwSize, dwType;
|
|
LONG lResult;
|
|
|
|
HANDLE hFile;
|
|
WIN32_FIND_DATA fd;
|
|
LPTSTR SrcDirEnd;
|
|
LPTSTR DstDirEnd;
|
|
LPTSTR CurDirEnd;
|
|
|
|
|
|
if(hInf == INVALID_HANDLE_VALUE) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixGenericDirectory] Open femgrate.inf failed !\n")));
|
|
return FALSE;
|
|
}
|
|
|
|
LineCount = (UINT)SetupGetLineCount(hInf,SectionName);
|
|
|
|
if((LONG)LineCount <= 0) {
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixGenericDirectory] line count == 0 !\n")));
|
|
goto err1;
|
|
}
|
|
|
|
for(LineNo=0; LineNo<LineCount; LineNo++) {
|
|
if (SetupGetLineByIndex(hInf,SectionName,LineNo,&InfContext)
|
|
&& (DirName = pSetupGetField(&InfContext,1))
|
|
&& (SrcName = pSetupGetField(&InfContext,2))
|
|
&& (DstName = pSetupGetField(&InfContext,3))) {
|
|
|
|
ExtName = pSetupGetField(&InfContext,4);
|
|
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixGenericDirectory] Line# [%d] !\n"),LineNo));
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixGenericDirectory] DirName = %s !\n"),DirName));
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixGenericDirectory] SrcName = %s !\n"),SrcName));
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixGenericDirectory] DstName = %s !\n"),DstName));
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixGenericDirectory] ExtName = %s !\n"),ExtName));
|
|
|
|
ExpandEnvironmentStrings (DirName, SrcPathName, MAX_PATH);
|
|
ExpandEnvironmentStrings (DirName, CurPathName, MAX_PATH);
|
|
ExpandEnvironmentStrings (DirName, DstPathName, MAX_PATH);
|
|
|
|
SrcDirEnd = CheckSlash (SrcPathName);
|
|
DstDirEnd = CheckSlash (DstPathName);
|
|
CurDirEnd = CheckSlash (CurPathName);
|
|
|
|
lstrcat(SrcPathName,SrcName);
|
|
lstrcat(SrcPathName,TEXT("*"));
|
|
lstrcat(SrcPathName,ExtName);
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixGenericDirectory] Source = %s !\n"),SrcPathName));
|
|
|
|
hFile = FindFirstFile (SrcPathName, &fd);
|
|
|
|
if (hFile != INVALID_HANDLE_VALUE) {
|
|
|
|
do {
|
|
|
|
LPCTSTR ExtraPtr = fd.cFileName+lstrlen(SrcName);
|
|
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixGenericDirectory] fd.cFileName = %s !\n"),fd.cFileName));
|
|
DebugMsg((DM_VERBOSE,TEXT("[FixGenericDirectory] ExtraPtr = %s !\n"),ExtraPtr));
|
|
|
|
lstrcat(DstDirEnd,DstName);
|
|
lstrcat(DstDirEnd,ExtraPtr);
|
|
lstrcat(CurDirEnd,fd.cFileName);
|
|
|
|
DebugMsg((DM_VERBOSE, TEXT("%s %s\n"),SrcPathName,DstPathName));
|
|
RenameFile(CurPathName,DstPathName);
|
|
|
|
} while (FindNextFile(hFile, &fd));
|
|
|
|
FindClose (hFile);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
bRet = TRUE;
|
|
|
|
err1:
|
|
return bRet;
|
|
|
|
}
|
|
|
|
BOOL RenameSBKANAFiles(
|
|
HINF hInf)
|
|
/*
|
|
[WallPaper.Files]
|
|
BMP files
|
|
|
|
[Sound.Files]
|
|
Sound Files
|
|
*/
|
|
|
|
{
|
|
BOOL bResult;
|
|
|
|
TCHAR WinDir[MAX_PATH];
|
|
TCHAR Directory[MAX_PATH];
|
|
|
|
GetWindowsDirectory(WinDir,sizeof(WinDir)/sizeof(WinDir[0]));
|
|
|
|
bResult = RenameSectionFiles(hInf,
|
|
TEXT("WallPaper.Files"),
|
|
WinDir,
|
|
WinDir);
|
|
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameAllFiles] Rename [WallPaper.Files] %s !\n"),bResult ? TEXT("OK") : TEXT("FAIL")));
|
|
|
|
lstrcpy(Directory,WinDir);
|
|
|
|
ConcatenatePaths(Directory,TEXT("Media"),MAX_PATH);
|
|
bResult = RenameSectionFiles(hInf,
|
|
TEXT("Sound.Files"),
|
|
Directory,
|
|
Directory);
|
|
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameAllFiles] Rename [Sound.Files] %s !\n"),bResult ? TEXT("OK") : TEXT("FAIL")));
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
BOOL RenameSBKANARegSZ(
|
|
HINF hInf)
|
|
/*
|
|
[WallPaper.Files]
|
|
BMP files
|
|
|
|
[Sound.Files]
|
|
Sound Files
|
|
*/
|
|
|
|
{
|
|
BOOL bResult;
|
|
|
|
TCHAR WinDir[MAX_PATH];
|
|
TCHAR Directory[MAX_PATH];
|
|
|
|
|
|
bResult = RenameSectionRegSZ(hInf,
|
|
TEXT("Cursor_Scheme_Reg"),
|
|
HKEY_CURRENT_USER,
|
|
TEXT("Control Panel\\Cursors\\Schemes"));
|
|
|
|
DebugMsg((DM_VERBOSE, TEXT("[RenameSBKANARegSZ] Rename [Cursor_Scheme_Reg] %s !\n"),bResult ? TEXT("OK") : TEXT("FAIL")));
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
int WINAPI WinMainJPN(
|
|
int nCmd,
|
|
HINF hMigrateInf)
|
|
{
|
|
const UINT nLocale = LOCALE_JPN;
|
|
|
|
switch(nCmd) {
|
|
case FUNC_PatchInSetup:
|
|
|
|
if (IsInSetupUpgradeMode() == FALSE) {
|
|
DebugMsg((DM_VERBOSE,TEXT("This is NOT upgrade \n")));
|
|
break;
|
|
}
|
|
|
|
DebugMsg((DM_VERBOSE,TEXT("..................This is upgrade \n")));
|
|
|
|
if (FixFoldersInSetup(hMigrateInf,TRUE)) {
|
|
if (FixCommon(hMigrateInf)) {
|
|
if (RenameProgramFolderOrLink(hMigrateInf,TRUE)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("All Users, RenameProgramFolderOrLink() ok ! \n")));
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE,TEXT("All Users, RenameProgramFolderOrLink() failed ! \n")));
|
|
}
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE,TEXT("All Users, FixCommon() failed ! \n")));
|
|
}
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE,TEXT("All Users, FixFoldersInSetup() failed ! \n")));
|
|
}
|
|
|
|
if (FixFoldersInSetup(hMigrateInf,FALSE)) {
|
|
if (RenameProgramFolderOrLink(hMigrateInf,FALSE)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("Default User, RenameProgramFolderOrLink() ok ! \n")));
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE,TEXT("Default User, RenameProgramFolderOrLink() failed ! \n")));
|
|
}
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE,TEXT("Default User, FixFoldersInSetup() failed ! \n")));
|
|
}
|
|
|
|
if (RenameSBKANAFiles(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("Fix Sound Settings OK ! \n")));
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE,TEXT("Fix Sound Settings failed ! \n")));
|
|
}
|
|
|
|
if (FixSoundRegValue(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixSoundRegValue OK ! \n")));
|
|
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixSoundRegValue failed ! \n")));
|
|
}
|
|
|
|
if (FixTimeZone(nLocale)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixTimeZone OK ! \n")));
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixTimeZone failed ! \n")));
|
|
}
|
|
|
|
if (FixSBKanaRegValue(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixSBKanaRegValue OK ! \n")));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixSBKanaRegValue Failed ! \n")));
|
|
}
|
|
|
|
//
|
|
// FixSBIniSectionWithDBIniSection first and then FixSBIniKeyWithDBIniKey
|
|
//
|
|
if (FixSBIniSectionWithDBIniSection(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixSBSectionWithDBSection OK ! \n")));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixSBSectionWithDBSection failed ! \n")));
|
|
}
|
|
|
|
if (FixSBIniKeyWithDBIniKey(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixSBSectionWithDBSection OK ! \n")));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixSBSectionWithDBSection failed ! \n")));
|
|
}
|
|
|
|
if (FixGenericDirectory(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixGenericDirectory OK ! \n")));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixGenericDirectory failed ! \n")));
|
|
}
|
|
|
|
if (FixGenericLink(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixGenericLink OK ! \n")));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixGenericLink failed ! \n")));
|
|
}
|
|
|
|
if (FixPartialFileName(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixGenericLink OK ! \n")));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixGenericLink failed ! \n")));
|
|
}
|
|
|
|
if (RenameSBKANARegSZ(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("RenameSBKANARegSZ OK ! \n")));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("RenameSBKANARegSZ failed ! \n")));
|
|
}
|
|
|
|
break;
|
|
|
|
case FUNC_PatchInLogon:
|
|
if (FixUserFolders(hMigrateInf)) {
|
|
if (RenameProgramFolderOrLink(hMigrateInf,FALSE)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("Current User, RenameProgramFolderOrLink() ok ! \n")));
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE,TEXT("Current User, RenameProgramFolderOrLink() failed ! \n")));
|
|
}
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE,TEXT("Current User, FixFoldersInSetup() failed ! \n")));
|
|
}
|
|
if (FixSpecificFolder(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("Current User, FixSpecificFolder() ok ! \n")));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("Current User, FixSpecificFolder() failed ! \n")));
|
|
}
|
|
if (FixAppearanceScheme(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixAppearanceScheme OK ! \n")));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixAppearanceScheme Failed ! \n")));
|
|
}
|
|
if (FixSchemeProblem(TRUE,hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixSchemeProblem OK ! \n")));
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixSchemeProblem Fail ! \n")));
|
|
}
|
|
if (FixSoundRegValue(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixSoundRegValue OK ! \n")));
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixSoundRegValue failed ! \n")));
|
|
}
|
|
|
|
if (FixPatterns(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixPatterns OK ! \n")));
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixPatterns failed ! \n")));
|
|
}
|
|
if (FixCurrentWallPaperInDeskTop(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixCurrentWallPaperInDeskTop OK ! \n")));
|
|
}
|
|
else {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixCurrentWallPaperInDeskTop failed ! \n")));
|
|
}
|
|
if (FixGenericLink(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixGenericLink OK ! \n")));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixGenericLink failed ! \n")));
|
|
}
|
|
if (FixPartialFileName(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixGenericLink OK ! \n")));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixGenericLink failed ! \n")));
|
|
}
|
|
if (FixPathInProfileLink(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixPathInProfileLink OK ! \n")));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("FixPathInProfileLink failed ! \n")));
|
|
}
|
|
if (RenameSBKANARegSZ(hMigrateInf)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("RenameSBKANARegSZ OK ! \n")));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("RenameSBKANARegSZ failed ! \n")));
|
|
}
|
|
|
|
if (RenameRegValueName(hMigrateInf,TRUE)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("RenameRegValueName OK ! \n")));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("RenameRegValueName failed ! \n")));
|
|
}
|
|
break;
|
|
|
|
case FUNC_PatchPreload:
|
|
if (PatchPreloadKeyboard(FALSE)) {
|
|
DebugMsg((DM_VERBOSE,TEXT("PatchPreloadKeyboard OK ! \n")));
|
|
} else {
|
|
DebugMsg((DM_VERBOSE,TEXT("PatchPreloadKeyboard Failed ! \n")));
|
|
}
|
|
break;
|
|
case FUNC_PatchTest:
|
|
break;
|
|
|
|
default:
|
|
DebugMsg((DM_VERBOSE,TEXT("No such function\n")));
|
|
}
|
|
|
|
return (0);
|
|
}
|
|
|
|
|
|
|