|
|
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <userenv.h>
#include <userenvp.h>
#include <setupapi.h>
#include <regstr.h>
#include <shlwapi.h>
#define NO_FUNCTION 0xFF
#define DM_VERBOSE 2
#ifndef UNICODE
#define A2I atoi
#define STRSTR strstr
#else
#define A2I _wtoi
#define STRSTR wcsstr
#endif
enum FunctionType { FUNC_PatchInLogon, FUNC_PatchInSetup, FUNC_PatchTest, FUNC_NumofFunctions };
typedef struct _FUNC_DIR { char cFunc; int nID; } FUNC_DIR;
FUNC_DIR FuncDir[FUNC_NumofFunctions] = { {'l',FUNC_PatchInLogon}, {'s',FUNC_PatchInSetup}, {'t',FUNC_PatchTest},
};
HINSTANCE ghInst=NULL; //
// Function Declaration
//
//#define MYDBG
#ifdef MYDBG
#define DebugMsg(_parameter) Print _parameter
#define DBGTITLE TEXT("FEMGRATE :")
void Print(UINT mask,LPCTSTR pszFormat,...) {
TCHAR szBuf[255]; va_list arglist;
va_start(arglist,pszFormat);
wvsprintf(szBuf,pszFormat,arglist);
OutputDebugString(DBGTITLE);
OutputDebugString(szBuf); va_end(arglist); } #else
#define DebugMsg(_parameter)
#endif
BOOL ConcatenatePaths( IN OUT LPTSTR Target, IN LPCTSTR Path, IN UINT TargetBufferSize )
{ UINT TargetLength,PathLength; BOOL TrailingBackslash,LeadingBackslash; UINT EndingLength;
TargetLength = lstrlen(Target); PathLength = lstrlen(Path);
//
// See whether the target has a trailing backslash.
//
if(TargetLength && (Target[TargetLength-1] == TEXT('\\'))) { TrailingBackslash = TRUE; TargetLength--; } else { TrailingBackslash = FALSE; }
//
// See whether the path has a leading backshash.
//
if(Path[0] == TEXT('\\')) { LeadingBackslash = TRUE; PathLength--; } else { LeadingBackslash = FALSE; }
//
// Calculate the ending length, which is equal to the sum of
// the length of the two strings modulo leading/trailing
// backslashes, plus one path separator, plus a nul.
//
EndingLength = TargetLength + PathLength + 2;
if(!LeadingBackslash && (TargetLength < TargetBufferSize)) { Target[TargetLength++] = TEXT('\\'); }
if(TargetBufferSize > TargetLength) { lstrcpyn(Target+TargetLength,Path,TargetBufferSize-TargetLength); }
//
// Make sure the buffer is nul terminated in all cases.
//
if (TargetBufferSize) { Target[TargetBufferSize-1] = 0; }
return(EndingLength <= TargetBufferSize); }
//
// Max size of a value's data
//
//
// Max number of Functions NO_FUNCTION - 1
//
UINT GetFunctions( int *pCmdList, int nNum) { int i,j; int nMaxNum; int nCommands;
if ((__argc <=1) || nNum < 2) return 0;
//
// reserved one cell for terminiator
//
nMaxNum = (__argc-1 > nNum-1) ? nNum-1 : __argc-1;
for (nCommands = 0,i=1; i <= nMaxNum; i++) {
if (__argv[i][0] != '-') { continue; }
for (j=0; j<FUNC_NumofFunctions ; j++) { if (FuncDir[j].cFunc == __argv[i][1]) { pCmdList[nCommands++] = FuncDir[j].nID; } } } pCmdList[nCommands] = NO_FUNCTION; return nCommands; }
LPTSTR CheckSlash (LPTSTR lpDir) { DWORD dwStrLen; LPTSTR lpEnd;
lpEnd = lpDir + lstrlen(lpDir);
if (*(lpEnd - 1) != TEXT('\\')) { *lpEnd = TEXT('\\'); lpEnd++; *lpEnd = TEXT('\0'); }
return lpEnd; }
#define CCH_MAX_DEC 12 // Number of chars needed to hold 2^32
void IntToString( DWORD i, LPTSTR sz) { TCHAR szTemp[CCH_MAX_DEC]; int iChr;
iChr = 0;
do { szTemp[iChr++] = TEXT('0') + (TCHAR)(i % 10); i = i / 10; } while (i != 0);
do { iChr--; *sz++ = szTemp[iChr]; } while (iChr != 0);
*sz++ = TEXT('\0'); }
#define USER_SHELL_FOLDER TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders")
BOOL GetProgramsDirectory (BOOL bCommonGroup, LPTSTR lpDirectory) { LONG lResult; HKEY hKey; DWORD dwType, dwSize; TCHAR szDirectory[MAX_PATH]; UINT uID; BOOL bRetVal = FALSE;
//
// Open the User Shell Folders in the registry
//
lResult = RegOpenKeyEx ((bCommonGroup ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER), USER_SHELL_FOLDER, 0, KEY_READ, &hKey);
if (lResult != ERROR_SUCCESS) { goto Exit; }
//
// Now query for the programs directory
//
dwSize = MAX_PATH * sizeof(TCHAR); szDirectory[0] = TEXT('\0');
if (bCommonGroup) {
lResult = RegQueryValueEx (hKey, TEXT("Common Programs"), NULL, &dwType, (LPBYTE) szDirectory, &dwSize); } else {
lResult = RegQueryValueEx (hKey, TEXT("Programs"), NULL, &dwType, (LPBYTE) szDirectory, &dwSize); }
RegCloseKey(hKey);
if (lResult != ERROR_SUCCESS) { goto Exit; }
//
// Did we find anything?
//
if (szDirectory[0] == TEXT('\0')) { goto Exit; }
//
// Save the result
//
if (ExpandEnvironmentStrings(szDirectory, lpDirectory, MAX_PATH)) { bRetVal = TRUE; }
Exit: return bRetVal;
}
const TCHAR c_szDot[] = TEXT("."); const TCHAR c_szDotDot[] = TEXT(".."); const TCHAR c_szStarDotStar[] =TEXT("*.*");
BOOL Delnode_Recurse (LPTSTR lpDir) { WIN32_FIND_DATA fd; HANDLE hFile;
//
// Verbose output
//
//DebugMsg((DM_VERBOSE, TEXT("Delnode_Recurse: Entering, lpDir = <%s>\n"), lpDir));
//
// Setup the current working dir
//
if (!SetCurrentDirectory (lpDir)) { //DebugMsg((DM_VERBOSE, TEXT("Delnode_Recurse: Failed to set current working directory. Error = %d\n"), GetLastError()));
return FALSE; }
//
// Find the first file
//
hFile = FindFirstFile(c_szStarDotStar, &fd);
if (hFile == INVALID_HANDLE_VALUE) {
if (GetLastError() == ERROR_FILE_NOT_FOUND) { return TRUE; } else { //DebugMsg((DM_VERBOSE, TEXT("Delnode_Recurse: FindFirstFile failed. Error = %d\n"),
// GetLastError()));
return FALSE; } }
do { //
// Verbose output
//
//DebugMsg((DM_VERBOSE, TEXT("Delnode_Recurse: FindFile found: <%s>\n"),
// fd.cFileName));
//
// Check for "." and ".."
//
if (!lstrcmpi(fd.cFileName, c_szDot)) { continue; }
if (!lstrcmpi(fd.cFileName, c_szDotDot)) { continue; }
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
//
// Found a directory.
//
if (!Delnode_Recurse(fd.cFileName)) { FindClose(hFile); return FALSE; }
if (fd.dwFileAttributes & FILE_ATTRIBUTE_READONLY) { fd.dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY; SetFileAttributes (fd.cFileName, fd.dwFileAttributes); }
if (!RemoveDirectory (fd.cFileName)) { // DebugMsg((DM_VERBOSE, TEXT("Delnode_Recurse: Failed to delete directory <%s>. Error = %d\n"),
// fd.cFileName, GetLastError()));
} else { // DebugMsg((DM_VERBOSE, TEXT("Delnode_Recurse: Successfully delete directory <%s>.\n"),
// fd.cFileName));
}
} else {
//
// We found a file. Set the file attributes,
// and try to delete it.
//
if ((fd.dwFileAttributes & FILE_ATTRIBUTE_READONLY) || (fd.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)) { SetFileAttributes (fd.cFileName, FILE_ATTRIBUTE_NORMAL); }
if (!DeleteFile (fd.cFileName)) { // DebugMsg((DM_VERBOSE, TEXT("Delnode_Recurse: Failed to delete <%s>. Error = %d\n"),
// fd.cFileName, GetLastError()));
} else { // DebugMsg((DM_VERBOSE, TEXT("Delnode_Recurse: Successful delete <%s>.\n"),
// fd.cFileName));
}
}
//
// Find the next entry
//
} while (FindNextFile(hFile, &fd));
//
// Close the search handle
//
FindClose(hFile);
//
// Reset the working directory
//
if (!SetCurrentDirectory (c_szDotDot)) { DebugMsg((DM_VERBOSE, TEXT("Delnode_Recurse: Failed to reset current working directory. Error = %d\n"), GetLastError())); return FALSE; }
//
// Success.
//
DebugMsg((DM_VERBOSE, TEXT("Delnode_Recurse: Leaving <%s>"), lpDir));
return TRUE; }
BOOL Delnode (LPTSTR lpDir) { TCHAR szCurWorkingDir[MAX_PATH];
if (GetCurrentDirectory(MAX_PATH, szCurWorkingDir)) {
Delnode_Recurse (lpDir);
SetCurrentDirectory (szCurWorkingDir);
if (!RemoveDirectory (lpDir)) { DebugMsg((DM_VERBOSE, TEXT("Delnode: Failed to delete directory <%s>. Error = %d\n"), lpDir, GetLastError())); return FALSE; } else { DebugMsg((DM_VERBOSE, TEXT("Delnode: RemoveDirectory OK <%s>. retcode = %d\n"), lpDir, GetLastError())); }
} else {
DebugMsg((DM_VERBOSE, TEXT("Delnode: Failed to get current working directory. Error = %d\n"), GetLastError())); return FALSE; }
return TRUE;
}
LPCTSTR pSetupGetField(PINFCONTEXT Context,DWORD FieldIndex);
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 (! DeleteGroup(ObjSrcName,bCommonGroup)) { DebugMsg((DM_VERBOSE, TEXT("[RenameFolder] Delete old folder (%s) failed !"), ObjSrcName)); } else { DebugMsg((DM_VERBOSE, TEXT("[RenameFolder] Delete old folder (%s) successfully !"), ObjSrcName)); } } 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 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("[RenameFolder] \nOld = %s\nNew = %s\nPath = %s\n"),ObjSrcName,ObjDstName,ObjPath));
GetProgramsDirectory(bCommonGroup,szSrcPath); GetProgramsDirectory(bCommonGroup,szDstPath);
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 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;
}
BOOL ReplaceString( LPCTSTR lpszOldStr, LPCTSTR lpszReplaceStr, LPCTSTR lpszReplacedWithStr, LPTSTR lpszOutputStr) { LPTSTR pszAnchor = NULL;
lstrcpy(lpszOutputStr,lpszOldStr); pszAnchor = STRSTR(lpszOutputStr,lpszReplaceStr);
if (!pszAnchor) { return FALSE; }
if (lstrcmp(pszAnchor,lpszReplaceStr) != 0) { return FALSE; }
lstrcpy(pszAnchor,lpszReplacedWithStr); return TRUE; }
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 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 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 (ReplaceString(szNT5USF,NT5Name,NT4Name,szNT4USF)) { ExpandEnvironmentStrings (szNT4USF, szExpNT4USF, MAX_PATH); ExpandEnvironmentStrings (szNT5USF, szExpNT5USF, MAX_PATH); DebugMsg((DM_VERBOSE, TEXT("[FixFoldersInSetup] szExpNT4USF = %s\n"),szExpNT4USF)); DebugMsg((DM_VERBOSE, TEXT("[FixFoldersInSetup] 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)); }
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;
//
// 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 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 %s failed !\n"),NT4SchemeName)); } } }
bRet = TRUE;
Err2: RegCloseKey(hSchemeKey); Err1: RegCloseKey(hAppearanceKey); Err0: return bRet;
}
BOOL DoInstallationFromSection(HINF hInf,LPCTSTR lpszSectionName) { HSPFILEQ FileQueue; PVOID QContext; BOOL bRet=FALSE;
if(hInf == INVALID_HANDLE_VALUE) { DebugMsg((DM_VERBOSE,TEXT("[DoInstallationFromSection] Open femgrate.inf failed !\n"))); goto Err0; }
if ((FileQueue = SetupOpenFileQueue()) == INVALID_HANDLE_VALUE) { DebugMsg((DM_VERBOSE,TEXT("[DoInstallationFromSection] SetupOpenFileQueue failed !\n"))); goto Err0; }
bRet = SetupInstallFilesFromInfSection(hInf, NULL, FileQueue, lpszSectionName, NULL, SP_COPY_NEWER ); if (!bRet) { DebugMsg((DM_VERBOSE,TEXT("[DoInstallationFromSection] SetupInstallFilesFromInfSection failed !\n"))); goto Err1; }
if (!(QContext = SetupInitDefaultQueueCallback(NULL))) { bRet = FALSE; DebugMsg((DM_VERBOSE,TEXT("[DoInstallationFromSection] SetupInitDefaultQueueCallback failed !\n"))); goto Err1; }
bRet = SetupCommitFileQueue(NULL, FileQueue, SetupDefaultQueueCallback, QContext ); if (!bRet) { DebugMsg((DM_VERBOSE,TEXT("[DoInstallationFromSection] SetupCommitFileQueue failed !\n"))); goto Err1; }
bRet = SetupInstallFromInfSection( NULL, hInf, lpszSectionName, SPINST_ALL & ~SPINST_FILES, NULL, NULL, 0, NULL, NULL, NULL, NULL ); if (!bRet) { DebugMsg((DM_VERBOSE,TEXT("[DoInstallationFromSection] SetupInstallFromInfSection failed !\n"))); goto Err1; }
bRet = TRUE; Err1: SetupTermDefaultQueueCallback(QContext); SetupCloseFileQueue(FileQueue); Err0: return bRet;
}
TCHAR szBuf[300];
BOOL SoundMapSBtoDBKana(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("[IsInSoundSBKanaList] Open femgrate.inf failed !\n"))); return FALSE; }
LineCount = (UINT)SetupGetLineCount(hInf,lpszSectionName);
if((LONG)LineCount <= 0) { DebugMsg((DM_VERBOSE,TEXT("[SoundMapSBtoDBKana] 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 SoundDoAppsNameSubstitution(HINF hInf,LPTSTR lpszOrgSoundName) { TCHAR szMediaDir[] = TEXT("%SystemRoot%\\Media\\"); TCHAR szExpMediaDir[MAX_PATH]; LPTSTR lpszAnchor; TCHAR szOnlySoundName[MAX_PATH];
if (StrStrI(lpszOrgSoundName,TEXT("\\"))) { if (ExpandEnvironmentStrings(szMediaDir,szExpMediaDir,MAX_PATH) == 0) { return FALSE; }
lpszAnchor = StrStrI(lpszOrgSoundName,szExpMediaDir); if ((lpszAnchor == NULL ) || (lpszAnchor != lpszOrgSoundName)) { return FALSE; }
lstrcpy(szOnlySoundName,lpszAnchor+lstrlen(szExpMediaDir)); DebugMsg((DM_VERBOSE,TEXT("We want to find %s !\n"),szOnlySoundName));
if (SoundMapSBtoDBKana(hInf,TEXT("Sound.Files"),szOnlySoundName)) { lstrcpy(lpszAnchor+lstrlen(szExpMediaDir),szOnlySoundName); return TRUE; } } else { if (SoundMapSBtoDBKana(hInf,TEXT("Sound.Files"),lpszOrgSoundName)) { 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); 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 (SoundDoAppsNameSubstitution(hInf,szSoundValue)) { 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; }
BOOL FixSoundFiles(HINF hInf) { if (! DoInstallationFromSection(hInf, TEXT("Sound.Files.Delete"))) { DebugMsg((DM_VERBOSE,TEXT("[FixSoundFiles] DeleteSBKanaSoundFiles failed !\n"))); }
return TRUE; }
BOOL IsInSetupUpgradeMode()
{ LPCTSTR szKeyName = TEXT("SYSTEM\\Setup"); DWORD dwType, dwSize; HKEY hKeySetup; DWORD dwSystemSetupInProgress,dwUpgradeInProcess; LONG lResult;
if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_READ, &hKeySetup) == ERROR_SUCCESS) {
dwSize = sizeof(DWORD); lResult = RegQueryValueEx (hKeySetup, TEXT("SystemSetupInProgress"), NULL, &dwType, (LPBYTE) &dwSystemSetupInProgress, &dwSize); if (lResult == ERROR_SUCCESS) { lResult = RegQueryValueEx (hKeySetup, TEXT("UpgradeInProgress"), NULL, &dwType, (LPBYTE) &dwUpgradeInProcess, &dwSize); if (lResult == ERROR_SUCCESS) { DebugMsg((DM_VERBOSE,TEXT("[IsInSetupUpgradeMode] dwSystemSetupInProgress =%, dwUpgradeInProcess=%d !\n"),dwSystemSetupInProgress,dwUpgradeInProcess));
if ((dwSystemSetupInProgress != 0) && (dwUpgradeInProcess != 0)) { return TRUE; } } else { DebugMsg((DM_VERBOSE,TEXT("[IsInSetupUpgradeMode] RegQueryValueEx UpgradeInProcess failed !\n")));
}
} else { DebugMsg((DM_VERBOSE,TEXT("[IsInSetupUpgradeMode] RegQueryValueEx SystemSetupInProgress failed !\n"))); } RegCloseKey (hKeySetup); } else { DebugMsg((DM_VERBOSE,TEXT("[IsInSetupUpgradeMode] RegOpenKeyEx failed !\n")));
} return FALSE ; }
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int Cmds[FUNC_NumofFunctions + 1]; int i; HINF hMigrateInf;
DebugMsg((DM_VERBOSE,TEXT("FEGRPCV: Start Executing....\n")));
ghInst = hInstance; if (GetFunctions(Cmds,FUNC_NumofFunctions+1) == 0) { DebugMsg((DM_VERBOSE,TEXT("FEGRPCV: There are no valid commands. \n"))); return (1); }
//
// Open INF file first !
//
hMigrateInf = SetupOpenInfFile( TEXT("femgrate.inf"), NULL, INF_STYLE_WIN4, NULL);
if(hMigrateInf == INVALID_HANDLE_VALUE) { DebugMsg((DM_VERBOSE,TEXT("[FixCommon] Open femgrate.inf failed !\n"))); return 0; }
for (i=0; Cmds[i] != NO_FUNCTION && i < FUNC_NumofFunctions+1; i++) {
switch(Cmds[i]) { 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 (FixSoundFiles(hMigrateInf) && FixSoundRegValue(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"))); } 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 (FixSoundRegValue(hMigrateInf)) { DebugMsg((DM_VERBOSE,TEXT("FixSoundRegValue OK ! \n")));
} else { DebugMsg((DM_VERBOSE,TEXT("FixSoundRegValue failed ! \n"))); } break;
case FUNC_PatchTest: // if (FixUserFolders()) {
// if (RenameProgramFolderOrLink(hMigrateInf,FALSE)) {
// }
// else {
// DebugMsg((DM_VERBOSE,TEXT("Current User, RenameProgramFolderOrLink() failed ! \n")));
// }
// }
// else {
// DebugMsg((DM_VERBOSE,TEXT("Current User, FixFoldersInSetup() failed ! \n")));
// }
// FixAppearanceScheme(hMigrateInf);
// FixSoundFiles(hMigrateInf);
// FixSoundRegValue(hMigrateInf);
// FixSpecificFolder(hMigrateInf);
break;
default: DebugMsg((DM_VERBOSE,TEXT("No such function\n"))); }
}
SetupCloseInfFile(hMigrateInf); return (0); }
|