//自定义消息
#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;
}
``

驱动-遍历驱动、隐藏驱动相关推荐

  1. 通过驱动断链来隐藏驱动

    隐藏指定驱动 尝试隐藏这个驱动 #include <ntifs.h>typedef struct _KLDR_DATA_TABLE_ENTRY {LIST_ENTRY InLoadOrde ...

  2. ddd领域驱动设计_领域驱动设计(DDD)理论启示

    过去几年通天塔一直处于快速的业务能力建设和架构完善的阶段,以应对不断增长的业务需求和容量.高可用等技术需求,现在通天塔平台已经能满足集团主站的大部分活动.频道搭建和运营能力,主流程的新需求越来越少,个 ...

  3. linux中流设备_[快速上手Linux设备驱动]之块设备驱动流程详解一

    [快速上手Linux设备驱动]之块设备驱动流程详解一 walfred已经在[快速上手Linux设备驱动]之我看字符设备驱动一 文中详细讲解了linux下字符设备驱动,并紧接着用四篇文章描述了Linux ...

  4. 驱动开发笔记5—驱动对象、设备对象、IRP和派遣函数

    文章目录 驱动对象 设备对象 IRP和派遣函数 IRP IRP类型 设置派遣函数 处理IRP 举例说明 设备读写方式 缓冲区方式读写 直接方式读写 其他方式读写 驱动对象 每个驱动程序都会有唯一的驱动 ...

  5. Linux 音频驱动(四) ASoC音频驱动之Machine驱动

    目录 1. 基本介绍 2. 源码分析 2.1. Machine数据结构 struct snd_soc_dai_link 3. 声卡 3.1. 数据结构struct snd_soc_card 3.2. ...

  6. linux 设备驱动 ppt,linux设备驱动开发详解讲座ppt

    PPT内容 这是linux设备驱动开发详解讲座ppt下载,主要介绍了设备驱动简介:建立和运行模块:字符驱动:调试技术:并发和竞争:分配内存:硬件通讯:中断处理:块设备驱动,欢迎点击下载. 嵌入式Lin ...

  7. c语言windows驱动编程入门,Windows驱动开发技术详解 PDF扫描版[175MB]

    Windows驱动开发技术详解由浅入深.循序渐进地介绍了windows驱动程序的开发方法与调试技巧.本书共分23章,内容涵盖了windows操作系统的基本原理.nt驱动程序与wdm驱动程序的构造.驱动 ...

  8. Linux驱动开发|块设备驱动

    块设备驱动 块设备驱动是 Linux 三大驱动类型之一,块设备驱动比字符设备驱动复杂得多,不同类型的存储设备又对应不同的驱动子系统,下面介绍块设备驱动框架及使用 一.块设备介绍 块设备是针对存储设备的 ...

  9. Linux驱动模型之注册驱动

    前言 驱动的话我们关心几个点: 驱动是怎么添加到总线管理的设备链表上的? 注册驱动后,它是怎么和设备匹配,并最终调用驱动中的probe()函数的? 数据结构 首先看下数据结构: struct devi ...

最新文章

  1. C++关键字积累——持续更新
  2. Windows Vista即将发布SP1
  3. 14.count-api
  4. 浅谈万进制算法与大数定理的结合(高精度乘除法,阶乘)
  5. mysql对所有列的数据进行修改6_MySQL的SQL语句 - 数据定义语句(6)- ALTER TABLE 语句 (3)...
  6. Java:AspectJ的异常翻译
  7. 开发服务器 VSS开发库 自动备份方案
  8. 【转】jquery文件上传插件uploadify在.NET中session丢失的解决方案
  9. jQuery学习之路(1)-选择器
  10. 计算机老师教育叙事,信息技术教育叙事范文10篇 初中
  11. idea工具(1):依赖包详解
  12. 网络工程师十个常见面试问题
  13. 苹果零售店被指销售翻新机
  14. 2020 Multi-University Training Contest 6
  15. 开机就提示“请安装TCP/IP协议,error=10106”的解决的方法
  16. DevExpress XtraReport报表开发相关知识点
  17. android.bp 编译,Android编译系统中的Android.bp
  18. .Net 根据年份计算周次和起止日期
  19. 【SRE笔记 2022.8.16 Linux命令基础01】
  20. HTML小游戏16 —— 消除游戏《魔法石》源码(附完整源码)

热门文章

  1. 西门子PLC200SMART恒压供水通讯案例
  2. 亚信联创2011.9.17招聘会笔试题
  3. mmap_sem信号量死锁故障分析
  4. 【C++】命令行方式获取主板序列号
  5. 最新8款非常漂亮的免费英文字体
  6. 移动终端网页游戏移植研发框架【精灵系统-纸娃娃】
  7. 免费翻译软件-批量自动一键翻译
  8. Git在添加目录时遇到了Fatal: unpopulated submodule的解决办法
  9. 西门子M440变频器手册
  10. [矩阵论] Unit 3. 矩阵的分解 - 知识点整理