367 lines
9.4 KiB
C++
367 lines
9.4 KiB
C++
|
/**************************************************/
|
||
|
/* */
|
||
|
/* */
|
||
|
/* 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;
|
||
|
}
|