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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea2021.7.16激活码(JetBrains全家桶)「建议收藏」

    (idea2021.7.16激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月21日
    53
  • android 画图 平面图,房屋平面图 DIY 神工具!「MagicPlan」用手机拍照就自动帮你画好(iPhone, Android)…

    android 画图 平面图,房屋平面图 DIY 神工具!「MagicPlan」用手机拍照就自动帮你画好(iPhone, Android)…不论是新屋装潢还是老屋改装,为了省下设计费,许多人都会想自己动手画平面图,但是如果本身没有相关的底子,从怎么开始动手测量尺寸到画出完整的全屋平面图,每个点都有让人不知所措的地方。来!免惊~「MagicPlan」快拿去用!它简直就是我们这种无设计底子平凡人的救星,只要拿着手机或平板拍几张照,房屋或房间的平面图就完成啦!什么?你说听起来很神吗?没错它就是这么神呀!完全不需测量、不需自己拿笔尺绘制、不需…

    2022年5月25日
    165
  • Promise用法详解(一)

    Promise用法详解(一)Promise基本概念Promise是一个构造函数,所以可以new出一个Promise的实例在Promise上有两个函数resolve(成功之后的回调函数)和reject(失败后的回调函数)在Promise构造函数的prototype属性上,有一个.then()方法。所以只要是Promise构造函数创建的实例,都可以访问到.then()方法Promise表示一个一…

    2022年6月16日
    38
  • 悲观锁和乐观锁的使用[通俗易懂]

    悲观锁和乐观锁的使用[通俗易懂]1、悲观锁(PessimisticLock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。最常用的就是select..forupdate,它是一种行锁,会把select出来的结果行锁住,在本

    2022年8月23日
    8
  • org.apache.jasperException(jasper是谁)

    该错误为所要转跳的jsp页面包含语句错误!org.apache.jasper.JasperException:Theabsoluteuri:http://java.sun.com/jsp/jstl/corecannotberesolvedineitherweb.xmlorthejarfilesdeployedwiththisapplication  

    2022年4月16日
    46
  • MATLAB入门教程

    MATLAB入门教程MATLAB入门教程

    2022年8月2日
    7

发表回复

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

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