ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

windows 驱动实例分析系列: HidHide驱动分析-HidHideClient 篇(中)

windows 驱动实例分析系列: HidHide驱动分析-HidHideClient 篇(中) HidHide 驱动分析 - HidHideClient 篇中白名单对话框WhitelistDlg一、白名单对话框的功能定位CWhitelistDlg是主对话框中的应用标签页负责管理白名单Whitelist——即允许访问隐藏设备的应用程序列表。用户可以通过插入按钮选择可执行文件或直接通过拖放Drag Drop将.exe、.com、.bin文件拖入列表从而实现快速添加。该对话框同时提供删除按钮移除选中条目以及反转白名单复选框用于切换逻辑模式。二、类结构与成员变量classCWhitelistDlg:publicCDialogEx,publicHidHide::IDropTarget{CHidHideClientDlgm_HidHideClientDlg;// 父对话框引用HidHide::FullImageNames m_DropTargetFullImageNames;// 拖放时缓存的路径列表CListBox m_Whitelist;// 显示白名单的列表框CStatic m_Guidance;// 提示标签CButton m_Insert;// 插入按钮CButton m_Delete;// 删除按钮CButton m_Inverse;// 反转复选框// 方法OnDragEnter, OnDragOver, OnDropEx, OnBnClicked... 等};HidHide::FullImageNames是std::setstd::filesystem::path的类型别名确保白名单中无重复条目。三、初始化与资源加载OnInitDialogm_Guidance.SetWindowTextW(HidHide::StringTable(IDS_STATIC_WHITELIST_GUIDANCE).c_str());m_Insert.SetWindowTextW(HidHide::StringTable(IDS_BUTTON_WHITELIST_INSERT).c_str());m_Delete.SetWindowTextW(HidHide::StringTable(IDS_BUTTON_WHITELIST_DELETE).c_str());m_Inverse.SetWindowTextW(HidHide::StringTable(IDS_CHECK_WHITELIST_INVERSE).c_str());m_Inverse.SetCheck(FilterDriverProxy().GetInverse()?BST_CHECKED:BST_UNCHECKED);所有标签从字符串表资源加载支持本地化。反转复选框的初始状态从驱动读取保持与内核一致。四、列表内容的刷新Refresh 与 OnUserMessageRefresh由于设备或进程状态可能动态变化如白名单被外部程序修改Refresh方法通过PostMessage(WM_USER_CM_NOTIFICATION_REFRESH)异步刷新 UI避免在敏感的窗口消息处理中阻塞。OnUserMessageRefresh执行实际刷新逻辑m_Whitelist.ResetContent();m_Whitelist.SetSel(-1,FALSE);for(autoconstfullImageName:FilterDriverProxy().GetWhitelist()){autoconstindexm_Whitelist.AddString(fullImageName.c_str());// 检查文件是否存在若不存在则高亮选中提示用户autoconstexistsstd::filesystem::exists(HidHide::FullImageNameToFileName(fullImageName));if(!exists)m_Whitelist.SetSel(index,TRUE);}m_Whitelist.SetFocus();高亮不存在的文件条目帮助用户识别已失效的应用路径及时清理。五、插入操作OnBnClickedButtonWhitelistInsert清除当前列表框的选择状态。使用CFileDialog打开文件选择对话框过滤条件为可执行文件.exe, .com, .bin。用户选择文件后通过HidHide::FileNameToFullImageName将逻辑盘符路径转换为 NT 设备路径如\Device\HarddiskVolume1\...这是驱动白名单所需的格式。遍历现有列表防止重复添加。调用m_Whitelist.AddString添加到列表框并通过FilterDriverProxy().SetWhitelist(ListBoxToPathSet(m_Whitelist))同步到驱动。关键函数FileNameToFullImageName的实现原理通过GetVolumeNameForVolumeMountPoint和QueryDosDeviceW建立逻辑盘符到设备名称的映射拼接出完整设备路径。这确保了即使盘符在重启后改变白名单依然能精准匹配。六、删除操作OnBnClickedButtonWhitelistDelete调用m_Whitelist.GetSelCount()获取选中的条目数量并通过GetSelItems获取所有选中索引。从后往前遍历索引逐个调用DeleteString删除从后往前避免索引变化影响。更新后的列表通过SetWhitelist同步到驱动。七、拖放支持IDropTarget 接口实现7.1 OnDragEnter准入判断当用户拖拽文件进入窗口时OnDragEnter首先提取拖拽的文件列表通过HidHide::DragTargetFileNames(pDataObject)然后遍历检查文件扩展名是否为.exe、.com或.bin。文件是否能成功转换为全路径FileNameToFullImageName非空。若全部满足则将转换后的路径存入m_DropTargetFullImageNames并返回DROPEFFECT_COPY否则返回DROPEFFECT_NONE阻止拖放。7.2 OnDragOver实时反馈在拖拽过程中OnDragOver检查鼠标位置是否位于列表框区域内MousePointerAtWhitelist同时确认按键状态符合复制操作左键 无 Ctrl/Shift/Alt。只有满足条件时才显示可放置光标提供清晰的交互反馈。7.3 OnDropEx执行放置当用户释放鼠标时OnDropEx执行最终添加逻辑autodirtyfalse;autowhitelistFilterDriverProxy().GetWhitelist();for(autoconstfullImageName:m_DropTargetFullImageNames){if(whitelist.emplace(fullImageName).second)dirtytrue;}if(dirty){FilterDriverProxy().SetWhitelist(whitelist);Refresh();}returnDROPEFFECT_COPY;利用std::set::emplace的返回值判断是否新增了条目避免不必要的驱动写入。八、反转复选框OnBnClickedCheckInverseFilterDriverProxy().SetInverse(0!(m_Inverse.GetCheck()BST_CHECKED));立即将反转状态同步到驱动无需重启。九、错误处理与异常安全所有 UI 操作均被try-catch包裹在消息响应函数中由 MFC 顶层捕获但代码中显式使用THROW_WIN32抛出异常信息通过全局异常处理机制向用户展示。列表框操作如AddString若返回LB_ERR或LB_ERRSPACE会抛出异常避免静默失败。
返回列表