#include #include #include #include #include #include #include #include #include #include "iedkbrnd.h" #include "treeview.h" #include "resource.h" #include "extract.h" #include #include #include "..\..\ieakeng\exports.h" #include "..\..\ieakutil\ieakutil.h" #include "..\..\ieakui\insexe.h" #include // for html help calls #include "insedit.h" #include "admparse.h" #include //these are for #include //ver_productversion_str HINSTANCE g_hInst; static HINSTANCE s_hInstIeakUI; HWND g_hMain; TCHAR g_szInsFile[MAX_PATH]; TCHAR g_szFileName[MAX_PATH]; LPINSDLG g_pInsDialog; int g_nDialogs; TCHAR g_szDesktopDir[MAX_PATH]; TCHAR g_szCabsURLPath[INTERNET_MAX_URL_LENGTH]; TCHAR g_szConfigURLPath[INTERNET_MAX_URL_LENGTH]; TCHAR g_szDesktopURLPath[INTERNET_MAX_URL_LENGTH]; TCHAR g_szConfigCabName[MAX_PATH]; TCHAR g_szDesktopCabName[MAX_PATH]; TCHAR g_szNewVersionStr[32]; static TCHAR s_szUnsignedFiles[MAX_PATH*3] = TEXT(""); // for Res2Str TCHAR g_szTemp[1024]; TCHAR g_szTemp2[1024]; CTreeView TreeView; HWND g_hDialog = NULL; HTREEITEM g_hInsRootItem = NULL; HTREEITEM g_hPolicyRootItem = NULL; HWND g_hWndAdmInstr = NULL; int g_InsSettingsOpen, g_InsSettingsClose, g_InsLeafItem, g_TreeLeaf, g_PolicyOpen, g_PolicyClose, g_ADMOpen, g_ADMClose; TCHAR g_szCabWorkDir[MAX_PATH]; TCHAR g_szCabTempDir[MAX_PATH]; TCHAR g_szRoot[MAX_PATH]; TCHAR g_szLanguage[10]; DWORD g_dwLanguage = 0xffffffff; TCHAR g_szDefInf[MAX_PATH]; TCHAR g_szCurrInsPath[MAX_PATH]; DWORD g_dwPlatformId = PLATFORM_WIN32; TCHAR g_szCmdLine[MAX_PATH]; HWND g_hWndHelp = NULL; TCHAR *Res2Str(int nString) { static BOOL fSet = FALSE; if(fSet) { if (LoadString(g_hInst, nString, g_szTemp, ARRAYSIZE(g_szTemp)) == 0) LoadString(s_hInstIeakUI, nString, g_szTemp, ARRAYSIZE(g_szTemp)); fSet = FALSE; return(g_szTemp); } if (LoadString(g_hInst, nString, g_szTemp2, ARRAYSIZE(g_szTemp2)) == 0) LoadString(s_hInstIeakUI, nString, g_szTemp2, ARRAYSIZE(g_szTemp2)); fSet = TRUE; return(g_szTemp2); } BOOL BrowseForFileEx(HWND hWnd, LPTSTR szFilter, LPTSTR szFileName, int cchSize, LPTSTR szDefExt) { OPENFILENAME ofn; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hWnd; ofn.hInstance = g_hInst; ofn.lpstrFilter = szFilter; ofn.lpstrCustomFilter = NULL; ofn.nFilterIndex = 0; ofn.lpstrFile = szFileName; ofn.nMaxFile = cchSize; ofn.lpstrFileTitle = NULL; ofn.lpstrInitialDir = g_szCurrInsPath; ofn.lpstrTitle = NULL; ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; ofn.nFileOffset = 0; ofn.nFileExtension = 0; ofn.lpstrDefExt = szDefExt; return GetOpenFileName(&ofn); } 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_hInst; 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 SetTitleBar(HWND hWnd, LPTSTR szFileName) { TCHAR szTitleBar[1024]; if(szFileName == NULL) wsprintf(szTitleBar, Res2Str(IDS_TITLE1)); else wsprintf(szTitleBar, Res2Str(IDS_TITLE2), szFileName); SetWindowText(hWnd, szTitleBar); } void NewTempFile() { TCHAR szTempPath[MAX_PATH]; DeleteFile(g_szInsFile); ZeroMemory(g_szInsFile, sizeof(g_szInsFile)); GetTempPath(ARRAYSIZE(szTempPath), szTempPath); GetTempFileName(szTempPath, TEXT("INS"), 0, g_szInsFile); } void SetStockFont(HWND hWnd) { HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); SendMessage(hWnd, WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0)); } int GetSelIndex() { int i; HTREEITEM hItem = TreeView.GetSel(); for(i = 0; i < g_nDialogs; i++) { if(hItem == g_pInsDialog[i].hItem) return i; } return 0; } BOOL IsPolicyTree(HTREEITEM hItem) { BOOL bRet = FALSE; HTREEITEM hParentItem = NULL; while(1) { hParentItem = TreeView_GetParent(TreeView.GetHandle(), hItem); if(hParentItem == NULL) { bRet = (hItem == g_hPolicyRootItem) ? TRUE : FALSE; break; } hItem = hParentItem; }; return bRet; } // Creates image list, adds bitmaps/icons to it, and associates the image // list with the treeview control. LRESULT InitImageList(HWND hTreeView) { HIMAGELIST hWndImageList; HICON hIcon; hWndImageList = ImageList_Create(GetSystemMetrics (SM_CXSMICON), GetSystemMetrics (SM_CYSMICON), TRUE, NUM_ICONS, 8); if(!hWndImageList) { return FALSE; } hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON2)); g_InsSettingsOpen = ImageList_AddIcon(hWndImageList, hIcon); DestroyIcon(hIcon); hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON3)); g_InsSettingsClose = ImageList_AddIcon(hWndImageList, hIcon); DestroyIcon(hIcon); hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON4)); g_TreeLeaf = ImageList_AddIcon(hWndImageList, hIcon); DestroyIcon(hIcon); hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON5)); g_PolicyOpen = ImageList_AddIcon(hWndImageList, hIcon); DestroyIcon(hIcon); hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON6)); g_PolicyClose = ImageList_AddIcon(hWndImageList, hIcon); DestroyIcon(hIcon); hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON7)); g_ADMOpen = ImageList_AddIcon(hWndImageList, hIcon); DestroyIcon(hIcon); hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON8)); g_ADMClose = ImageList_AddIcon(hWndImageList, hIcon); DestroyIcon(hIcon); hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON9)); g_InsLeafItem = ImageList_AddIcon(hWndImageList, hIcon); DestroyIcon(hIcon); // Fail if not all images were added. if (ImageList_GetImageCount(hWndImageList) < NUM_ICONS) { // ERROR: Unable to add all images to image list. return FALSE; } // Associate image list with treeView control. TreeView_SetImageList(hTreeView, hWndImageList, TVSIL_NORMAL); return TRUE; } void InitTreeView(HWND hTreeView, HWND hInfoWnd) { TCHAR szTemp[MAX_PATH]; ShowADMWindow(hTreeView, FALSE); for(int i = 0; i < g_nDialogs; i++) g_pInsDialog[i].hItem = TreeView.AddItem(g_pInsDialog[i].szName, g_hInsRootItem); SetInfoWindowText(hInfoWnd, Res2Str(IDS_LOADADMFILEMSG)); wsprintf(szTemp, TEXT("%sPolicies\\%s"), g_szRoot, g_szLanguage); LoadADMFiles(TreeView.GetHandle(), g_hPolicyRootItem, szTemp, g_szCabWorkDir, g_dwPlatformId, ROLE_CORP, g_ADMClose, g_InsLeafItem); if(TreeView_GetChild(TreeView.GetHandle(), g_hPolicyRootItem) == NULL) // if no items in the tree view MessageBox(hTreeView, Res2Str(IDS_NOPOLICYFILE), Res2Str(IDS_TITLE), MB_ICONINFORMATION | MB_OK); SetInfoWindowText(hInfoWnd, Res2Str(IDS_READYMSG)); TreeView_Expand(TreeView.GetHandle(), g_hPolicyRootItem, TVE_EXPAND); TreeView_Expand(TreeView.GetHandle(), g_hInsRootItem, TVE_EXPAND); ShowADMWindow(hTreeView, TRUE); TreeView.SetSel(g_hInsRootItem); } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { int i; int nMinWidth = 0; int nMinHeight = 0; DWORD dwType = REG_SZ; DWORD dwSize = sizeof(g_szCurrInsPath); DWORD dwDisposition; DWORD dwCabBuildStatus; TCHAR szItem[100]; TCHAR szTempFile[MAX_PATH]; TCHAR szMsg[MAX_PATH]; TCHAR szLangId[MAX_PATH]; TCHAR szTemp[MAX_PATH]; TCHAR szFilter[MAX_PATH]; LPTSTR pszFilter = NULL; NM_TREEVIEW *lpNMTreeView; TV_ITEM tvitem, tvitem1; HTREEITEM hItem; HWND hWndFocus; HMENU hMenu; HKEY hKey; RECT rect1, rect2; LPMINMAXINFO lpmmi = NULL; static BOOL bSwitchScreen = TRUE; static BOOL fCanResize = FALSE; static BOOL fDirty = FALSE; static HWND hWndSizeBar = NULL; static HWND hInfoWnd = NULL; static HCURSOR hCurVTResize = NULL; static int nPrevXPos = 0; static int nTreeViewWidth = TREEVIEW_WIDTH; static TCHAR szRecentFileList[5][MAX_PATH]; static TCHAR szFileToOpen[MAX_PATH]; static HWND hErrorDlgCtrl = NULL; switch(msg) { case WM_CREATE: SetWindowText(hWnd, Res2Str(IDS_TITLE)); ZeroMemory(g_szCurrInsPath, sizeof(g_szCurrInsPath)); if(RegOpenKeyEx(HKEY_CURRENT_USER, RK_IEAK_SERVER TEXT("\\ProfMgr"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) { RegQueryValueEx(hKey, TEXT("LastOpenedPath"), NULL, &dwType, (LPBYTE) g_szCurrInsPath, &dwSize); dwType = REG_DWORD; dwSize = sizeof(nTreeViewWidth); if (RegQueryValueEx(hKey, TEXT("TreeviewWidth"), NULL, &dwType, (LPBYTE) &nTreeViewWidth, &dwSize) != ERROR_SUCCESS) nTreeViewWidth = TREEVIEW_WIDTH; RegCloseKey(hKey); } TreeView.Create(hWnd, MARGIN, MARGIN, nTreeViewWidth, TREEVIEW_HEIGHT); InitImageList(TreeView.GetHandle()); // Create the INS dialog to get the intial size of the right hand pane g_hDialog = CreateInsDialog(hWnd, nTreeViewWidth + (2*MARGIN), 0, 0, g_szInsFile, g_szCabWorkDir); EnableWindow(g_hDialog, FALSE); hInfoWnd = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(""), WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, NULL, g_hInst, 0); if (hInfoWnd) SetStockFont(hInfoWnd); GetWindowRect(g_hDialog, &rect1); GetWindowRect(hWnd, &rect2); nMinWidth = (3 * MARGIN) + nTreeViewWidth + (rect1.right - rect1.left) + (2 * GetSystemMetrics(SM_CXFIXEDFRAME)) + 4; nMinHeight = (2 * MARGIN) + (rect1.bottom - rect1.top) + (hInfoWnd ? INFOWINDOW_HEIGHT : 0) + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION) + (2 * GetSystemMetrics(SM_CYFIXEDFRAME)) + 4; GetWindowRect(GetDesktopWindow(), &rect1); // center the window on the desktop rect2.left = ((rect1.right - rect1.left)/2) - (nMinWidth/2); rect2.top = ((rect1.bottom - rect1.top)/2) - (nMinHeight/2); MoveWindow(hWnd, (rect2.left > 0) ? rect2.left : 0, (rect2.top > 0) ? rect2.top : 0, nMinWidth, nMinHeight, TRUE); g_hWndAdmInstr = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(""), WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, NULL, g_hInst, 0); CreateADMWindow(TreeView.GetHandle(), NULL, 0, 0, 0, 0); ShowADMWindow(TreeView.GetHandle(), FALSE); hWndSizeBar = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT("SizeBarWnd"), WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, NULL, g_hInst, 0); LoadString(g_hInst, IDS_WIZARDSETTINGS, szMsg, ARRAYSIZE(szMsg)); g_hInsRootItem = TreeView.AddItem(szMsg); DestroyInsDialog(g_hDialog); g_hDialog = NULL; LoadString(g_hInst, IDS_POLICYSETTINGS, szMsg, ARRAYSIZE(szMsg)); g_hPolicyRootItem = TreeView.AddItem(szMsg); ShowWindow(hWnd, SW_SHOWNORMAL); ZeroMemory(g_szLanguage, sizeof(g_szLanguage)); ZeroMemory(g_szDefInf, sizeof(g_szDefInf)); DialogBox(g_hInst, MAKEINTRESOURCE(IDD_LANGDLG), hWnd, LanguageDialogProc); if(*g_szLanguage != TEXT('\0')) { // check whether the Optional Cab has been downloaded for a particular platform // and language. hMenu = GetSubMenu(GetMenu(hWnd), 2); CheckMenuItem(hMenu, IDM_PLATFORM_WIN32, MF_BYCOMMAND | MF_UNCHECKED); if (PlatformExists(hWnd, g_szLanguage, g_dwPlatformId)) // g_dwPlatformId = PLATFORM_WIN32 CheckMenuItem(hMenu, IDM_PLATFORM_WIN32, MF_BYCOMMAND | MF_CHECKED); else g_dwPlatformId = 0; } if (*g_szLanguage == TEXT('\0') || !g_dwPlatformId) { TCHAR szWin32Text[25]; LPTSTR pMsg; StrCpy(szWin32Text, Res2Str(IDS_WIN32)); pMsg = FormatString(Res2Str(IDS_NOLANGDIR), szWin32Text); MessageBox(hWnd, pMsg, Res2Str(IDS_TITLE), MB_ICONINFORMATION | MB_OK); LocalFree(pMsg); return -1; } // default inf GetDefaultInf(g_dwPlatformId); SetDefaultInf(g_szDefInf); SetPlatformInfo(g_dwPlatformId); ReInitializeInsDialogProcs(); g_pInsDialog = GetInsDlgStruct(&g_nDialogs); SetFocus(g_hWndAdmInstr); EnableWindow(TreeView.GetHandle(), FALSE); // read the recent file list from the registry ReadRecentFileList(szRecentFileList); UpdateRecentFileListMenu(hWnd, szRecentFileList); hCurVTResize = LoadCursor(NULL, IDC_SIZEWE); SetInfoWindowText(hInfoWnd); // forcing the status info window to redraw entirely before initilaizing the treeview. RedrawWindow(hInfoWnd, NULL, NULL, RDW_ERASENOW | RDW_UPDATENOW); PostMessage(hWnd, UM_INIT_TREEVIEW, 0, 0L); if (*g_szCmdLine != TEXT('\0')) { StrCpy(szFileToOpen, g_szCmdLine); PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(IDM_FILEOPEN, 0), 1L); } break; case UM_INIT_TREEVIEW: InitTreeView(TreeView.GetHandle(), hInfoWnd); break; case WM_GETMINMAXINFO: lpmmi = (LPMINMAXINFO) lParam; lpmmi->ptMaxTrackSize.x = MAX_WINDOW_WIDTH; lpmmi->ptMaxTrackSize.y = MAX_WINDOW_HEIGHT; return FALSE; case WM_SIZE: TreeView.MoveWindow(MARGIN, MARGIN, nTreeViewWidth, (int)HIWORD(lParam)-(2*MARGIN)); MoveWindow(g_hWndAdmInstr, nTreeViewWidth + (2*MARGIN), MARGIN, LOWORD(lParam) - (nTreeViewWidth + (2*MARGIN)) - MARGIN, (int)HIWORD(lParam) - (hInfoWnd ? INFOWINDOW_HEIGHT : 0) - (2*MARGIN), TRUE); MoveADMWindow(TreeView.GetHandle(), nTreeViewWidth + (2*MARGIN) + 2, MARGIN + 2, LOWORD(lParam) - (nTreeViewWidth + (2*MARGIN)) - MARGIN - 4, (int)HIWORD(lParam) - (hInfoWnd ? INFOWINDOW_HEIGHT : 0) - (2*MARGIN) - 4); MoveWindow(hWndSizeBar, nTreeViewWidth + MARGIN, MARGIN, 4, (int)HIWORD(lParam)-(2*MARGIN), TRUE); MoveWindow(hInfoWnd, nTreeViewWidth + (2*MARGIN), (int)HIWORD(lParam) - INFOWINDOW_HEIGHT - MARGIN, LOWORD(lParam) - (nTreeViewWidth + (3*MARGIN)), INFOWINDOW_HEIGHT, TRUE); RedrawWindow(hInfoWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE); if (g_hDialog) { SetWindowPos(g_hDialog, HWND_TOP, nTreeViewWidth + (2*MARGIN) + 2, MARGIN + 2, 0, 0, SWP_NOSIZE | SWP_NOZORDER); RedrawWindow(g_hDialog, NULL, NULL, RDW_ERASE | RDW_INVALIDATE); } else { hItem = TreeView.GetSel(); // get selected item if (hItem != NULL && IsPolicyTree(hItem)) { HTREEITEM hParentItem = TreeView_GetParent(TreeView.GetHandle(), hItem); if (hParentItem != NULL && hParentItem != g_hPolicyRootItem) { // is a ADM category HWND hWndAdm = GetAdmWindowHandle(TreeView.GetHandle(), hItem); // category window handle if (hWndAdm) { SetWindowPos(hWndAdm, HWND_TOP, nTreeViewWidth + (2*MARGIN) + 2, MARGIN + 2, 0, 0, SWP_NOSIZE | SWP_NOZORDER); RedrawWindow(hWndAdm, NULL, NULL, RDW_ERASE | RDW_INVALIDATE); } } } } break; case WM_NOTIFY: lpNMTreeView = (NM_TREEVIEW FAR *) lParam; if(lpNMTreeView->hdr.code == TVN_SELCHANGED) { if(bSwitchScreen == FALSE) { bSwitchScreen = TRUE; break; } if (lpNMTreeView->itemOld.hItem == NULL) ; // do nothing. else if (!IsPolicyTree(lpNMTreeView->itemOld.hItem)) // is ins item { if (lpNMTreeView->itemOld.hItem == g_hInsRootItem) // is root ins item ShowADMWindow(TreeView.GetHandle(), FALSE); else { if(g_hDialog) { if (!(bSwitchScreen = SaveInsDialog(g_hDialog, ITEM_SAVE | ITEM_DESTROY))) { fDirty = !bSwitchScreen; hErrorDlgCtrl = GetFocus(); TreeView.SetSel(lpNMTreeView->itemOld.hItem); return 1; } else g_hDialog = NULL; } } } else // is policy item { if (lpNMTreeView->itemOld.hItem == g_hPolicyRootItem) // is root policy item ShowADMWindow(TreeView.GetHandle(), FALSE); else SelectADMItem(hWnd, TreeView.GetHandle(), &lpNMTreeView->itemOld, FALSE, FALSE); } if (lpNMTreeView->itemNew.hItem == NULL) ShowADMWindow(TreeView.GetHandle(), FALSE); else if (!IsPolicyTree(lpNMTreeView->itemNew.hItem)) // is ins item { if(lpNMTreeView->itemNew.hItem == g_hInsRootItem) // is root ins item { SetADMWindowText(TreeView.GetHandle(), Res2Str(IDS_WIZARDBRANCHTITLE), Res2Str(IDS_WIZARDBRANCHTEXT)); } else { TreeView.GetItemText(lpNMTreeView->itemNew.hItem, szItem, ARRAYSIZE(szItem)); for (i = 0; i < g_nDialogs; i++) { if (StrCmp(szItem, g_pInsDialog[i].szName) == 0) { g_hDialog = CreateInsDialog(hWnd, nTreeViewWidth + (2*MARGIN) + 2, MARGIN + 2, i, g_szInsFile, g_szCabWorkDir); if(lstrlen(g_szInsFile) == 0) EnableWindow(g_hDialog, FALSE); break; } } } } else // is policy item SelectADMItem(hWnd, TreeView.GetHandle(), &lpNMTreeView->itemNew, TRUE, ISNULL(g_szInsFile)); SetInfoWindowText(hInfoWnd); } else if(lpNMTreeView->hdr.code == TVN_ITEMEXPANDED) { tvitem.mask = TVIF_IMAGE; tvitem.hItem = lpNMTreeView->itemNew.hItem; TreeView_GetItem(TreeView.GetHandle(), &tvitem); // If tree item is EXPANDING (opening up) and // current icon == CloseFolder, change icon to OpenFolder if(lpNMTreeView->action == TVE_EXPAND) { tvitem1.hItem = lpNMTreeView->itemNew.hItem; tvitem1.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE; if(tvitem.iImage == g_InsSettingsClose) { tvitem1.iImage = g_InsSettingsOpen; tvitem1.iSelectedImage = g_InsSettingsOpen; } else if(tvitem.iImage == g_PolicyClose) { tvitem1.iImage = g_PolicyOpen; tvitem1.iSelectedImage = g_PolicyOpen; } else if(tvitem.iImage == g_ADMClose) { tvitem1.iImage = g_ADMOpen; tvitem1.iSelectedImage = g_ADMOpen; } else break; TreeView_SetItem(TreeView.GetHandle(), &tvitem1); } // If tree item is COLLAPSING (closing up) and // current icon == OpenFolder, change icon to CloseFolder else if(lpNMTreeView->action == TVE_COLLAPSE) { tvitem1.hItem = lpNMTreeView->itemNew.hItem; tvitem1.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE; if(tvitem.iImage == g_InsSettingsOpen) { tvitem1.iImage = g_InsSettingsClose; tvitem1.iSelectedImage = g_InsSettingsClose; } else if(tvitem.iImage == g_PolicyOpen) { tvitem1.iImage = g_PolicyClose; tvitem1.iSelectedImage = g_PolicyClose; } else if(tvitem.iImage == g_ADMOpen) { tvitem1.iImage = g_ADMClose; tvitem1.iSelectedImage = g_ADMClose; } else break; TreeView_SetItem(TreeView.GetHandle(), &tvitem1); } break; } else if(lpNMTreeView->hdr.code == NM_SETFOCUS) { if (lpNMTreeView->hdr.hwndFrom == TreeView.GetHandle() && hErrorDlgCtrl != NULL) { SetFocus(g_hDialog); SetFocus(hErrorDlgCtrl); hErrorDlgCtrl = NULL; } } return DefWindowProc(hWnd, msg, wParam, lParam); case WM_COMMAND: // patch: if the message is a button down (return key), send the message to the // corresponding window if(g_hDialog && HIWORD(wParam) == BN_CLICKED) { hWndFocus = GetFocus(); if(IsChild(g_hDialog, hWndFocus) && hWndFocus == (HWND) lParam) { SendMessage(g_hDialog, msg, MAKEWPARAM(LOWORD(GetDlgCtrlID(hWndFocus)), HIWORD(wParam)), (LPARAM) hWndFocus); } } switch (LOWORD(wParam)) { case IDM_FILEEXIT: SendMessage(hWnd, WM_CLOSE, 0, 0); break; case IDM_FILENEW: if(lstrlen(g_szInsFile)) { //save the current page SaveCurrentSelItem(TreeView.GetHandle(), ITEM_CHECKDIRTY); SetInfoWindowText(hInfoWnd); if (IsDirty()) { int nError; wsprintf(szMsg, Res2Str(IDS_SAVE), lstrlen(g_szFileName) ? g_szFileName : Res2Str(IDS_UNTITLED)); switch(MessageBox(hWnd, szMsg, Res2Str(IDS_TITLE), MB_YESNOCANCEL)) { case IDCANCEL: return 1; case IDYES: nError = (int) SendMessage(hWnd, WM_COMMAND, MAKEWPARAM(IDM_FILESAVE, 0), 0); if (nError == PAGE_ERROR || nError == SAVE_ERROR || nError == SAVE_CANCEL) return 1; break; case IDNO: break; } } ZeroMemory(g_szFileName, sizeof(g_szFileName)); } ZeroMemory(g_szCabsURLPath, sizeof(g_szCabsURLPath)); ZeroMemory(g_szConfigURLPath, sizeof(g_szConfigURLPath)); ZeroMemory(g_szDesktopURLPath, sizeof(g_szDesktopURLPath)); ZeroMemory(g_szConfigCabName, sizeof(g_szConfigCabName)); ZeroMemory(g_szDesktopCabName, sizeof(g_szDesktopCabName)); ZeroMemory(g_szNewVersionStr, sizeof(g_szNewVersionStr)); EnableWindow(TreeView.GetHandle(), TRUE); DeleteCabWorkDirs(); SaveCurrentSelItem(TreeView.GetHandle(), ITEM_DESTROY); TreeView.SetSel(NULL); ResetAdmFiles(TreeView.GetHandle(), g_szCabWorkDir, FALSE); NewTempFile(); CreateCabWorkDirs(TEXT("new")); SetTitleBar(hWnd, NULL); WritePrivateProfileString(TEXT("Branding"), TEXT("Language Locale"), g_szLanguage, g_szInsFile); if(g_dwLanguage != 0xffffffff) { wsprintf(szLangId, TEXT("%lu"), g_dwLanguage); WritePrivateProfileString(TEXT("Branding"), TEXT("Language ID"), szLangId, g_szInsFile); } WritePrivateProfileString(URL_SECT, TEXT("AutoConfig"), TEXT("0"), g_szInsFile); // Collapse all policy treeview items that has been expanded TreeView.CollapseChildNodes(g_hPolicyRootItem); TreeView.SetSel(g_pInsDialog[0].hItem); SetFocus(TreeView.GetHandle()); ClearDirtyFlag(); SetInfoWindowText(hInfoWnd); break; case IDM_FILESAVE: if (!SaveCurrentSelItem(TreeView.GetHandle(), ITEM_SAVE)) return PAGE_ERROR; SetInfoWindowText(hInfoWnd); dwCabBuildStatus = GetCabBuildStatus(); DirectoryName(g_szFileName, szTemp); // szTemp will contain the INS path. if((PathFileExists(g_szFileName) && ((!HasFlag(dwCabBuildStatus, CAB_TYPE_CONFIG) && !HasFlag(dwCabBuildStatus, CAB_TYPE_DESKTOP)) || *g_szCabsURLPath) && (!HasFlag(dwCabBuildStatus, CAB_TYPE_CONFIG) || *g_szConfigCabName) && (!HasFlag(dwCabBuildStatus, CAB_TYPE_DESKTOP) || *g_szDesktopCabName)) && !IsFileReadOnly(g_szFileName) && !IsFileReadOnly(g_szConfigCabName, szTemp) && !IsFileReadOnly(g_szDesktopCabName, szTemp)) { SetInfoWindowText(hInfoWnd, Res2Str(IDS_SAVEFILEMSG)); wsprintf(szTemp, TEXT("%d"), g_dwPlatformId); WritePrivateProfileString(TEXT("Branding"), TEXT("Platform"), szTemp, g_szInsFile); SaveAdmFiles(TreeView.GetHandle(), g_szCabWorkDir, g_szInsFile); PrepareFolderForCabbing(g_szCabWorkDir, PM_COPY | PM_CLEAR); if (!DialogBox(s_hInstIeakUI, MAKEINTRESOURCE(IDD_DISPLAYSAVE), hWnd, DisplaySaveDlgProc)) { SetInfoWindowText(hInfoWnd, Res2Str(IDS_READYMSG)); return SAVE_ERROR; } SetInfoWindowText(hInfoWnd, Res2Str(IDS_READYMSG)); ClearDirtyFlag(); SetInfoWindowText(hInfoWnd); break; } // fallthrough case IDM_FILESAVEAS: if (LOWORD(wParam) == IDM_FILESAVEAS && !SaveCurrentSelItem(TreeView.GetHandle(), ITEM_SAVE)) return PAGE_ERROR; SetInfoWindowText(hInfoWnd); StrCpy(szTempFile, g_szFileName); if(DialogBox(s_hInstIeakUI, MAKEINTRESOURCE(IDD_SAVEAS), hWnd, SaveAsDlgProc) == 0) { SetInfoWindowText(hInfoWnd, Res2Str(IDS_SAVEFILEMSG)); wsprintf(szTemp, TEXT("%d"), g_dwPlatformId); WritePrivateProfileString(TEXT("Branding"), TEXT("Platform"), szTemp, g_szInsFile); SaveAdmFiles(TreeView.GetHandle(), g_szCabWorkDir, g_szInsFile); PrepareFolderForCabbing(g_szCabWorkDir, PM_COPY | PM_CLEAR); if (!DialogBox(s_hInstIeakUI, MAKEINTRESOURCE(IDD_DISPLAYSAVE), hWnd, DisplaySaveDlgProc)) { SetInfoWindowText(hInfoWnd, Res2Str(IDS_READYMSG)); // revert back the previous INS filename and CAB names. StrCpy(g_szFileName, szTempFile); GetCabName(g_szFileName, CAB_TYPE_CONFIG, g_szConfigCabName); GetCabName(g_szFileName, CAB_TYPE_DESKTOP, g_szDesktopCabName); return SAVE_ERROR; } SetTitleBar(hWnd, g_szFileName); UpdateRecentFileList(g_szFileName, TRUE, szRecentFileList); UpdateRecentFileListMenu(hWnd, szRecentFileList); SetInfoWindowText(hInfoWnd, Res2Str(IDS_READYMSG)); ClearDirtyFlag(); SetInfoWindowText(hInfoWnd); } else return SAVE_CANCEL; break; case IDM_FILEOPEN: if(lstrlen(g_szInsFile)) { SaveCurrentSelItem(TreeView.GetHandle(), ITEM_CHECKDIRTY); SetInfoWindowText(hInfoWnd); if (IsDirty()) { int nError; wsprintf(szMsg, Res2Str(IDS_SAVE), lstrlen(g_szFileName) ? g_szFileName : Res2Str(IDS_UNTITLED)); switch(MessageBox(hWnd, szMsg, Res2Str(IDS_TITLE), MB_YESNOCANCEL)) { case IDCANCEL: return 1; case IDYES: nError = (int) SendMessage(hWnd, WM_COMMAND, MAKEWPARAM(IDM_FILESAVE, 0), 0); if (nError == PAGE_ERROR || nError == SAVE_ERROR || nError == SAVE_CANCEL) return 1; break; case IDNO: break; } } } ZeroMemory(szTempFile, sizeof(szTempFile)); ZeroMemory(szFilter, sizeof(szFilter)); LoadString(g_hInst, IDS_INSFILTERNAME, szFilter, ARRAYSIZE(szFilter)); pszFilter = szFilter + lstrlen(szFilter) + 1; lstrcpy(pszFilter, TEXT("*.ins")); if (lParam == 0) { if (!BrowseForFileEx(hWnd, szFilter, szTempFile, ARRAYSIZE(szTempFile), TEXT("*.ins"))) break; } else StrCpy(szTempFile, szFileToOpen); if (PathFileExists(szTempFile)) { LPTSTR pExtn; TCHAR szLang[10]; DWORD dwInsPlatformId; pExtn = PathFindExtension(szTempFile); if (pExtn == NULL || ((StrCmpI(pExtn, TEXT(".ins")) != 0) && (StrCmpI(pExtn, TEXT(".INS")) != 0))) //looks weird, but hack is needed for turkish locale { MessageBox(hWnd, Res2Str(IDS_INVALIDEXTN), Res2Str(IDS_TITLE), MB_OK); break; } // check if it is a Win32/W2K INS file if (!IsWin32INSFile(szTempFile)) break; // check if the associated cab files are available. if (CabFilesExist(hWnd, szTempFile)) { // check whether the INS language matches the language selected in the profile manager. GetPrivateProfileString(TEXT("Branding"), TEXT("Language Locale"), TEXT(""), szLang, ARRAYSIZE(szLang), szTempFile); if (StrCmpI(szLang, g_szLanguage) != 0) { TCHAR szMsg[MAX_PATH]; wsprintf(szMsg, Res2Str(IDS_LANGDIFFERS), szTempFile); if (MessageBox(hWnd, szMsg, Res2Str(IDS_TITLE), MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2) == IDNO) break; } // check if the selected platform Optional cab is available for the selected language. dwInsPlatformId = GetPrivateProfileInt(TEXT("Branding"), TEXT("Platform"), IDM_PLATFORM_WIN32, szTempFile); if (!PlatformExists(hWnd, g_szLanguage, dwInsPlatformId, TRUE)) break; ZeroMemory(g_szCabsURLPath, sizeof(g_szCabsURLPath)); ZeroMemory(g_szConfigURLPath, sizeof(g_szConfigURLPath)); ZeroMemory(g_szDesktopURLPath, sizeof(g_szDesktopURLPath)); ZeroMemory(g_szConfigCabName, sizeof(g_szConfigCabName)); ZeroMemory(g_szDesktopCabName, sizeof(g_szDesktopCabName)); ZeroMemory(g_szNewVersionStr, sizeof(g_szNewVersionStr)); EnableWindow(TreeView.GetHandle(), TRUE); SetInfoWindowText(hInfoWnd, Res2Str(IDS_OPENFILEMSG)); DeleteCabWorkDirs(); if (*g_szInsFile) { DeleteFile(g_szInsFile); ZeroMemory(g_szInsFile, sizeof(g_szInsFile)); } SaveCurrentSelItem(TreeView.GetHandle(), ITEM_DESTROY); TreeView.SetSel(NULL); ResetAdmFiles(TreeView.GetHandle(), g_szCabWorkDir, FALSE); lstrcpy(g_szFileName, szTempFile); SetTitleBar(hWnd, g_szFileName); switch(dwInsPlatformId) { case PLATFORM_W2K: SendMessage(hWnd, WM_COMMAND, MAKEWPARAM(IDM_PLATFORM_W2K, 0), 0L); break; case PLATFORM_WIN32: default: SendMessage(hWnd, WM_COMMAND, MAKEWPARAM(IDM_PLATFORM_WIN32, 0), 0L); break; } NewTempFile(); CopyFile(g_szFileName, g_szInsFile, FALSE); SetFileAttributes(g_szInsFile, FILE_ATTRIBUTE_NORMAL); ExtractCabFile(); // Collapse all policy treeview items that has been expanded TreeView.CollapseChildNodes(g_hPolicyRootItem); TreeView.SetSel(g_pInsDialog[0].hItem); SetFocus(TreeView.GetHandle()); ResetAdmFiles(TreeView.GetHandle(), g_szCabWorkDir, TRUE); SetInfoWindowText(hInfoWnd, Res2Str(IDS_READYMSG)); lstrcpy(szTemp, szTempFile); PathRemoveFileSpec(szTemp); lstrcpy(g_szCurrInsPath, szTemp); UpdateRecentFileList(szTempFile, TRUE, szRecentFileList); } } else { TCHAR szErrMsg[MAX_PATH + 20]; TCHAR szStr[MAX_PATH]; LoadString(g_hInst, IDS_FILENOTFOUND, szStr, ARRAYSIZE(szStr)); wsprintf(szErrMsg, szStr, szTempFile); MessageBox(hWnd, szErrMsg, Res2Str(IDS_TITLE), MB_OK | MB_ICONEXCLAMATION); UpdateRecentFileList(szTempFile, FALSE, szRecentFileList); } UpdateRecentFileListMenu(hWnd, szRecentFileList); ClearDirtyFlag(); SetInfoWindowText(hInfoWnd); break; case IDM_ADMIMPORT: wsprintf(szTemp, TEXT("%sPolicies\\%s"), g_szRoot, g_szLanguage); ImportADMFile(hWnd, TreeView.GetHandle(), szTemp, g_szCabWorkDir, ROLE_CORP, g_szInsFile); break; case IDM_ADMDELETE: LoadString(g_hInst, IDS_ADMDELWARN, szMsg, ARRAYSIZE(szMsg)); if(MessageBox(hWnd, szMsg, Res2Str(IDS_TITLE), MB_ICONQUESTION|MB_YESNO) == IDYES) { hItem = TreeView.GetSel(); DeleteADMItem(TreeView.GetHandle(), hItem, g_szCabWorkDir, g_szInsFile, TRUE, TRUE); } break; case IDM_CHKDUPKEYS: hItem = TreeView.GetSel(); CheckForDupKeys(g_hMain, TreeView.GetHandle(), hItem, TRUE); break; case IDM_PLATFORM_WIN32: case IDM_PLATFORM_W2K: InitializePlatform(hWnd, hInfoWnd, LOWORD(wParam)); break; case IDM_HELP: SendMessage(hWnd, WM_HELP, 0, 0L); break; } if (LOWORD(wParam) >= IDM_RECENTFILELIST && LOWORD(wParam) < IDM_RECENTFILELIST + 5) { if (!(LOWORD(wParam) == IDM_RECENTFILELIST && StrCmpI(g_szFileName, szRecentFileList[0]) == 0)) { StrCpy(szFileToOpen, szRecentFileList[LOWORD(wParam) - IDM_RECENTFILELIST]); SendMessage(hWnd, WM_COMMAND, MAKEWPARAM(IDM_FILEOPEN, 0), 1L); } } break; case WM_MENUSELECT: if(LOWORD(wParam) == 0) // FILE menu { hMenu = GetSubMenu((HMENU) lParam, 0); if(lstrlen(g_szInsFile) == 0) { EnableMenuItem(hMenu, IDM_FILESAVE, MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(hMenu, IDM_FILESAVEAS, MF_BYCOMMAND | MF_GRAYED); } else { EnableMenuItem(hMenu, IDM_FILESAVE, MF_BYCOMMAND | MF_ENABLED); EnableMenuItem(hMenu, IDM_FILESAVEAS, MF_BYCOMMAND | MF_ENABLED); } } else if(LOWORD(wParam) == 1) // POLICY menu { hItem = TreeView.GetSel(); hMenu = GetSubMenu((HMENU) lParam, 1); if(!IsPolicyTree(hItem) || hItem == g_hPolicyRootItem || TreeView_GetParent(TreeView.GetHandle(), hItem) != g_hPolicyRootItem || !CanDeleteADM(TreeView.GetHandle(), hItem)) { EnableMenuItem(hMenu, IDM_ADMDELETE, MF_BYCOMMAND | MF_GRAYED); } else EnableMenuItem(hMenu, IDM_ADMDELETE, MF_BYCOMMAND | MF_ENABLED); if(!IsPolicyTree(hItem) || hItem == g_hPolicyRootItem || TreeView_GetParent(TreeView.GetHandle(), hItem) != g_hPolicyRootItem) { EnableMenuItem(hMenu, IDM_CHKDUPKEYS, MF_BYCOMMAND | MF_GRAYED); } else EnableMenuItem(hMenu, IDM_CHKDUPKEYS, MF_BYCOMMAND | MF_ENABLED); if(lstrlen(g_szLanguage)) EnableMenuItem(hMenu, IDM_ADMIMPORT, MF_BYCOMMAND | MF_ENABLED); else EnableMenuItem(hMenu, IDM_ADMIMPORT, MF_BYCOMMAND | MF_GRAYED); } break; case WM_HELP: if (GetForegroundWindow() != g_hMain) break; hItem = TreeView.GetSel(); if (hItem != NULL) { if (TreeView_GetParent(TreeView.GetHandle(), hItem) != NULL && !IsPolicyTree(hItem)) { TreeView.GetItemText(hItem, szItem, countof(szItem)); for(i = 0; i < g_nDialogs; i++) { if(StrCmp(szItem, g_pInsDialog[i].szName) == 0) IeakPageHelp(hWnd, g_pInsDialog[i].DlgId); } } else if (hItem == g_hInsRootItem) IeakPageHelp(hWnd, MAKEINTRESOURCE(IDD_CORPWELCOME)); else if (IsPolicyTree(hItem)) IeakPageHelp(hWnd, MAKEINTRESOURCE(IDD_ADM)); } break; case WM_MOUSEMOVE: fCanResize = FALSE; if (GetCapture() == hWnd) { DrawTrackLine(hWnd, nPrevXPos); DrawTrackLine(hWnd, LOWORD(lParam)); nPrevXPos = LOWORD(lParam); break; } GetWindowRect(hWndSizeBar, &rect1); { int nXPos = LOWORD(lParam); int nYPos = HIWORD(lParam); POINT ptLeftTop; POINT ptRightBottom; ptLeftTop.x = rect1.left; ptLeftTop.y = rect1.top; ScreenToClient(hWnd, &ptLeftTop); ptRightBottom.x = rect1.right; ptRightBottom.y = rect1.bottom; ScreenToClient(hWnd, &ptRightBottom); if (nXPos >= ptLeftTop.x - 1 && nXPos <= ptRightBottom.x && nYPos >= ptLeftTop.y && nYPos <= ptRightBottom.y) { fCanResize = TRUE; SetCursor(hCurVTResize); } } break; case WM_LBUTTONDOWN: if (fCanResize) { POINT pt; RECT rectTrack; HDC hDC = NULL; GetWindowRect(TreeView.GetHandle(), &rect1); rect2.left = rect1.left + 10; rect2.top = rect1.top; rect2.right = rect2.left + TREEVIEW_WIDTH - 10 + 1; rect2.bottom = rect2.top + (rect1.bottom - rect1.top); ClipCursor(&rect2); pt.x = 0; pt.y = HIWORD(lParam); ClientToScreen(hWnd, &pt); GetWindowRect(hWndSizeBar, &rect1); SetCursor(hCurVTResize); SetCursorPos(rect1.left, pt.y); SetCapture(hWnd); pt.x = rect1.left; pt.y = 0; ScreenToClient(hWnd, &pt); DrawTrackLine(hWnd, pt.x); nPrevXPos = pt.x; } break; case WM_LBUTTONUP: if (GetCapture() == hWnd) { RECT rectWnd; ReleaseCapture(); ClipCursor(NULL); DrawTrackLine(hWnd, nPrevXPos); nTreeViewWidth = nPrevXPos - MARGIN; GetWindowRect(TreeView.GetHandle(), &rect1); GetWindowRect(hWnd, &rectWnd); SetWindowPos(hWnd, HWND_TOP, 0, 0, (rectWnd.right - rectWnd.left) + (nTreeViewWidth - (rect1.right - rect1.left)), rectWnd.bottom - rectWnd.top, SWP_NOMOVE | SWP_NOZORDER); } break; case WM_CLOSE: if(*g_szInsFile != TEXT('\0')) { SaveCurrentSelItem(TreeView.GetHandle(), ITEM_CHECKDIRTY); SetInfoWindowText(hInfoWnd); if (IsDirty()) { int nError; wsprintf(szMsg, Res2Str(IDS_SAVE), (*g_szFileName != TEXT('\0')) ? g_szFileName : Res2Str(IDS_UNTITLED)); switch(MessageBox(hWnd, szMsg, Res2Str(IDS_TITLE), MB_YESNOCANCEL)) { case IDYES: nError = (int) SendMessage(hWnd, WM_COMMAND, MAKEWPARAM(IDM_FILESAVE, 0), 0); if (nError == PAGE_ERROR || nError == SAVE_ERROR || nError == SAVE_CANCEL) return 1; break; case IDCANCEL: return 1; case IDNO: break; } } ZeroMemory(g_szFileName, sizeof(g_szFileName)); DeleteFile(g_szInsFile); ZeroMemory(g_szInsFile, sizeof(g_szInsFile)); } if (RegCreateKeyEx(HKEY_CURRENT_USER, RK_IEAK_SERVER TEXT("\\ProfMgr"), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) { RegSetValueEx(hKey, TEXT("LastOpenedPath"), 0, dwType, (const BYTE*) g_szCurrInsPath, lstrlen(g_szCurrInsPath) + 1); RegSetValueEx(hKey, TEXT("TreeviewWidth"), 0, REG_DWORD, (const BYTE*) &nTreeViewWidth, sizeof(DWORD)); RegCloseKey(hKey); } SaveCurrentSelItem(TreeView.GetHandle(), ITEM_DESTROY); DeleteADMItems(TreeView.GetHandle(), g_szCabWorkDir, g_szInsFile, TRUE); DestroyWindow(g_hWndAdmInstr); DestroyADMWindow(TreeView.GetHandle()); DeleteCabWorkDirs(); WriteRecentFileList(szRecentFileList); ReleaseCapture(); ClipCursor(NULL); if (g_hWndHelp != NULL) SendMessage(g_hWndHelp, WM_CLOSE, 0, 0L); return DefWindowProc(hWnd, msg, wParam, lParam); case WM_DESTROY: DeleteFile(g_szInsFile); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, msg, wParam, lParam); } return 1; } void DrawTrackLine(HWND hWnd, int nXPos) { RECT rectTV; RECT rectTrack; HDC hDC = NULL; GetWindowRect(TreeView.GetHandle(), &rectTV); rectTrack.left = nXPos; rectTrack.top = MARGIN; rectTrack.right= nXPos + 4; rectTrack.bottom = rectTrack.top + (rectTV.bottom - rectTV.top); hDC = GetDC(hWnd); InvertRect(hDC, &rectTrack); ReleaseDC(hWnd, hDC); } 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]; wsprintf(szMsg, Res2Str(IDS_FILE_READONLY), szReadOnlyFiles); MessageBox(hDlg, szMsg, Res2Str(IDS_TITLE), MB_ICONEXCLAMATION | MB_OK); return FALSE; } if (*szExistingFiles != TEXT('\0')) { TCHAR szMsg[MAX_PATH*6]; wsprintf(szMsg, Res2Str(IDS_FILE_ALREADY_EXISTS), szExistingFiles); if (MessageBox(hDlg, szMsg, Res2Str(IDS_TITLE), MB_ICONEXCLAMATION | MB_YESNO | MB_DEFBUTTON2) == IDNO) return FALSE; } return TRUE; } INT_PTR CALLBACK SaveAsDlgProc(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]; HWND hCtrl; TCHAR szFilter[MAX_PATH]; LPTSTR pszFilter = NULL; TCHAR szTemp[MAX_PATH]; DWORD dwCabBuildStatus = 0; switch(uMsg) { case WM_INITDIALOG: EnableDBCSChars(hDlg, IDE_INSFILE); // enable DBCS chars EnableDBCSChars(hDlg, IDE_CABSURL); EnableDBCSChars(hDlg, IDE_CAB1NAME); EnableDBCSChars(hDlg, IDE_CAB2NAME); // since base INS filename will be used as prefix to the respective // cab names and the largest cab suffix string is _channnels.cab (which has // 13 chars in it), the prefix can be at the max only 246 chars long. // So limit the text to be entered in the IDE_INSFILE to MAX_PATH - 20. Edit_LimitText(GetDlgItem(hDlg, IDE_INSFILE), ARRAYSIZE(g_szFileName) - 20); Edit_LimitText(GetDlgItem(hDlg, IDE_CABSURL), ARRAYSIZE(g_szCabsURLPath) - 1); Edit_LimitText(GetDlgItem(hDlg, IDE_CAB1NAME), ARRAYSIZE(g_szConfigCabName) - 1); Edit_LimitText(GetDlgItem(hDlg, IDE_CAB2NAME), ARRAYSIZE(g_szDesktopCabName) - 1); dwCabBuildStatus = GetCabBuildStatus(); if (!HasFlag(dwCabBuildStatus, CAB_TYPE_CONFIG)) { EnableWindow(GetDlgItem(hDlg, IDC_CAB1TEXT), FALSE); EnableWindow(GetDlgItem(hDlg, IDE_CAB1NAME), FALSE); } if (!HasFlag(dwCabBuildStatus, CAB_TYPE_DESKTOP)) { 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); } *szPrefix = TEXT('\0'); //----------------- InsFile if (PathFileExists(g_szFileName)) { SetDlgItemText(hDlg, IDE_INSFILE, g_szFileName); GetBaseFileName(g_szFileName, szPrefix, ARRAYSIZE(szPrefix)); if(StrCmpI(szPrefix, TEXT("install")) == 0) StrCpy(szPrefix, TEXT("Default")); } //----------------- CabsURLPath if (*g_szCabsURLPath) SetDlgItemText(hDlg, IDE_CABSURL, g_szCabsURLPath); //----------------- Config if (HasFlag(dwCabBuildStatus, CAB_TYPE_CONFIG)) { if (*g_szConfigCabName == TEXT('\0')) GetDefaultCabName(CAB_TYPE_CONFIG, szPrefix, szCabName); else GetDefaultCabName(CAB_TYPE_CONFIG, g_szConfigCabName, szCabName); SetDlgItemText(hDlg, IDE_CAB1NAME, szCabName); } //----------------- Desktop if (HasFlag(dwCabBuildStatus, CAB_TYPE_DESKTOP)) { if (*g_szDesktopCabName == TEXT('\0')) GetDefaultCabName(CAB_TYPE_DESKTOP, szPrefix, szCabName); else GetDefaultCabName(CAB_TYPE_DESKTOP, g_szDesktopCabName, szCabName); SetDlgItemText(hDlg, IDE_CAB2NAME, szCabName); } //----------------- Version if (*g_szNewVersionStr == TEXT('\0')) GenerateNewVersionStr(g_szFileName, g_szNewVersionStr); SetDlgItemText(hDlg, IDC_CABVERSION, g_szNewVersionStr); return TRUE; case WM_COMMAND: switch (wParam) { case IDOK: GetDlgItemText(hDlg, IDE_INSFILE, szInsFile, ARRAYSIZE(szInsFile)); if(*szInsFile != TEXT('\0') && (StrCmpI(PathFindExtension(szInsFile), TEXT(".ins")) != 0) && (StrCmpI(PathFindExtension(szInsFile), TEXT(".INS")) != 0)) { MessageBox(hDlg, Res2Str(IDS_INVALIDEXTN), Res2Str(IDS_TITLE), MB_OK); SendMessage(hCtrl = GetDlgItem(hDlg, IDE_INSFILE), EM_SETSEL, 0, -1); SetFocus(hCtrl); } else if (IsFileCreatable(szInsFile)) { ZeroMemory(szCabsURL, sizeof(szCabsURL)); if (!IsWindowEnabled(GetDlgItem(hDlg, IDE_CABSURL)) || (GetDlgItemText(hDlg, IDE_CABSURL, szCabsURL, ARRAYSIZE(szCabsURL)) && PathIsURL(szCabsURL))) { int nLen = 0; if (!IsWindowEnabled(GetDlgItem(hDlg, IDE_CAB1NAME)) || ((nLen = GetDlgItemText(hDlg, IDE_CAB1NAME, szCabName, ARRAYSIZE(szCabName))))) { if (!IsWindowEnabled(GetDlgItem(hDlg, IDE_CAB2NAME)) || ((nLen = GetDlgItemText(hDlg, IDE_CAB2NAME, szCabName, ARRAYSIZE(szCabName))))) { if(!CanOverwriteFiles(hDlg)) return TRUE; StrCpy(g_szFileName, szInsFile); StrCpy(g_szCabsURLPath, szCabsURL); GetDlgItemText(hDlg, IDE_CAB1NAME, g_szConfigCabName, ARRAYSIZE(g_szConfigCabName)); GetDlgItemText(hDlg, IDE_CAB2NAME, g_szDesktopCabName, ARRAYSIZE(g_szDesktopCabName)); // clear out the version buffer so that it gets initialized properly in SetOrClearVersionInfo ZeroMemory(g_szNewVersionStr, sizeof(g_szNewVersionStr)); EndDialog(hDlg, 0); lstrcpy(szTemp, szInsFile); PathRemoveFileSpec(szTemp); lstrcpy(g_szCurrInsPath, szTemp); break; } else hCtrl = GetDlgItem(hDlg, IDE_CAB2NAME); } else hCtrl = GetDlgItem(hDlg, IDE_CAB1NAME); MessageBox(hDlg, Res2Str(IDS_MUSTSPECIFYNAME), Res2Str(IDS_TITLE), MB_OK); SendMessage(hCtrl, EM_SETSEL, 0, -1); SetFocus(hCtrl); } else { hCtrl = GetDlgItem(hDlg, IDE_CABSURL); MessageBox(hDlg, Res2Str(IDS_MUSTSPECIFYURL), Res2Str(IDS_TITLE), MB_OK); SendMessage(hCtrl, EM_SETSEL, 0, -1); SetFocus(hCtrl); } } else { MessageBox(hDlg, Res2Str(IDS_CANTCREATEFILE), Res2Str(IDS_TITLE), MB_OK); SendMessage(hCtrl = GetDlgItem(hDlg, IDE_INSFILE), EM_SETSEL, 0, -1); SetFocus(hCtrl); } return TRUE; case IDCANCEL: EndDialog(hDlg, -1); break; case IDC_INSBROWSE: *szInsFile = TEXT('\0'); GetDlgItemText(hDlg, IDE_INSFILE, szInsFile, ARRAYSIZE(szInsFile)); ZeroMemory(szFilter, sizeof(szFilter)); LoadString(g_hInst, IDS_INSFILTERNAME, szFilter, ARRAYSIZE(szFilter)); pszFilter = szFilter + lstrlen(szFilter) + 1; lstrcpy(pszFilter, TEXT("*.ins")); if (BrowseForSave(hDlg, szFilter, szInsFile, ARRAYSIZE(szInsFile), TEXT("*.ins"))) SetDlgItemText(hDlg, IDE_INSFILE, szInsFile); return TRUE; } if (LOWORD(wParam) == IDE_INSFILE && HIWORD(wParam) == EN_CHANGE) { 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")); if (IsWindowEnabled(GetDlgItem(hDlg, IDE_CAB1NAME))) { TCHAR szTempCabName[MAX_PATH]; GetDlgItemText(hDlg, IDE_CAB1NAME, szTempCabName, countof(szTempCabName)); if (*szTempCabName == TEXT('\0') || (StrStrI(szTempCabName, TEXT("_config.cab")) != NULL)) { GetDefaultCabName(CAB_TYPE_CONFIG, szPrefix, szCabName); SetDlgItemText(hDlg, IDE_CAB1NAME, szCabName); } } if (IsWindowEnabled(GetDlgItem(hDlg, IDE_CAB2NAME))) { TCHAR szTempCabName[MAX_PATH]; GetDlgItemText(hDlg, IDE_CAB2NAME, szTempCabName, countof(szTempCabName)); if (*szTempCabName == TEXT('\0') || (StrStrI(szTempCabName, TEXT("_desktop.cab")) != NULL)) { GetDefaultCabName(CAB_TYPE_DESKTOP, szPrefix, szCabName); SetDlgItemText(hDlg, IDE_CAB2NAME, szCabName); } } } } break; } return FALSE; } int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { HANDLE hMutex; HINSTANCE hInsDll; WNDCLASSEX wc; MSG msg; TCHAR* pLastSlash = NULL; DWORD dwSize, dwIEVer; int iType; dwSize = sizeof(DWORD); if (SHGetValue(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\IEAK"), TEXT("Mode"), NULL, &iType, &dwSize) == ERROR_SUCCESS) { if ((iType == REDIST) || (iType == BRANDED)) { ErrorMessageBox(NULL, IDS_REQUIRE_CORPMODE); return FALSE; } } // allow only one instance running at a time hMutex = CreateMutex(NULL, TRUE, TEXT("IEAK6ProfMgr.Mutex")); if ((hMutex != NULL) && (GetLastError() == ERROR_ALREADY_EXISTS)) { CloseHandle(hMutex); ErrorMessageBox(NULL, IDS_ERROR_MULTPROFMGR); return FALSE; } g_hInst = hInst; s_hInstIeakUI = LoadLibrary(TEXT("ieakui.dll")); if (s_hInstIeakUI == NULL) return (int)FALSE; ZeroMemory(g_szFileName, sizeof(g_szFileName)); ZeroMemory(g_szInsFile, sizeof(g_szInsFile)); ZeroMemory(g_szCabWorkDir, sizeof(g_szCabWorkDir)); wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1)); wc.hIconSm = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON1)); wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("InsEdit4Class"); if(!RegisterClassEx(&wc)) { FreeLibrary(s_hInstIeakUI); return 0; } // if ie5.5 is not installed, bail out dwIEVer = GetIEVersion(); if (HIWORD(dwIEVer) < 6) { TCHAR szMsgBoxTitle[128]; TCHAR szMsgBoxText[MAX_PATH]; LoadString(g_hInst, IDS_NOIE, szMsgBoxText, ARRAYSIZE(szMsgBoxText)); LoadString(g_hInst, IDS_TITLE, szMsgBoxTitle, ARRAYSIZE(szMsgBoxTitle)); MessageBox(NULL, szMsgBoxText, szMsgBoxTitle, MB_OK); FreeLibrary(s_hInstIeakUI); return FALSE; } dwSize = sizeof(g_szRoot); ZeroMemory(g_szRoot, sizeof(g_szRoot)); GetModuleFileName(GetModuleHandle(NULL), g_szRoot, MAX_PATH); if(*g_szRoot == 0) SHGetValue(HKEY_LOCAL_MACHINE, CURRENTVERSIONKEY TEXT("\\App Paths\\IEAK6WIZ.EXE"), NULL, NULL, (LPVOID) g_szRoot, &dwSize); if(*g_szRoot != 0) { pLastSlash = StrRChr(g_szRoot, NULL, TEXT('\\')); if (pLastSlash) *(++pLastSlash) = 0; CharUpper(g_szRoot); } else { FreeLibrary(s_hInstIeakUI); return 0; } hInsDll = LoadLibrary(TEXT("insedit.dll")); if(!hInsDll) { MessageBox(NULL, Res2Str(IDS_ERRDLL), Res2Str(IDS_TITLE), MB_OK); FreeLibrary(s_hInstIeakUI); return 0; } CreateInsDialog = (CREATEINSDIALOG) GetProcAddress(hInsDll, "CreateInsDialog"); GetInsDlgStruct = (GETINSDLGSTRUCT) GetProcAddress(hInsDll, "GetInsDlgStruct"); DestroyInsDialog = (DESTROYINSDIALOG) GetProcAddress(hInsDll, "DestroyInsDialog"); SetDefaultInf = (SETDEFAULTINF) GetProcAddress(hInsDll, "SetDefaultInf"); ReInitializeInsDialogProcs = (REINITIALIZEINSDIALOGPROCS) GetProcAddress(hInsDll, "ReInitializeInsDialogProcs"); SetPlatformInfo = (SETPLATFORMINFO) GetProcAddress(hInsDll, "SetPlatformInfo"); InsDirty = (INSDIRTY) GetProcAddress(hInsDll, "InsDirty"); ClearInsDirtyFlag = (CLEARINSDIRTYFLAG) GetProcAddress(hInsDll, "ClearInsDirtyFlag"); SaveInsDialog = (SAVEINSDIALOG) GetProcAddress(hInsDll, "SaveInsDialog"); CheckForExChar = (CHECKFOREXCHAR) GetProcAddress(hInsDll, "CheckForExChar"); if(!CreateInsDialog || !GetInsDlgStruct || !DestroyInsDialog || !SetDefaultInf || !ReInitializeInsDialogProcs || !SetPlatformInfo || !InsDirty || !ClearInsDirtyFlag || !SaveInsDialog || !CheckForExChar) { FreeLibrary(s_hInstIeakUI); return 0; } if (CoInitialize(NULL) != S_OK) { MessageBox(NULL, Res2Str(IDS_COMINITFAILURE), Res2Str(IDS_TITLE), MB_OK); return 0; } *g_szCmdLine = TEXT('\0'); if (*lpCmdLine != TEXT('\0')) { PathUnquoteSpaces(lpCmdLine); if (lstrlen(lpCmdLine) < MAX_PATH) lstrcpy(g_szCmdLine, lpCmdLine); } g_pInsDialog = GetInsDlgStruct(&g_nDialogs); g_hMain = CreateWindowEx(0, TEXT("InsEdit4Class"), Res2Str(IDS_TITLE), WS_OVERLAPPEDWINDOW ^ (WS_THICKFRAME | WS_MAXIMIZEBOX), CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, LoadMenu(hInst, MAKEINTRESOURCE(IDR_MAINMENU)), hInst, NULL); if(g_hMain != NULL) { while(GetMessage(&msg, NULL, 0, 0)) { if(msg.message == WM_QUIT) break; if(IsDialogMessage(g_hMain, &msg)) continue; TranslateMessage(&msg); DispatchMessage(&msg); } } if(hInsDll != NULL) FreeLibrary(hInsDll); FreeLibrary(s_hInstIeakUI); if (hMutex != NULL) CloseHandle(hMutex); CoUninitialize(); return 1; } BOOL DirectoryName(LPCTSTR lpDirectory, LPTSTR szDirectoryPath) { TCHAR* ptr = StrRChr((LPTSTR)lpDirectory, NULL, TEXT('\\')); ZeroMemory(szDirectoryPath, sizeof(szDirectoryPath)); if(ptr == NULL) return FALSE; lstrcpyn(szDirectoryPath, lpDirectory, (int) (ptr - lpDirectory + 1)); return TRUE; } void ExtractCabFile() { TCHAR szBaseInsFileName[_MAX_FNAME]; TCHAR szCabFullFileName[MAX_PATH]; CHAR szCabFullNameA[MAX_PATH]; CHAR szCabDirA[MAX_PATH]; GetBaseFileName(g_szFileName, szBaseInsFileName, ARRAYSIZE(szBaseInsFileName)); CreateCabWorkDirs(szBaseInsFileName); // read in the URL path for the cabs GetPrivateProfileString(BRANDING, CABSURLPATH, TEXT(""), g_szCabsURLPath, ARRAYSIZE(g_szCabsURLPath), g_szFileName); if (GetCabName(g_szFileName, CAB_TYPE_CONFIG, szCabFullFileName) != NULL) { #ifdef UNICODE WideCharToMultiByte(CP_ACP, 0, szCabFullFileName, -1, szCabFullNameA, sizeof(szCabFullNameA), NULL, NULL); WideCharToMultiByte(CP_ACP, 0, g_szCabWorkDir, -1, szCabDirA, sizeof(szCabDirA), NULL, NULL); #else StrCpyA(szCabFullNameA, szCabFullFileName); StrCpyA(szCabDirA, g_szCabWorkDir); #endif ExtractFiles(szCabFullNameA, szCabDirA, 0, NULL, NULL, NULL); } if (GetCabName(g_szFileName, CAB_TYPE_DESKTOP, szCabFullFileName) != NULL) { #ifdef UNICODE WideCharToMultiByte(CP_ACP, 0, szCabFullFileName, -1, szCabFullNameA, sizeof(szCabFullNameA), NULL, NULL); WideCharToMultiByte(CP_ACP, 0, g_szDesktopDir, -1, szCabDirA, sizeof(szCabDirA), NULL, NULL); #else StrCpyA(szCabFullNameA, szCabFullFileName); StrCpyA(szCabDirA, g_szDesktopDir); #endif ExtractFiles(szCabFullNameA, szCabDirA, 0, NULL, NULL, NULL); } if (GetCabName(g_szFileName, CAB_TYPE_CHANNELS, szCabFullFileName) != NULL) { #ifdef UNICODE WideCharToMultiByte(CP_ACP, 0, szCabFullFileName, -1, szCabFullNameA, sizeof(szCabFullNameA), NULL, NULL); WideCharToMultiByte(CP_ACP, 0, g_szDesktopDir, -1, szCabDirA, sizeof(szCabDirA), NULL, NULL); #else StrCpyA(szCabFullNameA, szCabFullFileName); StrCpyA(szCabDirA, g_szDesktopDir); #endif ExtractFiles(szCabFullNameA, szCabDirA, 0, NULL, NULL, NULL); } } 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; case CAB_TYPE_CHANNELS: pcszSection = CUSTCHANSECT; pcszKey = CUSTCHANNAME; break; } if (pcszSection == NULL || pcszKey == NULL) return; DirectoryName(pcszInsFile, 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); } } LPTSTR GetCabName(LPCTSTR pcszInsFile, DWORD dwCabType, TCHAR szCabFullFileName[]) // NOTE: It's assumed that the length of szCabName is atleast MAX_PATH { TCHAR szCabName[MAX_PATH]; TCHAR szCabInfoLine[INTERNET_MAX_URL_LENGTH + 128]; TCHAR szCabFilePath[MAX_PATH]; *szCabInfoLine = TEXT('\0'); // first check if a cab file is already specified in pcszInsFile GetCabNameFromINS(pcszInsFile, dwCabType, szCabFullFileName, szCabInfoLine); if (*szCabFullFileName != TEXT('\0') && PathFileExists(szCabFullFileName)) { switch (dwCabType) { case CAB_TYPE_CONFIG: StrCpy(g_szConfigURLPath, szCabInfoLine); StrCpy(g_szConfigCabName, PathFindFileName(szCabFullFileName)); break; case CAB_TYPE_DESKTOP: StrCpy(g_szDesktopURLPath, szCabInfoLine); StrCpy(g_szDesktopCabName, PathFindFileName(szCabFullFileName)); break; } return szCabFullFileName; } // use the default cab name output by ieakwiz.exe switch (dwCabType) { case CAB_TYPE_CONFIG: GetBaseFileName(pcszInsFile, szCabName, ARRAYSIZE(szCabName)); if (StrCmpI(szCabName, TEXT("install")) == 0) StrCpy(szCabName, TEXT("branding")); StrCat(szCabName, TEXT(".cab")); break; case CAB_TYPE_DESKTOP: StrCpy(szCabName, TEXT("desktop.cab")); break; case CAB_TYPE_CHANNELS: StrCpy(szCabName, TEXT("chnls.cab")); break; } DirectoryName(pcszInsFile, szCabFilePath); PathCombine(szCabFullFileName, szCabFilePath, szCabName); if (PathFileExists(szCabFullFileName)) return szCabFullFileName; else *szCabFullFileName = TEXT('\0'); return NULL; } void CabUpFolder(HWND hWnd, LPTSTR szFolderPath, LPTSTR szDestDir, LPTSTR szCabname, BOOL fSubDirs) { TCHAR szFrom[MAX_PATH]; TCHAR szCabPath[MAX_PATH]; TCHAR szDiamondParams[MAX_PATH * 2]; SHELLEXECUTEINFO shInfo; TCHAR szToolsFile[MAX_PATH]; DWORD dwCode; wsprintf(szCabPath, TEXT("%s\\%s"), szDestDir, szCabname); if (fSubDirs) wsprintf(szDiamondParams, TEXT("-p -r n \"%s\" *.*"), szCabPath); else wsprintf(szDiamondParams, TEXT("n \"%s\" *.*"), szCabPath); ZeroMemory(&shInfo, sizeof(shInfo)); shInfo.cbSize = sizeof(shInfo); shInfo.hwnd = hWnd; shInfo.fMask = SEE_MASK_NOCLOSEPROCESS; shInfo.lpVerb = TEXT("open"); wsprintf(szToolsFile, TEXT("%stools\\CABARC.EXE"), g_szRoot); shInfo.lpFile = szToolsFile; shInfo.lpParameters = szDiamondParams; shInfo.lpDirectory = szFolderPath; shInfo.nShow = SW_MINIMIZE; SetCurrentDirectory(szFolderPath); ShellExecuteEx(&shInfo); while (MsgWaitForMultipleObjects(1, &shInfo.hProcess, FALSE, INFINITE, QS_ALLINPUT) != WAIT_OBJECT_0) { MSG msg; while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } } GetExitCodeProcess(shInfo.hProcess, &dwCode); CloseHandle(shInfo.hProcess); if (g_dwPlatformId == PLATFORM_WIN32) { TCHAR szDest[MAX_PATH]; PathCombine(szToolsFile, g_szRoot, TEXT("tools\\signcode.exe")); PathCombine(szDest, szDestDir, TEXT("signcode.exe")); CopyFile(szToolsFile, szDest, FALSE); PathCombine(szToolsFile, g_szRoot, TEXT("tools\\signer.dll")); PathCombine(szDest, szDestDir, TEXT("signer.dll")); CopyFile(szToolsFile, szDest, FALSE); SignFile(szCabname, szDestDir, g_szInsFile, s_szUnsignedFiles); } SetCurrentDirectory(g_szRoot); } BOOL CompressCabFile() { TCHAR szCabFilePath[MAX_PATH]; TCHAR szCif[MAX_PATH]; TCHAR szDisplayName[MAX_PATH]; TCHAR szBaseInsFileName[_MAX_FNAME]; TCHAR szCabSrcFile[MAX_PATH]; TCHAR szCabDestFile[MAX_PATH]; TCHAR szType[8]; BOOL fUpdateInsVer = FALSE; DWORD dwSpaceReq, dwSpaceFree; ZeroMemory(szCif, sizeof(szCif)); ZeroMemory(szDisplayName, sizeof(szDisplayName)); DirectoryName(g_szFileName, szCabFilePath); GetBaseFileName(g_szFileName, szBaseInsFileName, ARRAYSIZE(szBaseInsFileName)); if(lstrcmpi(szBaseInsFileName, TEXT("install")) == 0) lstrcpy(szBaseInsFileName, TEXT("branding")); wsprintf(szCif, TEXT("%s\\%s.cif"), g_szCabTempDir, szBaseInsFileName); lstrcpy(szDisplayName, szBaseInsFileName); DeleteFileInDir(TEXT("*.cab"), g_szCabTempDir); //-------------------- Config if (*g_szConfigCabName != TEXT('\0') && !PathIsEmptyPath(g_szCabWorkDir)) { TCHAR szConfigDir[MAX_PATH]; PathCombine(szConfigDir, g_szCabWorkDir, TEXT("Config")); // before copying files to the config dir, clear the dir if there were old // files from a previous save. PathRemovePath(szConfigDir); CopyDir(g_szCabWorkDir, szConfigDir); if (!PathIsEmptyPath(szConfigDir)) { CabUpFolder(NULL, szConfigDir, g_szCabTempDir, TEXT("config.cab")); wsprintf(szCabSrcFile, TEXT("%s\\%s"), g_szCabTempDir, TEXT("config.cab")); wsprintf(szCabDestFile, TEXT("%s\\%s"), g_szCabTempDir, g_szConfigCabName); MoveFile(szCabSrcFile, szCabDestFile); } } //-------------------- Desktop if (*g_szDesktopCabName != TEXT('\0') && !PathIsEmptyPath(g_szDesktopDir, FILES_ONLY)) { CabUpFolder(NULL, g_szDesktopDir, g_szCabTempDir, TEXT("desktop.cab")); wsprintf(szCabSrcFile, TEXT("%s\\%s"), g_szCabTempDir, TEXT("desktop.cab")); wsprintf(szCabDestFile, TEXT("%s\\%s"), g_szCabTempDir, g_szDesktopCabName); MoveFile(szCabSrcFile, szCabDestFile); } // Check for disk space availability while (!EnoughDiskSpace(g_szCabTempDir, szCabFilePath, &dwSpaceReq, &dwSpaceFree)) { LPTSTR pMsg; int nResult; pMsg = FormatString(Res2Str(IDS_INSUFFICIENT_DISKSPACE), dwSpaceReq, dwSpaceFree); nResult = MessageBox(g_hMain, pMsg, Res2Str(IDS_TITLE), MB_ICONQUESTION | MB_YESNO); LocalFree(pMsg); if (nResult == IDNO) return FALSE; } //flush temp INS file InsFlushChanges(g_szInsFile); //-------------------- Ins file SetFileAttributes(g_szFileName, FILE_ATTRIBUTE_NORMAL); CopyFile(g_szInsFile, g_szFileName, FALSE); //-------------------- Config wsprintf(szCabSrcFile, TEXT("%s\\%s"), g_szCabTempDir, g_szConfigCabName); if (*g_szConfigCabName != TEXT('\0') && PathFileExists(szCabSrcFile)) { CopyFileToDir(szCabSrcFile, szCabFilePath); fUpdateInsVer = TRUE; SetOrClearVersionInfo(g_szFileName, CAB_TYPE_CONFIG, g_szConfigCabName, g_szCabsURLPath, g_szNewVersionStr, SET); } else SetOrClearVersionInfo(g_szFileName, CAB_TYPE_CONFIG, g_szConfigCabName, g_szCabsURLPath, g_szNewVersionStr, CLEAR); //-------------------- Desktop wsprintf(szCabSrcFile, TEXT("%s\\%s"), g_szCabTempDir, g_szDesktopCabName); if (*g_szDesktopCabName != TEXT('\0') && PathFileExists(szCabSrcFile)) { CopyFileToDir(szCabSrcFile, szCabFilePath); fUpdateInsVer = TRUE; SetOrClearVersionInfo(g_szFileName, CAB_TYPE_DESKTOP, g_szDesktopCabName, g_szCabsURLPath, g_szNewVersionStr, SET); } else SetOrClearVersionInfo(g_szFileName, CAB_TYPE_DESKTOP, g_szDesktopCabName, g_szCabsURLPath, g_szNewVersionStr, CLEAR); WritePrivateProfileString(BRANDING, CABSURLPATH, fUpdateInsVer ? g_szCabsURLPath : NULL, g_szFileName); WritePrivateProfileString(BRANDING, INSVERKEY, fUpdateInsVer ? g_szNewVersionStr : NULL, g_szFileName); WritePrivateProfileString(BRANDING, PMVERKEY, A2CT(VER_PRODUCTVERSION_STR), g_szFileName); //clear other keys so we're sure this is profmgr WritePrivateProfileString(BRANDING, GPVERKEY, NULL, g_szFileName); WritePrivateProfileString(BRANDING, IK_WIZVERSION, NULL, g_szFileName); // write the type as INTRANET so that the branding DLL extracts and processes the cabs in the CUSTOM dir wsprintf(szType, TEXT("%u"), INTRANET); WritePrivateProfileString(BRANDING, TEXT("Type"), szType, g_szFileName); SetForegroundWindow(g_hMain); if (g_dwPlatformId == PLATFORM_WIN32) { if (ISNONNULL(s_szUnsignedFiles)) { TCHAR szMessage[MAX_PATH*3]; TCHAR szMsg[64]; LoadString(g_hInst, IDS_CABSIGN_ERROR, szMsg, ARRAYSIZE(szMsg)); wsprintf(szMessage, szMsg, s_szUnsignedFiles); MessageBox(g_hMain, szMessage, TEXT(""), MB_OK | MB_SETFOREGROUND); ZeroMemory(s_szUnsignedFiles, sizeof(s_szUnsignedFiles)); } } InsFlushChanges(g_szFileName); return TRUE; } void DeleteCabWorkDirs() { if(*g_szCabWorkDir) { PathRemovePath(g_szCabWorkDir); ZeroMemory(g_szCabWorkDir, sizeof(g_szCabWorkDir)); } if(*g_szCabTempDir) { PathRemovePath(g_szCabTempDir); ZeroMemory(g_szCabTempDir, sizeof(g_szCabTempDir)); } } void CreateCabWorkDirs(LPCTSTR szWorkDir) { TCHAR szTempPath[MAX_PATH]; if(*g_szCabWorkDir) DeleteCabWorkDirs(); GetTempPath(ARRAYSIZE(szTempPath), szTempPath); wsprintf(g_szCabWorkDir, TEXT("%s%scabwrk"), szTempPath, szWorkDir); CreateDirectory(g_szCabWorkDir, NULL); PathCombine(g_szDesktopDir, g_szCabWorkDir, TEXT("desktop")); CreateDirectory(g_szDesktopDir, NULL); wsprintf(g_szCabTempDir, TEXT("%scabtmp"), szTempPath); CreateDirectory(g_szCabTempDir, NULL); } void CopyDir(LPCTSTR szSrcDir, LPCTSTR szDestDir) { WIN32_FIND_DATA wfdFind; HANDLE hFind; TCHAR szNewDir[MAX_PATH]; TCHAR szTemp[MAX_PATH]; TCHAR szTemp1[MAX_PATH]; wsprintf(szTemp, TEXT("%s\\*.*"), szSrcDir); hFind = FindFirstFile(szTemp, &wfdFind); if(hFind == INVALID_HANDLE_VALUE) return; CreateDirectory(szDestDir, NULL); do { if(!(wfdFind.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { wsprintf(szTemp, TEXT("%s\\%s"), szSrcDir, wfdFind.cFileName); wsprintf(szTemp1, TEXT("%s\\%s"), szDestDir, wfdFind.cFileName); SetFileAttributes(szTemp, FILE_ATTRIBUTE_NORMAL); CopyFile(szTemp, szTemp1, FALSE); } }while(FindNextFile(hFind, &wfdFind)); FindClose(hFind); } void GetLangDesc(LPTSTR szLangId, LPTSTR szLangDesc, int cchLangDescSize, LPDWORD dwLangId) { DWORD dwErr = 0; RFC1766INFO rInfo; LCID lcid; BOOL fDef = FALSE; LCID curLcid = GetUserDefaultLCID(); LPMULTILANGUAGE pMLang = NULL; TCHAR szLocale[MAX_PATH]; ZeroMemory(szLangDesc, cchLangDescSize * sizeof(TCHAR)); wsprintf(szLocale, TEXT("%sLocale.ini"), g_szRoot); GetPrivateProfileString(TEXT("Strings"), szLangId, TEXT(""), szLangDesc, cchLangDescSize, szLocale); CharLower(szLangId); dwErr = CoCreateInstance(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER, IID_IMultiLanguage, (void **) &pMLang); if(pMLang) { if((dwErr = GetLcid(&lcid, szLangId, szLocale)) == NOERROR) { if(*szLangDesc == 0) { dwErr = pMLang->GetRfc1766Info(lcid, &rInfo); #ifdef UNICODE StrCpyW(szLangDesc, rInfo.wszLocaleName); #else WideCharToMultiByte(CP_ACP, 0, rInfo.wszLocaleName, -1, szLangDesc, 32, TEXT(" "), &fDef); #endif } } else lcid = curLcid; pMLang->Release(); } *dwLangId = lcid; } INT_PTR CALLBACK LanguageDialogProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { WIN32_FIND_DATA wfdFind; HANDLE hFind; TCHAR szPolicyDir[MAX_PATH]; TCHAR szLangDir[10]; int nItems = 0; int nSelItem = -1; TCHAR szLangDesc[100]; LPTSTR pLangId = NULL; int nIndex = -1; TCHAR szMsg[MAX_PATH]; DWORD dwLangId = 0; typedef struct LangLocale { TCHAR szLang[10]; DWORD dwLang; } LANGID; static LANGID lang[NUMLANG]; switch(msg) { case WM_INITDIALOG: LoadString(g_hInst, IDS_LANGUAGE, szMsg, ARRAYSIZE(szMsg)); SetWindowText(hDlg, szMsg); // get the all the directories under the ieak\policies directory wsprintf(szPolicyDir, TEXT("%s\\iebin\\*.*"), g_szRoot); hFind = FindFirstFile(szPolicyDir, &wfdFind); if(hFind == INVALID_HANDLE_VALUE) { EndDialog(hDlg, 1); break; } ZeroMemory(lang, sizeof(LANGID) * NUMLANG); do { if(wfdFind.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // avoid the . and .. case if(StrCmp(wfdFind.cFileName, TEXT(".")) != 0 && StrCmp(wfdFind.cFileName, TEXT("..")) != 0) { GetLangDesc(wfdFind.cFileName, szLangDesc, ARRAYSIZE(szLangDesc), &dwLangId); if(*szLangDesc != TEXT('\0') && PlatformExists(hDlg, wfdFind.cFileName, PLATFORM_WIN32)) { nIndex = (int) SendMessage(GetDlgItem(hDlg, IDC_LANG), CB_ADDSTRING, 0, (LPARAM) (LPCTSTR) szLangDesc); if(nIndex != CB_ERR) { lstrcpy(lang[nIndex].szLang, wfdFind.cFileName); lang[nIndex].dwLang = dwLangId; } } } } }while(FindNextFile(hFind, &wfdFind)); FindClose(hFind); nItems = (int) SendMessage(GetDlgItem(hDlg, IDC_LANG), CB_GETCOUNT, 0, 0L); if(nItems == 0) { EndDialog(hDlg, 1); break; } else if(nItems == 1) { lstrcpy(g_szLanguage, lang[0].szLang); g_dwLanguage = lang[0].dwLang; EndDialog(hDlg, 1); break; } SendMessage(GetDlgItem(hDlg, IDC_LANG), CB_SETCURSEL, 0, 0L); EnableWindow(hDlg, TRUE); ShowWindow(hDlg, SW_SHOWNORMAL); break; case WM_COMMAND: if(HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDOK) { int nSelItem = (int) SendMessage(GetDlgItem(hDlg, IDC_LANG), CB_GETCURSEL, 0, 0L); if(nSelItem != CB_ERR) { lstrcpy(g_szLanguage, lang[nSelItem].szLang); g_dwLanguage = lang[nSelItem].dwLang; } EndDialog(hDlg, 1); } break; case WM_DESTROY: case WM_CLOSE: SendMessage(GetDlgItem(hDlg, IDC_LANG), CB_RESETCONTENT, 0, 0L); break; default: return 0; } return 1; } void PrepareFolderForCabbing(LPCTSTR pcszDestDir, DWORD dwFlags) { int i; for (i = 0; i < g_nDialogs; i++) if (g_pInsDialog[i].pfnFinalCopy != NULL) g_pInsDialog[i].pfnFinalCopy(pcszDestDir, dwFlags, NULL); } BOOL DoCompressCabFile(LPVOID lpVoid) { HWND hDlg = (HWND) lpVoid; BOOL fSuccess; fSuccess = CompressCabFile(); PostMessage(hDlg, UM_SAVE_COMPLETE, 0, (LPARAM)fSuccess); return TRUE; } INT_PTR CALLBACK DisplaySaveDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static HANDLE hIcon = NULL; static HANDLE hThread; DWORD dwThread; switch(msg) { case WM_INITDIALOG: SetWindowText(hDlg, Res2Str(IDS_TITLE)); Animate_Open( GetDlgItem( hDlg, IDC_ANIMATE ), IDA_GEARS ); Animate_Play( GetDlgItem( hDlg, IDC_ANIMATE ), 0, -1, -1 ); if((hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) DoCompressCabFile, (LPVOID) hDlg, 0, &dwThread)) == NULL) { int nResult = CompressCabFile(); EndDialog(hDlg, nResult); } break; case UM_SAVE_COMPLETE: EndDialog(hDlg, lParam); break; case WM_DESTROY: if (hThread != NULL) CloseHandle(hThread); if (hIcon != NULL) DestroyIcon((HICON) hIcon); break; default: return 0; } return 1; } DWORD GetCabBuildStatus() // This is a real hacky function. It checks whether the work dirs are empty or not and // returns the cabs that will be built. { DWORD dwCabsToBuild = 0; for (int nIndex = 0; nIndex < g_nDialogs; nIndex++) { if (g_pInsDialog[nIndex].pfnFinalCopy != NULL) g_pInsDialog[nIndex].pfnFinalCopy(g_szCabWorkDir, PM_CHECK, &dwCabsToBuild); } if (IsAdmDirty() || !PathIsEmptyPath(g_szCabWorkDir, FILES_ONLY)) SetFlag(&dwCabsToBuild, CAB_TYPE_CONFIG); if (!PathIsEmptyPath(g_szDesktopDir, FILES_ONLY)) SetFlag(&dwCabsToBuild, CAB_TYPE_DESKTOP); return dwCabsToBuild; } void GetDefaultInf(DWORD dwPlatformId) { switch(dwPlatformId) { case PLATFORM_WIN32: case PLATFORM_W2K: default: wsprintf(g_szDefInf, TEXT("%siebin\\%s\\Optional\\DefFav.inf"), g_szRoot, g_szLanguage); break; } } void GetDefaultCabName(DWORD dwCabType, LPCTSTR pcszPrefix, LPTSTR pszCabName) { TCHAR szActualPrefix[MAX_PATH]; if (pszCabName == NULL) return; *pszCabName = TEXT('\0'); if (pcszPrefix == NULL || *pcszPrefix == TEXT('\0')) return; if (StrChr(pcszPrefix, '.') != NULL) { lstrcpy(pszCabName, pcszPrefix); return; } lstrcpy(szActualPrefix, pcszPrefix); switch(dwCabType) { case CAB_TYPE_CONFIG: wsprintf(pszCabName, TEXT("%s_config.cab"), szActualPrefix); break; case CAB_TYPE_DESKTOP: wsprintf(pszCabName, TEXT("%s_desktop.cab"), szActualPrefix); break; } } BOOL InitializePlatform(HWND hWnd, HWND hInfoWnd, WORD wPlatform) { TCHAR szTemp[MAX_PATH]; HMENU hMenu = GetSubMenu(GetMenu(hWnd), 2); DWORD dwPlatformId; if (hMenu) { UINT nMenuState = GetMenuState(hMenu, wPlatform, MF_BYCOMMAND); if (nMenuState != 0xFFFFFFFF && (nMenuState & MF_CHECKED) == 0) // if not checked { TreeView.SetSel(g_hInsRootItem); if (TreeView.GetSel() != g_hInsRootItem) // error closing/saving the visible page return FALSE; if (wPlatform == IDM_PLATFORM_WIN32) dwPlatformId = PLATFORM_WIN32; else if (wPlatform == IDM_PLATFORM_W2K) dwPlatformId = PLATFORM_W2K; // check if the selected platform Optional cab is available for the language. if (!PlatformExists(hWnd, g_szLanguage, dwPlatformId)) { TCHAR szPlatformText[25], szLangDesc[200]; LPTSTR pMsg; DWORD dwLangId; if (dwPlatformId == PLATFORM_WIN32) StrCpy(szPlatformText, Res2Str(IDS_WIN32)); else if (dwPlatformId == PLATFORM_W2K) StrCpy(szPlatformText, Res2Str(IDS_W2K)); GetLangDesc(g_szLanguage, szLangDesc, ARRAYSIZE(szLangDesc), &dwLangId); pMsg = FormatString(Res2Str(IDS_NOPLATFORMDIR), szPlatformText, szLangDesc); MessageBox(hWnd, pMsg, Res2Str(IDS_TITLE), MB_ICONINFORMATION | MB_OK); LocalFree(pMsg); return FALSE; } CheckMenuItem(hMenu, IDM_PLATFORM_WIN32, MF_BYCOMMAND | MF_UNCHECKED); CheckMenuItem(hMenu, IDM_PLATFORM_W2K, MF_BYCOMMAND | MF_UNCHECKED); CheckMenuItem(hMenu, wPlatform, MF_BYCOMMAND | MF_CHECKED); g_dwPlatformId = dwPlatformId; GetDefaultInf(g_dwPlatformId); SetDefaultInf(g_szDefInf); TreeView.DeleteNodes(g_hInsRootItem); SetPlatformInfo(g_dwPlatformId); ReInitializeInsDialogProcs(); g_pInsDialog = GetInsDlgStruct(&g_nDialogs); DeleteADMItems(TreeView.GetHandle(), g_szCabWorkDir, g_szInsFile, TRUE); InitTreeView(TreeView.GetHandle(), hInfoWnd); } } return TRUE; } void IeakPageHelp(HWND hWnd, LPCTSTR pszData) { TCHAR szHelpPath[MAX_PATH]; PathCombine(szHelpPath, g_szRoot, TEXT("ieakhelp.chm")); g_hWndHelp = HtmlHelp(NULL, szHelpPath, HH_HELP_CONTEXT, (ULONG_PTR) pszData); SetForegroundWindow(g_hWndHelp); } void UpdateRecentFileListMenu(HWND hWnd, TCHAR pRecentFileList[5][MAX_PATH]) { HMENU hMenu; MENUITEMINFO mii; hMenu = GetSubMenu(GetMenu(hWnd), 0); // 0 is the position of the FILE menu int nMenuItems = GetMenuItemCount(hMenu); if (nMenuItems > 7) // 7 is the no. of menu items in the list excluding the recent file list items { // delete all the recent file list menu items including the seperator for (int nIndex = 0; nIndex < nMenuItems - 7; nIndex++) DeleteMenu(hMenu, 6, MF_BYPOSITION); // the recent file list items start at position 6 in the FILE menu } // add the recent file list menu items mii.cbSize = sizeof(MENUITEMINFO); for(int nIndex = 0; nIndex < 5; nIndex++) { if (*pRecentFileList[nIndex] != TEXT('\0')) { mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_DATA; mii.fType = MFT_STRING; mii.dwTypeData = pRecentFileList[nIndex]; mii.cch = StrLen(pRecentFileList[nIndex]); mii.wID = IDM_RECENTFILELIST + nIndex; InsertMenuItem(hMenu, 6 + nIndex, TRUE, &mii); } else break; } // add the seperator if menu items were added if (nIndex > 0) { mii.fMask = MIIM_ID | MIIM_TYPE; mii.fType = MFT_SEPARATOR; mii.wID = IDM_RECENTFILELIST + nIndex; InsertMenuItem(hMenu, 6 + nIndex, TRUE, &mii); } DrawMenuBar(hWnd); } void ReadRecentFileList(TCHAR pRecentFileList[5][MAX_PATH]) { HKEY hKey; TCHAR szValue[20]; DWORD dwType; TCHAR szData[MAX_PATH]; DWORD dwSize; ZeroMemory(pRecentFileList, sizeof(pRecentFileList[0]) * 5); if (RegOpenKeyEx(HKEY_CURRENT_USER, RK_IEAK_SERVER TEXT("\\ProfMgr"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) { // get the registry entries for (int nIndex = 1; nIndex < 6; nIndex++) { wsprintf(szValue, TEXT("RecentFile%d"), nIndex); dwSize = sizeof(szData); if (RegQueryValueEx(hKey, szValue, NULL, &dwType, (LPBYTE) szData, &dwSize) == ERROR_SUCCESS) StrCpy(pRecentFileList[nIndex - 1], szData); else break; } RegCloseKey(hKey); } } void UpdateRecentFileList(LPCTSTR pcszFile, BOOL fAdd, TCHAR pRecentFileList[5][MAX_PATH]) { HKEY hKey; TCHAR szValue[20]; DWORD dwType; DWORD dwSize; int nFilenamePos = -1; for (int nIndex = 0; nIndex < 5; nIndex++) { if (StrCmpI(pRecentFileList[nIndex], pcszFile) == 0) nFilenamePos = nIndex; } if (fAdd) { if (nFilenamePos > 0) { // if the filename exists in the list bring to the top for (nIndex = nFilenamePos; nIndex > 0; nIndex--) StrCpy(pRecentFileList[nIndex], pRecentFileList[nIndex - 1]); StrCpy(pRecentFileList[0], pcszFile); } else if (nFilenamePos == -1) { // move the list contents i.e., 1-4 to 2-5 for (nIndex = 3; nIndex >= 0; nIndex--) { if (*pRecentFileList[nIndex] != TEXT('\0')) StrCpy(pRecentFileList[nIndex + 1], pRecentFileList[nIndex]); } StrCpy(pRecentFileList[0], pcszFile); } } else { if (nFilenamePos >= 0) { for (nIndex = nFilenamePos; nIndex < 4; nIndex++) StrCpy(pRecentFileList[nIndex], pRecentFileList[nIndex + 1]); ZeroMemory(pRecentFileList[4], sizeof(pRecentFileList[4])); } } } void WriteRecentFileList(TCHAR pRecentFileList[5][MAX_PATH]) { HKEY hKey; TCHAR szValue[20]; DWORD dwDisposition; if (RegCreateKeyEx(HKEY_CURRENT_USER, RK_IEAK_SERVER TEXT("\\ProfMgr"), 0, TEXT(""), REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) { for (int nIndex = 0; nIndex < 5; nIndex++) { wsprintf(szValue, TEXT("RecentFile%d"), nIndex + 1); if (*pRecentFileList[nIndex] != TEXT('\0')) RegSetValueEx(hKey, szValue, 0, REG_SZ, (const BYTE *)pRecentFileList[nIndex], (StrLen(pRecentFileList[nIndex]) + 1) * sizeof(TCHAR)); else RegDeleteValue(hKey, szValue); } RegCloseKey(hKey); } } BOOL IsDirty() { return (InsDirty() || IsAdmDirty()); } void ClearDirtyFlag() { ClearInsDirtyFlag(); ResetAdmDirtyFlag(); } BOOL SaveCurrentSelItem(HWND hTreeView, DWORD dwFlags) { BOOL fRetVal = TRUE; HTREEITEM hItem = TreeView.GetSel(); HTREEITEM hParentItem = TreeView_GetParent(hTreeView, hItem); TVITEM tvitem; DWORD dwItemFlags = 0; if (hItem != NULL && hParentItem != NULL) { if (!IsPolicyTree(hItem)) { if (g_hDialog) { fRetVal = SaveInsDialog(g_hDialog, dwFlags); if (HasFlag(dwFlags, ITEM_DESTROY)) g_hDialog = NULL; } } else if (hParentItem != g_hPolicyRootItem) { tvitem.mask = TVIF_PARAM; tvitem.hItem = hItem; TreeView_GetItem(hTreeView, &tvitem); if (HasFlag(dwFlags, ITEM_CHECKDIRTY)) // for adm items checkitem for dirty dwFlags |= ITEM_SAVE; // is same as saveitem SaveADMItem(hTreeView, &tvitem, dwFlags); } } return fRetVal; } void SetInfoWindowText(HWND hInfoWnd, LPCTSTR pcszStatusText /*= NULL*/) { TCHAR szInfoText[MAX_PATH*2], szProfileState[MAX_PATH], szCabsUrlPath[MAX_PATH], szVersion[MAX_PATH], szDefaultStr[MAX_PATH], szStatusText[MAX_PATH], szCabsUrlPathText[MAX_PATH], szVersionText[MAX_PATH]; if (hInfoWnd == NULL) return; StrCpy(szDefaultStr, Res2Str(IDS_NOTAVAILABLE)); if (*g_szInsFile != TEXT('\0')) { if (IsDirty()) StrCpy(szProfileState, Res2Str(IDS_PROFILE_DIRTY)); else StrCpy(szProfileState, Res2Str(IDS_PROFILE_NOCHANGE)); if (*g_szFileName != TEXT('\0') && *g_szNewVersionStr != TEXT('\0')) StrCpy(szVersion, g_szNewVersionStr); else GetPrivateProfileString(BRANDING, INSVERKEY, szDefaultStr, szVersion, ARRAYSIZE(szVersion), g_szInsFile); } else { StrCpy(szProfileState, szDefaultStr); StrCpy(szVersion, szDefaultStr); } if (pcszStatusText != NULL && *pcszStatusText != TEXT('\0')) StrCpy(szProfileState, pcszStatusText); if (*g_szCabsURLPath == TEXT('\0')) StrCpy(szCabsUrlPath, szDefaultStr); else { if (StrLen(g_szCabsURLPath) > 80) // 80 is the max. characters that can be displayed. { StrCpyN(szCabsUrlPath, g_szCabsURLPath, 77); StrCat(szCabsUrlPath, TEXT("...")); } else #pragma prefast(suppress:202,"g_szCabsURLPath length is less than 80, dest. buffer is MAX_PATH") StrCpy(szCabsUrlPath, g_szCabsURLPath); } wsprintf(szStatusText, Res2Str(IDS_STATUS), szProfileState); wsprintf(szCabsUrlPathText, Res2Str(IDS_CABSURLPATH), szCabsUrlPath); wsprintf(szVersionText, Res2Str(IDS_VERSIONINFO), szVersion); wsprintf(szInfoText, TEXT("%s%s%s"), szStatusText, szCabsUrlPathText, szVersionText); SendMessage(hInfoWnd, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)szInfoText); } BOOL PlatformExists(HWND hWnd, LPTSTR pLang, DWORD dwPlatform, BOOL fShowError /*= FALSE*/) { WIN32_FIND_DATA wfdFind; HANDLE hFind; TCHAR szLangDir[MAX_PATH], szPlatform[10]; BOOL fRetVal = FALSE; // get the all the directories under the ieak\iebin\\Optional directory wsprintf(szLangDir, TEXT("%s\\iebin\\%s\\Optional"), g_szRoot, pLang); PathAppend(szLangDir, TEXT("deffav.inf")); if (PathFileExists(szLangDir)) fRetVal = TRUE; if (!fRetVal && fShowError) { TCHAR szPlatformText[25], szLangDesc[200]; LPTSTR pMsg; DWORD dwLangId; if (dwPlatform == PLATFORM_WIN32) StrCpy(szPlatformText, Res2Str(IDS_WIN32)); else if (dwPlatform == PLATFORM_W2K) StrCpy(szPlatformText, Res2Str(IDS_W2K)); GetLangDesc(g_szLanguage, szLangDesc, ARRAYSIZE(szLangDesc), &dwLangId); pMsg = FormatString(Res2Str(IDS_NOPLATFORMDIR), szPlatformText, szLangDesc); MessageBox(hWnd, pMsg, Res2Str(IDS_TITLE), MB_ICONINFORMATION | MB_OK); LocalFree(pMsg); } return fRetVal; } BOOL EnoughDiskSpace(LPCTSTR szSrcDir, LPCTSTR szDestDir, LPDWORD pdwSpaceReq, LPDWORD pdwSpaceFree) { TCHAR szDestFile[MAX_PATH]; DWORD dwFreeSpace = 0, dwFlags = 0, dwSrcSize = 0, dwDestSize = 0, dwSpaceReq = 0; if (!GetFreeDiskSpace(szDestDir, &dwFreeSpace, &dwFlags)) return TRUE; dwSrcSize = FileSize(g_szInsFile); dwDestSize = FileSize(g_szFileName); if (dwSrcSize > dwDestSize) { dwSpaceReq = dwSrcSize - dwDestSize; dwSpaceReq >>= 10; // divide by 1024 (we are interested in KBytes) dwSpaceReq++; } dwSpaceReq += FindSpaceRequired(szSrcDir, TEXT("*.cab"), szDestDir); if (dwSpaceReq) dwSpaceReq += 5; // 5K buffer to account for random stuff if (dwFlags & FS_VOL_IS_COMPRESSED) { // if the destination volume is compressed, the space free returned is only // a guesstimate; for example, if it's a DoubleSpace volume, the system thinks // that it can compress by 50% and so it reports the free space as (actual free space * 2) // it's better to be safe when dealing with compressed volumes; so bump up the space // requirement by a factor 2 dwSpaceReq <<= 1; // multiply by 2 } if (pdwSpaceReq != NULL) *pdwSpaceReq = dwSpaceReq; if (pdwSpaceFree != NULL) *pdwSpaceFree = dwFreeSpace; return dwFreeSpace > dwSpaceReq; } BOOL CabFilesExist(HWND hWnd, LPCTSTR pcszInsFile) { TCHAR szBrandingCab[MAX_PATH]; TCHAR szDesktopCab[MAX_PATH]; TCHAR szCabFailStr[MAX_PATH]; if (pcszInsFile == NULL || *pcszInsFile == TEXT('\0')) return FALSE; GetCabNameFromINS(pcszInsFile, CAB_TYPE_CONFIG, szBrandingCab); GetCabNameFromINS(pcszInsFile, CAB_TYPE_DESKTOP, szDesktopCab); *szCabFailStr = TEXT('\0'); if (*szBrandingCab != TEXT('\0') && !PathFileExists(szBrandingCab)) StrCpy(szCabFailStr, PathFindFileName(szBrandingCab)); if (*szDesktopCab != TEXT('\0') && !PathFileExists(szDesktopCab)) { if (*szCabFailStr != TEXT('\0')) StrCat(szCabFailStr, TEXT("\r\n")); StrCat(szCabFailStr, PathFindFileName(szDesktopCab)); } if (*szCabFailStr != TEXT('\0')) { LPTSTR pMsg = NULL; pMsg = FormatString(Res2Str(IDS_CAB_DOESNOTEXIST), pcszInsFile, szCabFailStr); MessageBox(hWnd, pMsg, Res2Str(IDS_TITLE), MB_ICONEXCLAMATION | MB_OK); LocalFree(pMsg); return FALSE; } return TRUE; } BOOL IsWin32INSFile(LPCTSTR pcszIns) { int nPlatformId = 0; TCHAR szTemp[MAX_PATH]; InsGetString(IS_BRANDING, TEXT("Platform"), szTemp, countof(szTemp), pcszIns); nPlatformId = StrToInt(szTemp); if (nPlatformId != 0 && nPlatformId != PLATFORM_WIN32 && nPlatformId != PLATFORM_W2K) { TCHAR szMsg[MAX_PATH+128]; wsprintf(szMsg, Res2Str(IDS_UNSUPPORTED_PLATFORM), pcszIns); MessageBox(g_hMain, szMsg, Res2Str(IDS_TITLE), MB_ICONINFORMATION | MB_OK); return FALSE; } else if (nPlatformId == 0) nPlatformId = PLATFORM_WIN32; return TRUE; }