#include "precomp.h" #define WM_SAVE_COMPLETE WM_USER+101 extern INT_PTR CALLBACK CabSignProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam ); extern void SignCabFile(LPCTSTR pcszFilename, LPCTSTR pcszIns, LPTSTR pszUnsignedFiles); static TCHAR s_szConfigCabName[MAX_PATH] = TEXT(""); static TCHAR s_szDesktopCabName[MAX_PATH] = TEXT(""); static TCHAR s_szCurrInsPath[MAX_PATH] = TEXT(""); static TCHAR s_szCabsURLPath[INTERNET_MAX_URL_LENGTH] = TEXT(""); static TCHAR s_szNewVersionStr[32] = TEXT(""); static TCHAR s_szInsFile[MAX_PATH] = TEXT(""); static INT_PTR CALLBACK displaySaveDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam ); static BOOL doCompressCabFile(LPVOID lpVoid); static void compressCabFile(); static BOOL createCab(LPCTSTR pcszCabPath, LPCTSTR pcszCabName, LPTSTR pszUnsignedFiles); static void getDefaultCabName(DWORD dwCabType, LPCTSTR pcszPrefix, LPTSTR pszCabName); static void getCabNameFromINS(LPCTSTR pcszInsFile, DWORD dwCabType, LPTSTR pszCabFullFileName, LPTSTR pszCabInfoLine = NULL); static void updateCabName(HWND hDlg, UINT nCtrlID, DWORD dwCabType, LPCTSTR pcszPrefix, LPCTSTR pcszInsFile); static BOOL makeDDFFile(LPCTSTR pcszSrcDir, LPCTSTR pcszDDF); static BOOL CanOverwriteFiles(HWND hDlg); BOOL BrowseForSave(HWND hWnd, LPTSTR szFilter, LPTSTR szFileName, int nSize, LPTSTR szDefExt) { OPENFILENAME ofn; TCHAR szDir[MAX_PATH]; LPTSTR lpExt; StrCpy(szDir, szFileName); lpExt = PathFindExtension(szFileName); if (*lpExt != TEXT('\0')) { StrCpy(szFileName, PathFindFileName(szDir)); PathRemoveFileSpec(szDir); } else *szFileName = TEXT('\0'); ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hWnd; ofn.hInstance = g_hUIInstance; ofn.lpstrFilter = szFilter; ofn.lpstrCustomFilter = NULL; ofn.nFilterIndex = 0; ofn.lpstrFile = szFileName; ofn.nMaxFile = nSize; ofn.lpstrFileTitle = NULL; ofn.lpstrInitialDir = szDir; ofn.lpstrTitle = NULL; ofn.Flags = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; ofn.nFileOffset = 0; ofn.nFileExtension = 0; ofn.lpstrDefExt = szDefExt; return GetSaveFileName(&ofn); } void ExportSettings() { if (PathFileExists(s_szCurrInsPath)) { TCHAR szTempInsFile[MAX_PATH]; TCHAR szCabInfoLine[INTERNET_MAX_URL_LENGTH + 128]; // create a copy of the .INS file -> .TMP file in the temp directory GetTempPath(countof(szTempInsFile), szTempInsFile); PathAppend(szTempInsFile, TEXT("install.tmp")); CopyFile(s_szInsFile, szTempInsFile, FALSE); // save away old version sections, if any into the temp INS file if (GetPrivateProfileString(CUSTOMVERSECT, CUSTBRNDNAME, TEXT(""), szCabInfoLine, ARRAYSIZE(szCabInfoLine), s_szCurrInsPath)) WritePrivateProfileString(CUSTOMVERSECT, CUSTBRNDNAME, szCabInfoLine, szTempInsFile); if (GetPrivateProfileString(CUSTBRNDSECT, CUSTBRNDNAME, TEXT(""), szCabInfoLine, ARRAYSIZE(szCabInfoLine), s_szCurrInsPath)) WritePrivateProfileString(CUSTBRNDSECT, CUSTBRNDNAME, szCabInfoLine, szTempInsFile); if (GetPrivateProfileString(CUSTOMVERSECT, CUSTDESKNAME, TEXT(""), szCabInfoLine, ARRAYSIZE(szCabInfoLine), s_szCurrInsPath)) WritePrivateProfileString(CUSTOMVERSECT, CUSTDESKNAME, szCabInfoLine, szTempInsFile); if (GetPrivateProfileString(CUSTDESKSECT, CUSTDESKNAME, TEXT(""), szCabInfoLine, ARRAYSIZE(szCabInfoLine), s_szCurrInsPath)) WritePrivateProfileString(CUSTDESKSECT, CUSTDESKNAME, szCabInfoLine, szTempInsFile); if (GetPrivateProfileString(BRANDING, INSVERKEY, TEXT(""), szCabInfoLine, ARRAYSIZE(szCabInfoLine), s_szCurrInsPath)) WritePrivateProfileString(BRANDING, INSVERKEY, szCabInfoLine, szTempInsFile); // copy temp INS file to destination path CopyFile(szTempInsFile, s_szCurrInsPath, FALSE); // delete the temp INS file DeleteFile(szTempInsFile); } else { TCHAR szDir[MAX_PATH]; StrCpy(szDir, s_szCurrInsPath); PathRemoveFileSpec(szDir); PathCreatePath(szDir); // copy INS file to destination path CopyFile(s_szInsFile, s_szCurrInsPath, FALSE); } DialogBox(g_hUIInstance, MAKEINTRESOURCE(IDD_DISPLAYSAVE), NULL, displaySaveDlgProc); } INT_PTR CALLBACK SaveDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { TCHAR szInsFile[MAX_PATH]; TCHAR szCabsURL[INTERNET_MAX_URL_LENGTH]; TCHAR szPrefix[MAX_PATH]; TCHAR szCabName[MAX_PATH]; TCHAR szCabPath[MAX_PATH]; HWND hCtrl; TCHAR szMsgText[1024]; TCHAR szMsgTitle[1024]; UNREFERENCED_PARAMETER(lParam); switch(uMsg) { case WM_SETFONT: //a change to mmc requires us to do this logic for all our property pages that use common controls INITCOMMONCONTROLSEX iccx; iccx.dwSize = sizeof(INITCOMMONCONTROLSEX); iccx.dwICC = ICC_ANIMATE_CLASS | ICC_BAR_CLASSES | ICC_LISTVIEW_CLASSES |ICC_TREEVIEW_CLASSES; InitCommonControlsEx(&iccx); break; case WM_INITDIALOG: StrCpy(s_szInsFile, (LPCTSTR)lParam); DisableDBCSChars(hDlg, IDE_CABSURL); EnableDBCSChars(hDlg, IDE_INSFILE); EnableDBCSChars(hDlg, IDE_CAB1NAME); EnableDBCSChars(hDlg, IDE_CAB2NAME); ShowWindow(GetDlgItem(hDlg, IDC_ADVANCEDSIGN), SW_SHOW); CreateWorkDir(s_szInsFile, IEAK_GPE_BRANDING_SUBDIR, szCabPath); if (PathIsDirectoryEmpty(szCabPath)) { EnableWindow(GetDlgItem(hDlg, IDC_CAB1TEXT), FALSE); EnableWindow(GetDlgItem(hDlg, IDE_CAB1NAME), FALSE); } CreateWorkDir(s_szInsFile, IEAK_GPE_DESKTOP_SUBDIR, szCabPath); if (PathIsDirectoryEmpty(szCabPath)) { EnableWindow(GetDlgItem(hDlg, IDC_CAB2TEXT), FALSE); EnableWindow(GetDlgItem(hDlg, IDE_CAB2NAME), FALSE); } if (!IsWindowEnabled(GetDlgItem(hDlg, IDE_CAB1NAME)) && !IsWindowEnabled(GetDlgItem(hDlg, IDE_CAB2NAME))) { EnableWindow(GetDlgItem(hDlg, IDC_CABSURLTEXT), FALSE); EnableWindow(GetDlgItem(hDlg, IDE_CABSURL), FALSE); } //----------------- InsFile if (ISNULL(s_szCurrInsPath)) { DWORD dwType = REG_SZ; DWORD dwSize = sizeof(s_szCurrInsPath); SHGetValue(HKEY_CURRENT_USER, RK_IEAK TEXT("\\SIE"), TEXT("LastOpenedFile"), &dwType, s_szCurrInsPath, &dwSize); } if (ISNONNULL(s_szCurrInsPath)) { SetDlgItemText(hDlg, IDE_INSFILE, s_szCurrInsPath); GetBaseFileName(s_szCurrInsPath, szPrefix, ARRAYSIZE(szPrefix)); if(StrCmpI(szPrefix, TEXT("install")) == 0) StrCpy(szPrefix, TEXT("Default")); } else *szPrefix = TEXT('\0'); if (!PathFileExists(s_szCurrInsPath)) { *s_szCabsURLPath = TEXT('\0'); *s_szConfigCabName = TEXT('\0'); *s_szDesktopCabName = TEXT('\0'); *s_szNewVersionStr = TEXT('\0'); } //----------------- CabsURLPath if (ISNONNULL(s_szCabsURLPath)) SetDlgItemText(hDlg, IDE_CABSURL, s_szCabsURLPath); if (IsWindowEnabled(GetDlgItem(hDlg, IDE_CAB1NAME))) { if (ISNULL(s_szConfigCabName)) getDefaultCabName(CAB_TYPE_CONFIG, szPrefix, szCabName); else getDefaultCabName(CAB_TYPE_CONFIG, s_szConfigCabName, szCabName); SetDlgItemText(hDlg, IDE_CAB1NAME, szCabName); } if (IsWindowEnabled(GetDlgItem(hDlg, IDE_CAB2NAME))) { if (ISNULL(s_szDesktopCabName)) getDefaultCabName(CAB_TYPE_DESKTOP, szPrefix, szCabName); else getDefaultCabName(CAB_TYPE_DESKTOP, s_szDesktopCabName, szCabName); SetDlgItemText(hDlg, IDE_CAB2NAME, szCabName); } //----------------- Version if (ISNULL(s_szNewVersionStr)) GenerateNewVersionStr(s_szCurrInsPath, s_szNewVersionStr); SetDlgItemText(hDlg, IDC_CABVERSION, s_szNewVersionStr); SetFocus(GetDlgItem(hDlg, IDE_INSFILE)); return FALSE; case WM_COMMAND: switch (wParam) { case IDOK: if (GetDlgItemText(hDlg, IDE_INSFILE, szInsFile, ARRAYSIZE(szInsFile)) && ((StrCmpI(PathFindExtension(szInsFile), TEXT(".ins")) == 0) || (StrCmpI(PathFindExtension(szInsFile), TEXT(".INS")) == 0))) //looks weird, but hack is needed for turkish locale { if (IsFileCreatable(szInsFile)) { *szCabsURL = TEXT('\0'); if (!IsWindowEnabled(GetDlgItem(hDlg, IDE_CABSURL)) || (GetDlgItemText(hDlg, IDE_CABSURL, szCabsURL, ARRAYSIZE(szCabsURL)) && PathIsURL(szCabsURL))) { if (!IsWindowEnabled(GetDlgItem(hDlg, IDE_CAB1NAME)) || GetDlgItemText(hDlg, IDE_CAB1NAME, szCabName, ARRAYSIZE(szCabName))) { if (!IsWindowEnabled(GetDlgItem(hDlg, IDE_CAB2NAME)) || GetDlgItemText(hDlg, IDE_CAB2NAME, szCabName, ARRAYSIZE(szCabName))) { if(!CanOverwriteFiles(hDlg)) return TRUE; StrCpy(s_szCurrInsPath, szInsFile); StrCpy(s_szCabsURLPath, szCabsURL); GetDlgItemText(hDlg, IDE_CAB1NAME, s_szConfigCabName, ARRAYSIZE(s_szConfigCabName)); GetDlgItemText(hDlg, IDE_CAB2NAME, s_szDesktopCabName, ARRAYSIZE(s_szDesktopCabName)); // set the last opened INS file in the registry SHSetValue(HKEY_CURRENT_USER, RK_IEAK TEXT("\\SIE"), TEXT("LastOpenedFile"), REG_SZ, s_szCurrInsPath, sizeof(s_szCurrInsPath)); EndDialog(hDlg, 0); break; } else hCtrl = GetDlgItem(hDlg, IDE_CAB2NAME); } else hCtrl = GetDlgItem(hDlg, IDE_CAB1NAME); MessageBox(hDlg, res2Str(IDS_MUSTSPECIFYNAME, szMsgText, countof(szMsgText)),\ res2Str(IDS_TITLE, szMsgTitle, countof(szMsgTitle)), MB_OK); SendMessage(hCtrl, EM_SETSEL, 0, -1); SetFocus(hCtrl); } else { hCtrl = GetDlgItem(hDlg, IDE_CABSURL); MessageBox(hDlg, res2Str(IDS_MUSTSPECIFYURL, szMsgText, countof(szMsgText)), res2Str(IDS_TITLE, szMsgTitle, countof(szMsgTitle)), MB_OK); SendMessage(hCtrl, EM_SETSEL, 0, -1); SetFocus(hCtrl); } } else { MessageBox(hDlg, res2Str(IDS_CANTCREATEFILE, szMsgText, countof(szMsgText)), res2Str(IDS_TITLE, szMsgTitle, countof(szMsgTitle)), MB_OK); SendMessage(hCtrl = GetDlgItem(hDlg, IDE_INSFILE), EM_SETSEL, 0, -1); SetFocus(hCtrl); } } else { hCtrl = GetDlgItem(hDlg, IDE_INSFILE); MessageBox(hDlg, res2Str(IDS_MUSTSPECIFYINS, szMsgText, countof(szMsgText)), res2Str(IDS_TITLE, szMsgTitle, countof(szMsgTitle)), MB_OK); SendMessage(hCtrl, EM_SETSEL, 0, -1); SetFocus(hCtrl); } return TRUE; case IDCANCEL: EndDialog(hDlg, -1); break; case IDC_ADVANCEDSIGN: { PROPSHEETPAGE psp; HPROPSHEETPAGE hPage; PROPSHEETHEADER psph; psp.dwSize = sizeof(PROPSHEETPAGE); psp.dwFlags = PSP_HASHELP; psp.hInstance = g_hUIInstance; psp.pszTemplate = MAKEINTRESOURCE(IDD_CABSIGN); psp.lParam = (LPARAM)s_szInsFile; psp.pfnDlgProc = CabSignProc; hPage = CreatePropertySheetPage(&psp); ZeroMemory(&psph, sizeof(psph)); psph.dwSize = sizeof(PROPSHEETHEADER); psph.hwndParent = hDlg; psph.hInstance = g_hUIInstance; psph.nPages = 1; psph.phpage = &hPage; psph.pszCaption = MAKEINTRESOURCE(IDS_CABSIGN); PropertySheet(&psph); break; } case IDC_INSBROWSE: *s_szCurrInsPath = TEXT('\0'); GetDlgItemText(hDlg, IDE_INSFILE, s_szCurrInsPath, ARRAYSIZE(s_szCurrInsPath)); if (BrowseForSave(hDlg, NULL, s_szCurrInsPath, ARRAYSIZE(s_szCurrInsPath), NULL)) SetDlgItemText(hDlg, IDE_INSFILE, s_szCurrInsPath); //send the killfocus msg, since this is how we notice changes SendMessage(hDlg, WM_COMMAND, MAKEWPARAM(IDE_INSFILE, EN_KILLFOCUS), (LPARAM)GetDlgItem(hDlg, IDE_INSFILE)); return TRUE; } if (LOWORD(wParam) == IDE_INSFILE && HIWORD(wParam) == EN_KILLFOCUS && IsWindowEnabled(GetDlgItem(hDlg, IDE_CABSURL))) { GetDlgItemText(hDlg, IDE_INSFILE, szInsFile, ARRAYSIZE(szInsFile)); if(*szInsFile != TEXT('\0') && StrCmpI(PathFindExtension(szInsFile), TEXT(".ins")) == 0) { GetBaseFileName(szInsFile, szPrefix, ARRAYSIZE(szPrefix)); if(StrCmpI(szPrefix, TEXT("install")) == 0) StrCpy(szPrefix, TEXT("Default")); GetPrivateProfileString(BRANDING, CABSURLPATH, TEXT(""), szCabsURL, countof(szCabsURL), szInsFile); if (ISNONNULL(szCabsURL)) SetDlgItemText(hDlg, IDE_CABSURL, szCabsURL); if (IsWindowEnabled(GetDlgItem(hDlg, IDE_CAB1NAME))) updateCabName(hDlg, IDE_CAB1NAME, CAB_TYPE_CONFIG, szPrefix, szInsFile); if (IsWindowEnabled(GetDlgItem(hDlg, IDE_CAB2NAME))) updateCabName(hDlg, IDE_CAB2NAME, CAB_TYPE_DESKTOP, szPrefix, szInsFile); } } break; } return FALSE; } static INT_PTR CALLBACK displaySaveDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam ) { static HANDLE s_hThread; DWORD dwThread; TCHAR szMsgTitle[1024]; UNREFERENCED_PARAMETER(wParam); UNREFERENCED_PARAMETER(lParam); switch( msg ) { case WM_INITDIALOG: SetWindowText(hDlg, res2Str(IDS_TITLE, szMsgTitle, countof(szMsgTitle))); Animate_Open( GetDlgItem( hDlg, IDC_ANIMATE ), IDA_GEARS ); Animate_Play( GetDlgItem( hDlg, IDC_ANIMATE ), 0, -1, -1 ); if((s_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) doCompressCabFile, (LPVOID) hDlg, 0, &dwThread)) == NULL) { compressCabFile(); EndDialog(hDlg, 1); } break; case WM_SAVE_COMPLETE: EndDialog(hDlg, 1); break; case WM_DESTROY: if (s_hThread != NULL) CloseHandle(s_hThread); break; default: return 0; } return 1; } static BOOL doCompressCabFile(LPVOID lpVoid) { HWND hDlg = (HWND) lpVoid; compressCabFile(); PostMessage(hDlg, WM_SAVE_COMPLETE, 0, 0L); return TRUE; } static void compressCabFile() { TCHAR szCabPath[MAX_PATH]; TCHAR szType[8]; TCHAR szUnsignedFiles[MAX_PATH * 2] = TEXT(""); //-------------------- Config CreateWorkDir(s_szInsFile, IEAK_GPE_BRANDING_SUBDIR, szCabPath); if (createCab(szCabPath, s_szConfigCabName, szUnsignedFiles)) SetOrClearVersionInfo(s_szCurrInsPath, CAB_TYPE_CONFIG, s_szConfigCabName, s_szCabsURLPath, s_szNewVersionStr, SET); else SetOrClearVersionInfo(s_szCurrInsPath, CAB_TYPE_CONFIG, s_szConfigCabName, s_szCabsURLPath, s_szNewVersionStr, CLEAR); //-------------------- Desktop CreateWorkDir(s_szInsFile, IEAK_GPE_DESKTOP_SUBDIR, szCabPath); if (createCab(szCabPath, s_szDesktopCabName, szUnsignedFiles)) SetOrClearVersionInfo(s_szCurrInsPath, CAB_TYPE_DESKTOP, s_szDesktopCabName, s_szCabsURLPath, s_szNewVersionStr, SET); else SetOrClearVersionInfo(s_szCurrInsPath, CAB_TYPE_DESKTOP, s_szDesktopCabName, s_szCabsURLPath, s_szNewVersionStr, CLEAR); WritePrivateProfileString(BRANDING, CABSURLPATH, s_szCabsURLPath, s_szCurrInsPath); WritePrivateProfileString(BRANDING, INSVERKEY, s_szNewVersionStr, s_szCurrInsPath); // write the type as INTRANET so that the branding DLL extracts and processes the cabs in the CUSTOM dir wnsprintf(szType, countof(szType), TEXT("%u"), INTRANET); WritePrivateProfileString(BRANDING, TEXT("Type"), szType, s_szCurrInsPath); if (ISNONNULL(szUnsignedFiles)) { TCHAR szMessage[MAX_PATH*3]; TCHAR szMsg[64]; LoadString(g_hUIInstance, IDS_CABSIGN_ERROR, szMsg, ARRAYSIZE(szMsg)); wnsprintf(szMessage, ARRAYSIZE(szMessage), szMsg, szUnsignedFiles); MessageBox(NULL, szMessage, TEXT(""), MB_OK | MB_SETFOREGROUND); } } static BOOL createCab(LPCTSTR pcszCabPath, LPCTSTR pcszCabName, LPTSTR pszUnsignedFiles) { TCHAR szCmd[MAX_PATH*4]; TCHAR szDest[MAX_PATH]; TCHAR szDDF[MAX_PATH]; TCHAR szTempPath[MAX_PATH]; if (!PathFileExists(pcszCabPath) || PathIsDirectoryEmpty(pcszCabPath)) return FALSE; // create a temporary cab folder GetTempPath(countof(szTempPath), szTempPath); PathAppend(szTempPath, TEXT("SIE")); PathCreatePath(szTempPath); PathCombine(szDDF, szTempPath, TEXT("folder.ddf")); if (!makeDDFFile(pcszCabPath, szDDF)) return FALSE; wnsprintf(szCmd, countof(szCmd), TEXT("MAKECAB.EXE /D CabinetName1=\"%s\" /D DiskDirectory1=\"%s\" /F %s"), pcszCabName, szTempPath, szDDF); RunAndWait(szCmd, szTempPath, SW_HIDE); // if the cab file exist in the destination path set the attribute to normal StrCpy(szDest, s_szCurrInsPath); PathRemoveFileSpec(szDest); PathAppend(szDest, pcszCabName); if (PathFileExists(szDest)) SetFileAttributes(szDest, FILE_ATTRIBUTE_NORMAL); PathAppend(szTempPath, pcszCabName); CopyFile(szTempPath, szDest, FALSE); SignCabFile(szDest, s_szCurrInsPath, pszUnsignedFiles); // remove the temporary folder PathRemovePath(szDDF); return TRUE; } static void getDefaultCabName(DWORD dwCabType, LPCTSTR pcszPrefix, LPTSTR pszCabName) { TCHAR szActualPrefix[MAX_PATH]; *pszCabName = TEXT('\0'); if (pcszPrefix == NULL || *pcszPrefix == TEXT('\0')) return; if (StrChr(pcszPrefix, '.') != NULL) { StrCpy(pszCabName, pcszPrefix); return; } StrCpy(szActualPrefix, pcszPrefix); switch(dwCabType) { case CAB_TYPE_CONFIG: wnsprintf(pszCabName, MAX_PATH, TEXT("%s_config.cab"), szActualPrefix); break; case CAB_TYPE_DESKTOP: wnsprintf(pszCabName, MAX_PATH, TEXT("%s_desktop.cab"), szActualPrefix); break; } } static void getCabNameFromINS(LPCTSTR pcszInsFile, DWORD dwCabType, LPTSTR pszCabFullFileName, LPTSTR pszCabInfoLine /* = NULL*/) { LPCTSTR pcszSection = NULL, pcszKey = NULL; TCHAR szCabFilePath[MAX_PATH]; TCHAR szCabName[MAX_PATH]; TCHAR szCabInfoLine[INTERNET_MAX_URL_LENGTH + 128]; if (pcszInsFile == NULL || *pcszInsFile == TEXT('\0') || pszCabFullFileName == NULL) return; *pszCabFullFileName = TEXT('\0'); if (pszCabInfoLine != NULL) *pszCabInfoLine = TEXT('\0'); switch (dwCabType) { case CAB_TYPE_CONFIG: pcszSection = CUSTBRNDSECT; pcszKey = CUSTBRNDNAME; break; case CAB_TYPE_DESKTOP: pcszSection = CUSTDESKSECT; pcszKey = CUSTDESKNAME; break; } if (pcszSection == NULL || pcszKey == NULL) return; StrCpy(szCabFilePath, pcszInsFile); PathRemoveFileSpec(szCabFilePath); if (GetPrivateProfileString(pcszSection, pcszKey, TEXT(""), szCabInfoLine, ARRAYSIZE(szCabInfoLine), pcszInsFile) == 0) GetPrivateProfileString(CUSTOMVERSECT, pcszKey, TEXT(""), szCabInfoLine, ARRAYSIZE(szCabInfoLine), pcszInsFile); if (*szCabInfoLine) { LPTSTR pszT; if ((pszT = StrChr(szCabInfoLine, TEXT(','))) != NULL) *pszT = TEXT('\0'); if ((pszT = PathFindFileName(szCabInfoLine)) > szCabInfoLine) { // cab URL path is specified *(pszT - 1) = TEXT('\0'); // nul the '/' char } StrCpy(szCabName, pszT); PathCombine(pszCabFullFileName, szCabFilePath, szCabName); if (pszCabInfoLine) StrCpy(pszCabInfoLine, szCabInfoLine); } } static void updateCabName(HWND hDlg, UINT nCtrlID, DWORD dwCabType, LPCTSTR pcszPrefix, LPCTSTR pcszInsFile) { TCHAR szTempCabName[MAX_PATH]; BOOL fCabName = FALSE; *szTempCabName = TEXT('\0'); if (PathFileExists(pcszInsFile)) { getCabNameFromINS(pcszInsFile, dwCabType, szTempCabName); if (ISNONNULL(szTempCabName)) { SetDlgItemText(hDlg, nCtrlID, PathFindFileName(szTempCabName)); fCabName = TRUE; } } else GetDlgItemText(hDlg, nCtrlID, szTempCabName, countof(szTempCabName)); if (!fCabName) { TCHAR szCabSuffix[MAX_PATH]; TCHAR szCabName[MAX_PATH]; if (dwCabType == CAB_TYPE_CONFIG) StrCpy(szCabSuffix, TEXT("_config.cab")); else if (dwCabType == CAB_TYPE_DESKTOP) StrCpy(szCabSuffix, TEXT("_desktop.cab")); if (ISNULL(szTempCabName) || StrStrI(szTempCabName, szCabSuffix) != NULL) { getDefaultCabName(dwCabType, pcszPrefix, szCabName); SetDlgItemText(hDlg, nCtrlID, szCabName); } } } #define BUFFER_SIZE 1024 HRESULT pepFileEnumProc(LPCTSTR pszPath, PWIN32_FIND_DATA pfd, LPARAM lParam, PDWORD *prgdwControl /*= NULL*/) { LPTSTR pListBuffer = NULL; static DWORD s_dwBuffer = 0; DWORD dwLen; UNREFERENCED_PARAMETER(prgdwControl); ASSERT(pszPath != NULL && pfd != NULL && lParam != NULL); // if its is a directory name, we have nothing to do with it if (pfd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) return S_OK; pListBuffer = *((LPTSTR*)lParam); if (pListBuffer == NULL) // allocate buffer for the first time { s_dwBuffer = BUFFER_SIZE; pListBuffer = (LPTSTR)CoTaskMemAlloc(s_dwBuffer); if (pListBuffer == NULL) return E_OUTOFMEMORY; *((LPTSTR*)lParam) = pListBuffer; ZeroMemory(pListBuffer, s_dwBuffer); } // if not enough memory reallocate // StrCbFromSz adds 1 extra unit, accounting 2 units for double quotes, // add 3 extra unit for the \r\n and the NULL character if (StrCbFromSz(pListBuffer) + StrCbFromSz(pszPath) + StrCbFromCch(3) > s_dwBuffer) { LPVOID lpTemp; s_dwBuffer += BUFFER_SIZE; lpTemp = CoTaskMemRealloc(pListBuffer, s_dwBuffer); if (lpTemp == NULL) return E_OUTOFMEMORY; pListBuffer = (LPTSTR)lpTemp; *((LPTSTR*)lParam) = pListBuffer; ZeroMemory(pListBuffer + StrCchFromCb(s_dwBuffer - BUFFER_SIZE), BUFFER_SIZE); } // append the string to buffer dwLen = StrLen(pListBuffer); wnsprintf(pListBuffer + dwLen, StrCchFromCb(s_dwBuffer) - dwLen , TEXT("\"%s\"\r\n"), pszPath); return S_OK; } static BOOL makeDDFFile(LPCTSTR pcszSrcDir, LPCTSTR pcszDDF) { HANDLE hDDF; LPTSTR pFileList = NULL; BOOL fRetVal = FALSE; HRESULT hrResult; hDDF = CreateFile(pcszDDF, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hDDF == INVALID_HANDLE_VALUE) return fRetVal; hrResult = PathEnumeratePath(pcszSrcDir, PEP_DEFAULT, pepFileEnumProc, (LPARAM)&pFileList); if (pFileList != NULL) { TCHAR szMsgText[1024]; TCHAR szMsgTitle[1024]; if (hrResult == S_OK) fRetVal = WriteStringToFile(hDDF, pFileList, StrLen(pFileList)); else if (hrResult == E_OUTOFMEMORY) MessageBox(NULL, res2Str(IDS_MEMORY_ERROR, szMsgText, countof(szMsgText)), res2Str(IDS_TITLE, szMsgTitle, countof(szMsgTitle)), MB_OK); CoTaskMemFree(pFileList); } CloseHandle(hDDF); return fRetVal; } static BOOL CanOverwriteFiles(HWND hDlg) { TCHAR szExistingFiles[MAX_PATH*5]; TCHAR szTemp[MAX_PATH]; TCHAR szDir[MAX_PATH]; TCHAR szFile[MAX_PATH]; TCHAR szReadOnlyFiles[MAX_PATH*5]; *szExistingFiles = TEXT('\0'); *szReadOnlyFiles = TEXT('\0'); // check for file already exists in the destination directory. GetDlgItemText(hDlg, IDE_INSFILE, szTemp, ARRAYSIZE(szTemp)); if (PathFileExists(szTemp)) { StrCat(szExistingFiles, szTemp); StrCat(szExistingFiles, TEXT("\r\n")); if (IsFileReadOnly(szTemp)) StrCpy(szReadOnlyFiles, szExistingFiles); } StrCpy(szDir, szTemp); PathRemoveFileSpec(szDir); if (IsWindowEnabled(GetDlgItem(hDlg, IDE_CAB1NAME))) { GetDlgItemText(hDlg, IDE_CAB1NAME, szTemp, ARRAYSIZE(szTemp)); PathCombine(szFile, szDir, szTemp); if (PathFileExists(szFile)) { StrCat(szExistingFiles, szFile); StrCat(szExistingFiles, TEXT("\r\n")); if (IsFileReadOnly(szFile)) { StrCat(szReadOnlyFiles, szFile); StrCat(szReadOnlyFiles, TEXT("\r\n")); } } } if (IsWindowEnabled(GetDlgItem(hDlg, IDE_CAB2NAME))) { GetDlgItemText(hDlg, IDE_CAB2NAME, szTemp, ARRAYSIZE(szTemp)); PathCombine(szFile, szDir, szTemp); if (PathFileExists(szFile)) { StrCat(szExistingFiles, szFile); StrCat(szExistingFiles, TEXT("\r\n")); if (IsFileReadOnly(szFile)) { StrCat(szReadOnlyFiles, szFile); StrCat(szReadOnlyFiles, TEXT("\r\n")); } } } if (*szReadOnlyFiles != TEXT('\0')) { TCHAR szMsg[MAX_PATH*6]; TCHAR szMsgText[MAX_PATH]; TCHAR szMsgTitle[MAX_PATH]; wnsprintf(szMsg, countof(szMsg), res2Str(IDS_FILE_READONLY, szMsgText, countof(szMsgText)), szReadOnlyFiles); MessageBox(hDlg, szMsg, res2Str(IDS_TITLE, szMsgTitle, countof(szMsgTitle)), MB_ICONEXCLAMATION | MB_OK); return FALSE; } if (*szExistingFiles != TEXT('\0')) { TCHAR szMsg[MAX_PATH*6]; TCHAR szMsgText[MAX_PATH]; TCHAR szMsgTitle[MAX_PATH]; wnsprintf(szMsg, countof(szMsg), res2Str(IDS_FILE_ALREADY_EXISTS, szMsgText, countof(szMsgText)), szExistingFiles); if (MessageBox(hDlg, szMsg, res2Str(IDS_TITLE, szMsgTitle, countof(szMsgTitle)), MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON2) == IDNO) return FALSE; } return TRUE; }