Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

366 lines
9.4 KiB

/**************************************************/
/* */
/* */
/* 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;
}