//////////////////////////////////////////////////////////////////////////////////// // // File: write.cpp // // History: 16-Nov-00 markder Created. // // Desc: This file contains all code needed to create SDB files // from the SdbDatabase internal C++ object. // //////////////////////////////////////////////////////////////////////////////////// #include "StdAfx.h" #include "make.h" DWORD g_dwCurrentWriteFilter = SDB_FILTER_INCLUDE_ALL; DATE g_dtCurrentWriteRevisionCutoff = 0; //////////////////////////////////////////////////////////////////////////////////// // // Func: GetUniqueCount // // Desc: Returns the count of unique index entries given an "ordered" // array of exes // DWORD GetUniqueCount(SdbRefArray* prgExes, DWORD dwFilter, DATE dtRevisionCutoff, BOOL bWildCard) { int i; SdbExe* pExe; DWORD dwCount = 0; ULONGLONG ullKey = 0; for (i = 0; i < prgExes->GetSize(); ++i) { pExe = (SdbExe*)prgExes->GetAt(i); if (!(pExe->m_bWildcardInName ^ bWildCard)) { // XOR is 1 if the args are different and // is 0 if the args are the same if ((pExe->m_dwFilter & dwFilter) && dtRevisionCutoff <= pExe->m_dtLastRevision) { if (ullKey != pExe->m_ullKey) { ullKey = pExe->m_ullKey; ++dwCount; } } } } return dwCount; } BOOL WriteDatabase( SdbOutputFile* pOutputFile, SdbDatabase* pDatabase) { BOOL bSuccess = FALSE; PDB pdb = NULL; pdb = SdbCreateDatabase(pOutputFile->m_csName, DOS_PATH); if (pdb == NULL) { SDBERROR_FORMAT((_T("Error creating database \"%s\".\n"), pOutputFile->m_csName)); goto eh; } pDatabase->m_Library.SanitizeTagIDs(); if (!pDatabase->WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } bSuccess = TRUE; eh: if (pdb) { SdbCloseDatabase(pdb); } if (bSuccess == FALSE) { // // We need to delete the .SDB that has been created. We had an error // but shimdbc has made the .SDB for the XML till it hit the error. This is typically // in the case when we hit a tag in the summary part of a XML for a custom SDB // that is not allowed in the summary part. For e.g if we have // ********************************************************************* // // // // sd // // // // //********************************************************************** // Such an .SDB is an invalid .SDB and should be removed // DeleteFile(pOutputFile->GetFullPath()); } return bSuccess; } VOID SdbLibrary::SanitizeTagIDs(VOID) { INT i; for (i = 0; i < m_rgShims.GetSize(); ++i) { SdbShim* pShim = (SdbShim*)m_rgShims.GetAt(i); pShim->m_tiTagID = TAGID_NULL; } for (i = 0; i < m_rgPatches.GetSize(); ++i) { SdbPatch* pPatch = (SdbPatch*)m_rgPatches.GetAt(i); pPatch->m_tiTagID = TAGID_NULL; } for (i = 0; i < m_rgLayers.GetSize(); ++i) { SdbLayer* pLayer = (SdbLayer*)m_rgLayers.GetAt(i); pLayer->m_tiTagID = TAGID_NULL; } for (i = 0; i < m_rgFiles.GetSize(); ++i) { SdbFile* pFile = (SdbFile*)m_rgFiles.GetAt(i); pFile->m_tiTagID = TAGID_NULL; } for (i = 0; i < m_rgMsiTransforms.GetSize(); ++i) { SdbMsiTransform* pTransform = (SdbMsiTransform*)m_rgMsiTransforms.GetAt(i); pTransform->m_tiTagID = TAGID_NULL; } } BOOL SdbDatabase::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; BOOL bAtLeastOneIndex = FALSE; TAGID tiDatabase; FILETIME ftBuildStamp; LARGE_INTEGER liBuildStamp; DWORD dwHTMLHelpID; LANGID langID; DWORD dwUniqueCount = 0; long i, j; SdbAppHelp* pAppHelp; SdbMessage* pMessage; CString csURL, csLinkText, csContactInfo; CString csAppTitle, csSummary, csDetails, csID, csDBName; CString csLanguagesParam, csLangID; CStringArray rgLanguages; csLanguagesParam = m_pCurrentOutputFile->GetParameter(_T("LANGUAGES")); if (csLanguagesParam.GetLength()) { if (!ParseLanguagesString(csLanguagesParam, &rgLanguages)) { SDBERROR_FORMAT((_T("Error parsing LANGUAGES parameter in makefile: %s\n"), csLanguagesParam)); goto eh; } } else { rgLanguages.Add(m_pCurrentMakefile->m_csLangID); } // // Allocate indexes // dwUniqueCount = GetUniqueCount(&m_rgExes, m_pCurrentOutputFile->m_dwFilter, g_dtCurrentWriteRevisionCutoff, FALSE); if (m_pCurrentOutputFile->m_dwFilter & (SDB_FILTER_FIX | SDB_FILTER_DRIVER)) { if (!SdbDeclareIndex(pdb, TAG_EXE, TAG_NAME, dwUniqueCount, TRUE, &m_iiExeIndex)) { SDBERROR(_T("Error declaring index for Exes.\n")); goto eh; } bAtLeastOneIndex = TRUE; } if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_FIX) { if (!SdbDeclareIndex(pdb, TAG_EXE, TAG_WILDCARD_NAME, (DWORD)m_rgWildcardExes.GetFilteredCount(m_pCurrentOutputFile->m_dwFilter, g_dtCurrentWriteRevisionCutoff), FALSE, &m_iiWildcardExeIndex)) { SDBERROR(_T("Error declaring index for wildcard Exes.\n")); goto eh; } if (!SdbDeclareIndex(pdb, TAG_EXE, TAG_16BIT_MODULE_NAME, (DWORD)m_rgModuleExes.GetFilteredCount(m_pCurrentOutputFile->m_dwFilter, g_dtCurrentWriteRevisionCutoff), FALSE, &m_iiModuleExeIndex)) { SDBERROR(_T("Error declaring index for wildcard Exes.\n")); goto eh; } if (!SdbDeclareIndex(pdb, TAG_SHIM, TAG_NAME, (DWORD)m_Library.m_rgShims.GetFilteredCount(m_pCurrentOutputFile->m_dwFilter, 0), FALSE, &m_iiShimIndex)) { SDBERROR(_T("Error declaring index for Shims.\n")); goto eh; } bAtLeastOneIndex = TRUE; } if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_APPHELP) { if (!SdbDeclareIndex(pdb, TAG_APPHELP, TAG_HTMLHELPID, (DWORD) (m_rgAppHelps.GetFilteredCount(m_pCurrentOutputFile->m_dwFilter, g_dtCurrentWriteRevisionCutoff) * rgLanguages.GetSize()), FALSE, &m_iiHtmlHelpID)) { SDBERROR(_T("Error declaring index for HTMLHELPID\n")); goto eh; } bAtLeastOneIndex = TRUE; } if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_MSI) { // // MSI_TRANSFORM index, unique style (it's more efficient) - these are "fixes" // if (!SdbDeclareIndex(pdb, TAG_MSI_TRANSFORM, TAG_NAME, (DWORD)m_Library.m_rgMsiTransforms.GetFilteredCount(m_pCurrentOutputFile->m_dwFilter, g_dtCurrentWriteRevisionCutoff), TRUE, &m_iiMsiTransformIndex)) { SDBERROR(_T("Error declaring index for MSI Transforms.\n")); goto eh; } // // MSI_PACKAGE index, unique style (it's more efficient, again) // if (!SdbDeclareIndex(pdb, TAG_MSI_PACKAGE, TAG_MSI_PACKAGE_ID, m_rgMsiPackages.GetFilteredCount(m_pCurrentOutputFile->m_dwFilter, g_dtCurrentWriteRevisionCutoff), FALSE, &m_iiMsiPackageIndex)) { SDBERROR(_T("Error declaring index for MSI Packages.\n")); goto eh; } if (!SdbDeclareIndex(pdb, TAG_MSI_PACKAGE, TAG_EXE_ID, m_rgMsiPackages.GetFilteredCount(m_pCurrentOutputFile->m_dwFilter, g_dtCurrentWriteRevisionCutoff), TRUE, &m_iiMsiIDIndex)) { SDBERROR(_T("Error declaring index for MSI Exe IDs.\n")); goto eh; } bAtLeastOneIndex = TRUE; } if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_DRIVER) { if (!SdbDeclareIndex(pdb, TAG_EXE, TAG_EXE_ID, m_rgExes.GetFilteredCount(m_pCurrentOutputFile->m_dwFilter, g_dtCurrentWriteRevisionCutoff), FALSE, &m_iiDrvIDIndex)) { SDBERROR(_T("Error declaring index for DRIVER ID\n")); goto eh; } bAtLeastOneIndex = TRUE; } if (bAtLeastOneIndex) { if (!SdbCommitIndexes(pdb)) { SDBERROR(_T("Error ending index declarations.\n")); goto eh; } } // // Open tag // tiDatabase = SdbBeginWriteListTag(pdb, TAG_DATABASE); if (!tiDatabase) { SDBERROR(_T("Error writing DATABASE tag\n")); goto eh; } // // Stamp the build time // GetSystemTimeAsFileTime(&ftBuildStamp); liBuildStamp.LowPart = ftBuildStamp.dwLowDateTime; liBuildStamp.HighPart = ftBuildStamp.dwHighDateTime; if (!SdbWriteQWORDTag(pdb, TAG_TIME, liBuildStamp.QuadPart)) { SDBERROR(_T("Error writing TIME\n")); goto eh; } // // Stamp the compiler version // if (!SdbWriteStringTag(pdb, TAG_COMPILER_VERSION, g_szVersion)) { SDBERROR(_T("Error writing COMPILER_VERSION\n")); goto eh; } // // Look for name from makefile // csDBName = m_pDB->m_pCurrentOutputFile->GetParameter(_T("DATABASE NAME")); if (csDBName.IsEmpty()) { csDBName = m_csName; } // // Write the name of the database // if (!SdbWriteStringTag(pdb, TAG_NAME, csDBName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } // // Look for GUID from makefile // csID = m_pDB->m_pCurrentOutputFile->GetParameter(_T("DATABASE ID")); if (csID.GetLength()) { if (!GUIDFromString(csID, &m_CurrentDBID)) { SDBERROR_FORMAT((_T("Bad GUID specified for DATABASE_ID: %s\n"), csID)); goto eh; } } else { // // Not there, take the ID from the XML file // m_CurrentDBID = m_ID; } // // Write the GUID // if (!SdbWriteBinaryTag(pdb, TAG_DATABASE_ID, (PBYTE)&m_CurrentDBID, sizeof(m_CurrentDBID))) { SDBERROR(_T("Error writing TAG_DATABASE_ID\n")); goto eh; } if (m_pCurrentOutputFile->m_dwFilter & ~SDB_FILTER_DRIVER) { // // Write the Library // if (!m_Library.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } } // // Action // if (!m_rgAction.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_FIX) { // // First write all the EXEs with wild-card names // if (!SdbStartIndexing(pdb, m_iiWildcardExeIndex)) { SDBERROR(_T("Error starting to index wildcard Exes.\n")); goto eh; } // // Wildcard Exes // if (!m_rgWildcardExes.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Done indexing the wildcard exes // if (!SdbStopIndexing(pdb, m_iiWildcardExeIndex)) { SDBERROR(_T("Error stopping indexing wildcard Exes.\n")); goto eh; } // // Next write all the EXEs with module names // if (!SdbStartIndexing(pdb, m_iiModuleExeIndex)) { SDBERROR(_T("Error starting to index Module Exes.\n")); goto eh; } // // Module Exes // if (!m_rgModuleExes.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Done indexing the module exes // if (!SdbStopIndexing(pdb, m_iiModuleExeIndex)) { SDBERROR(_T("Error stopping indexing Module Exes.\n")); goto eh; } } if (m_pCurrentOutputFile->m_dwFilter & (SDB_FILTER_FIX | SDB_FILTER_DRIVER)) { // // Go ahead and start indexing normal exes // if (!SdbStartIndexing(pdb, m_iiExeIndex)) { SDBERROR(_T("Error starting to index Exes.\n")); goto eh; } if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_DRIVER) { if (!SdbStartIndexing(pdb, m_iiDrvIDIndex)) { SDBERROR(_T("Error starting to index driver IDs\n")); goto eh; } } if (!m_rgExes.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_DRIVER) { if (!SdbStopIndexing(pdb, m_iiDrvIDIndex)) { SDBERROR(_T("Error stopping indexing driver IDs\n")); goto eh; } } // // Done indexing the exes // if (!SdbStopIndexing(pdb, m_iiExeIndex)) { SDBERROR(_T("Error stopping indexing Exes.\n")); goto eh; } } if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_MSI) { // // MSI Packages, they are just like EXEs // but indexed not by name but by their GUID IDs // if (!SdbStartIndexing(pdb, m_iiMsiPackageIndex)) { SDBERROR(_T("Error starting to index MSI Packages.\n")); goto eh; } if (!SdbStartIndexing(pdb, m_iiMsiIDIndex)) { SDBERROR(_T("Error starting to index MSI packages by exe id\n")); goto eh; } if (!m_rgMsiPackages.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } if (!SdbStopIndexing(pdb, m_iiMsiIDIndex)) { SDBERROR(_T("Error stopping indexing of MSI packages by exe id\n")); goto eh; } if (!SdbStopIndexing(pdb, m_iiMsiPackageIndex)) { SDBERROR(_T("Error stopping indexing MSI Packages.\n")); goto eh; } } if (m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_APPHELP) { // // Start indexing apphelps // if (!SdbStartIndexing(pdb, m_iiHtmlHelpID)) { SDBERROR( _T("Error starting to index HTMLHELPID.\n")); goto eh; } for (i = 0; i < m_rgAppHelps.GetSize(); i++) { pAppHelp = (SdbAppHelp *) m_rgAppHelps[i]; if (!(pAppHelp->m_dwFilter & m_pCurrentOutputFile->m_dwFilter)) { continue; } if (g_dtCurrentWriteRevisionCutoff > pAppHelp->m_dtLastRevision) { continue; } for (j = 0; j < rgLanguages.GetSize(); j++) { csLangID = rgLanguages[j]; pMessage = (SdbMessage *) m_rgMessages.LookupName(pAppHelp->m_csMessage, csLangID); if (pMessage == NULL) { SDBERROR_FORMAT((_T("Localized MESSAGE not found for\n NAME: %s\n HTMLHELPID: %s\n LANG: %s\n"), pAppHelp->m_csMessage, pAppHelp->m_csName, csLangID)); goto eh; } if (!ConstructMessageParts( pAppHelp, pMessage, csLangID, &dwHTMLHelpID, &csURL, &csContactInfo, &csAppTitle, &csSummary, &csDetails)) { SDBERROR_PROPOGATE(); goto eh; } if (g_bStrict) { if (csURL.IsEmpty()) { SDBERROR_FORMAT((_T("ERROR: Empty string for URL on\n NAME: %s\n HTMLHELPID: %s\n LANG: %s\n\n"), pAppHelp->m_pApp->m_csName, pAppHelp->m_csName, csLangID)); goto eh; } if (csAppTitle.IsEmpty()) { SDBERROR_FORMAT((_T("ERROR: Empty string for APP_TITLE on\n NAME: %s\n HTMLHELPID: %s\n LANG: %s\n\n"), pAppHelp->m_pApp->m_csName, pAppHelp->m_csName, csLangID)); goto eh; } if (csSummary.IsEmpty()) { SDBERROR_FORMAT((_T("ERROR: Empty string for SUMMARY on\n NAME: %s\n HTMLHELPID: %s\n LANG: %s\n\n"), pAppHelp->m_pApp->m_csName, pAppHelp->m_csName, csLangID)); goto eh; } } if (!WriteAppHelpRefTag( pdb, pAppHelp->m_csName, csLangID == _T("---") ? 0 : m_pCurrentMakefile->GetLangMap(csLangID)->m_lcid, csURL, csAppTitle, csSummary)) { SDBERROR_PROPOGATE(); goto eh; } } } // // Stop indexing apphelps // if (!SdbStopIndexing(pdb, m_iiHtmlHelpID)) { SDBERROR( _T("Error stopping indexing HTMLHELPID.\n")); goto eh; } } // // Close tag // if (!SdbEndWriteListTag(pdb, tiDatabase)) { SDBERROR(_T("Error writing TAG_DATABASE\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbLibrary::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiLibrary; // // Open tag // tiLibrary = SdbBeginWriteListTag(pdb, TAG_LIBRARY); if (!tiLibrary) { SDBERROR(_T("Error writing TAG_LIBRARY\n")); goto eh; } if (m_pDB->m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_FIX) { // // Global exclusion list // if (!m_rgCallers.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Index the shims // if (!SdbStartIndexing(pdb, m_pDB->m_iiShimIndex)) { SDBERROR(_T("Error starting to index Dlls.\n")); goto eh; } // // Shims // if (!m_rgShims.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Done indexing the shims // if (!SdbStopIndexing(pdb, m_pDB->m_iiShimIndex)) { SDBERROR(_T("Error stopping indexing shims.\n")); goto eh; } // // Patches // if (!m_rgPatches.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Flags // if (!m_rgFlags.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } } // // Included files // if (!m_rgFiles.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } if (m_pDB->m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_MSI) { // // Msi Transforms, indexed by the their respective name // if (!SdbStartIndexing(pdb, m_pDB->m_iiMsiTransformIndex)) { SDBERROR(_T("Error starting to index MSI Transforms.\n")); goto eh; } if (!m_rgMsiTransforms.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } if (!SdbStopIndexing(pdb, m_pDB->m_iiMsiTransformIndex)) { SDBERROR(_T("Error stopping indexing MSI Transforms.\n")); goto eh; } } // // Close tag // if (!SdbEndWriteListTag(pdb, tiLibrary)) { SDBERROR(_T("Error ending TAG_LIBRARY\n")); goto eh; } if (m_pDB->m_pCurrentOutputFile->m_dwFilter & SDB_FILTER_FIX) { // // Layers // // BUGBUG: Layers should be *inside* the library // if (!m_rgLayers.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbExe::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiExe; long i; ULONGLONG ullFlagsNTVDM1 = 0; ULONGLONG ullFlagsNTVDM2 = 0; ULONGLONG ullFlagsNTVDM3 = 0; // // Open tag // tiExe = SdbBeginWriteListTag(pdb, TAG_EXE); if (!tiExe) { SDBERROR(_T("Error writing TAG_EXE\n")); goto eh; } // // NAME (i.e., EXE filename) // if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } // // If there's a wildcard in the name, write WILDCARD_NAME // as well, for the indexing // if (m_bWildcardInName) { if (!SdbWriteStringTag(pdb, TAG_WILDCARD_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_WILDCARD_NAME\n")); goto eh; } } // // If this is supposed to match on module name, write that out too // if (m_bMatchOnModule) { if (!SdbWriteStringTag(pdb, TAG_16BIT_MODULE_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_16BIT_MODULE_NAME\n")); goto eh; } } } // // APP_NAME (i.e., application title) // if (m_pApp != NULL) { if (m_pApp->m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_APP_NAME, m_pApp->m_csName)) { SDBERROR(_T("Error writing TAG_APP_NAME\n")); goto eh; } } } // // VENDOR // if (m_pApp != NULL) { if (m_pApp->m_csVendor.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_VENDOR, m_pApp->m_csVendor)) { SDBERROR(_T("Error writing TAG_VENDOR\n")); goto eh; } } } // // GUID (Unique ID) // if (!SdbWriteBinaryTag(pdb, TAG_EXE_ID, (PBYTE)&m_ID, sizeof(m_ID))) { SDBERROR(_T("Error writing TAG_EXE_ID\n")); goto eh; } // // OS SERVICE PACK mask if it's anything other than 0xFFFFFFFF // if (m_dwSPMask != 0xFFFFFFFF) { if (!SdbWriteDWORDTag(pdb, TAG_OS_SERVICE_PACK, m_dwSPMask)) { SDBERROR(_T("Error writing TAG_OS_SERVICE_PACK\n")); goto eh; } } // // Write the MATCH_MODE tag if it's anything other than NORMAL // if (m_dwMatchMode != MATCH_DEFAULT) { BOOL bWriteMatchMode = FALSE; if (m_pDB->IsStandardDatabase()) { // // standard db, we write match mode if it's not "normal" // since normal is the default // bWriteMatchMode = (m_dwMatchMode != MATCHMODE_DEFAULT_MAIN); } else { // // for custom dbs default match mode is additive // bWriteMatchMode = (m_dwMatchMode != MATCHMODE_DEFAULT_CUSTOM); } if (bWriteMatchMode && !SdbWriteWORDTag(pdb, TAG_MATCH_MODE, (WORD)m_dwMatchMode)) { SDBERROR(_T("Error writing TAG_MATCH_MODE\n")); goto eh; } } // // Write the RUNTIME_PLATFORM tag if it's anything other than RUNTIME_PLATFORM_ANY // if (m_dwRuntimePlatform != RUNTIME_PLATFORM_ANY) { if (!SdbWriteDWORDTag(pdb, TAG_RUNTIME_PLATFORM, m_dwRuntimePlatform)) { SDBERROR(_T("Error writing RUNTIME_PLATFORM\n")); goto eh; } } // // Write the OS_SKU tag if it's anything other than OS_SKU_ALL // if (m_dwOSSKU != OS_SKU_ALL) { if (!SdbWriteDWORDTag(pdb, TAG_OS_SKU, m_dwOSSKU)) { SDBERROR(_T("Error writing OS_SKU\n")); goto eh; } } // // Message reference // if (m_AppHelpRef.m_pAppHelp) { if (!m_AppHelpRef.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } } // // Matching Files // if (!m_rgMatchingFiles.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Shim references // if (!m_rgShimRefs.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Flag references // if (!m_rgFlagRefs.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Patches (by reference) // if (!m_rgPatches.WriteToSDB(pdb, TRUE)) { SDBERROR_PROPOGATE(); goto eh; } // // Layers references // if (!m_rgLayerRefs.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } if (!m_csSXSManifest.IsEmpty()) { // // Add XML header tag // WCHAR wszXMLHeader[] = L""; // // The whole manifest consists of the Unicode byte marker (1 byte), the XML header, // the manifest itself, and a NULL terminator (1 byte). // DWORD dwSXSEntryLen = wcslen(wszXMLHeader) + m_csSXSManifest.GetLength() + 2; LPWSTR wszSXSEntry = (LPWSTR) (malloc(dwSXSEntryLen * sizeof(WCHAR))); // // Begin with 0xFF 0xFE Unicode byte order marker // UCHAR* szSXSEntry = (UCHAR*) wszSXSEntry; szSXSEntry[0] = 0xFF; szSXSEntry[1] = 0xFE; // // Add the XML header // StringCchCopy(wszSXSEntry + 1, dwSXSEntryLen, wszXMLHeader); // // Add the manifest // StringCchCat(wszSXSEntry, dwSXSEntryLen, m_csSXSManifest); if (!SdbWriteStringTag(pdb, TAG_SXS_MANIFEST, wszSXSEntry)) { goto eh; } free(wszSXSEntry); } // // Data // if (!m_rgData.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Action // if (!m_rgAction.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Close tag // if (!SdbEndWriteListTag(pdb, tiExe)) { SDBERROR(_T("Error ending TAG_EXE\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbMsiPackage::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiMsiPackage; // // Open tag // tiMsiPackage = SdbBeginWriteListTag(pdb, TAG_MSI_PACKAGE); if (!tiMsiPackage) { SDBERROR(_T("Error writing TAG_MSI_PACKAGE\n")); goto eh; } // // NAME (i.e., EXE filename) // if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME for MSI_PACKAGE\n")); goto eh; } } // // APP_NAME (i.e., application title) // if (m_pApp != NULL) { if (m_pApp->m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_APP_NAME, m_pApp->m_csName)) { SDBERROR(_T("Error writing TAG_APP_NAME for MSI_PACKAGE\n")); goto eh; } } } // // GUID (unique ID) // if (!SdbWriteBinaryTag(pdb, TAG_EXE_ID, (PBYTE)&m_ID, sizeof(m_ID))) { SDBERROR(_T("Error writing TAG_EXE_ID\n")); goto eh; } // // GUID (non-Unique ID) // if (!SdbWriteBinaryTag(pdb, TAG_MSI_PACKAGE_ID, (PBYTE)&m_MsiPackageID, sizeof(m_MsiPackageID))) { SDBERROR(_T("Error writing TAG_MSI_PACKAGE_ID\n")); goto eh; } // // RUNTIME_PLATFORM data // if (m_dwRuntimePlatform != RUNTIME_PLATFORM_ANY) { if (!SdbWriteDWORDTag(pdb, TAG_RUNTIME_PLATFORM, m_dwRuntimePlatform)) { SDBERROR(_T("Error writing RUNTIME_PLATFORM\n")); goto eh; } } // // Write the OS_SKU tag if it's anything other than OS_SKU_ALL // if (m_dwOSSKU != OS_SKU_ALL) { if (!SdbWriteDWORDTag(pdb, TAG_OS_SKU, m_dwOSSKU)) { SDBERROR(_T("Error writing OS_SKU\n")); goto eh; } } // // Supplemental data // if (!m_rgData.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // applicable fixes (reference to transforms) // if (!m_rgMsiTransformRefs.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Message reference // if (m_AppHelpRef.m_pAppHelp) { if (!m_AppHelpRef.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } } // // custom actions // if (!m_rgCustomActions.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Close tag // if (!SdbEndWriteListTag(pdb, tiMsiPackage)) { SDBERROR(_T("Error ending TAG_MSI_PACKAGE\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbMsiCustomAction::WriteToSDB(PDB pdb) { TAGID tiMsiCustomAction; BOOL bSuccess = FALSE; // // Open tag // tiMsiCustomAction = SdbBeginWriteListTag(pdb, TAG_MSI_CUSTOM_ACTION); if (!tiMsiCustomAction) { SDBERROR(_T("Error writing TAG_MSI_CUSTOM_ACTION\n")); goto eh; } // // NAME (i.e., EXE filename) // if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME for MSI_CUSTOM_ACTION\n")); goto eh; } } // // Shim references // if (!m_rgShimRefs.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } if (!m_rgLayerRefs.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Close tag // if (!SdbEndWriteListTag(pdb, tiMsiCustomAction)) { SDBERROR(_T("Error ending TAG_MSI_CUSTOM_ACTION\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbCaller::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiCaller; // // Open tag // tiCaller = SdbBeginWriteListTag(pdb, TAG_INEXCLUDE); if (!tiCaller) { SDBERROR(_T("Error writing TAG_INEXCLUDE\n")); goto eh; } // // If it's an tag, write out the indicator // if (m_CallerType == SDB_CALLER_INCLUDE) { if (!SdbWriteNULLTag(pdb, TAG_INCLUDE)) { SDBERROR(_T("Error writing TAG_INCLUDE\n")); goto eh; } } // // Module // if (m_csModule.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_MODULE, m_csModule)) { SDBERROR(_T("Error writing TAG_MODULE\n")); goto eh; } } // // Close tag // if (!SdbEndWriteListTag(pdb, tiCaller)) { SDBERROR(_T("Error ending TAG_INEXCLUDE\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbFile::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiFile; CString csFileDir, csFilename; csFileDir = MakeFullPath(m_pDB->m_pCurrentOutputFile->GetParameter(_T("INCLUDE FILES"))); // // Check if filtered out // if (!(m_dwFilter & m_pDB->m_pCurrentOutputFile->m_dwFilter)) { // // Filtered out, return success // return TRUE; } // // Open tag // tiFile = SdbBeginWriteListTag(pdb, TAG_FILE); if (!tiFile) { SDBERROR(_T("Error writing TAG_FILE\n")); goto eh; } // // NAME // if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } } // // Binary data // if (csFileDir.GetLength()) { csFilename = csFileDir; csFilename += m_csName; if (!SdbWriteBinaryTagFromFile(pdb, TAG_FILE_BITS, csFilename)) { if (g_bStrict) { SDBERROR_FORMAT((_T("Can't find FILE \"%s\". No bits written.\n"), csFilename)); goto eh; } } } else { if (g_bStrict) { SDBERROR_FORMAT((_T("Can't find FILE \"%s\". -f compiler flag required.\n"), m_csName)); goto eh; } } // // Close tag // if (!SdbEndWriteListTag(pdb, tiFile)) { SDBERROR(_T("Error ending TAG_FILE\n")); goto eh; } m_tiTagID = tiFile; // this is the tagid as it was written into the database bSuccess = TRUE; eh: return bSuccess; } BOOL SdbShimRef::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiShimRef; // // Open tag // tiShimRef = SdbBeginWriteListTag(pdb, TAG_SHIM_REF); if (!tiShimRef) { SDBERROR(_T("Error writing TAG_SHIM_REF\n")); goto eh; } // // NAME // if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing NAME tag\n")); goto eh; } // // Write TAGID of the SHIM in the LIBRARY, if any // if (m_pShim && m_pShim->m_tiTagID) { if (!SdbWriteDWORDTag(pdb, TAG_SHIM_TAGID, m_pShim->m_tiTagID)) { SDBERROR(_T("Error writing TAG_SHIM_TAGID\n")); goto eh; } } // // COMMAND_LINE // if (m_csCommandLine.GetLength()) { // // process this command line first // CString csProcessedCmdLine = ProcessShimCmdLine(m_csCommandLine, m_pDB->m_CurrentDBID, tiShimRef); if (!SdbWriteStringTag(pdb, TAG_COMMAND_LINE, csProcessedCmdLine)) { SDBERROR(_T("Error writing COMMAND_LINE tag\n")); goto eh; } } // // Inclusion/exclusion list // if (!m_rgCallers.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // child data tags // if (!m_rgData.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Close tag // if (!SdbEndWriteListTag(pdb, tiShimRef)) { SDBERROR(_T("Error ending TAG_SHIM_REF\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbShim::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiShim; // // Open tag // tiShim = SdbBeginWriteListTag(pdb, TAG_SHIM); if (!tiShim) { SDBERROR(_T("Error writing TAG_SHIM\n")); goto eh; } m_tiTagID = tiShim; // // NAME // if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } } if (m_csDllFile.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_DLLFILE, m_csDllFile)) { SDBERROR(_T("Error writing TAG_DLLFILE\n")); goto eh; } } // // DESCRIPTION, only written for general-purpose shims // if (m_csDesc.GetLength() && m_Purpose == SDB_PURPOSE_GENERAL) { // // Remove all extra white space and new line characters // via TrimParagraph() // if (!SdbWriteStringTag(pdb, TAG_DESCRIPTION, TrimParagraph(m_csDesc))) { SDBERROR(_T("Error writing TAG_DESCRIPTION\n")); goto eh; } } // // Purpose (if general) // if (m_Purpose == SDB_PURPOSE_GENERAL) { if (!SdbWriteNULLTag(pdb, TAG_GENERAL)) { SDBERROR(_T("Error writing TAG_GENERAL\n")); goto eh; } } // // APPLY_ALL_SHIMS flag // if (m_bApplyAllShims) { if (!SdbWriteNULLTag(pdb, TAG_APPLY_ALL_SHIMS)) { SDBERROR(_T("Error writing TAG_APPLY_ALL_SHIMS\n")); goto eh; } } // // Inclusion/exclusion list // if (!m_rgCallers.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Close tag // if (!SdbEndWriteListTag(pdb, tiShim)) { SDBERROR(_T("Error ending TAG_SHIM\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbPatch::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiPatch; // // Open tag // tiPatch = SdbBeginWriteListTag(pdb, TAG_PATCH); if (!tiPatch) { SDBERROR(_T("Error writing TAG_PATCH\n")); goto eh; } m_tiTagID = tiPatch; // // NAME // if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } } // // Patch bits // if (GetBlobSize()) { if (!SdbWriteBinaryTag(pdb, TAG_PATCH_BITS, GetBlobBytes(), GetBlobSize())) { SDBERROR_FORMAT((_T("Error writing patch bytes \"%s\"\n"), m_csName)); goto eh; } } // // Close tag // if (!SdbEndWriteListTag(pdb, tiPatch)) { SDBERROR(_T("Error ending TAG_PATCH\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbPatch::WriteRefToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiPatch; // // Open tag // tiPatch = SdbBeginWriteListTag(pdb, TAG_PATCH_REF); if (!tiPatch) { SDBERROR(_T("Error writing TAG_PATCH\n")); goto eh; } // // NAME // if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } } // // Write TAGID of the PATCH in the LIBRARY, if any // if (m_tiTagID) { if (!SdbWriteDWORDTag(pdb, TAG_PATCH_TAGID, m_tiTagID)) { SDBERROR(_T("Error writing TAG_PATCH_TAGID\n")); goto eh; } } // // Close tag // if (!SdbEndWriteListTag(pdb, tiPatch)) { SDBERROR(_T("Error ending TAG_PATCH\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbFlag::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiFlag; // // Open tag // tiFlag = SdbBeginWriteListTag(pdb, TAG_FLAG); if (!tiFlag) { SDBERROR(_T("Error writing TAG_FLAG\n")); goto eh; } m_tiTagID = tiFlag; // // NAME // if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } } // // DESCRIPTION, only general-purpose descriptions // if (m_csDesc.GetLength() && m_Purpose == SDB_PURPOSE_GENERAL) { // // Remove all extra white space and new line characters // via TrimParagraph() // if (!SdbWriteStringTag(pdb, TAG_DESCRIPTION, TrimParagraph(m_csDesc))) { SDBERROR(_T("Error writing TAG_DESCRIPTION\n")); goto eh; } } // // Mask // if (!SdbWriteQWORDTag(pdb, TagFromType(m_dwType), m_ullMask)) { SDBERROR(_T("Error writing in \n")); goto eh; } // // Purpose (if general) // if (m_Purpose == SDB_PURPOSE_GENERAL) { if (!SdbWriteNULLTag(pdb, TAG_GENERAL)) { SDBERROR(_T("Error writing TAG_GENERAL\n")); goto eh; } } // // Close tag // if (!SdbEndWriteListTag(pdb, tiFlag)) { SDBERROR(_T("Error ending TAG_FLAG\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbFlagRef::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiFlagRef; // // Open tag // tiFlagRef = SdbBeginWriteListTag(pdb, TAG_FLAG_REF); if (!tiFlagRef) { SDBERROR(_T("Error writing TAG_FLAG_REF\n")); goto eh; } // // NAME // if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing NAME tag\n")); goto eh; } // // Write TAGID of the FLAG in the LIBRARY, if any // if (m_pFlag && m_pFlag->m_tiTagID) { if (!SdbWriteDWORDTag(pdb, TAG_FLAG_TAGID, m_pFlag->m_tiTagID)) { SDBERROR(_T("Error writing TAG_FLAG_TAGID\n")); goto eh; } } // // Write Command Line tag // if (m_csCommandLine.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_COMMAND_LINE, m_csCommandLine)) { SDBERROR(_T("Error writing COMMAND_LINE tag for flag\n")); goto eh; } } // // Close tag // if (!SdbEndWriteListTag(pdb, tiFlagRef)) { SDBERROR(_T("Error ending TAG_FLAG_REF\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbMsiTransformRef::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiMsiTransformRef; tiMsiTransformRef = SdbBeginWriteListTag(pdb, TAG_MSI_TRANSFORM_REF); if (!tiMsiTransformRef) { SDBERROR(_T("Error writing TAG_MSI_TRANSFORM_REF\n")); goto eh; } // // write out the reference to the transform by name first // if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } } // // now -- satisfy the judgement by writing reference to the // actual transform object if available // if (m_pMsiTransform != NULL) { if (!SdbWriteDWORDTag(pdb, TAG_MSI_TRANSFORM_TAGID, m_pMsiTransform->m_tiTagID)) { SDBERROR(_T("Error writing TAG_MSI_TRANSFORM_TAGID for MSI_TRANSFORM_REF\n")); goto eh; } } if (!SdbEndWriteListTag(pdb, tiMsiTransformRef)) { SDBERROR(_T("Error ending TAG_MSI_TRANSFORM_REF\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbMsiTransform::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiMsiTransform; // // write out the name of the transform tiMsiTransform = SdbBeginWriteListTag(pdb, TAG_MSI_TRANSFORM); if (!tiMsiTransform) { SDBERROR(_T("Error writing TAG_MSI_TRANSFORM\n")); goto eh; } // // NAME // if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } } // // MSI transform file name // if (m_csMsiTransformFile.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_MSI_TRANSFORM_FILE, m_csMsiTransformFile)) { SDBERROR(_T("Error writing TAG_MSI_TRANSFORM_FILE\n")); goto eh; } } // // REFERENCE the Actual file bits // if (m_pSdbFile != NULL && m_pSdbFile->m_tiTagID != TAGID_NULL) { if (!SdbWriteDWORDTag(pdb, TAG_MSI_TRANSFORM_TAGID, m_pSdbFile->m_tiTagID)) { SDBERROR(_T("Error writing TAG_MSI_TRANSFORM_TAGID\n")); goto eh; } } // // Close tag // if (!SdbEndWriteListTag(pdb, tiMsiTransform)) { SDBERROR(_T("Error ending TAG_MSI_TRANSFORM\n")); goto eh; } m_tiTagID = tiMsiTransform; bSuccess = TRUE; eh: return bSuccess; } BOOL SdbLayer::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiLayer; long i; // // Open tag // tiLayer = SdbBeginWriteListTag(pdb, TAG_LAYER); if (!tiLayer) { SDBERROR(_T("Error writing TAG_LAYER\n")); goto eh; } m_tiTagID = tiLayer; // // NAME // if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } } // // Display name // if (m_csDisplayName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_LAYER_DISPLAYNAME, m_csDisplayName)) { SDBERROR(_T("Error writing TAG_LAYER_DISPLAYNAME\n")); goto eh; } } // // Shim references // if (!m_rgShimRefs.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Flags // if (!m_rgFlagRefs.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Close tag // if (!SdbEndWriteListTag(pdb, tiLayer)) { SDBERROR(_T("Error ending TAG_LAYER\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbLayerRef::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiLayer; // // Open tag // tiLayer = SdbBeginWriteListTag(pdb, TAG_LAYER); if (!tiLayer) { SDBERROR(_T("Error writing TAG_LAYER\n")); goto eh; } // // NAME // if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } } // // Write TAGID of the LAYER in the LIBRARY, if any // if (m_pLayer) { if (m_pLayer->m_tiTagID) { if (!SdbWriteDWORDTag(pdb, TAG_LAYER_TAGID, m_pLayer->m_tiTagID)) { SDBERROR(_T("Error writing TAG_LAYER_TAGID\n")); goto eh; } } } // // child data tags // if (!m_rgData.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Close tag // if (!SdbEndWriteListTag(pdb, tiLayer)) { SDBERROR(_T("Error ending TAG_LAYER\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbMatchingFile::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiMatchingFile; // // Open tag // tiMatchingFile = SdbBeginWriteListTag(pdb, TAG_MATCHING_FILE); if (!tiMatchingFile) { SDBERROR(_T("Error writing TAG_MATCHING_FILE\n")); goto eh; } // // NAME // if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } } // // platform should be first if it exists -- along with the logic bit // if (m_bMatchLogicNot) { if (!SdbWriteNULLTag(pdb, TAG_MATCH_LOGIC_NOT)) { SDBERROR(_T("Error writing MATCH_LOGIC_NOT\n")); goto eh; } } // matching information if (m_dwMask & SDB_MATCHINGINFO_SIZE) { if (!SdbWriteDWORDTag(pdb, TAG_SIZE, m_dwSize)) { SDBERROR(_T("Error writing SIZE\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_CHECKSUM) { if (!SdbWriteDWORDTag(pdb, TAG_CHECKSUM, m_dwChecksum)) { SDBERROR(_T("Error writing CHECKSUM\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_COMPANY_NAME) { if (!SdbWriteStringTag(pdb, TAG_COMPANY_NAME, m_csCompanyName)) { SDBERROR(_T("Error writing COMPANY_NAME tag\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_PRODUCT_NAME) { if (!SdbWriteStringTag(pdb, TAG_PRODUCT_NAME, m_csProductName)) { SDBERROR(_T("Error writing PRODUCT_NAME tag\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_PRODUCT_VERSION) { if (!SdbWriteStringTag(pdb, TAG_PRODUCT_VERSION, m_csProductVersion)) { SDBERROR(_T("Error writing PRODUCT_VERSION tag\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_FILE_DESCRIPTION) { if (!SdbWriteStringTag(pdb, TAG_FILE_DESCRIPTION, m_csFileDescription)) { SDBERROR(_T("Error writing FILE_DESCRIPTION tag\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_BIN_FILE_VERSION) { if (!SdbWriteQWORDTag(pdb, TAG_BIN_FILE_VERSION, m_ullBinFileVersion)) { SDBERROR(_T("Error writing BIN_FILE_VERSION\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_BIN_PRODUCT_VERSION) { if (!SdbWriteQWORDTag(pdb, TAG_BIN_PRODUCT_VERSION, m_ullBinProductVersion)) { SDBERROR(_T("Error writing BIN_PRODUCT_VERSION\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_MODULE_TYPE) { if (!SdbWriteDWORDTag(pdb, TAG_MODULE_TYPE, m_dwModuleType)) { SDBERROR(_T("Error writing MODULE_TYPE\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_VERFILEDATEHI) { if (!SdbWriteDWORDTag(pdb, TAG_VERDATEHI, m_dwFileDateMS)) { SDBERROR(_T("Error writing MODULE_TYPE\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_VERFILEDATELO) { if (!SdbWriteDWORDTag(pdb, TAG_VERDATELO, m_dwFileDateLS)) { SDBERROR(_T("Error writing MODULE_TYPE\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_VERFILEOS) { if (!SdbWriteDWORDTag(pdb, TAG_VERFILEOS, m_dwFileOS)) { SDBERROR(_T("Error writing VERFILEOS\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_VERFILETYPE) { if (!SdbWriteDWORDTag(pdb, TAG_VERFILETYPE, m_dwFileType)) { SDBERROR(_T("Error writing VERFILETYPE\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_PE_CHECKSUM) { if (!SdbWriteDWORDTag(pdb, TAG_PE_CHECKSUM, m_ulPECheckSum)) { SDBERROR(_T("Error writing PE_CHECKSUM\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_LINKER_VERSION) { if (!SdbWriteDWORDTag(pdb, TAG_LINKER_VERSION, m_dwLinkerVersion)) { SDBERROR(_T("Error writing LINKER_VERSION\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_FILE_VERSION) { if (!SdbWriteStringTag(pdb, TAG_FILE_VERSION, m_csFileVersion)) { SDBERROR(_T("Error writing FILE_VERSION\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_ORIGINAL_FILENAME) { if (!SdbWriteStringTag(pdb, TAG_ORIGINAL_FILENAME, m_csOriginalFileName)) { SDBERROR(_T("Error writing ORIGINAL_FILENAME\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_INTERNAL_NAME) { if (!SdbWriteStringTag(pdb, TAG_INTERNAL_NAME, m_csInternalName)) { SDBERROR(_T("Error writing INTERNAL_NAME\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_LEGAL_COPYRIGHT) { if (!SdbWriteStringTag(pdb, TAG_LEGAL_COPYRIGHT, m_csLegalCopyright)) { SDBERROR(_T("Error writing LEGAL_COPYRIGHT\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_16BIT_DESCRIPTION) { if (!SdbWriteStringTag(pdb, TAG_16BIT_DESCRIPTION, m_cs16BitDescription)) { SDBERROR(_T("Error writing 16BIT_DESCRIPTION\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_16BIT_MODULE_NAME) { if (!SdbWriteStringTag(pdb, TAG_16BIT_MODULE_NAME, m_cs16BitModuleName)) { SDBERROR(_T("Error Writing 16BIT_MODULE_NAME\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_UPTO_BIN_PRODUCT_VERSION) { if (!SdbWriteQWORDTag(pdb, TAG_UPTO_BIN_PRODUCT_VERSION, m_ullUpToBinProductVersion)) { SDBERROR(_T("Error writing UPTO_BIN_PRODUCT_VERSION\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_UPTO_BIN_FILE_VERSION) { if (!SdbWriteQWORDTag(pdb, TAG_UPTO_BIN_FILE_VERSION, m_ullUpToBinFileVersion)) { SDBERROR(_T("Error writing UPTO_BIN_FILE_VERSION\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_PREVOSMAJORVERSION) { if (!SdbWriteDWORDTag(pdb, TAG_PREVOSMAJORVER, m_dwPrevOSMajorVersion)) { SDBERROR(_T("Error writing PREVOSMAJORVER\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_PREVOSMINORVERSION) { if (!SdbWriteDWORDTag(pdb, TAG_PREVOSMINORVER, m_dwPrevOSMinorVersion)) { SDBERROR(_T("Error writing PREVOSMINORVER\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_PREVOSPLATFORMID) { if (!SdbWriteDWORDTag(pdb, TAG_PREVOSPLATFORMID, m_dwPrevOSPlatformID)) { SDBERROR(_T("Error writing PREVOSPLATFORMID\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_PREVOSBUILDNO) { if (!SdbWriteDWORDTag(pdb, TAG_PREVOSBUILDNO, m_dwPrevOSBuildNo)) { SDBERROR(_T("Error writing PREVOSBUILDNO\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_LINK_DATE) { if (!SdbWriteDWORDTag(pdb, TAG_LINK_DATE, (DWORD) m_timeLinkDate)) { SDBERROR(_T("Error writing LINK_DATE\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_UPTO_LINK_DATE) { if (!SdbWriteDWORDTag(pdb, TAG_UPTO_LINK_DATE, (DWORD) m_timeUpToLinkDate)) { SDBERROR(_T("Error writing UPTO_LINK_DATE\n")); goto eh; } } if (m_dwMask & SDB_MATCHINGINFO_VER_LANGUAGE) { if (!SdbWriteDWORDTag(pdb, TAG_VER_LANGUAGE, m_dwVerLanguage)) { SDBERROR(_T("Error writing VER_LANGUAGE tag\n")); goto eh; } } // // Close tag // if (!SdbEndWriteListTag(pdb, tiMatchingFile)) { SDBERROR(_T("Error ending TAG_MATCHING_FILE\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbAppHelpRef::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiAppHelp; CString cs; // // Open tag // tiAppHelp = SdbBeginWriteListTag(pdb, TAG_APPHELP); if (!tiAppHelp) { SDBERROR(_T("Error writing TAG_APPHELP\n")); goto eh; } if (m_pDB->m_pCurrentOutputFile->m_dwFilter & ~SDB_FILTER_DRIVER) { // // If this EXE entry contains only APPHELP entries, set // a flag. // if (m_bApphelpOnly) { if (!SdbWriteDWORDTag(pdb, TAG_FLAGS, SHIMDB_APPHELP_ONLY)) { SDBERROR(_T("Error writing FLAGS in APPHELP entry\n")); goto eh; } } // // Severity // if (!SdbWriteDWORDTag(pdb, TAG_PROBLEMSEVERITY, (DWORD)m_pAppHelp->m_Type)) { SDBERROR( _T("Error writing PROBLEM_SEVERITY\n")); goto eh; } } // // HTMLHELPID // if (!SdbWriteDWORDTag(pdb, TAG_HTMLHELPID, (DWORD)_ttol(m_pAppHelp->m_csName))) { SDBERROR( _T("Error writing HTMLHELPID\n")); goto eh; } // // Check for service pack parameters. // cs = m_pDB->m_pCurrentOutputFile->GetParameter("DATE AFTER WHICH TO USE SERVICE PACK APPHELP SDB"); if (cs.GetLength()) { COleDateTime odt; if (!odt.ParseDateTime(cs)) { SDBERROR_FORMAT((_T("Error parsing DATE AFTER WHICH TO USE SERVICE PACK APPHELP SDB parameter: \"%s\"\n"), cs)); goto eh; } if (odt.m_dt <= m_pAppHelp->m_dtLastRevision) { if (!SdbWriteNULLTag(pdb, TAG_USE_SERVICE_PACK_FILES)) { SDBERROR( _T("Error writing USE_SERVICE_PACK_FILES\n")); goto eh; } } } // // Close tag // if (!SdbEndWriteListTag(pdb, tiAppHelp)) { SDBERROR(_T("Error ending TAG_APPHELP\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbDatabase::ConstructMigrationMessage( SdbWin9xMigration* pMigApp, SdbMessage* pMessage, CString* pcsMessage ) { BOOL bSuccess = FALSE; CString csSummaryXML, csRedirURL; SdbRefArray rgFields; SdbMessageField TitleField; SdbMessageField VendorField; if (pMessage->m_csSummaryXML.IsEmpty()) { if (pMessage->m_pTemplate != NULL) { csSummaryXML = pMessage->m_pTemplate->m_csSummaryXML; } } else { csSummaryXML = pMessage->m_csSummaryXML; } TitleField.m_csName = _T("TITLE"); TitleField.m_csValue = pMigApp->m_pApp->GetLocalizedAppName(); VendorField.m_csName = _T("VENDOR"); VendorField.m_csValue = pMigApp->m_pApp->GetLocalizedVendorName(); rgFields.Add(&TitleField); rgFields.Add(&VendorField); rgFields.Append(pMessage->m_rgFields); if (!ReplaceFields(csSummaryXML, pcsMessage, &rgFields)) { SDBERROR_PROPOGATE(); goto eh; } csRedirURL = m_pCurrentOutputFile->GetParameter(_T("REDIR URL")); if (!RedirectLinks(pcsMessage, m_pCurrentMakefile->GetLangMap(m_pCurrentOutputFile->m_csLangID)->m_lcid, csRedirURL)) { SDBERROR_PROPOGATE(); goto eh; } if (g_bStrict) { if (pcsMessage->IsEmpty()) { SDBERROR_FORMAT((_T("ERROR: Empty string for SUMMARY on\n NAME: %s\n MESSAGE: %s\n LANG: %s\n\n"), pMigApp->m_pApp->m_csName, pMigApp->m_csMessage, m_pCurrentMakefile->m_csLangID)); goto eh; } } // // Remove redundant spacing // *pcsMessage = TrimParagraph(*pcsMessage); // // Replace
with \r\n // ReplaceStringNoCase(*pcsMessage, _T("
"), _T("
")); ReplaceStringNoCase(*pcsMessage, _T("

"), _T("
")); ReplaceStringNoCase(*pcsMessage, _T("&"), _T("&")); bSuccess = TRUE; eh: return bSuccess; } BOOL SdbDatabase::ConstructMessageParts( SdbAppHelp* pAppHelp, SdbMessage* pMessage, CString& csLangID, DWORD* pdwHTMLHelpID, CString* pcsURL, CString* pcsContactInfo, CString* pcsAppTitle, CString* pcsSummary, CString* pcsDetails) { BOOL bSuccess = FALSE; SdbContactInfo* pContactInfo; SdbMessageTemplate* pTemplate; SdbMessageField* pField; CString csContactInfoXML, csSummaryXML, csDetailsXML; CString csField, csRedirURL, csBaseURL, csLCID; long i; SdbRefArray rgFields; SdbMessageField TitleField; SdbMessageField VendorField; // // If there's a custom URL for this apphelp, use it. If a base content URL was given // via the makefile, use that to construct the URL. // csBaseURL = m_pCurrentOutputFile->GetParameter(_T("BASE ONLINE CONTENT URL")); *pdwHTMLHelpID = (DWORD)_ttol(pAppHelp->m_csName); if (pAppHelp->m_csURL.GetLength()) { *pcsURL = pAppHelp->m_csURL; } else if (csBaseURL.GetLength()) { *pcsURL = csBaseURL; ReplaceStringNoCase(*pcsURL, _T("$HTMLHELPID$"), pAppHelp->m_csName); ReplaceStringNoCase(*pcsURL, _T("$LANGID$"), csLangID); csLCID.Format(_T("%X"), m_pCurrentMakefile->GetLangMap(csLangID)->m_lcid); ReplaceStringNoCase(*pcsURL, _T("$LCID$"), csLCID); } if (pMessage->m_csContactInfoXML.IsEmpty()) { pContactInfo = (SdbContactInfo *) m_rgContactInfo.LookupName(pAppHelp->m_pApp->m_csVendor, csLangID); if (pContactInfo == NULL) { pContactInfo = (SdbContactInfo *) m_rgContactInfo.LookupName(_T("__DEFAULT__"), csLangID); } if (pContactInfo == NULL) { if (g_bStrict) { SDBERROR_FORMAT((_T("ERROR: Localized CONTACT_INFO not found for\n NAME: %s\n HTMLHELPID: %s\n LANG: %s\n\n"), pAppHelp->m_pApp->m_csVendor, pAppHelp->m_csName, csLangID)); goto eh; } else { csContactInfoXML = pAppHelp->m_pApp->m_csVendorXML; } } else { csContactInfoXML = pContactInfo->m_csXML; } } else { csContactInfoXML = pMessage->m_csContactInfoXML; } *pcsAppTitle = pAppHelp->m_pApp->GetLocalizedAppName(csLangID); if (pMessage->m_csSummaryXML.IsEmpty()) { if (pMessage->m_pTemplate != NULL) { csSummaryXML = pMessage->m_pTemplate->m_csSummaryXML; } } else { csSummaryXML = pMessage->m_csSummaryXML; } if (pMessage->m_csDetailsXML.IsEmpty()) { if (pMessage->m_pTemplate != NULL) { csDetailsXML = pMessage->m_pTemplate->m_csDetailsXML; } } else { csDetailsXML = pMessage->m_csDetailsXML; } TitleField.m_csName = _T("TITLE"); TitleField.m_csValue = pAppHelp->m_pApp->GetLocalizedAppName(csLangID); VendorField.m_csName = _T("VENDOR"); VendorField.m_csValue = pAppHelp->m_pApp->GetLocalizedVendorName(csLangID); rgFields.Add(&TitleField); rgFields.Add(&VendorField); rgFields.Append(pMessage->m_rgFields); if (!ReplaceFields(csContactInfoXML, pcsContactInfo, &rgFields)) { SDBERROR_PROPOGATE(); goto eh; } if (pcsSummary) { if (!ReplaceFields(csSummaryXML, pcsSummary, &rgFields)) { SDBERROR_PROPOGATE(); goto eh; } } if (!ReplaceFields(csDetailsXML, pcsDetails, &rgFields)) { SDBERROR_PROPOGATE(); goto eh; } csRedirURL = m_pCurrentOutputFile->GetParameter(_T("REDIR URL")); if (!RedirectLinks(pcsContactInfo, m_pCurrentMakefile->GetLangMap(csLangID)->m_lcid, csRedirURL)) { SDBERROR_PROPOGATE(); goto eh; } if (!RedirectLinks(pcsDetails, m_pCurrentMakefile->GetLangMap(csLangID)->m_lcid, csRedirURL)) { SDBERROR_PROPOGATE(); goto eh; } // // Remove redundant spacing // *pcsURL = TrimParagraph(*pcsURL); *pcsAppTitle = TrimParagraph(*pcsAppTitle); if (pcsSummary) { *pcsSummary = TrimParagraph(*pcsSummary); // // Replace various HTML entities with equivalents // ReplaceStringNoCase(*pcsSummary, _T("
"), _T("\r\n")); ReplaceStringNoCase(*pcsSummary, _T("

"), _T("\r\n")); ReplaceStringNoCase(*pcsSummary, _T("&"), _T("&")); if (-1 != pcsSummary->Find(_T('<'))) { SDBERROR_FORMAT((_T("ERROR:

can only contain
and

formatting tags:\n%s\n"), *pcsSummary)); goto eh; } } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbDatabase::WriteAppHelpRefTag( PDB pdb, CString csHTMLHelpID, LCID lcid, CString csURL, CString csAppTitle, CString csSummary) { TAGID tiMessageSummary; TAGID tiLink; INT i; BOOL bReturn = FALSE; tiMessageSummary = SdbBeginWriteListTag(pdb, TAG_APPHELP); if (!tiMessageSummary) { SDBERROR(_T("Error writing APPHELP_DETAILS tag\n")); goto eh; } if (!SdbWriteDWORDTag(pdb, TAG_HTMLHELPID, (DWORD)_ttol(csHTMLHelpID))) { SDBERROR( _T("Error writing HTMLHELPID\n")); goto eh; } if (lcid != 0) { if (!SdbWriteDWORDTag(pdb, TAG_LANGID, lcid)) { SDBERROR( _T("Error writing LANGID\n")); goto eh; } } // for each, write a list tag tiLink = SdbBeginWriteListTag(pdb,TAG_LINK); if (!tiLink) { SDBERROR(_T("Error writing APPHELP LINK tag\n")); goto eh; } if (!SdbWriteStringTag(pdb, TAG_LINK_URL, csURL)) { SDBERROR(_T("Error writing APPHELP URL tag\n")); goto eh; } if (!SdbEndWriteListTag(pdb, tiLink)) { SDBERROR(_T("Error closing APPHELP LINK tag\n")); goto eh; } if (!csAppTitle.IsEmpty() && !SdbWriteStringTag(pdb, TAG_APPHELP_TITLE, csAppTitle)) { SDBERROR(_T("Error writing APPHELP_TITLE tag\n")); goto eh; } if (!csSummary.IsEmpty() && !SdbWriteStringTag(pdb, TAG_APPHELP_DETAILS, csSummary)) { SDBERROR(_T("Error writing APPHELP_DETAILS tag\n")); goto eh; } if (!SdbEndWriteListTag(pdb, tiMessageSummary)) { SDBERROR(_T("Error closing APPHELP_DETAILS tag\n")); goto eh; } bReturn = TRUE; eh: return bReturn; } BOOL SdbData::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiData; // // Open tag // tiData = SdbBeginWriteListTag(pdb, TAG_DATA); if (!tiData) { SDBERROR(_T("Error writing TAG_DATA\n")); goto eh; } // // NAME // if (m_csName.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing TAG_NAME\n")); goto eh; } } // // Value type // if (!SdbWriteDWORDTag(pdb, TAG_DATA_VALUETYPE, m_DataType)) { SDBERROR(_T("Error writing TAG_DATA_VALUETYPE for DRIVER_POLICY\n")); goto eh; } // // Value // switch(m_DataType) { case eValueNone: break; case eValueString: if (m_szValue != NULL && !SdbWriteStringTag(pdb, TAG_DATA_STRING, m_szValue)) { SDBERROR(_T("Error writing TAG_DATA_STRING\n")); goto eh; } break; case eValueDWORD: if (!SdbWriteDWORDTag(pdb, TAG_DATA_DWORD, m_dwValue)) { SDBERROR(_T("Error writing TAG_DATA_DWORD\n")); goto eh; } break; case eValueQWORD: if (!SdbWriteQWORDTag(pdb, TAG_DATA_QWORD, m_ullValue)) { SDBERROR(_T("Error writing TAG_DATA_QWORD\n")); goto eh; } break; case eValueBinary: if (!SdbWriteBinaryTag(pdb, TAG_DATA_BITS, m_pBinValue, m_dwDataSize)) { SDBERROR(_T("Error writing TAG_DATA_BITS\n")); goto eh; } break; } // // Data // if (!m_rgData.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Close tag // if (!SdbEndWriteListTag(pdb, tiData)) { SDBERROR(_T("Error ending TAG_DATA\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; } BOOL SdbAction::WriteToSDB(PDB pdb) { BOOL bSuccess = FALSE; TAGID tiAction; // // Open tag // tiAction = SdbBeginWriteListTag(pdb, TAG_ACTION); if (!tiAction) { SDBERROR(_T("Error writing TAG_ACTION\n")); goto eh; } // // NAME // if (!SdbWriteStringTag(pdb, TAG_NAME, m_csName)) { SDBERROR(_T("Error writing NAME tag\n")); goto eh; } // // TYPE // if (m_csType.GetLength()) { if (!SdbWriteStringTag(pdb, TAG_ACTION_TYPE, m_csType)) { SDBERROR(_T("Error writing TAG_ACTION_TYPE tag\n")); goto eh; } } // // child data tags // if (!m_rgData.WriteToSDB(pdb)) { SDBERROR_PROPOGATE(); goto eh; } // // Close tag // if (!SdbEndWriteListTag(pdb, tiAction)) { SDBERROR(_T("Error ending TAG_ACTION\n")); goto eh; } bSuccess = TRUE; eh: return bSuccess; }