|
|
////////////////////////////////////////////////////////////////////////////////////
//
// File: ntcompat.cpp
//
// History: 27-Mar-01 markder Created.
//
// Desc: This file contains all code needed to create ntcompat.inx
// additions.
//
////////////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "make.h"
#include "fileio.h"
BOOL NtCompatCreateWinNTUpgradeEntry( SdbWinNTUpgrade* pNTUpg, CString* pcsInfLine) { BOOL bSuccess = FALSE; CString csLinkDate, csAttr, csBinProductVersion, csBinFileVersion, csTemp; CString csFileName, csServiceName; ULONGLONG ullAttr = 0;
if (pNTUpg->m_AppHelpRef.m_pAppHelp == NULL) { SDBERROR_FORMAT((_T("NTCOMPAT entry requires APPHELP: \"%s\"\n"), pNTUpg->m_pApp->m_csName)); goto eh; } if (pNTUpg->m_MatchingFile.m_csName.GetLength() || pNTUpg->m_MatchingFile.m_csServiceName.GetLength()) { if (pNTUpg->m_MatchingFile.m_dwMask & (~( SDB_MATCHINGINFO_BIN_PRODUCT_VERSION | SDB_MATCHINGINFO_UPTO_BIN_PRODUCT_VERSION | SDB_MATCHINGINFO_BIN_FILE_VERSION | SDB_MATCHINGINFO_UPTO_BIN_FILE_VERSION | SDB_MATCHINGINFO_LINK_DATE | SDB_MATCHINGINFO_UPTO_LINK_DATE))) {
SDBERROR_FORMAT((_T("NTCOMPAT entry can only use (UPTO_)LINK_DATE and (UPTO_)BIN_xxxx_VERSION as matching info: \"%s\"\n"), pNTUpg->m_pApp->m_csName));
goto eh; }
if (pNTUpg->m_MatchingFile.m_dwMask & SDB_MATCHINGINFO_BIN_PRODUCT_VERSION || pNTUpg->m_MatchingFile.m_dwMask & SDB_MATCHINGINFO_UPTO_BIN_PRODUCT_VERSION) {
csAttr.Empty();
if (pNTUpg->m_MatchingFile.m_dwMask & SDB_MATCHINGINFO_BIN_PRODUCT_VERSION) { ullAttr = pNTUpg->m_MatchingFile.m_ullBinProductVersion; } else { ullAttr = pNTUpg->m_MatchingFile.m_ullUpToBinProductVersion; }
if (((WORD)(ullAttr >> 48)) != 0xFFFF) { csTemp.Format(_T("%d"), (WORD)(ullAttr >> 48)); csAttr += csTemp;
if (((WORD)(ullAttr >> 32)) != 0xFFFF) { csTemp.Format(_T(".%d"), (WORD)(ullAttr >> 32)); csAttr += csTemp;
if (((WORD)(ullAttr >> 16)) != 0xFFFF) { csTemp.Format(_T(".%d"), (WORD)(ullAttr >> 16)); csAttr += csTemp;
if (((WORD)(ullAttr)) != 0xFFFF) { csTemp.Format(_T(".%d"), (WORD)(ullAttr)); csAttr += csTemp; } } } }
if (pNTUpg->m_MatchingFile.m_dwMask & SDB_MATCHINGINFO_BIN_PRODUCT_VERSION) { csAttr = _T("=") + csAttr; }
csAttr = _T("\"") + csAttr; csAttr += _T("\"");
csBinProductVersion = csAttr; }
if (pNTUpg->m_MatchingFile.m_dwMask & SDB_MATCHINGINFO_BIN_FILE_VERSION || pNTUpg->m_MatchingFile.m_dwMask & SDB_MATCHINGINFO_UPTO_BIN_FILE_VERSION) {
csAttr.Empty();
if (pNTUpg->m_MatchingFile.m_dwMask & SDB_MATCHINGINFO_BIN_FILE_VERSION) { ullAttr = pNTUpg->m_MatchingFile.m_ullBinFileVersion; } else { ullAttr = pNTUpg->m_MatchingFile.m_ullUpToBinFileVersion; }
if (((WORD)(ullAttr >> 48)) != 0xFFFF) { csTemp.Format(_T("%d"), (WORD)(ullAttr >> 48)); csAttr += csTemp;
if (((WORD)(ullAttr >> 32)) != 0xFFFF) { csTemp.Format(_T(".%d"), (WORD)(ullAttr >> 32)); csAttr += csTemp;
if (((WORD)(ullAttr >> 16)) != 0xFFFF) { csTemp.Format(_T(".%d"), (WORD)(ullAttr >> 16)); csAttr += csTemp;
if (((WORD)(ullAttr)) != 0xFFFF) { csTemp.Format(_T(".%d"), (WORD)(ullAttr)); csAttr += csTemp; } } } }
if (pNTUpg->m_MatchingFile.m_dwMask & SDB_MATCHINGINFO_BIN_FILE_VERSION) { csAttr = _T("=") + csAttr; }
csAttr = _T("\"") + csAttr; csAttr += _T("\"");
csBinFileVersion = csAttr; }
if (pNTUpg->m_MatchingFile.m_dwMask & SDB_MATCHINGINFO_UPTO_LINK_DATE) { csLinkDate.Format(_T("\"0x%08X\""), (DWORD) pNTUpg->m_MatchingFile.m_timeUpToLinkDate); }
if (pNTUpg->m_MatchingFile.m_dwMask & SDB_MATCHINGINFO_LINK_DATE) { csLinkDate.Format(_T("\"=0x%08X\""), (DWORD) pNTUpg->m_MatchingFile.m_timeLinkDate); }
if (pNTUpg->m_MatchingFile.m_csServiceName.IsEmpty()) { pcsInfLine->Format( _T("f,\"%s\",%s,*idh_w2_%s.htm,,%%drvmain__%s__%%,,,,%s,%s"), pNTUpg->m_MatchingFile.m_csName, csBinFileVersion, pNTUpg->m_AppHelpRef.m_pAppHelp->m_csName, pNTUpg->m_AppHelpRef.m_pAppHelp->m_csName, csLinkDate, csBinProductVersion); } else {
if (!pNTUpg->m_MatchingFile.m_csName.IsEmpty()) { csFileName = _T("\""); csFileName += pNTUpg->m_MatchingFile.m_csName; csFileName += _T("\""); }
if (!pNTUpg->m_MatchingFile.m_csServiceName.IsEmpty()) { csServiceName = _T("\""); csServiceName += pNTUpg->m_MatchingFile.m_csServiceName; csServiceName += _T("\""); }
pcsInfLine->Format( _T("s,%s,*idh_w2_%s.htm,,%%drvmain__%s__%%,%s,%s,,,,%s,%s"), csServiceName, pNTUpg->m_AppHelpRef.m_pAppHelp->m_csName, pNTUpg->m_AppHelpRef.m_pAppHelp->m_csName, csFileName, csBinFileVersion, csLinkDate, csBinProductVersion); }
} else if (pNTUpg->m_MatchingRegistryEntry.m_csName.GetLength()) {
CString csKey, csValueName, csValue;
csKey = pNTUpg->m_MatchingRegistryEntry.m_csName; csValueName = pNTUpg->m_MatchingRegistryEntry.m_csValueName; csValue = pNTUpg->m_MatchingRegistryEntry.m_csValue;
if (!csKey.IsEmpty()) { csKey = _T("\"") + csKey + _T("\""); }
if (!csValueName.IsEmpty()) { csValueName = _T("\"") + csValueName + _T("\""); }
if (!csValue.IsEmpty()) { csValue = _T("\"") + csValue + _T("\""); }
pcsInfLine->Format( _T("r,%s,%s,%s,*idh_w2_%s.htm,*idh_w2_%s.htm,%%drvmain__%s__%%"), csKey, csValueName, csValue, pNTUpg->m_AppHelpRef.m_pAppHelp->m_csName, pNTUpg->m_AppHelpRef.m_pAppHelp->m_csName, pNTUpg->m_AppHelpRef.m_pAppHelp->m_csName);
} else { SDBERROR_FORMAT((_T("NTCOMPAT entry requires 1 matching specification: \"%s\"\n"), pNTUpg->m_pApp->m_csName)); goto eh; }
bSuccess = TRUE;
eh: return bSuccess; }
BOOL NtCompatWriteInfAdditions( SdbOutputFile* pOutputFile, SdbDatabase* pDB) { BOOL bSuccess = FALSE; CStringArray rgServicesToDisable; CStringArray rgServicesToStopInstallation; CMapStringToString mapStrings; CString csInfLine, csStringKey, csStringLine; SdbWinNTUpgrade* pNTUpg = NULL; long i;
for (i = 0; i < pDB->m_rgWinNTUpgradeEntries.GetSize(); i++) {
pNTUpg = (SdbWinNTUpgrade *) pDB->m_rgWinNTUpgradeEntries.GetAt(i);
if (!(pNTUpg->m_dwFilter & g_dwCurrentWriteFilter)) { continue; }
if (!NtCompatCreateWinNTUpgradeEntry(pNTUpg, &csInfLine)) { SDBERROR_PROPOGATE(); goto eh; }
if (pNTUpg->m_AppHelpRef.m_pAppHelp->m_bBlockUpgrade) { rgServicesToStopInstallation.Add(csInfLine); } else { rgServicesToDisable.Add(csInfLine); }
csStringKey.Format(_T("drvmain__%s__"), pNTUpg->m_AppHelpRef.m_pAppHelp->m_csName);
csStringLine.Format(_T("drvmain__%s__=\"%s\""), pNTUpg->m_AppHelpRef.m_pAppHelp->m_csName, pNTUpg->m_AppHelpRef.m_pAppHelp->m_pApp->GetLocalizedAppName());
mapStrings.SetAt(csStringKey,csStringLine); }
try { POSITION pos; CANSITextFile File(pOutputFile->m_csName, pDB->m_pCurrentMakefile->GetLangMap(pDB->m_pCurrentOutputFile->m_csLangID)->m_dwCodePage, CFile::typeText | CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite);
File.WriteString(_T(";\n")); File.WriteString(_T("; App Compat entries start here\n")); File.WriteString(_T(";\n")); File.WriteString(_T("; ___APPCOMPAT_NTCOMPAT_ENTRIES___\n")); File.WriteString(_T(";\n"));
pos = mapStrings.GetStartPosition();
while (pos) { mapStrings.GetNextAssoc(pos, csStringKey, csStringLine);
File.WriteString(csStringLine + _T("\n")); }
File.WriteString(_T("\n\n[ServicesToDisable]\n")); for (i = 0; i < rgServicesToDisable.GetSize(); i++) { File.WriteString(rgServicesToDisable[i] + _T("\n")); }
File.WriteString(_T("\n\n[ServicesToStopInstallation]\n")); for (i = 0; i < rgServicesToStopInstallation.GetSize(); i++) { File.WriteString(rgServicesToStopInstallation[i] + _T("\n")); }
File.Close(); }
catch(...) { SDBERROR_FORMAT((_T("Error writing NTCOMPAT file \"%s\"."), pOutputFile->m_csName)); goto eh; }
bSuccess = TRUE;
eh:
return bSuccess; }
BOOL NtCompatWriteMessageInf( SdbOutputFile* pOutputFile, SdbDatabase* pDB) { BOOL bSuccess = FALSE; SdbAppHelp* pAppHelp; SdbMessage* pMessage; CString csInfLine; long i;
// Message parts
DWORD dwHTMLHelpID; LANGID langID; CString csURL, csContactInfo, csAppTitle; CString csDetails;
try {
CANSITextFile File(pOutputFile->m_csName, pDB->m_pCurrentMakefile->GetLangMap(pDB->m_pCurrentOutputFile->m_csLangID)->m_dwCodePage, CFile::typeText | CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite);
File.WriteString(_T(";\n; AppHelp Message INF for NTCOMPAT-style upgrades\n")); File.WriteString(_T(";\n; This file is generated from XML via ShimDBC\n;\n")); File.WriteString(_T("\n\n[Version]\nsignature=\"$windows nt$\"\n\n"));
for (i = 0; i < pDB->m_rgAppHelps.GetSize(); i++) {
pAppHelp = (SdbAppHelp *) pDB->m_rgAppHelps.GetAt(i);
if (!(pAppHelp->m_dwFilter & g_dwCurrentWriteFilter)) { continue; }
pMessage = (SdbMessage *) pDB->m_rgMessages.LookupName(pAppHelp->m_csMessage, pDB->m_pCurrentMakefile->m_csLangID);
if (pMessage == NULL) { SDBERROR_FORMAT((_T("Error looking up message for AppHelp HTMLHELPID %s\n"), pAppHelp->m_csName)); goto eh; }
if (!pDB->ConstructMessageParts( pAppHelp, pMessage, pDB->m_pCurrentMakefile->m_csLangID, &dwHTMLHelpID, &csURL, &csContactInfo, &csAppTitle, NULL, &csDetails)) { SDBERROR_PROPOGATE(); goto eh; }
csInfLine.Format(_T("[idh_w2_%d.htm]\n"), dwHTMLHelpID); File.WriteString(csInfLine);
csDetails = TrimParagraph(csDetails);
if (!pDB->HTMLtoText(csDetails, &csInfLine)) { SDBERROR_PROPOGATE(); goto eh; }
ReplaceStringNoCase(csInfLine, _T(" \n"), _T("\n")); ReplaceStringNoCase(csInfLine, _T("\n "), _T("\n")); ReplaceStringNoCase(csInfLine, _T("\""), _T("'")); ReplaceStringNoCase(csInfLine, _T("\n"), _T("\"\n\""));
csInfLine.TrimLeft(); csInfLine.TrimRight(); csInfLine = _T("\"") + csInfLine; csInfLine += _T("\"\n\"\"\n");
File.WriteString(csInfLine);
csContactInfo = TrimParagraph(csContactInfo);
if (!pDB->HTMLtoText(csContactInfo, &csInfLine)) { SDBERROR_PROPOGATE(); goto eh; }
ReplaceStringNoCase(csInfLine, _T(" \n"), _T("\n")); ReplaceStringNoCase(csInfLine, _T("\n "), _T("\n")); ReplaceStringNoCase(csInfLine, _T("\""), _T("'")); ReplaceStringNoCase(csInfLine, _T("\n"), _T("\"\n\""));
csInfLine.TrimLeft(); csInfLine.TrimRight(); csInfLine = _T("\"") + csInfLine; csInfLine += _T("\"\n\n");
File.WriteString(csInfLine); }
File.Close(); } catch(...) { SDBERROR_FORMAT((_T("Error writing to NTCOMPAT INF for HTMLHELPID %s.\n"), pAppHelp->m_csName)); }
bSuccess = TRUE;
eh: return bSuccess; }
|