win7及以上系统C++实现Hook explorer文件级监控复制、剪切和删除操作

2023-10-29

最近项目组需要实现一个对windows用户文件操作进行监控的功能,(也就是使用explorer资源管理器的操作),于是乎我就想到了使用Hook的方法进行拦截,查找一番资料后发现XP调用的是最简单的CopyFileEx, MoveFileWithProgressW, ReplaceFileW之类的API,所以XP是最好解决的,但是到了Vista及以后的系统中,微软采用了一种新的方法——com组件里的IID_IFileOperation接口类。这样的话就有点麻烦了,但是资料中也有人实现了对com组件的HOOK,是通过修改从com组件的虚表从而实现挂钩。因此,我也尝试了一下这种方法,就是Hook IFileOperation中的CopyItems/MoveItems/DeleteItem等接口从而实现对文件操作的监控。具体方法就下面给出。使用这种方法的过程中,我发现了一些问题,以至于我无法完全套用这种方法。问题如下:

  1. 通过Hook以上接口无法达到文件级的监控,就是说如果我选择了一个文件夹,然后对它进行复制或者剪切操作,则获取到的文件操作信息只有这个文件夹的路径和目的路径,至于文件夹里有什么,是否有套层,无从得知。PS:这个接口里是有个单数形式的CopyItem/MoveItem/DeleteItem的系列接口API,但是无论我怎么Hook他们,都不会被触发,也许是我使用的方法不对把,或者这几个API根本没有被调用。
  2. 通过以上接口我只能得到用户有该操作的意向,如果用户在过程中点击了取消,或者操作根本没有成功,我无从得知详情。
  3. 当遇到有文件名重复后得到新文件名时,我无法获取到准确的新文件名,因为接口所给的只有源路径和目的目录的路径(新文件路径还得我自己拚...),并没有更加详细的信息可以供我使用。

由于以上几种原因,我无法通过上述方法实现我想要的功能,所以我开始另辟蹊径,我认为windows应该还有更详细更底层一点的接口可以供我使用,经过多天的查找和尝试,我终于找到了一个符合我需求的接口IFileOperationProgressSink。

对于这个接口的描述我给出微软的说明:

Exposes methods that provide a rich notification system used by callers of IFileOperation to monitor the details of the operations they are performing through that interface.

意思应该是说这个接口是用来响应IFileOperation的各种操作和消息的,还能得到更为详细的操作信息。而在这个接口类中,有着许多我寻找了许久的API,比如PreCopyItem/PreMoveItem/PreDeleteItem以及PostCopyItem/PostMoveItem等等系列API,并且根据微软官方的说明,Pre前缀系列的API是指在操作进行前的消息处理,Post前缀的系列API是指在操作完成后所调用的处理函数。下面以CopyItem为例,给出微软的说明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

win7及以上系统C++实现Hook explorer文件级监控复制、剪切和删除操作 的相关文章

  • 在 Windows 上安装 MonoDevelop:满足 Gtk# 要求的解决方法?

    我已经安装了Mono 版本2 11 4 在我的Windows 7系统上 现在我打算安装单一开发 版本 3 0 4 7 然而 当我开始单一开发安装程序我收到以下错误消息 并且安装终止 好的 这可以通过获取轻松解决Gtk 安装程序来自here
  • 在 Mercurial 中配置 eol 扩展时出现问题

    我正在尝试将 UNIX 托管的 Mercurial 存储库克隆到 Windows 计算机 我希望使用eol扩展名 以便我在服务器上以 LF 结尾的文本文件在克隆到 Windows 计算机时具有 CRLF 以前我用过win32文本扩展效果很好
  • 生成唯一硬件 ID 的可靠方法

    问题 我必须为每个联网客户端提供唯一的 ID 例如 一旦客户端软件安装在目标计算机上 它 ID 应该持续存在 并且如果在同一台计算机和相同的操作系统安装上重新安装软件 它应该继续存在 如果以大多数方式修改硬件配置 除了更改主板 它不应该改变
  • 如何测试 Windows (10) 上是否安装了 Python,如果未安装则运行 exe 来安装它?

    仅当第一个命令失败时 我才需要在 Windows cmd 上运行第二个命令 在另一个场景中 我想在检查 python setup 是否安装后打开它 我用了这个命令 python version path to python install
  • 动态获取当前LDAP路径

    我正在使用 C 和 NET Framework 4 0 开发一个库 我想检索所有活动目录用户 它效果很好 但我的问题是 如果我在另一个域上运行我的程序 我必须更改此设置 private static string ldapPath LDAP
  • 打开文件选择器对话框时出现 Glib-GIO-ERROR

    我在 Windows 7 中使用 GTK3 codeblcks IDE glade3 在我的应用程序中 我有一个按钮 单击该按钮应打开一个 gtk file chooser dialog 但给出填充错误 Glib GIO 错误 系统上未安装
  • 如何以编程方式重新启动 Windows 资源管理器进程

    我正在开发 Windows shell 扩展 不幸的是 在更改 DLL 时 我必须重新启动 Windows 资源管理器 因为它将 DLL 保留在内存中 我从 Dino Esposito 找到了这个程序 但它对我不起作用 void SHShe
  • CTRL+C 和 CTRL+Break 不同吗?

    我一直认为它们绝对是一样的 但我刚刚在以下位置找到了一些值 CTRL C EVENT 和 CTRL BREAK EVENT设置控制台Ctrl处理程序 http msdn microsoft com en us library ms68601
  • 在 docker windows 上运行 linux 容器

    我在 Windows 10 机器上安装了 Docker for Windows 它要求我启用 HyperV 功能 一切都安装正确并且运行良好 虽然有一件事让我大吃一惊 我实际上能够在 docker windows 上运行 Linux 容器
  • Shell 执行将窗口置于前面

    我正在使用此函数从我的 MSI 调用可执行文件 然而 可执行文件的窗口隐藏在我的 MSI 窗口后面 有什么办法可以把它带到前面吗 我尝试在调用之前最小化所有窗口ShellExecute但这仍然没有将可执行窗口带到前面 extern C UI
  • 尝试在 Windows 上执行 package.json 中的脚本会引发 JScript 错误

    所以我正在尝试构建 javascriptair site 在 的里面package json有一个 npm 脚本指向 javascript 命令 package scripts 找到该存储库https github com kentcdod
  • 无法加载 php_curl

    我已经在WindowsXp上安装了php5 2 13 apache2 2 15 将C php添加到PATH ssystem变量中 我无法启用卷曲扩展 我配置了extension dir并删除了 在 php ini 中形成 php curl
  • 向 Windows 任务栏缩略图添加按钮 JavaFX?

    这个问题已经闲置一年多了 我的问题仍然没有解决方案 我编辑此内容是为了澄清我的问题并引起人们对它的新关注 如果您使用 Windows 您可能知道将程序图标悬停在任务栏上时显示的小预览图像 缩略图 某些程序 例如 Spotify Git 扩展
  • Python 原始字符串和尾随反斜杠[重复]

    这个问题在这里已经有答案了 我曾经遇到过一些东西 想知道它是否是一个 Python bug 或者至少是一个错误功能 我很好奇是否有人知道这种行为的任何理由 我刚刚在阅读 Code Like a Pythonista 时想到了这一点 到目前为
  • Windows 通用应用程序串行端口无法打开,SerialDevice.FromIdAsync 始终为 null

    我正在尝试在 Windows 通用应用程序中使用串行端口 我一直在使用微软的串行示例应用程序作为模板 但是我遇到了一个相当奇怪的问题 var dis await DeviceInformation FindAllAsync SerialDe
  • 读取进程的进程内存不会返回所有内容

    我正在尝试扫描第三方应用程序的内存 我已经查到地址了 现在是在0x0643FB78 问题是 从那以后我就再也爬不上去LPMODULEENTRY32 gt modBaseAddr is 0x00400000 and LPMODULEENTRY
  • 捕获由纯 C++ dll 中的 MFC 应用程序生成的 Windows 消息

    首先 这可能吗 我有一个与某些硬件接口的第三方 dll 它是用MFC编写的 我 从 dll 供应商处 收到了一个示例 Visual Studio 2010 解决方案 该解决方案只有一个项目 调用相关第三方 dll 的 MFC 应用程序 ex
  • 如何安装适用于 Windows C++ 的最新版本 OpenGL?

    我正在使用 Visual Studio 2010 运行 Windows 7 包含的 OpenGL 版本 include 是版本 1 1 我希望使用合理的当前版本 某种版本 3 或 4 我需要做什么才能达到该状态 OpenGL SDK 页面位
  • 获取已连接 USB 设备的端口名称

    当USB设备连接到计算机时 如何使用C 代码获取它所连接的端口名称 我找到了很多方法来查找 USB 何时连接 断开 驱动器号 路径 设备 ID 等 但没有找到任何明确的示例来说明如何知道它连接到哪个端口 我看到了一种可能的解释 但这涉及很多
  • 应用程序注册失败,因为文件位于网络共享上。注册包之前将文件复制到本地计算机

    我使用这些示例来构建 Windows 8 应用程序 http code msdn microsoft com windowsapps Getting started with C and 41e15af5 http code msdn mi

随机推荐

  • 【敬伟ps教程】图层进阶知识

    文章目录 图层过滤和锁定 图层链接 图层编组 图层合并 图层盖印 图层复合 图层剪贴蒙版 图层过滤和锁定 图层过滤可以根据图层不同的性质进行查看管理 图层锁定即是对图层或图层某部分进行操作保护 按钮分别为 锁定透明像素 禁止对透明区域进行操
  • 使用JavaScript实现一个简单的计时器

    简介 计时器是前端开发中常见的功能之一 它可以帮助我们记录时间并进行倒计时等操作 在本篇博客中 我将向大家介绍如何使用JavaScript实现一个简单的计时器 实现步骤 第一步 创建HTML结构 首先 我们需要在HTML中创建一个用于显示计
  • 大语言模型参数说明(Temperature,Top p,Top k)

    如下是一些模型的运行界面 在使用OpenAI的接口 常常遇见一些参数 搞清它们的含义促使我们更进一步理解输出的结果 学习传送带 1 Temperature 用于调整随机从生成模型中抽样的程度 因此每次点击 生成 时 相同的提示可能会产生不同
  • app性能

    性能获取办法 appium webview context execute script perfmance api appium selenium的ExecuteScript Api 注入js return JSON stringify
  • muduo网络库学习(九)日志类Logger和LogStream,将日志信息打印到屏幕

    每一个成熟的项目都有大大小小的日志系统 在关键的地方打印日志信息 常用来跟踪程序运行 查找错误原因等 可以节省大量的debug时间 muduo的日志信息有5个级别 TRACE 细粒度最高的日志信息 打印的最详细 DEBUG 细粒度级别上对调
  • 程序中的耦合与解耦学习(三)——解耦学习1

    以下内容来源于网友内容 引用网友链接 简要 一 解耦都是需要代理的 本质上并不存在没有代理就发生两个部件之间解耦的情况 二 耦合 指的是两个可以协作的部件的关系 A和B可以协作 则A和B的关系是耦合 三 如果A可以和O P Q S 简称集合
  • API接口签名验证

    系统从外部获取数据时 通常采用API接口调用的方式来实现 请求方和接口提供方之间的通信过程 有这几个问题需要考虑 1 请求参数是否被篡改 2 请求来源是否合法 3 请求是否具有唯一性 今天跟大家探讨一下主流的通信安全解决方案 参数签名方式
  • java使用策略模式实现统一接口的不同效果返回

    首先说下什么是策略模式以及策略模式的优缺点 策略模式 是指定义了算法家族 分别封装起来 让他们之间可以相互替换 此模式让算法的变化不会影响到其他使用算法的用户 可以避免多重的if else 判断语句 1 加入系统中有很多类 而他们的区别仅仅
  • JAVA 四大作用域名

    JavaWeb有ServletContext ServletRequest HttpSession PageContext四大域对象 下面主要从域对象的生命周期 作用 作用范围进行介绍 Servlet中只有前三个域对象 JSP中多了一个pa
  • [2018 ICPC 青岛] 解题记录ing

    M Function and Function 队友说直接暴力即可 include
  • 安装ChormeOS

    一 准备工具 16G的U盘一个 支持UEFI启动的电脑 二 下载工具 Ubuntu Mate 镜像下载 https ubuntu mate org download Rufus写盘工具 https rufus ie Chrome 安装框架下
  • SpringBoot + redis 简单运用

    初始项目 pom xml引入redis
  • LeetCode每日一题之二分搜索

    文章目录 1 关于二分搜索常见的误区 2 左闭右闭区间的写法 3 左闭右开区间的写法 4 找到第一个大于target的数 5 找到第一个小于target的数 6 找到第一个大于等于taregt的数 7 找到第一个小于等于target的数 1
  • Vue3 word如何转成pdf代码实现

    博主 锅盖哒 文章核心 word如何转换pdf 目录 1 前端部分 2 后端部分 在Vue 3中 前端无法直接将Word文档转换为PDF 因为Word文档的解析和PDF的生成通常需要在后端进行 但是 你可以通过Vue来触发后端的转换过程 下
  • 牛客网刷题-java

    大部分解答为牛客网各位同学的精彩回答 本文只是选择一些互联网常考题目记录备忘 1 一个类的构造器可以调用这个类中的其他构造器 this的作用其中一个就是在一个构造方法中调用另一个构造方法 格式为this 参数 如 this x super是
  • 小程序挣钱_抖推之家抖音小程序怎么挣钱?

    最近很多朋友来公司咨询 抖推之家到底是个什么样的项目 用抖音小程序怎么挣钱 真的只需要发发视频就可以了 大家对于它的好奇 疑问越来越多 今天小编就来为大家一一解答 一 抖推之家是个什么样的项目 抖推之家 专注于短视频流量变现服务 整合短视频
  • anaconda 创建虚拟环境、激活,使用的基本方法及安装包的基本方法

    第一步 打开Anaconda Prompt 可以看到这里是base环境 第二步 我们现在要创建一个新的虚拟环境 名叫test 且python版本为3 8 在安装过程中会出现下面这个选项 输入y就好了 创建成功如下图所示 hiahia 我们已
  • js 实现同时调两个接口

    let promiseValues getScreeningFileList id report getScreeningFileList id pathology Promise all promiseValues then res gt
  • 方舟生存进化服务器文件设置,方舟生存进化私人服务器设置教程[多图]

    方舟生存进化私人服务器怎样设定 得到使用权后 就能设置进入途径 下面小编为大家带来方舟生存进化私人服务器设置教程 一起来看看吧 私人服务器购买后 服主可以在里边配置自己的服务器信息 私人服务器进入方法 点击多人游戏下方的英文字母选项 就是私
  • win7及以上系统C++实现Hook explorer文件级监控复制、剪切和删除操作

    最近项目组需要实现一个对windows用户文件操作进行监控的功能 也就是使用explorer资源管理器的操作 于是乎我就想到了使用Hook的方法进行拦截 查找一番资料后发现XP调用的是最简单的CopyFileEx MoveFileWithP