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

相关推荐

  • codeblocks mingw安装配置问题

    codeblocks mingw安装配置问题整了一上午!1.64位os可以用mingw-322.官网下载mingw,安装,位置无所谓,continue之后右键第三项,mark,然后install选项,apply3.path配置,win10以前的版本要手写变量,记得用半角英文分号,win10直接复制就行4.编译器配置,第一次自己搞最头疼最头疼最头疼最头疼最头疼的地方!第一步,setting,然后comp

    2022年6月22日
  • leetcode-84柱状图中最大的矩形(单调栈)「建议收藏」

    leetcode-84柱状图中最大的矩形(单调栈)「建议收藏」原题链接给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。示例:输入: [2,1,5,6,2,3]输出: 10题解对于每一个长方体,找出左边比他小的第一个长方体和右边比他小的第一个长方体,然后遍历求结即可class Solution {public

    2022年8月8日
  • js面向对象编程_JavaScript高级编程

    js面向对象编程_JavaScript高级编程面向对象编程有两大编程思想:面向过程和面向对象;面向过程编程POP(Process-orientedprogramming)面向过程即分析出解决问题所需要的步骤,然后用函数将这些步骤一步步实现,使用的时候再一个个的一次调用就可以了;即将大象装进冰箱,从面向过程来看,需要打开冰箱门、装进去大象、关上冰箱门面向对象编程OOP(ObjectOrientedProgramming)面向对象即把事务分解成为一个个对象,然后由对象之间分工与合作;是以对象功能来划分问题,而不是步骤;在面向对

    2022年8月20日
  • RPN网络理解[通俗易懂]

    RPN网络理解[通俗易懂]这是一个出自FasterR-CNN论文中的用于产生2Dproposal的神经网络,目前也被改进用于3D-proposal的产生,RPN一般会和目标检测器配合使用,两者组合形成2-stageobjectdetection。这周的汇报中我将RPN的主要部分整理成了一份PPT,各位在看FasterR-CNN和其他用到RPN的目标检测网络之前可以先看一下这个RPN大概有那些要点,这样就可以有的放矢地去读论文。链接:https://github.com/GuanRunwei/Fusion-of-Ra

    2022年6月23日
  • 一套键盘鼠标跨电脑切换使用「建议收藏」

    一套键盘鼠标跨电脑切换使用「建议收藏」       身为一名涉猎领域广泛的码农,工作间中往往会出现同时使用超过一台电脑的场景,笔记本+台式机基本是常态,甚至会出现Win+MAC或者Win+LINUX这样的跨平台同时操作需求。那么最令人烦恼的莫过于切换使用电脑时需要来回切换键鼠,如果可以用桌面上的一套键鼠,实现对多台电脑的无缝操作切换,岂不是美滋滋。      博主这样的愿望由来已久,今日终于完美解决,特分享给诸位道友。  …

    2022年10月10日
  • Redis设置过期时间_redis过期时间原理

    Redis设置过期时间_redis过期时间原理varredis=require(‘redis’),RDS_PORT=6389,//端口号RDS_HOST=’127.0.0.1′,//服务器IPRDS_PWD=’88888888888888′,//密码RDS_OPTS={},//设置项rclient=redi…

    2022年9月26日

发表回复

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

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