/** * @brief WM_NOTIFY handler of Preview dialog. * @param hwnd - window handle. * @param idCtrl - identifier of the common control sending the message. * @param pnmh - pointer to an NMHDR structure that contains the notification code and additional information. */ static LRESULT PreviewDlg_OnNotify(HWND hwnd, int idCtrl, LPNMHDR pnmh) { switch (pnmh->code) { case LVN_ITEMCHANGED: { if (idCtrl != IDC_FILESLIST) break; LPNMLISTVIEW pnmv = (LPNMLISTVIEW)pnmh; if ((pnmv->uNewState & LVIS_SELECTED) != (pnmv->uOldState & LVIS_SELECTED)) { if (pnmv->uNewState & LVIS_SELECTED) { _ASSERTE(g_hFile == INVALID_HANDLE_VALUE && g_hBitmap == NULL); HWND hwndFileList = GetDlgItem(hwnd, IDC_FILESLIST); LVITEM lvi; ZeroMemory(&lvi, sizeof(lvi)); lvi.mask = LVIF_PARAM; lvi.iItem = pnmv->iItem; ListView_GetItem(hwndFileList, &lvi); FILE_ITEM_INFO* pFileItemInfo = (FILE_ITEM_INFO*)lvi.lParam; if (pFileItemInfo != NULL) { CWaitCursor wait(true); if (! OpenImageFile(hwnd, pFileItemInfo->szFileName)) OpenRegularFile(hwnd, pFileItemInfo->szFileName); } } else CloseViewPane(hwnd); } } break; case LVN_COLUMNCLICK: { if (idCtrl != IDC_FILESLIST) break; LPNMLISTVIEW pnmv = (LPNMLISTVIEW)pnmh; HWND hwndFileList = GetDlgItem(hwnd, IDC_FILESLIST); g_FilesListOrder.ToggleSortParams(hwndFileList, pnmv->iSubItem); LISTVIEW_SORT_PARAMS lvSortParams; lvSortParams.hwndList = hwndFileList; lvSortParams.iColumnNumber = pnmv->iSubItem; lvSortParams.bAscending = g_FilesListOrder.GetSortOrder(); switch (pnmv->iSubItem) { case CID_FILE_NAME: case CID_FILE_TYPE: lvSortParams.eCompareType = LISTVIEW_SORT_PARAMS::ICT_STRING; ListView_SortItemsEx(hwndFileList, &ListViewCompareFunc, (LPARAM)&lvSortParams); break; case CID_FILE_SIZE: lvSortParams.eCompareType = LISTVIEW_SORT_PARAMS::ICT_INTEGER; ListView_SortItems(hwndFileList, &FileSizeCompareFunc, (LPARAM)&lvSortParams); break; } } break; case TTN_GETDISPINFO: { LPTOOLTIPTEXT ptt = (LPTOOLTIPTEXT)pnmh; ptt->hinst = g_hInstance; ptt->uFlags |= TTF_DI_SETITEM; switch (ptt->hdr.idFrom) { case IDC_ZOOMIN: ptt->lpszText = MAKEINTRESOURCE(IDS_ZOOMIN); break; case IDC_ZOOMOUT: ptt->lpszText = MAKEINTRESOURCE(IDS_ZOOMOUT); break; case IDC_RESETSIZE: ptt->lpszText = MAKEINTRESOURCE(IDS_RESETSIZE); break; case IDC_FITIMAGE: ptt->lpszText = MAKEINTRESOURCE(IDS_FITIMAGE); break; } } break; } return FALSE; }
/** * @brief WM_NOTIFY handler of Machine State dialog. * @param hwnd - window handle. * @param idCtrl - identifier of the common control sending the message. * @param pnmh - pointer to an NMHDR structure that contains the notification code and additional information. */ static LRESULT MachineStateDlg_OnNotify(HWND hwnd, int idCtrl, LPNMHDR pnmh) { switch (pnmh->code) { case LVN_ITEMCHANGED: { if (idCtrl != IDC_PROCESS_LIST) break; LPNMLISTVIEW pnmv = (LPNMLISTVIEW)pnmh; if ((pnmv->uNewState & LVIS_SELECTED) != (pnmv->uOldState & LVIS_SELECTED)) { if (pnmv->uNewState & LVIS_SELECTED) { CWaitCursor wait(true); HWND hwndModuleList = GetDlgItem(hwnd, IDC_PROCESS_MODULES_LIST); SendMessage(hwndModuleList, WM_SETREDRAW, FALSE, 0); DisplayWaitBanner(hwndModuleList); LVITEM lvi; ZeroMemory(&lvi, sizeof(lvi)); lvi.mask = LVIF_TEXT; CEnumProcess::CModuleEntry module; if (g_pEnumProc->GetModuleFirst((DWORD)pnmv->lParam, module)) { int iItemPos = 0; do { lvi.iItem = iItemPos; lvi.pszText = module.m_szModuleName; ListView_InsertItem(hwndModuleList, &lvi); TCHAR szVersionString[64]; if (CSymEngine::GetVersionString(module.m_szModuleName, szVersionString, countof(szVersionString))) ListView_SetItemText(hwndModuleList, iItemPos, CID_MODULE_VERSION, szVersionString); TCHAR szTempBuf[32]; #if defined _WIN64 _stprintf_s(szTempBuf, countof(szTempBuf), _T("%016X"), (DWORD_PTR)module.m_pLoadBase); #elif defined _WIN32 _stprintf_s(szTempBuf, countof(szTempBuf), _T("%08X"), (DWORD_PTR)module.m_pLoadBase); #endif ListView_SetItemText(hwndModuleList, iItemPos, CID_MODULE_BASE, szTempBuf); ++iItemPos; } while (g_pEnumProc->GetModuleNext((DWORD)pnmv->lParam, module)); } else { TCHAR szMessage[100]; LoadString(g_hInstance, IDS_ERROR_NOT_AVAILABLE, szMessage, countof(szMessage)); lvi.iItem = 0; lvi.pszText = szMessage; ListView_InsertItem(hwndModuleList, &lvi); } SendMessage(hwndModuleList, WM_SETREDRAW, TRUE, 0); InvalidateRect(hwndModuleList, NULL, TRUE); } else { HWND hwndModuleList = GetDlgItem(hwnd, IDC_PROCESS_MODULES_LIST); ListView_DeleteAllItems(hwndModuleList); } } } break; case LVN_COLUMNCLICK: { LPNMLISTVIEW pnmv = (LPNMLISTVIEW)pnmh; if (idCtrl == IDC_PROCESS_LIST) { HWND hwndProcessList = GetDlgItem(hwnd, IDC_PROCESS_LIST); g_ProcessListOrder.ToggleSortParams(hwndProcessList, pnmv->iSubItem); LISTVIEW_SORT_PARAMS lvSortParams; lvSortParams.hwndList = hwndProcessList; lvSortParams.iColumnNumber = pnmv->iSubItem; lvSortParams.bAscending = g_ProcessListOrder.GetSortOrder(); switch (pnmv->iSubItem) { case CID_PROCESS_ID: lvSortParams.eCompareType = LISTVIEW_SORT_PARAMS::ICT_INTEGER; break; case CID_PROCESS_NAME: lvSortParams.eCompareType = LISTVIEW_SORT_PARAMS::ICT_STRING; break; } ListView_SortItemsEx(hwndProcessList, &ListViewCompareFunc, (LPARAM)&lvSortParams); } else if (idCtrl == IDC_PROCESS_MODULES_LIST) { HWND hwndModuleList = GetDlgItem(hwnd, IDC_PROCESS_MODULES_LIST); g_ModulesListOrder.ToggleSortParams(hwndModuleList, pnmv->iSubItem); LISTVIEW_SORT_PARAMS lvSortParams; lvSortParams.hwndList = hwndModuleList; lvSortParams.iColumnNumber = pnmv->iSubItem; lvSortParams.bAscending = g_ModulesListOrder.GetSortOrder(); switch (pnmv->iSubItem) { case CID_MODULE_NAME: case CID_MODULE_VERSION: lvSortParams.eCompareType = LISTVIEW_SORT_PARAMS::ICT_STRING; break; case CID_MODULE_BASE: lvSortParams.eCompareType = LISTVIEW_SORT_PARAMS::ICT_HEXADECIMAL; break; } ListView_SortItemsEx(hwndModuleList, &ListViewCompareFunc, (LPARAM)&lvSortParams); } } break; } return FALSE; }