/**************************************************/ /* */ /* */ /* Registry Key Function */ /* */ /* */ /* Copyright (c) 1997-1999 Microsoft Corporation. */ /**************************************************/ #include "stdafx.h" #include "eudcedit.h" #include "registry.h" #include "util.h" static TCHAR subkey1[] = TEXT("EUDC"); static TCHAR subkey2[] = TEXT("System\\CurrentControlSet\\control\\Nls\\Codepage\\EUDCCodeRange"); static TCHAR SubKey[MAX_PATH]; #ifdef IN_FONTS_DIR // IsFileUnderWindowsRoot() LPTSTR IsFileUnderWindowsRoot( LPTSTR TargetPath) { TCHAR WindowsRoot[MAX_PATH+1]; UINT WindowsRootLength; WindowsRootLength = GetSystemWindowsDirectory(WindowsRoot,MAX_PATH); if( lstrcmpi(WindowsRoot,TargetPath) == 0) return (TargetPath + WindowsRootLength); return NULL; } void AdjustTypeFace(WCHAR *orgName, WCHAR *newName) { if (!lstrcmpW(orgName, L"\x5b8b\x4f53")) lstrcpy(newName, TEXT("Simsun")); else if (!lstrcmpW(orgName, L"\x65b0\x7d30\x660e\x9ad4")) lstrcpy(newName, TEXT("PMingLiU")); else if (!lstrcmpW(orgName, L"\xFF2d\xFF33\x0020\xFF30\x30b4\x30b7\x30c3\x30af")) lstrcpy(newName, TEXT("MS PGothic")); else if (!lstrcmpW(orgName, L"\xad74\xb9bc")) lstrcpy(newName, TEXT("Gulim")); else lstrcpy(newName, orgName); } #endif // IN_FONTS_DIR /****************************************/ /* */ /* Inquiry EUDC registry */ /* */ /****************************************/ BOOL InqTypeFace( TCHAR *typeface, TCHAR *filename, INT bufsiz) { HKEY phkey; DWORD cb, dwType; LONG rc; TCHAR FaceName[LF_FACESIZE]; TCHAR SysName[LF_FACESIZE]; #ifdef BUILD_ON_WINNT // InqTypeFace() TCHAR FileName[MAX_PATH]; #endif // BUILD_ON_WINNT GetStringRes(SysName, IDS_SYSTEMEUDCFONT_STR); if( !lstrcmp(typeface, SysName)){ lstrcpy(FaceName,TEXT("SystemDefaultEUDCFont")); }else { #ifdef IN_FONTS_DIR AdjustTypeFace(typeface, FaceName); #else lstrcpy(FaceName, typeface); #endif } if( RegOpenKeyEx( HKEY_CURRENT_USER, (LPCTSTR)SubKey, 0, KEY_ALL_ACCESS, &phkey) != ERROR_SUCCESS){ return FALSE; } #ifdef IN_FONTS_DIR // InqTypeFace() cb = (DWORD)MAX_PATH*sizeof(WORD)/sizeof(BYTE); rc = RegQueryValueEx(phkey, FaceName, 0, &dwType, (LPBYTE)FileName, &cb); RegCloseKey(phkey); /* * if there is some error or no data, just return false. */ if ((rc != ERROR_SUCCESS) || (FileName[0] == '\0')) { return (FALSE); } /* * expand %SystemRoot% to Windows direcotry. */ ExpandEnvironmentStrings((LPCTSTR)FileName,(LPTSTR)filename,bufsiz); #else cb = (DWORD)bufsiz*sizeof(WORD)/sizeof(BYTE); rc = RegQueryValueEx(phkey, (TCHAR *)FaceName, 0, &dwType, (LPBYTE)filename, &cb); RegCloseKey(phkey); if ((rc != ERROR_SUCCESS) || (filename[0] == '\0')) { return (FALSE); } #endif // IN_FONTS_DIR #ifdef BUILD_ON_WINNT // InqTypeFace() /* * if this is not 'full path'. Build 'full path'. * * EUDC.TTE -> C:\WINNT40\FONTS\EUDC.TTE * 0123456... * * 1. filename should have drive letter. * 2. filename should have one '\\' ,at least, for root. */ if ((filename[1] != ':') || (Mytcsstr((const TCHAR *)filename,TEXT("\\")) == NULL)) { /* backup original.. */ lstrcpy(FileName, (const TCHAR *)filename); /* Get windows directory */ GetSystemWindowsDirectory((TCHAR *)filename, MAX_PATH); #ifdef IN_FONTS_DIR // InqTypeFace() lstrcat((TCHAR *)filename, TEXT("\\FONTS\\")); #else strcat((char *)filename, "\\"); #endif // IN_FONTS_DIR lstrcat((TCHAR *) filename, FileName); } #endif // BUILD_ON_WINNT #ifdef IN_FONTS_DIR // InqTypeFace() return (TRUE); #else return rc == ERROR_SUCCESS && filename[0] != '\0' ? TRUE : FALSE; #endif } /****************************************/ /* */ /* Registry EUDC font and file */ /* */ /****************************************/ BOOL RegistTypeFace( TCHAR *typeface, TCHAR *filename) { HKEY phkey; LONG rc; TCHAR FaceName[LF_FACESIZE]; TCHAR SysName[LF_FACESIZE]; #ifdef IN_FONTS_DIR // RegistTypeFace() LPTSTR SaveFileName; TCHAR FileName[MAX_PATH]; #endif // IN_FONTS_DIR GetStringRes((TCHAR *)SysName, IDS_SYSTEMEUDCFONT_STR); if( !lstrcmp((const TCHAR *)typeface, (const TCHAR *)SysName)){ lstrcpy(FaceName, TEXT("SystemDefaultEUDCFont")); }else{ #ifdef IN_FONTS_DIR AdjustTypeFace(typeface, FaceName); #else lstrcpy(FaceName, (const TCHAR *)typeface); #endif } if( RegOpenKeyEx( HKEY_CURRENT_USER, (LPCTSTR)SubKey, 0, KEY_ALL_ACCESS, &phkey) != ERROR_SUCCESS){ return FALSE; } #ifdef IN_FONTS_DIR // RegistTypeFace() /* * if registry data contains full path, and the file is under windows * directory, replace the hardcodeed path with %SystemRoot%.... */ if( (SaveFileName = IsFileUnderWindowsRoot((LPTSTR)filename)) != NULL) { lstrcpy(FileName, TEXT("%SystemRoot%")); if( *SaveFileName != '\\' ) lstrcat(FileName, TEXT("\\")); lstrcat(FileName, SaveFileName ); } else { lstrcpy(FileName, (TCHAR *)filename ); } rc = RegSetValueEx( phkey, (LPCTSTR)FaceName, 0, REG_SZ, (const BYTE *)FileName, (lstrlen((LPCTSTR)FileName)+1)*sizeof(WORD)/sizeof(BYTE)); #else rc = RegSetValueEx( phkey, (LPCTSTR)FaceName, 0, REG_SZ, (const BYTE *)filename, (lstrlen((LPCTSTR)filename)+1)*sizeof(WORD)/sizeof(BYTE)); #endif // IN_FONTS_DIR RegCloseKey(phkey); return rc == ERROR_SUCCESS ? TRUE : FALSE; } /****************************************/ /* */ /* Delete Registry string */ /* */ /****************************************/ BOOL DeleteReg( TCHAR *typeface) { HKEY phkey; LONG rc; TCHAR FaceName[LF_FACESIZE]; TCHAR SysName[LF_FACESIZE]; GetStringRes((TCHAR *)SysName, IDS_SYSTEMEUDCFONT_STR); if( !lstrcmp((const TCHAR *)typeface, (const TCHAR *)SysName)){ lstrcpy((TCHAR *)FaceName, TEXT("SystemDefaultEUDCFont")); }else{ #ifdef IN_FONTS_DIR AdjustTypeFace(typeface, FaceName); #else lstrcpy((TCHAR *)FaceName, (const TCHAR *)typeface); #endif } if( RegOpenKeyEx(HKEY_CURRENT_USER, (LPCTSTR)SubKey, 0, KEY_ALL_ACCESS, &phkey) != ERROR_SUCCESS){ return FALSE; } rc = RegDeleteValue( phkey, (LPTSTR)FaceName); RegCloseKey(phkey); return rc == ERROR_SUCCESS ? TRUE : FALSE; } /****************************************/ /* */ /* Create Registry Subkey */ /* */ /****************************************/ BOOL CreateRegistrySubkey() { HKEY phkey; DWORD dwdisp; int LocalCP; TCHAR CodePage[10]; int result; /* New Registry */ LocalCP = GetACP(); wsprintf( CodePage, TEXT("%d"), LocalCP); lstrcpy(SubKey, subkey1); lstrcat(SubKey, TEXT("\\")); lstrcat(SubKey, CodePage); if( RegOpenKeyEx( HKEY_CURRENT_USER, (LPCTSTR)SubKey, 0, KEY_ALL_ACCESS, &phkey) != ERROR_SUCCESS){ result = RegCreateKeyEx(HKEY_CURRENT_USER, (LPCTSTR)SubKey, 0, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &phkey, &dwdisp); if( result == ERROR_SUCCESS) RegCloseKey( phkey); else return FALSE; }else RegCloseKey(phkey); return TRUE; } /****************************************/ /* */ /* Inquiry Code range registry */ /* */ /****************************************/ BOOL InqCodeRange( TCHAR *Codepage, BYTE *Coderange, INT bufsiz) { HKEY phkey; DWORD cb, dwType; LONG rc; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)subkey2, 0, KEY_READ, &phkey) != ERROR_SUCCESS) { return FALSE; } cb = (DWORD)bufsiz * sizeof(WORD)/sizeof(BYTE); rc = RegQueryValueEx(phkey, (TCHAR *)Codepage, 0, &dwType, (LPBYTE)Coderange, &cb); RegCloseKey(phkey); return rc == ERROR_SUCCESS && Coderange[0] != '\0' ? TRUE : FALSE; } BOOL DeleteRegistrySubkey() { HKEY phkey; if( RegOpenKeyEx( HKEY_CURRENT_USER, (LPCTSTR)SubKey, 0, KEY_ALL_ACCESS, &phkey) == ERROR_SUCCESS){ RegCloseKey(phkey); return RegDeleteKey(HKEY_CURRENT_USER, (LPCTSTR)SubKey); } return TRUE; } BOOL FindFontSubstitute(TCHAR *orgFontName, TCHAR *sbstFontName) { static TCHAR fsKey[] = TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\FontSubstitutes"); *sbstFontName = 0; lstrcpy(sbstFontName, orgFontName); HKEY phkey; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)fsKey, 0, KEY_QUERY_VALUE, &phkey) != ERROR_SUCCESS) { return FALSE; } DWORD valueNameSize = LF_FACESIZE + 50; //should be facename + ',' + codepage TCHAR valueName[LF_FACESIZE + 50]; DWORD valueType; DWORD valueDataSize = (LF_FACESIZE + 50) * sizeof(TCHAR); //should be facename + ',' + codepage BYTE valueData[(LF_FACESIZE + 50) * sizeof(TCHAR)]; LONG ret; DWORD idx = 0; while ((ret = RegEnumValue(phkey, idx, valueName, &valueNameSize, 0, &valueType, valueData, &valueDataSize)) != ERROR_NO_MORE_ITEMS) { if (ret != ERROR_SUCCESS) { RegCloseKey(phkey); return FALSE; } Truncate(valueName, _T(',')); if (!lstrcmpi(valueName, orgFontName)) { Truncate((TCHAR *)valueData, _T(',')); lstrcpy(sbstFontName, (TCHAR *)valueData); break; } idx ++; valueNameSize = LF_FACESIZE + 50; valueDataSize = (LF_FACESIZE + 50) * sizeof(TCHAR); } RegCloseKey(phkey); return TRUE; } void Truncate(TCHAR *str, TCHAR delim) { TCHAR *pchr = _tcschr(str, delim); if (pchr) *pchr = 0; }