[C] 纯文本查看 复制代码#include

/*

First Driver

*/

//未文档化的函数->通过名字获取设备对象

NTKERNELAPI

NTSTATUS

ObReferenceObjectByName(

IN PUNICODE_STRING ObjectName,

IN ULONG Attributes,

IN PACCESS_STATE PassedAccessState OPTIONAL,

IN ACCESS_MASK DesiredAccess OPTIONAL,

IN POBJECT_TYPE ObjectType OPTIONAL,

IN KPROCESSOR_MODE AccessMode,

IN OUT PVOID ParseContext OPTIONAL,

OUT PVOID *Object

);

extern POBJECT_TYPE *IoDriverObjectType;

PDRIVER_OBJECT g_FilterDriverObject;

//保存以前的驱动请求例程

PDRIVER_DISPATCH g_OrigReadCompeleteRoutine;

//驱动过滤例程

NTSTATUS FilterReadCompeleteRoutine(__in struct _DEVICE_OBJECT *DeviceObject,__inout struct _IRP *Irp)

{

KdPrint(("拦截到数据读取!"));

return g_OrigReadCompeleteRoutine(DeviceObject, Irp);

}

//卸载HOOK函数

NTSTATUS UnfilterDriverRoutinue()

{

//检测地址是否有效(可读可写)

if (MmIsAddressValid(g_FilterDriverObject))

{

//写回原例程

g_FilterDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = g_OrigReadCompeleteRoutine;

}

return STATUS_SUCCESS;

}

//驱动过滤函数->配合 ObReferenceObjectByname

NTSTATUS FilterDriverQuery()

{

NTSTATUS Status ;

UNICODE_STRING usObjectName;

RtlInitUnicodeString(&usObjectName, L"\\Driver\\Xuetr");

//取出驱动对象

Status = ObReferenceObjectByName(

&usObjectName,

OBJ_CASE_INSENSITIVE,

NULL,

0,

*IoDriverObjectType,

KernelMode,

NULL,

(PVOID*)&g_FilterDriverObject

);

if (!NT_SUCCESS(Status)) {

//返回失败值

KdPrint(("取出驱动对象失败!!!"));

return Status;

}

//打印驱动指针对象地址

KdPrint(("驱动指针地址:0x%x", g_FilterDriverObject));

//保存原有驱动实例

g_OrigReadCompeleteRoutine = g_FilterDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL];

//启动过滤

g_FilterDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FilterReadCompeleteRoutine;

return STATUS_SUCCESS;

}

//卸载函数

NTSTATUS Unload(IN PDRIVER_OBJECT pDriverObject)

{

//清理符号连接和设备对象,避免内存泄漏

UNICODE_STRING usSysname;

RtlInitUnicodeString(&usSysname, L"\\??\\CEpassTP");

if (pDriverObject->DeviceObject != NULL)

{

IoDeleteSymbolicLink(&usSysname);

IoDeleteDevice(pDriverObject->DeviceObject);

KdPrint(("删除设备对象和符号连接完成!"));

}

UnfilterDriverRoutinue();

return STATUS_SUCCESS;

}

//创建设备对象

NTSTATUS CreatDevice(PDRIVER_OBJECT pDriverObject)

{

//记录返回值

NTSTATUS Status;

//定义设备对象

PDEVICE_OBJECT pDevobj;

//设备对象名字字符串

UNICODE_STRING usDevName;

//设备符号连接字符串

UNICODE_STRING usSysName;

//初始化设备名

RtlInitUnicodeString(&usDevName, L"\\Device\\CEpassTP");

//创建设备->赋值创建状态

Status = IoCreateDevice(pDriverObject, \

0, \

&usDevName, \

FILE_DEVICE_UNKNOWN, \

FILE_DEVICE_SECURE_OPEN,\

TRUE,\

&pDevobj

);

//通过宏->判断创建状态

if (!(NT_SUCCESS(Status)))

{

return Status;

}

//或运算赋值

pDevobj->Flags |= DO_BUFFERED_IO;

//初始化符号连接名

RtlInitUnicodeString(&usSysName, L"\\??\\CEpassTP");

//创建符号连接

Status = IoCreateSymbolicLink(&usSysName, &usDevName);

if (!NT_SUCCESS(Status))

{

//不成功删除设备对象-返回错误值

IoDeleteDevice(pDevobj);

return Status;

}

return STATUS_SUCCESS;

}

//PIRP 传送数据包

NTSTATUS CreateCompleteRoutine(PDEVICE_OBJECT pDeviceobj,PIRP pIrp)

{

//注册标准参数实例例程,避免蓝屏

NTSTATUS Status;

Status = STATUS_SUCCESS;

KdPrint(("驱动例程创建完成!"));

pIrp->IoStatus.Status = Status;//设置传送状态

pIrp->IoStatus.Information = 0;//操作字节数返回

IoCompleteRequest(pIrp, IO_NO_INCREMENT);//终结IRP传递

return Status;

}

NTSTATUS CloseCompleteRoutine(PDEVICE_OBJECT pDeviceobj, PIRP pIrp)

{

//注册标准参数实例例程,避免蓝屏

NTSTATUS Status;

Status = STATUS_SUCCESS;

KdPrint(("驱动例程关闭成功!"));

pIrp->IoStatus.Status = Status;//设置传送状态

pIrp->IoStatus.Information = 0;//操作字节数返回

IoCompleteRequest(pIrp, IO_NO_INCREMENT);//终结IRP传递

return Status;

}

NTSTATUS ReadCompleteRoutine(PDEVICE_OBJECT pDeviceobj, PIRP pIrp)

{

//注册标准参数实例例程,避免蓝屏

NTSTATUS Status;

Status = STATUS_SUCCESS;

KdPrint(("例程内存读取!"));

pIrp->IoStatus.Status = Status;//设置传送状态

pIrp->IoStatus.Information = 0;//操作字节数返回

IoCompleteRequest(pIrp, IO_NO_INCREMENT);//终结IRP传递

return Status;

}

NTSTATUS WriteCompleteRoutine(PDEVICE_OBJECT pDeviceobj, PIRP pIrp)

{

//注册标准参数实例例程,避免蓝屏

NTSTATUS Status;

Status = STATUS_SUCCESS;

KdPrint(("例程写内存!"));

pIrp->IoStatus.Status = Status;//设置传送状态

pIrp->IoStatus.Information = 0;//操作字节数返回

IoCompleteRequest(pIrp, IO_NO_INCREMENT);//终结IRP传递

return Status;

}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING RegistryPath){

//KdBreakPoint();//断点

NTSTATUS Status;

Status = CreatDevice(pDriverObject);

if (!NT_SUCCESS(Status))

{

KdPrint(("创建设备对象失败!"));

}

else

{

KdPrint(("创建设备对象成功!\n"));

KdPrint(("注册表路径:%wZ ",RegistryPath));

}

//注册请求例程->发送到IO管理器进行处理

pDriverObject->MajorFunction[IRP_MJ_CREATE] = CreateCompleteRoutine;

pDriverObject->MajorFunction[IRP_MJ_CLOSE] = CloseCompleteRoutine;

pDriverObject->MajorFunction[IRP_MJ_READ] = ReadCompleteRoutine;

pDriverObject->MajorFunction[IRP_MJ_WRITE] = WriteCompleteRoutine;

pDriverObject->DriverUnload = Unload;

//开启驱动过滤

FilterDriverQuery();

return STATUS_SUCCESS;

}

android 文件过滤驱动,自己写的Xuetr工具驱动读写过滤驱动,并奉献上源码相关推荐

  1. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 使用反射获取方法创建本应用的 dexElements | 各版本创建 dex 数组源码对比 )

    文章目录 一.不同 Android 系统创建 dex 数组源码对比 二.不同 Android 系统创建 dex 数组源码对比 三. Android 5.1 及以下系统反射方法并创建 Element[] ...

  2. 【朝花夕拾】Android自定义View之(一)手把手教你看懂View绘制流程——向源码要答案

    前言 原文:Android自定义View之(一)手把手教你看懂View绘制流程--向源码要答案 View作为整个app的颜值担当,在Android体系中占有重要的地位.深入理解Android View ...

  3. 【Android 进程保活】提升进程优先级 ( 1 像素 Activity 提高进程优先级 | taskAffinity 亲和性说明 | 运行效果 | 源码资源 )

    文章目录 一.1 像素 Activity 提高进程优先级 1.主界面 MainActivity 2.1 像素 Activity 3.广播接收者 4.管理类 5.AndroidManifest.xml ...

  4. 【Matlab语音隐写】DCT+DWT音频数字水印嵌入提取【含GUI源码 836期】

    一.代码运行视频(哔哩哔哩) [Matlab语音隐写]DCT+DWT音频数字水印嵌入提取[含GUI源码 836期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1 ...

  5. Android【SDK目录结构】、【HelloWorld项目的目录结构】、【源码sources目录结构】

    Android SDK 目录和作用的分析详解 1.add-ons这里面保存着附加库,比如GoogleMaps,当然你如果安装了OphoneSDK,这里也会有一些类库在里面. 2.docs这里面是And ...

  6. Android【SDK目录结构】、【HelloWorld项目的目录结构】、【源码sources目录结构】...

    Android SDK 目录和作用的分析详解 1.add-ons这里面保存着附加库,比如GoogleMaps,当然你如果安装了OphoneSDK,这里也会有一些类库在里面. 2.docs这里面是And ...

  7. 用Android Studio做一个超好玩的拼图游戏,附送超详细注释的源码

    文章目录 一.项目概述 二.开发环境 三.需求分析 四.实现过程 1.拼图游戏布局绘制 2.拼图游戏时间计时 3.拼图游戏打乱显示 4.拼图游戏碎片位置切换 5.拼图游戏成功的条件 6.拼图游戏重新开 ...

  8. android小说阅读、MVP + RxJava + Retrofit项目、证件拍照裁剪、蓝牙锁等源码

    Android精选源码 完全防美团设置支付密码,页面与细节完全一致,如不能... android智能选股应用源码 android开源小说阅读app源码(Kotlin) Android模仿Duoling ...

  9. android小说阅读、MVP + RxJava + Retrofit项目、证件拍照裁剪、蓝牙锁等源码器

    Android精选源码 完全防美团设置支付密码,页面与细节完全一致,如不能- android智能选股应用源码 android开源小说阅读app源码(Kotlin) Android模仿Duolingo的 ...

最新文章

  1. Delphi - 新语法介绍之For In
  2. 云南昆明:看猪展迎猪年
  3. 重磅推荐几个接私活的利器!
  4. Mybatis报错: Invalid bound statement (not found)...
  5. java顺序表增删查改_Java实现顺序表的增删改查
  6. firefox 插件可能用得上的Firefox插件及下载
  7. shell基础--字符串和变量的操作
  8. 在IIS6 配置使用php5.4的fastcgi模式
  9. 【金蝶】金蝶KIS专业版9.1清理用户名密码
  10. ICE 3.7.4 实现客户服务端hello world
  11. linux awk 区别,linux awk 中 RS,ORS,FS,OFS 区别与联系
  12. WSL gcc -m32 readdir 出错: Value too large for defined data type
  13. 计算机网络-第1章 计算机网络和因特网-同步电大进度
  14. 谷歌57版本设置浏览器编码
  15. python3*1**3 表达式输出结果为_22 % 3 表达式输出结果为________
  16. Swin-Transformer网络结构详解
  17. WorldModel世界模型代码训练实录
  18. Hadoophbase监控页面未授权访问漏洞处理方案验证过程实现
  19. LigoWave品牌的产品分类及项目选型
  20. 新坑--阿里云图库引入

热门文章

  1. 若想进阶为软件架构师,这10本书必须读!
  2. python 字典的值可以为集合吗_Python 集合(Set)、字典(Dictionary)
  3. 解决mathtype默认使用中文输入法
  4. 图像 快速傅里叶变换 及 频率域滤波 java 实现
  5. 优思学院|创新问题的解决方法论TRIZ
  6. 软件测试用例白盒测试,软件测试白盒测试测试用例与代码.doc
  7. 三星gtn8010安卓7_三星N8000/N8010通用刷机教程
  8. 乔姆斯基文法分类【0型1型2型3型文法】
  9. 微课-面向对象程序设计(5课82分钟)
  10. 联想ThinkPad使用虚拟机时遇到要求打开CPU中VT的方法