/* * FindDlgHandleNotify * * Purpose: * * WM_NOTIFY processing for FindDlg listview. * */ VOID FindDlgHandleNotify( LPNMLISTVIEW nhdr ) { INT c, k; LPWSTR lpItemText; LVCOLUMN col; if (nhdr == NULL) return; if (nhdr->hdr.idFrom != ID_SEARCH_LIST) return; switch (nhdr->hdr.code) { case LVN_ITEMCHANGED: if (!(nhdr->uNewState & LVIS_SELECTED)) break; lpItemText = supGetItemText(nhdr->hdr.hwndFrom, nhdr->iItem, 0, NULL); if (lpItemText) { ListToObject(lpItemText); HeapFree(GetProcessHeap(), 0, lpItemText); } break; case LVN_COLUMNCLICK: bFindDlgSortInverse = !bFindDlgSortInverse; FindDlgSortColumn = ((NMLISTVIEW *)nhdr)->iSubItem; ListView_SortItemsEx(FindDlgList, &FindDlgCompareFunc, FindDlgSortColumn); RtlSecureZeroMemory(&col, sizeof(col)); col.mask = LVCF_IMAGE; col.iImage = -1; for (c = 0; c < 2; c++) ListView_SetColumn(FindDlgList, c, &col); k = ImageList_GetImageCount(ListViewImages); if (bFindDlgSortInverse) col.iImage = k - 2; else col.iImage = k - 1; ListView_SetColumn(FindDlgList, ((NMLISTVIEW *)nhdr)->iSubItem, &col); break; default: break; } }
/* * 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); }
/* * MainWindowHandleWMCommand * * Purpose: * * Main window WM_COMMAND handler. * */ LRESULT MainWindowHandleWMCommand( _In_ HWND hwnd, _In_ WPARAM wParam, _In_ LPARAM lParam ) { LPWSTR lpItemText; HWND hwndFocus; UNREFERENCED_PARAMETER(lParam); switch (LOWORD(wParam)) { case ID_FILE_RUNASADMIN: supRunAsAdmin(); break; case ID_FILE_EXIT: PostQuitMessage(0); break; case ID_OBJECT_PROPERTIES: hwndFocus = GetFocus(); if (hwndFocus == g_hwndObjectList) { MainWindowHandleObjectListProp(hwnd); } if (hwndFocus == g_hwndObjectTree) { MainWindowHandleObjectTreeProp(hwnd); } break; case ID_OBJECT_GOTOLINKTARGET: lpItemText = supGetItemText(g_hwndObjectList, ListView_GetSelectionMark(g_hwndObjectList), 2, NULL); if (lpItemText) { if (_strcmpi(lpItemText, L"\\??") == 0) { ListToObject(L"\\GLOBAL??"); } else { ListToObject(lpItemText); } supHeapFree(lpItemText); } else { lpItemText = supGetItemText(g_hwndObjectList, ListView_GetSelectionMark(g_hwndObjectList), 0, NULL); if (lpItemText) { if ((_strcmpi(lpItemText, L"GLOBALROOT") == 0) && (_strcmpi(g_WinObj.CurrentObjectPath, L"\\GLOBAL??") == 0)) { ListToObject(L"\\"); } supHeapFree(lpItemText); } } break; case ID_FIND_FINDOBJECT: FindDlgCreate(hwnd); break; case ID_VIEW_REFRESH: MainWindowOnRefresh(hwnd); break; //Extras -> Pipes case ID_EXTRAS_PIPES: extrasShowPipeDialog(hwnd); break; //Extras -> Mailslots case ID_EXTRAS_MAILSLOTS: extrasShowMailslotsDialog(hwnd); break; //Extras -> UserSharedData case ID_EXTRAS_USERSHAREDDATA: extrasShowUserSharedDataDialog(hwnd); break; //Extras -> Private Namespaces case ID_EXTRAS_PRIVATENAMESPACES: if (g_WinObj.osver.dwBuildNumber <= 10240) { //feature require driver usage if (g_kdctx.hDevice != NULL) { extrasShowPrivateNamespacesDialog(hwnd); } } break; //Extras -> KiServiceTable case ID_EXTRAS_SSDT: //feature require driver usage #ifndef _DEBUG if (g_kdctx.hDevice != NULL) { #endif extrasShowSSDTDialog(hwnd); #ifndef _DEBUG } #endif break; //Extras -> Drivers case ID_EXTRAS_DRIVERS: extrasShowDriversDialog(hwnd); break; case ID_HELP_ABOUT: DialogBoxParam(g_WinObj.hInstance, MAKEINTRESOURCE(IDD_DIALOG_ABOUT), hwnd, (DLGPROC)&AboutDialogProc, 0); break; case ID_HELP_HELP: supShowHelp(); break; default: break; } return FALSE; }
/* * MainWindowHandleWMCommand * * Purpose: * * Main window WM_COMMAND handler. * */ LRESULT MainWindowHandleWMCommand( _In_ HWND hwnd, _In_ WPARAM wParam, _In_ LPARAM lParam ) { LPWSTR lpItemText; HWND hwndFocus; UNREFERENCED_PARAMETER(lParam); switch (LOWORD(wParam)) { case ID_FILE_RUNASADMIN: supRunAsAdmin(); break; case ID_FILE_EXIT: PostQuitMessage(0); break; case ID_OBJECT_PROPERTIES: hwndFocus = GetFocus(); if (hwndFocus == ObjectList) { MainWindowHandleObjectListProp(hwnd); } if (hwndFocus == ObjectTree) { MainWindowHandleObjectTreeProp(hwnd); } break; case ID_OBJECT_GOTOLINKTARGET: lpItemText = supGetItemText(ObjectList, ListView_GetSelectionMark(ObjectList), 2, NULL); if (lpItemText) { if (_strcmpi(lpItemText, L"\\??") == 0) { ListToObject(L"\\GLOBAL??"); } else { ListToObject(lpItemText); } HeapFree(GetProcessHeap(), 0, lpItemText); } else { lpItemText = supGetItemText(ObjectList, ListView_GetSelectionMark(ObjectList), 0, NULL); if (lpItemText) { if ( (_strcmpi(lpItemText, L"GLOBALROOT") == 0) && (_strcmpi(CurrentObjectPath, L"\\GLOBAL??") == 0) ) { ListToObject(L"\\"); } HeapFree(GetProcessHeap(), 0, lpItemText); } } break; case ID_FIND_FINDOBJECT: FindDlgCreate(hwnd); break; case ID_VIEW_REFRESH: MainWindowOnRefresh(hwnd); break; case ID_EXTRAS_PIPES: extrasShowPipeDialog(hwnd); break; case ID_EXTRAS_USERSHAREDDATA: extrasShowUserSharedDataDialog(hwnd); break; case ID_EXTRAS_PRIVATENAMESPACES: extrasShowPrivateNamespacesDialog(hwnd); break; case ID_HELP_ABOUT: DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_DIALOG_ABOUT), hwnd, (DLGPROC)&AboutDialogProc, 0); break; case ID_HELP_HELP: supShowHelp(); break; default: break; } return FALSE; }