726 lines
22 KiB
C
726 lines
22 KiB
C
|
#include <windows.h>
|
||
|
#include <setupapi.h>
|
||
|
#include <malloc.h>
|
||
|
#include "common.h"
|
||
|
#include "chs.h"
|
||
|
extern TCHAR ImeDataDirectory[MAX_PATH];
|
||
|
extern TCHAR szMsgBuf[];
|
||
|
extern BOOL g_bCHSWin98;
|
||
|
|
||
|
BYTE EmbName[IMENUM][MAXIMENAME]={
|
||
|
"winpy.emb",
|
||
|
"winsp.emb",
|
||
|
"winzm.emb"
|
||
|
// "winbx.emb"
|
||
|
};
|
||
|
|
||
|
BYTE XEmbName[IMENUM][MAXIMENAME]={
|
||
|
"winxpy.emb",
|
||
|
"winxsp.emb",
|
||
|
"winxzm.emb"
|
||
|
// "winxbx.emb"
|
||
|
};
|
||
|
|
||
|
BOOL IsSizeReasonable(DWORD dwSize)
|
||
|
{
|
||
|
DWORD dwTemp = (dwSize - sizeof(WORD)) / sizeof(REC95);
|
||
|
|
||
|
if (((dwSize - sizeof(WORD)) - (dwTemp * sizeof(REC95))) == 0) {
|
||
|
return TRUE;
|
||
|
} else {
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
/******************************Public*Routine******************************\
|
||
|
* OpenEMBFile
|
||
|
*
|
||
|
* Get Win95 IME phrase data from system directory.
|
||
|
*
|
||
|
* Arguments:
|
||
|
*
|
||
|
* UCHAR * FileName - EMB file name.
|
||
|
*
|
||
|
* Return Value:
|
||
|
*
|
||
|
* HANDLE: Success - file handle of EMB file. Fail - 0;
|
||
|
*
|
||
|
* History:
|
||
|
*
|
||
|
\**************************************************************************/
|
||
|
|
||
|
HANDLE OpenEMBFile(UCHAR * FileName)
|
||
|
{
|
||
|
HFILE hf;
|
||
|
TCHAR FilePath[MAX_PATH];
|
||
|
|
||
|
lstrcpy(FilePath, ImeDataDirectory);
|
||
|
|
||
|
lstrcat(FilePath, FileName);
|
||
|
|
||
|
hf = _lopen(FilePath,OF_READ);
|
||
|
if (hf == HFILE_ERROR) {
|
||
|
DebugMsg(("OpenEMBFile,[%s] failed!\r\n",FileName));
|
||
|
return 0;
|
||
|
}
|
||
|
else {
|
||
|
DebugMsg(("OpenEMBFile,[%s] OK!\r\n",FileName));
|
||
|
return (HANDLE)hf;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/******************************Public*Routine******************************\
|
||
|
* ImeDataConvertChs
|
||
|
*
|
||
|
* Convert Windows 95 IME phrase data to Windows NT 5.0.
|
||
|
*
|
||
|
* Arguments:
|
||
|
*
|
||
|
* HANDLE hSource - source file handle.
|
||
|
* HANDLE hTarget - target file handle.
|
||
|
*
|
||
|
* Return Value:
|
||
|
*
|
||
|
* BOOL: TRUE-Success, FALSE-FAIL.
|
||
|
*
|
||
|
* History:
|
||
|
*
|
||
|
\**************************************************************************/
|
||
|
|
||
|
BOOL ImeDataConvertChs(HFILE hSource, HFILE hTarget)
|
||
|
{
|
||
|
HANDLE hPhrase95, hPhraseNT;
|
||
|
BYTE *szPhrase95;
|
||
|
WCHAR *szPhraseNT;
|
||
|
DWORD fsize;
|
||
|
BOOL bReturn = TRUE;
|
||
|
int i;
|
||
|
|
||
|
hPhrase95 = GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT,
|
||
|
sizeof(REC95)*MAXNUMBER_EMB+sizeof(WORD));
|
||
|
|
||
|
hPhraseNT = GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT,
|
||
|
sizeof(RECNT)*MAXNUMBER_EMB+sizeof(WORD));
|
||
|
|
||
|
if (!hPhraseNT || !hPhrase95 ) {
|
||
|
DebugMsg(("ImeDataConvertChs failed!,!hPhraseNT || !hPhrase95 \r\n"));
|
||
|
|
||
|
bReturn = FALSE;
|
||
|
goto Convert_Finish;
|
||
|
}
|
||
|
|
||
|
szPhrase95 = GlobalLock(hPhrase95);
|
||
|
szPhraseNT = GlobalLock(hPhraseNT);
|
||
|
|
||
|
fsize = _lread(hSource,szPhrase95,sizeof(REC95)*MAXNUMBER_EMB+sizeof(WORD));
|
||
|
|
||
|
if (fsize != *((WORD*)&szPhrase95[0])*sizeof(REC95)+2)
|
||
|
{
|
||
|
DebugMsg(("ImeDataConvertChs ,Warnning fsize ! %d, rec no = %d\r\n",fsize,*((WORD *) szPhrase95)));
|
||
|
|
||
|
if (IsSizeReasonable(fsize)) {
|
||
|
*((WORD *) szPhrase95) = (WORD)((fsize - sizeof(WORD)) / sizeof(REC95));
|
||
|
DebugMsg(("ImeDataConvertChs ,Fixed rec number = %d\r\n",*((WORD *) szPhrase95)));
|
||
|
} else {
|
||
|
DebugMsg(("ImeDataConvertChs ,Data file maybe wrong !\r\n"));
|
||
|
bReturn = FALSE;
|
||
|
goto Convert_Finish;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//phrase count
|
||
|
szPhraseNT[0] = *((WORD*)&szPhrase95[0]);
|
||
|
|
||
|
for (i=0; i<szPhraseNT[0]; i++)
|
||
|
{
|
||
|
MultiByteToWideChar(936,
|
||
|
MB_PRECOMPOSED,
|
||
|
(LPCSTR)(szPhrase95+sizeof(WORD)+i*sizeof(REC95)),
|
||
|
sizeof(REC95),
|
||
|
(LPWSTR)((LPBYTE)szPhraseNT+ sizeof(WORD) + i*sizeof(RECNT)),
|
||
|
sizeof(RECNT));
|
||
|
}
|
||
|
if (WriteFile((HANDLE)hTarget, szPhraseNT, sizeof(RECNT)*MAXNUMBER_EMB+sizeof(WORD), &fsize, NULL)) {
|
||
|
DebugMsg(("ImeDataConvertChs WriteFile OK\r\n"));
|
||
|
}
|
||
|
else {
|
||
|
DebugMsg(("ImeDataConvertChs WriteFile Failed [%d]\r\n",GetLastError()));
|
||
|
}
|
||
|
|
||
|
Convert_Finish:
|
||
|
if (hPhrase95) {
|
||
|
GlobalUnlock(hPhrase95);
|
||
|
GlobalFree(hPhrase95);
|
||
|
}
|
||
|
if (hPhraseNT) {
|
||
|
GlobalUnlock(hPhraseNT);
|
||
|
GlobalFree(hPhraseNT);
|
||
|
}
|
||
|
return bReturn;
|
||
|
}
|
||
|
|
||
|
BOOL IsFileExist(LPCTSTR lpszFileName)
|
||
|
{
|
||
|
LONG lResult;
|
||
|
|
||
|
lResult = GetFileAttributes(lpszFileName);
|
||
|
|
||
|
if (lResult == 0xFFFFFFFF) { // file does not exist
|
||
|
return FALSE;
|
||
|
} else if (lResult & FILE_ATTRIBUTE_DIRECTORY) {
|
||
|
return FALSE;
|
||
|
} else {
|
||
|
return TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
LPBYTE MergeGBandGBKEMBWorker(
|
||
|
PBYTE pGBEmbPtr,
|
||
|
PBYTE pGBKEmbPtr)
|
||
|
{
|
||
|
PBYTE pNewBufPtr;
|
||
|
|
||
|
WORD nGBRecNum;
|
||
|
WORD nGBKRecNum;
|
||
|
|
||
|
REC95* pGBRecPtr;
|
||
|
REC95* pGBKRecPtr;
|
||
|
|
||
|
WORD nNewRecNum;
|
||
|
|
||
|
WORD i,j;
|
||
|
|
||
|
if (pGBEmbPtr == NULL || pGBKEmbPtr == NULL) {
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
nGBRecNum = * ((WORD *) pGBEmbPtr);
|
||
|
pGBRecPtr = (REC95*)(pGBEmbPtr + sizeof(WORD));
|
||
|
|
||
|
nGBKRecNum = * ((WORD *) pGBKEmbPtr);
|
||
|
pGBKRecPtr = (REC95*)(pGBKEmbPtr + sizeof(WORD));
|
||
|
|
||
|
nNewRecNum = 0;
|
||
|
pNewBufPtr = (PBYTE) malloc(sizeof(WORD));
|
||
|
|
||
|
if (pNewBufPtr == NULL) {
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
for (i=0,j=0; i<nGBRecNum && j<nGBKRecNum; ) {
|
||
|
int nResult;
|
||
|
|
||
|
nNewRecNum++;
|
||
|
pNewBufPtr = (PBYTE) realloc(pNewBufPtr,sizeof(WORD)+(nNewRecNum)*sizeof(REC95));
|
||
|
|
||
|
DebugMsg(("MergeGBandGBKEMBWorker,Memory size = [%d]!\r\n",_msize(pNewBufPtr)));
|
||
|
|
||
|
if (pNewBufPtr == NULL) {
|
||
|
DebugMsg(("MergeGBandGBKEMBWorker,realloc error,[%d]!\r\n",GetLastError()));
|
||
|
return NULL;
|
||
|
}
|
||
|
nResult = memcmp(pGBRecPtr[i].CODE,pGBKRecPtr[j].CODE,MAXCODELENTH);
|
||
|
|
||
|
DebugMsg(("1. %s, %s\n2. %s, %s\n%d\n",pGBRecPtr[i].CODE,pGBRecPtr[i].PHRASE,pGBKRecPtr[j].CODE,pGBKRecPtr[j].PHRASE,nResult));
|
||
|
|
||
|
if (nResult < 0) {
|
||
|
CopyMemory(pNewBufPtr+sizeof(WORD)+(nNewRecNum-1)*sizeof(REC95),
|
||
|
&pGBRecPtr[i],
|
||
|
sizeof(REC95));
|
||
|
i++;
|
||
|
} else if (nResult == 0) {
|
||
|
nResult = memcmp(pGBRecPtr[i].PHRASE,pGBKRecPtr[j].PHRASE,MAXWORDLENTH);
|
||
|
if (nResult == 0) {
|
||
|
j++;
|
||
|
}
|
||
|
|
||
|
CopyMemory(pNewBufPtr+sizeof(WORD)+(nNewRecNum-1)*sizeof(REC95),
|
||
|
&pGBRecPtr[i],
|
||
|
sizeof(REC95));
|
||
|
i++;
|
||
|
|
||
|
|
||
|
} else {
|
||
|
memcpy(pNewBufPtr+sizeof(WORD)+(nNewRecNum-1)*sizeof(REC95),
|
||
|
&pGBKRecPtr[j],
|
||
|
sizeof(REC95));
|
||
|
j++;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
DebugMsg(("MergeGBandGBKEMBWorker [%d,%d ] i=%d, j=%d!\r\n",nGBRecNum,nGBKRecNum,i,j));
|
||
|
|
||
|
if (i == nGBRecNum && j == nGBKRecNum) {
|
||
|
* (WORD*)pNewBufPtr = nNewRecNum;
|
||
|
DebugMsg((szMsgBuf,"nNewRecNum = %d",* (WORD*)pNewBufPtr));
|
||
|
return pNewBufPtr;
|
||
|
}
|
||
|
|
||
|
if (i==nGBRecNum) {
|
||
|
for ( ; j<nGBKRecNum;j++) {
|
||
|
|
||
|
nNewRecNum++;
|
||
|
pNewBufPtr = (PBYTE) realloc(pNewBufPtr,sizeof(WORD)+(nNewRecNum)*sizeof(REC95));
|
||
|
if (pNewBufPtr == NULL) {
|
||
|
DebugMsg(("MergeGBandGBKEMBWorker,2.realloc error,[%d]!\r\n",GetLastError()));
|
||
|
return NULL;
|
||
|
}
|
||
|
CopyMemory(pNewBufPtr+sizeof(WORD)+(nNewRecNum-1)*sizeof(REC95),
|
||
|
&pGBKRecPtr[j],
|
||
|
sizeof(REC95));
|
||
|
}
|
||
|
} else {
|
||
|
for ( ; i<nGBRecNum;i++) {
|
||
|
|
||
|
nNewRecNum++;
|
||
|
pNewBufPtr = (PBYTE) realloc(pNewBufPtr,sizeof(WORD)+(nNewRecNum)*sizeof(REC95));
|
||
|
if (pNewBufPtr == NULL) {
|
||
|
DebugMsg(("MergeGBandGBKEMBWorker,3.realloc error,[%d]!\r\n",GetLastError()));
|
||
|
return NULL;
|
||
|
}
|
||
|
CopyMemory(pNewBufPtr+sizeof(WORD)+(nNewRecNum-1)*sizeof(REC95),
|
||
|
&pGBRecPtr[i],
|
||
|
sizeof(REC95));
|
||
|
}
|
||
|
}
|
||
|
*(WORD *)pNewBufPtr = nNewRecNum;
|
||
|
DebugMsg(("nNewRecNum = %d\r\n",* (WORD*)pNewBufPtr));
|
||
|
|
||
|
return pNewBufPtr;
|
||
|
}
|
||
|
|
||
|
BOOL MergeGBandGBKEMBWrapper(
|
||
|
LPCTSTR lpszGBFileName,
|
||
|
LPCTSTR lpszGBKFileName,
|
||
|
LPCTSTR lpszNewFileName)
|
||
|
{
|
||
|
HANDLE hGBEmb;
|
||
|
HANDLE hGBKEmb;
|
||
|
|
||
|
HANDLE hGBEmbMapping;
|
||
|
HANDLE hGBKEmbMapping;
|
||
|
|
||
|
PBYTE pGBEmbPtr;
|
||
|
PBYTE pGBKEmbPtr;
|
||
|
PBYTE pNewFilePtr;
|
||
|
|
||
|
HANDLE hNewFile;
|
||
|
DWORD dwByteWritten;
|
||
|
BOOL bRet =FALSE;
|
||
|
|
||
|
DWORD dwSizeGB,dwSizeGBK,dwHigh;
|
||
|
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper, Starting ...!\r\n"));
|
||
|
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper,lpszGBFileName=%s!\r\n",lpszGBFileName));
|
||
|
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper,lpszGBKFileName=%s!\r\n",lpszGBKFileName));
|
||
|
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper,lpszNewFileName=%s!\r\n",lpszNewFileName));
|
||
|
|
||
|
hGBEmb = CreateFile(lpszGBFileName,
|
||
|
GENERIC_READ | GENERIC_WRITE,
|
||
|
0,
|
||
|
NULL,
|
||
|
OPEN_ALWAYS,
|
||
|
FILE_ATTRIBUTE_NORMAL,
|
||
|
NULL);
|
||
|
if (hGBEmb == INVALID_HANDLE_VALUE) {
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper,CreateFile error=%s,[%d]!\r\n",lpszGBFileName,GetLastError()));
|
||
|
goto Err0;
|
||
|
}
|
||
|
|
||
|
hGBKEmb = CreateFile(lpszGBKFileName,
|
||
|
GENERIC_READ | GENERIC_WRITE,
|
||
|
0,
|
||
|
NULL,
|
||
|
OPEN_ALWAYS,
|
||
|
FILE_ATTRIBUTE_NORMAL,
|
||
|
NULL);
|
||
|
|
||
|
if (hGBKEmb == INVALID_HANDLE_VALUE) {
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper,CreateFile error=%s,[%d]!\r\n",lpszGBKFileName,GetLastError()));
|
||
|
goto Err1;
|
||
|
}
|
||
|
|
||
|
|
||
|
hGBEmbMapping = CreateFileMapping(hGBEmb,
|
||
|
NULL,
|
||
|
PAGE_READWRITE,
|
||
|
0,0,0);
|
||
|
|
||
|
if (hGBEmbMapping == NULL) {
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper,1. CreateFileMapping error,[%d]!\r\n",GetLastError()));
|
||
|
goto Err2;
|
||
|
}
|
||
|
|
||
|
hGBKEmbMapping = CreateFileMapping(hGBKEmb,
|
||
|
NULL,
|
||
|
PAGE_READWRITE,
|
||
|
0,0,0);
|
||
|
|
||
|
|
||
|
if (hGBKEmbMapping == NULL) {
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper,2. CreateFileMapping error,[%d]!\r\n",GetLastError()));
|
||
|
goto Err3;
|
||
|
}
|
||
|
|
||
|
pGBEmbPtr = (PBYTE) MapViewOfFile(hGBEmbMapping,
|
||
|
FILE_MAP_ALL_ACCESS,
|
||
|
0,0,0);
|
||
|
|
||
|
if (pGBEmbPtr == NULL) {
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper,1. MapViewOfFile error,[%d]!\r\n",GetLastError()));
|
||
|
goto Err3;
|
||
|
}
|
||
|
|
||
|
pGBKEmbPtr = (PBYTE) MapViewOfFile(hGBKEmbMapping,
|
||
|
FILE_MAP_ALL_ACCESS,
|
||
|
0,0,0);
|
||
|
|
||
|
if (pGBKEmbPtr == NULL) {
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper,2. MapViewOfFile error,[%d]!\r\n",GetLastError()));
|
||
|
goto Err4;
|
||
|
}
|
||
|
|
||
|
dwSizeGB = GetFileSize(hGBEmb,&dwHigh);
|
||
|
dwSizeGBK = GetFileSize(hGBKEmb,&dwHigh);
|
||
|
|
||
|
|
||
|
if (dwSizeGB != (sizeof(WORD)+sizeof(REC95) * (*(WORD *)pGBEmbPtr ))) {
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper: Warnning Real table size is different from info in record\r\n"));
|
||
|
|
||
|
DebugMsg(("[%s] sizeGB = %d, no=%d, calculated = %d\r\n",lpszGBFileName,
|
||
|
dwSizeGB,
|
||
|
*(WORD *)pGBEmbPtr,
|
||
|
sizeof(WORD)+sizeof(REC95) * (*(WORD *)pGBEmbPtr)
|
||
|
));
|
||
|
if (IsSizeReasonable(dwSizeGB) == FALSE) {
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper: Fatal error, file size is strange %d we need to give up this %s!\r\n",dwSizeGB,lpszGBFileName));
|
||
|
goto Err5;
|
||
|
}
|
||
|
|
||
|
(*(WORD *)pGBEmbPtr) = (WORD) ((dwSizeGB - sizeof(WORD)) / sizeof(REC95));
|
||
|
DebugMsg((
|
||
|
"MergeGBandGBKEMBWrapper: Adjust record number = %d\r\n",(*(WORD *)pGBEmbPtr)
|
||
|
));
|
||
|
}
|
||
|
|
||
|
if (dwSizeGBK != (sizeof(WORD)+sizeof(REC95) * (*(WORD *)pGBKEmbPtr ))) {
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper: Warnning Real table size is different from info in record\r\n"));
|
||
|
|
||
|
DebugMsg(("[%s] sizeGBK = %d, no=%d, calculated = %d\r\n",lpszGBKFileName,
|
||
|
dwSizeGBK,
|
||
|
*(WORD *)pGBKEmbPtr,
|
||
|
sizeof(WORD)+sizeof(REC95) * (*(WORD *)pGBKEmbPtr)
|
||
|
));
|
||
|
if (IsSizeReasonable(dwSizeGBK) == FALSE) {
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper: Fatal error, file size is strange %d we need to give up this %s!\r\n",dwSizeGBK,lpszGBKFileName));
|
||
|
goto Err5;
|
||
|
}
|
||
|
|
||
|
(*(WORD *)pGBKEmbPtr) = (WORD) ((dwSizeGBK - sizeof(WORD)) / sizeof(REC95));
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper: Adjust record number = %d\r\n",(*(WORD *)pGBKEmbPtr)));
|
||
|
}
|
||
|
|
||
|
pNewFilePtr = MergeGBandGBKEMBWorker(pGBEmbPtr,pGBKEmbPtr);
|
||
|
|
||
|
if (pNewFilePtr == NULL) {
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper,MergeGBandGBKEMBWorker[%s,%s] error,[%d]!\r\n",
|
||
|
lpszGBFileName,lpszGBKFileName,GetLastError()));
|
||
|
goto Err5;
|
||
|
}
|
||
|
|
||
|
hNewFile = CreateFile(lpszNewFileName,
|
||
|
GENERIC_WRITE,
|
||
|
FILE_SHARE_READ,
|
||
|
NULL,
|
||
|
CREATE_ALWAYS,
|
||
|
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
|
||
|
NULL);
|
||
|
|
||
|
if (hNewFile == INVALID_HANDLE_VALUE) {
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper,CreateFile error %s,[%d]!\r\n",lpszNewFileName,GetLastError()));
|
||
|
goto Err5;
|
||
|
}
|
||
|
|
||
|
if (WriteFile(hNewFile,
|
||
|
pNewFilePtr,
|
||
|
sizeof(WORD)+ *((WORD *) pNewFilePtr) * sizeof(REC95),
|
||
|
&dwByteWritten,
|
||
|
NULL) == 0) {
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper,WriteFile error %s,[%d]!\r\n",lpszNewFileName,GetLastError()));
|
||
|
goto Err6;
|
||
|
} else {
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper,WriteFile %s OK !\r\n",lpszNewFileName));
|
||
|
}
|
||
|
|
||
|
free (pNewFilePtr);
|
||
|
|
||
|
bRet = TRUE;
|
||
|
|
||
|
Err6:
|
||
|
CloseHandle(hNewFile);
|
||
|
Err5:
|
||
|
UnmapViewOfFile(pGBKEmbPtr);
|
||
|
Err4:
|
||
|
UnmapViewOfFile(pGBEmbPtr);
|
||
|
Err3:
|
||
|
CloseHandle(hGBEmbMapping);
|
||
|
Err2:
|
||
|
CloseHandle(hGBKEmb);
|
||
|
Err1:
|
||
|
CloseHandle(hGBEmb);
|
||
|
Err0:
|
||
|
DebugMsg(("MergeGBandGBKEMBWrapper, Finished ...!\r\n"));
|
||
|
return bRet;
|
||
|
|
||
|
}
|
||
|
|
||
|
BOOL MergeGBandGBKEMB(LPCTSTR lpszSourcePath)
|
||
|
//
|
||
|
// Warnning, lpszSourcePath, this string must be ended with "\"
|
||
|
//
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
TCHAR szGBEmbPath[MAX_PATH];
|
||
|
TCHAR szGBKEmbPath[MAX_PATH];
|
||
|
TCHAR szTmpEMBPath[MAX_PATH];
|
||
|
|
||
|
UINT uFileExistingStatus = 0;
|
||
|
|
||
|
DebugMsg(("MergeGBandGBKEMB,Starting ...!\r\n"));
|
||
|
DebugMsg(("MergeGBandGBKEMB, lpszSourcePath = %s!\r\n",lpszSourcePath));
|
||
|
|
||
|
for (i=0; i<IMENUM; i++) {
|
||
|
lstrcpy(szGBEmbPath,lpszSourcePath);
|
||
|
lstrcat(szGBEmbPath,EmbName[i]);
|
||
|
|
||
|
lstrcpy(szGBKEmbPath,lpszSourcePath);
|
||
|
lstrcat(szGBKEmbPath,XEmbName[i]);
|
||
|
|
||
|
if (IsFileExist(szGBEmbPath)) {
|
||
|
uFileExistingStatus |= 1;
|
||
|
DebugMsg(("MergeGBandGBKEMB,EMB %s exsiting !\r\n",szGBEmbPath));
|
||
|
} else {
|
||
|
DebugMsg(("MergeGBandGBKEMB,EMB %s not exsiting !\r\n",szGBEmbPath));
|
||
|
}
|
||
|
|
||
|
if (IsFileExist(szGBKEmbPath)) {
|
||
|
uFileExistingStatus |= 2;
|
||
|
DebugMsg(("MergeGBandGBKEMB,EMB %s exsiting !\r\n",szGBKEmbPath));
|
||
|
} else {
|
||
|
DebugMsg(("MergeGBandGBKEMB,EMB %s not exsiting !\r\n",szGBKEmbPath));
|
||
|
}
|
||
|
|
||
|
lstrcpy(szTmpEMBPath,szGBEmbPath);
|
||
|
lstrcat(szTmpEMBPath,TEXT("_"));
|
||
|
|
||
|
switch (uFileExistingStatus) {
|
||
|
case 1: // only GB emb
|
||
|
if (CopyFile(szGBEmbPath,szTmpEMBPath,FALSE)) {
|
||
|
DebugMsg(("MergeGBandGBKEMB,copy %s to %s OK!\r\n",szGBEmbPath,szTmpEMBPath));
|
||
|
} else {
|
||
|
DebugMsg(("MergeGBandGBKEMB,copy %s to %s failed!\r\n",szGBEmbPath,szTmpEMBPath));
|
||
|
}
|
||
|
break;
|
||
|
case 2: // only GBK emb
|
||
|
if (CopyFile(szGBKEmbPath,szTmpEMBPath,FALSE)) {
|
||
|
DebugMsg(("MergeGBandGBKEMB,copy %s to %s OK!\r\n",szGBKEmbPath,szTmpEMBPath));
|
||
|
} else {
|
||
|
DebugMsg(("MergeGBandGBKEMB,copy %s to %s failed!\r\n",szGBKEmbPath,szTmpEMBPath));
|
||
|
}
|
||
|
break;
|
||
|
case 3: // both
|
||
|
if (MergeGBandGBKEMBWrapper(szGBEmbPath,szGBKEmbPath,szTmpEMBPath)) {
|
||
|
DebugMsg(("MergeGBandGBKEMB,merge %s , %s to %s OK!\r\n",szGBEmbPath,szGBKEmbPath,szTmpEMBPath));
|
||
|
} else {
|
||
|
DebugMsg(("MergeGBandGBKEMB,merge %s , %s to %s failed!\r\n",szGBEmbPath,szGBKEmbPath,szTmpEMBPath));
|
||
|
}
|
||
|
break;
|
||
|
case 0: // none of them
|
||
|
default:
|
||
|
DebugMsg(("MergeGBandGBKEMB,None of them !\r\n"));
|
||
|
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
DebugMsg(("MergeGBandGBKEMB,Finished ...!\r\n"));
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
// Test above routines.
|
||
|
BOOL ConvertChsImeData(void)
|
||
|
{
|
||
|
HANDLE hs, ht;
|
||
|
int i,len;
|
||
|
TCHAR szName[MAX_PATH];
|
||
|
TCHAR szMergedName[MAX_PATH];
|
||
|
TCHAR szMigTempDir[MAX_PATH];
|
||
|
TCHAR szSys32Dir[MAX_PATH];
|
||
|
LPSTR pszMigTempDirPtr;
|
||
|
LPSTR pszSys32Ptr;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Get Winnt System 32 directory
|
||
|
//
|
||
|
len = GetSystemDirectory((LPSTR)szSys32Dir, MAX_PATH);
|
||
|
if (szSys32Dir[len - 1] != '\\') { // consider C:\ ;
|
||
|
szSys32Dir[len++] = '\\';
|
||
|
szSys32Dir[len] = 0;
|
||
|
}
|
||
|
DebugMsg(("ConvertChsImeData, System Directory = %s !\r\n",szSys32Dir));
|
||
|
|
||
|
//
|
||
|
// detect if IME98 directory there, if it is,
|
||
|
// then just copy files to system32 dir from temporary dir
|
||
|
// because Win98 IME's EMB tables are compatibile with NT
|
||
|
//
|
||
|
lstrcpy(szMigTempDir,ImeDataDirectory);
|
||
|
|
||
|
if (g_bCHSWin98) {
|
||
|
|
||
|
DebugMsg(("ConvertChsImeData ,This is win98 !\r\n"));
|
||
|
|
||
|
pszMigTempDirPtr = szMigTempDir+lstrlen(szMigTempDir);
|
||
|
pszSys32Ptr = szSys32Dir+lstrlen(szSys32Dir);
|
||
|
|
||
|
for (i=0; i<IMENUM; i++) {
|
||
|
lstrcat(pszMigTempDirPtr,EmbName[i]);
|
||
|
lstrcat(pszSys32Ptr,EmbName[i]);
|
||
|
if (CopyFile(szMigTempDir,szSys32Dir,FALSE)) {
|
||
|
DebugMsg(("ConvertChsImeData,copy %s to %s OK!\r\n",szMigTempDir,szSys32Dir));
|
||
|
} else {
|
||
|
DebugMsg(("ConvertChsImeData,doesn't copy %s to %s !\r\n",szMigTempDir,szSys32Dir));
|
||
|
}
|
||
|
*pszMigTempDirPtr = TEXT('\0');
|
||
|
*pszSys32Ptr = TEXT('\0');
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
//
|
||
|
// end of detecting Win98
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// if you're here, then it means we're not doing CHS win98 migration
|
||
|
//
|
||
|
// then we need to convert EMB to be compatibile with NT
|
||
|
//
|
||
|
if (! MergeGBandGBKEMB(ImeDataDirectory)) {
|
||
|
DebugMsg(("ConvertChsImeData, calling MergeGBandGBKEMB failed !\r\n"));
|
||
|
}
|
||
|
else {
|
||
|
DebugMsg(("ConvertChsImeData, calling MergeGBandGBKEMB OK !\r\n"));
|
||
|
}
|
||
|
|
||
|
for (i=0; i< IMENUM; i++)
|
||
|
{
|
||
|
lstrcpy(szMergedName,EmbName[i]);
|
||
|
lstrcat(szMergedName,TEXT("_"));
|
||
|
if (hs = OpenEMBFile(szMergedName))
|
||
|
{
|
||
|
|
||
|
lstrcat(szSys32Dir, EmbName[i]);
|
||
|
|
||
|
ht = CreateFile(szSys32Dir,
|
||
|
GENERIC_WRITE,
|
||
|
0,
|
||
|
NULL,
|
||
|
CREATE_NEW,
|
||
|
FILE_ATTRIBUTE_ARCHIVE, NULL);
|
||
|
|
||
|
DebugMsg(("ConvertChsImeData, ImeDataConvertChs Old = %s,New = %s!\r\n",szMergedName,szSys32Dir));
|
||
|
ImeDataConvertChs((HFILE)hs, (HFILE)ht);
|
||
|
CloseHandle(hs);
|
||
|
CloseHandle(ht);
|
||
|
szSys32Dir[len]=0;
|
||
|
}
|
||
|
else {
|
||
|
if (GetLastError() != ERROR_FILE_NOT_FOUND) {
|
||
|
DebugMsg(("ConvertChsImeData failed!\r\n"));
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL CHSBackupWinABCUserDict(LPCTSTR lpszSourcePath)
|
||
|
{
|
||
|
TCHAR szDstName[MAX_PATH];
|
||
|
TCHAR szSrcName[MAX_PATH];
|
||
|
int len;
|
||
|
|
||
|
int i;
|
||
|
TCHAR ChsDataFile[4][15]={"winbx.emb",
|
||
|
"winxbx.emb",
|
||
|
"user.rem",
|
||
|
"tmmr.rem"};
|
||
|
|
||
|
for (i=0; i<4; i++) {
|
||
|
lstrcpy(szSrcName,lpszSourcePath);
|
||
|
ConcatenatePaths(szSrcName,ChsDataFile[i],MAX_PATH);
|
||
|
|
||
|
if (! IsFileExist(szSrcName)) {
|
||
|
DebugMsg(("CHSBackupWinABCUserDict, no user dic file, %s!\r\n",szSrcName));
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
len = GetSystemDirectory((LPSTR)szDstName, MAX_PATH);
|
||
|
ConcatenatePaths(szDstName,ChsDataFile[i],MAX_PATH);
|
||
|
|
||
|
if (CopyFile(szSrcName,szDstName,FALSE)) {
|
||
|
DebugMsg(("CHSBackupWinABCUserDict,copy %s to %s OK!\r\n",szSrcName,szDstName));
|
||
|
} else {
|
||
|
DebugMsg(("CHSBackupWinABCUserDict,copy %s to %s failed!\r\n",szSrcName,szDstName));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL CHSDeleteGBKKbdLayout()
|
||
|
{
|
||
|
#define ID_LEN 9
|
||
|
TCHAR szKeyboardLayouts[][ID_LEN] = {"E0060804",
|
||
|
"E0070804",
|
||
|
"E0080804"
|
||
|
// "E0090804",
|
||
|
};
|
||
|
|
||
|
HKEY hKey;
|
||
|
LONG lResult;
|
||
|
int i;
|
||
|
|
||
|
|
||
|
lResult = RegOpenKey(HKEY_LOCAL_MACHINE,
|
||
|
TEXT("System\\CurrentControlSet\\Control\\Keyboard Layouts"),
|
||
|
&hKey);
|
||
|
|
||
|
if (lResult != ERROR_SUCCESS) {
|
||
|
DebugMsg(("CHSDeleteGBKKbdLayout, Open keyboard layout registry failed failed [%d] !\r\n",lResult));
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
for (i=0; i<sizeof(szKeyboardLayouts) / ID_LEN; i++) {
|
||
|
lResult = RegDeleteKey(hKey,szKeyboardLayouts[i]);
|
||
|
if (lResult != ERROR_SUCCESS) {
|
||
|
DebugMsg(("CHSDeleteGBKKbdLayout, Delete key %s failed %X!\r\n",szKeyboardLayouts[i],lResult));
|
||
|
}
|
||
|
else {
|
||
|
DebugMsg(("CHSDeleteGBKKbdLayout, Delete key %s OK %X!\r\n",szKeyboardLayouts[i]));
|
||
|
}
|
||
|
}
|
||
|
RegCloseKey(hKey);
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|