/* * MainWindowOnRefresh * * Purpose: * * Main Window Refresh handler. * */ VOID MainWindowOnRefresh( _In_ HWND hwnd ) { LPWSTR CurrentObject; SIZE_T len; UNREFERENCED_PARAMETER(hwnd); supSetWaitCursor(TRUE); if (g_kdctx.hDevice != NULL) { ObListDestroy(&g_kdctx.ObjectList); if (g_kdctx.hThreadWorker) { WaitForSingleObject(g_kdctx.hThreadWorker, INFINITE); CloseHandle(g_kdctx.hThreadWorker); g_kdctx.hThreadWorker = NULL; } //query object list info g_kdctx.hThreadWorker = CreateThread(NULL, 0, kdQueryProc, &g_kdctx, 0, NULL); } supFreeSCMSnapshot(g_enumParams.scmSnapshot); sapiFreeSnapshot(g_enumParams.sapiDB); RtlSecureZeroMemory(&g_enumParams, sizeof(g_enumParams)); g_enumParams.scmSnapshot = supCreateSCMSnapshot(&g_enumParams.scmNumberOfEntries); g_enumParams.sapiDB = sapiCreateSetupDBSnapshot(); g_enumParams.lpSubDirName = CurrentObjectPath; len = _strlen(CurrentObjectPath); CurrentObject = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (len + 1)*sizeof(WCHAR)); if (CurrentObject) _strcpy(CurrentObject, CurrentObjectPath); TreeView_DeleteAllItems(ObjectTree); ListObjectDirectoryTree(L"\\", NULL, NULL); TreeView_SelectItem(ObjectTree, TreeView_GetRoot(ObjectTree)); if (CurrentObject) { ListToObject(CurrentObject); HeapFree(GetProcessHeap(), 0, CurrentObject); } supSetWaitCursor(FALSE); }
/* * MainWindowOnRefresh * * Purpose: * * Main Window Refresh handler. * */ VOID MainWindowOnRefresh( _In_ HWND hwnd ) { LPWSTR CurrentPath = NULL; SIZE_T len; UNREFERENCED_PARAMETER(hwnd); supSetWaitCursor(TRUE); if (g_kdctx.hDevice != NULL) { ObListDestroy(&g_kdctx.ObjectList); if (g_kdctx.hThreadWorker) { WaitForSingleObject(g_kdctx.hThreadWorker, INFINITE); CloseHandle(g_kdctx.hThreadWorker); g_kdctx.hThreadWorker = NULL; } //query object list info g_kdctx.hThreadWorker = CreateThread(NULL, 0, kdQueryProc, &g_kdctx, 0, NULL); } supFreeSCMSnapshot(); sapiFreeSnapshot(); supCreateSCMSnapshot(); sapiCreateSetupDBSnapshot(); len = _strlen(g_WinObj.CurrentObjectPath); CurrentPath = supHeapAlloc((len + 1) * sizeof(WCHAR)); if (CurrentPath) _strcpy(CurrentPath, g_WinObj.CurrentObjectPath); TreeView_DeleteAllItems(g_hwndObjectTree); ListObjectDirectoryTree(L"\\", NULL, NULL); TreeView_SelectItem(g_hwndObjectTree, TreeView_GetRoot(g_hwndObjectTree)); if (CurrentPath) { ListToObject(CurrentPath); supHeapFree(CurrentPath); } supSetWaitCursor(FALSE); }
/* * MainWindowHandleWMNotify * * Purpose: * * Main window WM_NOTIFY handler. * */ LRESULT MainWindowHandleWMNotify( _In_ HWND hwnd, _In_ WPARAM wParam, _In_ LPARAM lParam ) { INT c, k; LPNMHDR hdr = (LPNMHDR)lParam; LPTOOLTIPTEXT lpttt; LPNMLISTVIEW lvn; LPNMTREEVIEW lpnmTreeView; LPWSTR str; SIZE_T lcp; LVITEM lvitem; LVCOLUMN col; TVHITTESTINFO hti; POINT pt; WCHAR item_string[MAX_PATH + 1]; UNREFERENCED_PARAMETER(wParam); if (hdr) { if (hdr->hwndFrom == g_hwndObjectTree) { switch (hdr->code) { case TVN_ITEMEXPANDED: case TVN_SELCHANGED: SetFocus(g_hwndObjectTree); supSetWaitCursor(TRUE); MainWindowTreeViewSelChanged((LPNMTREEVIEWW)lParam); SendMessage(hwndStatusBar, WM_SETTEXT, 0, (LPARAM)g_WinObj.CurrentObjectPath); ListObjectsInDirectory(g_WinObj.CurrentObjectPath); ListView_SortItemsEx(g_hwndObjectList, &MainWindowObjectListCompareFunc, SortColumn); supSetWaitCursor(FALSE); lpnmTreeView = (LPNMTREEVIEW)lParam; if (lpnmTreeView) { SelectedTreeItem = lpnmTreeView->itemNew.hItem; } break; case NM_RCLICK: GetCursorPos(&pt); hti.pt = pt; ScreenToClient(hdr->hwndFrom, &hti.pt); if (TreeView_HitTest(hdr->hwndFrom, &hti) && (hti.flags & (TVHT_ONITEM | TVHT_ONITEMRIGHT))) { SelectedTreeItem = hti.hItem; TreeView_SelectItem(g_hwndObjectTree, SelectedTreeItem); SendMessage(hwndStatusBar, WM_SETTEXT, 0, (LPARAM)g_WinObj.CurrentObjectPath); supHandleTreePopupMenu(hwnd, &pt); } break; } } if (hdr->hwndFrom == g_hwndObjectList) { switch (hdr->code) { case NM_SETFOCUS: if (ListView_GetSelectionMark(g_hwndObjectList) == -1) { lvitem.mask = LVIF_STATE; lvitem.iItem = 0; lvitem.state = LVIS_SELECTED | LVIS_FOCUSED; lvitem.stateMask = LVIS_SELECTED | LVIS_FOCUSED; ListView_SetItem(g_hwndObjectList, &lvitem); } break; case LVN_ITEMCHANGED: lvn = (LPNMLISTVIEW)lParam; RtlSecureZeroMemory(&item_string, sizeof(item_string)); ListView_GetItemText(g_hwndObjectList, lvn->iItem, 0, item_string, MAX_PATH); lcp = _strlen(g_WinObj.CurrentObjectPath); if (lcp) { str = supHeapAlloc((lcp + sizeof(item_string) + 4) * sizeof(WCHAR)); if (str == NULL) break; _strcpy(str, g_WinObj.CurrentObjectPath); if ((str[0] == '\\') && (str[1] == 0)) { _strcpy(str + lcp, item_string); } else { str[lcp] = '\\'; _strcpy(str + lcp + 1, item_string); } SendMessage(hwndStatusBar, WM_SETTEXT, 0, (LPARAM)str); supHeapFree(str); } break; //handle sort by column case LVN_COLUMNCLICK: bMainWndSortInverse = !bMainWndSortInverse; SortColumn = ((NMLISTVIEW *)lParam)->iSubItem; ListView_SortItemsEx(g_hwndObjectList, &MainWindowObjectListCompareFunc, SortColumn); RtlSecureZeroMemory(&col, sizeof(col)); col.mask = LVCF_IMAGE; col.iImage = -1; for (c = 0; c < 3; c++) ListView_SetColumn(g_hwndObjectList, c, &col); k = ImageList_GetImageCount(g_ListViewImages); if (bMainWndSortInverse) col.iImage = k - 2; else col.iImage = k - 1; ListView_SetColumn(g_hwndObjectList, ((NMLISTVIEW *)lParam)->iSubItem, &col); break; case NM_DBLCLK: MainWindowHandleObjectListProp(hwnd); break; default: break; } } //handle tooltip if (hdr->code == TTN_GETDISPINFO) { lpttt = (LPTOOLTIPTEXT)lParam; switch (lpttt->hdr.idFrom) { case ID_OBJECT_PROPERTIES: case ID_VIEW_REFRESH: case ID_FIND_FINDOBJECT: lpttt->hinst = g_WinObj.hInstance; lpttt->lpszText = MAKEINTRESOURCE(lpttt->hdr.idFrom); lpttt->uFlags |= TTF_DI_SETITEM; break; default: break; } } } return FALSE; }
/* * FindDlgProc * * Purpose: * * Find Dialog window procedure. * */ INT_PTR CALLBACK FindDlgProc( _In_ HWND hwndDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) { WCHAR search_string[MAX_PATH + 1], type_name[MAX_PATH + 1]; LPWSTR pnamestr = (LPWSTR)search_string, ptypestr = (LPWSTR)type_name; PFO_LIST_ITEM flist, plist; ULONG cci; LPNMLISTVIEW nhdr = (LPNMLISTVIEW)lParam; switch (uMsg) { case WM_NOTIFY: FindDlgHandleNotify(nhdr); break; case WM_GETMINMAXINFO: if (lParam) { ((PMINMAXINFO)lParam)->ptMinTrackSize.x = 548; ((PMINMAXINFO)lParam)->ptMinTrackSize.y = 230; } break; case WM_INITDIALOG: supCenterWindow(hwndDlg); FindDlgResize(hwndDlg); break; case WM_SIZE: FindDlgResize(hwndDlg); break; case WM_CLOSE: if (FindDlgGrip) DestroyWindow(FindDlgGrip); DestroyWindow(hwndDlg); FindDialog = NULL; g_wobjDialogs[WOBJ_FINDDLG_IDX] = NULL; return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDCANCEL) { SendMessage(hwndDlg, WM_CLOSE, 0, 0); return TRUE; } if (LOWORD(wParam) == ID_SEARCH_FIND) { supSetWaitCursor(TRUE); EnableWindow(GetDlgItem(hwndDlg, ID_SEARCH_FIND), FALSE); ListView_DeleteAllItems(FindDlgList); RtlSecureZeroMemory(&search_string, sizeof(search_string)); RtlSecureZeroMemory(&type_name, sizeof(type_name)); SendMessageW(GetDlgItem(hwndDlg, ID_SEARCH_NAME), WM_GETTEXT, MAX_PATH, (LPARAM)&search_string); SendMessageW(GetDlgItem(hwndDlg, ID_SEARCH_TYPE), WM_GETTEXT, MAX_PATH, (LPARAM)&type_name); flist = NULL; if (search_string[0] == 0) pnamestr = NULL; if (type_name[0] == '*') ptypestr = 0; FindObject(L"\\", pnamestr, ptypestr, &flist); cci = 0; while (flist != NULL) { FindDlgAddListItem(FindDlgList, flist->ObjectName, flist->ObjectType); plist = flist->Prev; HeapFree(GetProcessHeap(), 0, flist); flist = plist; cci++; } ultostr(cci, search_string); _strcat(search_string, L" Object(s) found"); SendMessageW(GetDlgItem(hwndDlg, ID_SEARCH_GROUPBOX), WM_SETTEXT, 0, (LPARAM)search_string); ListView_SortItemsEx(FindDlgList, &FindDlgCompareFunc, FindDlgSortColumn); supSetWaitCursor(FALSE); EnableWindow(GetDlgItem(hwndDlg, ID_SEARCH_FIND), TRUE); } break; } return FALSE; }