驱动-遍历驱动、隐藏驱动
//自定义消息
#define Ergodicdrivelist CTL_CODE( FILE_DEVICE_UNKNOWN, 0x801, METHOD_IN_DIRECT, FILE_ANY_ACCESS )
#define Hidedriver CTL_CODE( FILE_DEVICE_UNKNOWN, 0x802, METHOD_IN_DIRECT, FILE_ANY_ACCESS )
// 遍历驱动
void Ergodicdrivelistfun(PIRP Irp)
{PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);// 通过当前驱动获取驱动链,指针指向的就是当前驱动在链表中对应的项PLDR_DATA_TABLE_ENTRY current = (PLDR_DATA_TABLE_ENTRY)g_DriverObject->DriverSection;PLDR_DATA_TABLE_ENTRY item = (PLDR_DATA_TABLE_ENTRY)g_DriverObject->DriverSection;// 获取输出缓冲区PVOID Buffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);PDRIVERINFO outbuff = (PDRIVERINFO)Buffer;// 跳过头节点current = current->InLoadOrderLinks.Flink;// 第一个item = (PLDR_DATA_TABLE_ENTRY)item->InLoadOrderLinks.Flink;item = (PLDR_DATA_TABLE_ENTRY)item->InLoadOrderLinks.Flink;// 循环链表的遍历,结束条件是遍历到的内容不是自己int index = 0;do {RtlZeroMemory(outbuff, sizeof(DRIVERINFO));RtlCopyMemory(outbuff->wcDriverBasePath, item->BaseDllName.Buffer, item->BaseDllName.Length);RtlCopyMemory(outbuff->wcDriverFullPath, item->FullDllName.Buffer, item->FullDllName.Length);outbuff->DllBase = item->DllBase;outbuff++;// 获取当前元素指向的下一个元素item = (PLDR_DATA_TABLE_ENTRY)item->InLoadOrderLinks.Flink;index++;} while (current != item);Irp->IoStatus.Information = 20;
}
// 隐藏驱动
void Hidedriverfun(PIRP Irp)
{// 指针指向的就是当前驱动在链表中对应的项PLDR_DATA_TABLE_ENTRY current = (PLDR_DATA_TABLE_ENTRY)g_DriverObject->DriverSection;PLDR_DATA_TABLE_ENTRY item = (PLDR_DATA_TABLE_ENTRY)g_DriverObject->DriverSection;// 获取输入缓冲区PVOID InBuff = Irp->AssociatedIrp.SystemBuffer;// 初始化字符串,获取要隐藏的驱动名UNICODE_STRING pHideDriverName = { 0 };RtlInitUnicodeString(&pHideDriverName, (PCWSTR)InBuff);do{if (RtlCompareUnicodeString(&item->BaseDllName, &pHideDriverName, FALSE) == 0){//修改Flink和Blink指针,以跳过我们要隐藏的驱动//在驱动链中将当前驱动的上一个驱动的下级指针指向下一个驱动//再将下一个驱动的上级指针指向上一个驱动item->InLoadOrderLinks.Blink->Flink = item->InLoadOrderLinks.Flink;item->InLoadOrderLinks.Flink->Blink = item->InLoadOrderLinks.Blink;break;}item = item->InLoadOrderLinks.Flink;} while (item != current);
}// 用于实现自定义的消息派遣函数
NTSTATUS DeviceIoControlDispatch(PDEVICE_OBJECT DeviceObject, // 表示当前的消息是那个设备对象产生的PIRP Irp) // IRP,对应的是三环程序的消息,保存了一些附加参数
{UNREFERENCED_PARAMETER(DeviceObject);PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);// 设置消息的处理状态: 成功或失败 -> GetLastErrorIrp->IoStatus.Status = STATUS_SUCCESS;// 读取内容switch (Stack->Parameters.DeviceIoControl.IoControlCode){// 遍历驱动case Ergodicdrivelist:{Ergodicdrivelistfun(Irp);}break;// 隐藏驱动case Hidedriver:{Hidedriverfun(Irp);}break;}// 通知操作已经完成,完成后不提高当前的 IRQLIoCompleteRequest(Irp, IO_NO_INCREMENT);return Irp->IoStatus.Status;
}
``
驱动-遍历驱动、隐藏驱动相关推荐
- 通过驱动断链来隐藏驱动
隐藏指定驱动 尝试隐藏这个驱动 #include <ntifs.h>typedef struct _KLDR_DATA_TABLE_ENTRY {LIST_ENTRY InLoadOrde ...
- ddd领域驱动设计_领域驱动设计(DDD)理论启示
过去几年通天塔一直处于快速的业务能力建设和架构完善的阶段,以应对不断增长的业务需求和容量.高可用等技术需求,现在通天塔平台已经能满足集团主站的大部分活动.频道搭建和运营能力,主流程的新需求越来越少,个 ...
- linux中流设备_[快速上手Linux设备驱动]之块设备驱动流程详解一
[快速上手Linux设备驱动]之块设备驱动流程详解一 walfred已经在[快速上手Linux设备驱动]之我看字符设备驱动一 文中详细讲解了linux下字符设备驱动,并紧接着用四篇文章描述了Linux ...
- 驱动开发笔记5—驱动对象、设备对象、IRP和派遣函数
文章目录 驱动对象 设备对象 IRP和派遣函数 IRP IRP类型 设置派遣函数 处理IRP 举例说明 设备读写方式 缓冲区方式读写 直接方式读写 其他方式读写 驱动对象 每个驱动程序都会有唯一的驱动 ...
- Linux 音频驱动(四) ASoC音频驱动之Machine驱动
目录 1. 基本介绍 2. 源码分析 2.1. Machine数据结构 struct snd_soc_dai_link 3. 声卡 3.1. 数据结构struct snd_soc_card 3.2. ...
- linux 设备驱动 ppt,linux设备驱动开发详解讲座ppt
PPT内容 这是linux设备驱动开发详解讲座ppt下载,主要介绍了设备驱动简介:建立和运行模块:字符驱动:调试技术:并发和竞争:分配内存:硬件通讯:中断处理:块设备驱动,欢迎点击下载. 嵌入式Lin ...
- c语言windows驱动编程入门,Windows驱动开发技术详解 PDF扫描版[175MB]
Windows驱动开发技术详解由浅入深.循序渐进地介绍了windows驱动程序的开发方法与调试技巧.本书共分23章,内容涵盖了windows操作系统的基本原理.nt驱动程序与wdm驱动程序的构造.驱动 ...
- Linux驱动开发|块设备驱动
块设备驱动 块设备驱动是 Linux 三大驱动类型之一,块设备驱动比字符设备驱动复杂得多,不同类型的存储设备又对应不同的驱动子系统,下面介绍块设备驱动框架及使用 一.块设备介绍 块设备是针对存储设备的 ...
- Linux驱动模型之注册驱动
前言 驱动的话我们关心几个点: 驱动是怎么添加到总线管理的设备链表上的? 注册驱动后,它是怎么和设备匹配,并最终调用驱动中的probe()函数的? 数据结构 首先看下数据结构: struct devi ...
最新文章
- C++关键字积累——持续更新
- Windows Vista即将发布SP1
- 14.count-api
- 浅谈万进制算法与大数定理的结合(高精度乘除法,阶乘)
- mysql对所有列的数据进行修改6_MySQL的SQL语句 - 数据定义语句(6)- ALTER TABLE 语句 (3)...
- Java:AspectJ的异常翻译
- 开发服务器 VSS开发库 自动备份方案
- 【转】jquery文件上传插件uploadify在.NET中session丢失的解决方案
- jQuery学习之路(1)-选择器
- 计算机老师教育叙事,信息技术教育叙事范文10篇 初中
- idea工具(1):依赖包详解
- 网络工程师十个常见面试问题
- 苹果零售店被指销售翻新机
- 2020 Multi-University Training Contest 6
- 开机就提示“请安装TCP/IP协议,error=10106”的解决的方法
- DevExpress XtraReport报表开发相关知识点
- android.bp 编译,Android编译系统中的Android.bp
- .Net 根据年份计算周次和起止日期
- 【SRE笔记 2022.8.16 Linux命令基础01】
- HTML小游戏16 —— 消除游戏《魔法石》源码(附完整源码)