/*++ Copyright (c) 1989-2000 Microsoft Corporation Module Name: dbsupport.cpp Abstract: Author: clupu created 04/11/2001 Revision History: --*/ #include "stdafx.h" #include "appverif.h" #include "AVUtil.h" #include "dbsupport.h" #include "log.h" char g_szXML[2048]; TCHAR g_szCmd[1024]; BOOL AppCompatSaveSettings( CStringArray &astrExeNames ) { char szBuff[256] = ""; TCHAR szTempPath[MAX_PATH] = _T(""); TCHAR szXmlFile[MAX_PATH] = _T(""); TCHAR szSdbFile[MAX_PATH] = _T(""); HANDLE hFile = INVALID_HANDLE_VALUE; DWORD bytesWritten; STARTUPINFO si; PROCESS_INFORMATION pi; BOOL bReturn = FALSE; INT_PTR nCount; char szExeName[128]; nCount = astrExeNames.GetSize(); if ( nCount == 0 ) { return AppCompatDeleteSettings(); } // // Check for shimdbc.exe // GetSystemWindowsDirectory(szTempPath, MAX_PATH); lstrcat(szTempPath, _T("\\shimdbc.exe")); hFile = CreateFile(szTempPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if ( hFile == INVALID_HANDLE_VALUE ) { AVMesssageFromResource( IDS_NO_SHIMDBC ); return FALSE; } CloseHandle(hFile); // // Construct the XML... // lstrcpyA(g_szXML, "\r\n" "\r\n" " \r\n"); for ( INT_PTR i = 0; i < nCount; i++ ) { // // Convert the EXE name to ANSI // WideCharToMultiByte(CP_ACP, 0, (LPCTSTR)astrExeNames.GetAt(i), -1, szExeName, 128, NULL, NULL); wsprintfA(szBuff, " \r\n" " \r\n" " \r\n", szExeName); lstrcatA(g_szXML, szBuff); } lstrcatA(g_szXML, " \r\n" ""); if ( GetTempPath(MAX_PATH, szTempPath) == 0 ) { LogMessage(LOG_ERROR, _T("[AppCompatSaveSettings] GetTempPath failed.")); goto cleanup; } // // Obtain a temp name for the XML file // if ( GetTempFileName(szTempPath, _T("XML"), NULL, szXmlFile) == 0 ) { LogMessage(LOG_ERROR, _T("[AppCompatSaveSettings] GetTempFilePath for XML failed.")); goto cleanup; } hFile = CreateFile(szXmlFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if ( hFile == INVALID_HANDLE_VALUE ) { LogMessage(LOG_ERROR, _T("[AppCompatSaveSettings] CreateFile '%s' failed 0x%X."), szXmlFile, GetLastError()); goto cleanup; } if ( WriteFile(hFile, g_szXML, lstrlenA(g_szXML), &bytesWritten, NULL) == 0 ) { LogMessage(LOG_ERROR, _T("[AppCompatSaveSettings] WriteFile \"%s\" failed 0x%X."), szXmlFile, GetLastError()); goto cleanup; } CloseHandle(hFile); hFile = INVALID_HANDLE_VALUE; // // Obtain a temp name for the SDB file // wsprintf(szSdbFile, _T("%stempdb.sdb"), szTempPath); DeleteFile(szSdbFile); // // Invoke the compiler to generate the SDB file // ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); wsprintf(g_szCmd, _T("shimdbc.exe fix -q \"%s\" \"%s\""), szXmlFile, szSdbFile); if ( !CreateProcess(NULL, g_szCmd, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, NULL, NULL, &si, &pi) ) { LogMessage(LOG_ERROR, _T("[AppCompatSaveSettings] CreateProcess \"%s\" failed 0x%X."), g_szCmd, GetLastError()); goto cleanup; } CloseHandle(pi.hThread); WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); // // The SDB file is generated. Install the database now. // ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); wsprintf(g_szCmd, _T("sdbinst.exe -q \"%s\""), szSdbFile); if ( !CreateProcess(NULL, g_szCmd, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, NULL, NULL, &si, &pi) ) { LogMessage(LOG_ERROR, _T("[AppCompatSaveSettings] CreateProcess \"%s\" failed 0x%X."), g_szCmd, GetLastError()); goto cleanup; } CloseHandle(pi.hThread); WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); bReturn = TRUE; cleanup: if ( hFile != INVALID_HANDLE_VALUE ) { CloseHandle(hFile); } DeleteFile(szXmlFile); DeleteFile(szSdbFile); return bReturn; } BOOL AppCompatDeleteSettings( void ) { STARTUPINFO si; PROCESS_INFORMATION pi; TCHAR szCmd[MAX_PATH]; ZeroMemory( &si, sizeof( si ) ); si.cb = sizeof( si ); lstrcpy( szCmd, _T("sdbinst.exe -q -u -g {448850f4-a5ea-4dd1-bf1b-d5fa285dc64b}") ); if ( !CreateProcess( NULL, szCmd, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, NULL, NULL, &si, &pi) ) { LogMessage(LOG_ERROR, _T("[AppCompatDeleteSettings] CreateProcess \"%s\" failed 0x%X."), szCmd, GetLastError()); return FALSE; } CloseHandle(pi.hThread); WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); return TRUE; }