SwapBuffer驱动进阶(一)[通俗易懂]

SwapBuffer驱动进阶(一)[通俗易懂]之前通过阅读swapbuffer的read的部分代码,基本上弄明白了缓存交换的原理。    那么我们怎么做到文件的透明加解密,直接使用其缓存交换的方式来实现呢,目前参考了Antinvader,有一个步骤是肯定要做的,那就是在Create的Post中,添加文件流的上下文,这样才能知道你打开的文件,是不是在read中确认是你需要处理的问题,因为在Read中的FileName是不准确的,例

大家好,又见面了,我是你们的朋友全栈君。之前通过阅读swapbuffer的read的部分代码,基本上弄明白了缓存交换的原理。

        那么我们怎么做到文件的透明加解密,直接使用其缓存交换的方式来实现呢,目前参考了Antinvader, 有一个步骤是肯定要做的,那就是在Create的Post中,添加文件流的上下文,这样才能知道你打开的文件,是不是在read中确认是你需要处理的问题,因为在Read中的FileName是不准确的,例如:打开的”\111.txt”, 在Create中路径是正确的,但是在Read回调函数中,可能就是系统的缓存的文件了,根本找不到“\111.txt”这个路径。
         我们开始改造SwapBuffer代码,在其回调中添加如下代码:
FLT_PREOP_CALLBACK_STATUS
SwapPreCreate(
__inout PFLT_CALLBACK_DATA Data,
__in PCFLT_RELATED_OBJECTS FltObjects,
__deref_out_opt PVOID *CompletionContext
)
{
//NTSTATUS status;

UNREFERENCED_PARAMETER(FltObjects);
UNREFERENCED_PARAMETER(Data);
UNREFERENCED_PARAMETER(CompletionContext);
UNICODE_STRING MyVolumeName;
RtlInitUnicodeString(&MyVolumeName, L”\\1111\\1111.txt”);
if (0 != RtlCompareUnicodeString(&FltObjects->FileObject->FileName, &MyVolumeName, TRUE))
{
return FLT_PREOP_SUCCESS_WITH_CALLBACK;    
}
return FLT_PREOP_SUCCESS_WITH_CALLBACK;      —–可以在这里添加断点,这样每次对这个文件的操作,都会断住
}

下面这个就是WITH_CALLBACK的话,才会调用。
FLT_POSTOP_CALLBACK_STATUS
SwapPostCreate(
__inout PFLT_CALLBACK_DATA Data,
__in PCFLT_RELATED_OBJECTS FltObjects,
__in_opt PVOID CompletionContext,
__in FLT_POST_OPERATION_FLAGS Flags
)
{
UNREFERENCED_PARAMETER(Data);
UNREFERENCED_PARAMETER(FltObjects);
UNREFERENCED_PARAMETER(CompletionContext);
UNREFERENCED_PARAMETER(Flags);

UNICODE_STRING MyVolumeName;
RtlInitUnicodeString(&MyVolumeName, L”\\1111\\1111.txt”);
if (0 != RtlCompareUnicodeString(&FltObjects->FileObject->FileName, &MyVolumeName, TRUE))
{
return FLT_POSTOP_FINISHED_PROCESSING;
}

return FLT_POSTOP_FINISHED_PROCESSING; 
}
上面的代码,就是两个回调的最简单的实现。

这个主要是为了分析在Create的时候是不是有我们操作的真正的文件路径,经过测试发现,是有的!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145115.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月12日 下午10:40
下一篇 2022年5月12日 下午11:00


相关推荐

  • 小程序列表跳转至详情_小程序跳转链接怎么获取

    小程序列表跳转至详情_小程序跳转链接怎么获取效果展示:列表页js部分:onLoad:function(options){varthat=this;wx.request({url:’你的接口’,data:{ 接口参数},header:{‘content-type’:’ap…

    2022年8月19日
    7
  • ArcGis二次开发遇到的问题

    ArcGis二次开发遇到的问题在我们刚开始利用.net对arcgis进行二次开发时,费了牛鼻子劲安装好了arcgisengine,也在vs中建立了新项目,拖进去了工具条控件,主页面控件,想要欣赏一下成果的时候,发现一点击启动就报错了:查阅相关资料后发现,在主程序中加入这样两行代码,给程序进行授权,就可以顺利运行了。在这里强烈推荐牟乃夏老师的一系列书籍,从arcgis基础知识到开发自己的gis软件,非常有用。后面有时间我会…

    2022年7月23日
    10
  • pycharm编写的文件如何执行_pycharm可以写java吗

    pycharm编写的文件如何执行_pycharm可以写java吗最近在做编译原理课设,准备用Java写个GUI整合一下,因为自己的LL1文法使用python写的,所以需要Java来实现运行python代码,网上给出了主要三种方法,但是使用Jython的方法有局限性且不太方便,于是我将采用最简洁的方法Runtime.getRuntime()运行python代码,下面给出代码Processproc;try{/*注意:这里这种方式和cmd中使用python+文…

    2022年8月27日
    2
  • 设计模式–代理模式(Proxy Pattern)

    设计模式–代理模式(Proxy Pattern)

    2021年7月3日
    92
  • taskkill 使用

    taskkill 使用TASKKILL[/Ssystem[/Uusername[/P[password]]]]{[/FIfilter][/PIDprocessid|/IMimagename]}[/F][/T]描述:这个命令行工具可用来结束至少一个进程。可以根据进程id或图像名来结束进程。参数列表:/Ssystem指定要连接到的远程系统。/U…

    2025年6月30日
    4
  • armv7与armv8的区别(v8和w12的区别)

    ARMv7与ARMv8的处理器架构自己一直没有详细了解过,现在来学习一下,在armcommunity中文社区看到一个不错的总结。两者之间的区别主要如下:ARMv8指令集分为Aarch64和Aarch32指令集,而ARMv7使用的是A32和T16指令集(分别为32位和16位)。现今我们常见的手机处理器多为8核,采用大小核心伴侣架构,比如Kirin970处理器(4*Co…

    2022年4月18日
    283

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号