驱动都存在

\\Driver 或者 \\FileSystem 目录对象里 我们只需要遍历这两个目录就可以遍历windows所有驱动

知识点

\\Driver  \\FileSystem (dt _OBJECT_DIRECOTRY)都属于 ObpDirectoryObjectType(window内核全局变量) 对象

其他对象全局变量 可以参考 作者:潘爱民 书名:windows内核原理与实现 的 2.4图

一个目录对象 含有37个DirectoryEnTry 对象(dt _OBJECT_DIRECTORY_ENTRY)

_OBJECT_DIRECTORY_ENTRY 里的Object 指向的就是 驱动的 DriverObject( dt _DRIVER_OBJECT)

具体内容看代码

VOID init()

{

UNICODE_STRING vDriverName = { 0 };

RtlInitUnicodeString(&vDriverName, L"\\Driver");

POBJECT_DIRECTORY vPObjectDirectory;

NTSTATUS vStatus;

vStatus = ObReferenceObjectByName(

&vDriverName,

OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,

NULL,

0,

(POBJECT_TYPE)0x869d0040,

KernelMode,

NULL,

(PVOID *)&vPObjectDirectory

);

if (NT_SUCCESS(vStatus))

{

KdPrint(("成功"));

for (ULONG vI = 0; vI < NUMBER_HASH_BUCKETS; vI++)

{

PDRIVER_OBJECT vDriverObject = NULL;

POBJECT_DIRECTORY_ENTRY vObjectDirectoryEntry = NULL;

vObjectDirectoryEntry = vPObjectDirectory->HashBuckets[vI];

while (vObjectDirectoryEntry && MmIsAddressValid((PVOID)vObjectDirectoryEntry))

{

vDriverObject = (PDRIVER_OBJECT)vObjectDirectoryEntry->Object;

if (MmIsAddressValid((PVOID)vDriverObject))

{

if (MmIsAddressValid(&vDriverObject->DriverName))

{

if (wcsstr(vDriverObject->DriverName.Buffer, L"PCHunter32") != NULL)

{

KdPrint(("\r\n\r\n找到了\r\n\r\n"));

RtlInitUnicodeString(&vDriverObject->DriverName, L"\Driver\text32");

}

KdPrint(("名:%wZ\r\n", &vDriverObject->DriverName));

}

}

vObjectDirectoryEntry = vObjectDirectoryEntry->ChainLink;

}

}

ObDereferenceObject(vPObjectDirectory);

}

else

KdPrint(("vStatus = 0x%08X\r\n", vStatus));

RtlInitUnicodeString(&vDriverName, L"\\FileSystem");

vStatus = ObReferenceObjectByName(

&vDriverName,

OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,

NULL,

0,

(POBJECT_TYPE)0x869d0040,

KernelMode,

NULL,

(PVOID *)&vPObjectDirectory

);

if (NT_SUCCESS(vStatus))

{

KdPrint(("成功"));

for (ULONG vI = 0; vI < NUMBER_HASH_BUCKETS; vI++)

{

PDRIVER_OBJECT vDriverObject = NULL;

POBJECT_DIRECTORY_ENTRY vObjectDirectoryEntry = NULL;

vObjectDirectoryEntry = vPObjectDirectory->HashBuckets[vI];

while (vObjectDirectoryEntry && MmIsAddressValid((PVOID)vObjectDirectoryEntry))

{

vDriverObject = (PDRIVER_OBJECT)vObjectDirectoryEntry->Object;

if (MmIsAddressValid((PVOID)vDriverObject))

{

if (MmIsAddressValid(&vDriverObject->DriverName))

{

KdPrint(("名:%wZ\r\n", &vDriverObject->DriverName));

}

}

vObjectDirectoryEntry = vObjectDirectoryEntry->ChainLink;

}

}

ObDereferenceObject(vPObjectDirectory);

}

else

KdPrint(("vStatus = 0x%08X\r\n", vStatus));

}

jpg 改 rar

遍历windows驱动的更多相关文章

  1. 梦织未来Windows驱动编程 第05课 小结(读取另一驱动,遍历所有驱动)

    读取另一驱动 驱动通过"\\Driver\\XueTr"获取到了XueTr工具的驱动,并Hook了XueTr驱动的分发函数. 具体的驱动代码如下: //FilterDriver.c ...

  2. (转)Windows驱动编程基础教程

    版权声明     本书是免费电子书. 作者保留一切权利.但在保证本书完整性(包括版权声明.前言.正文内容.后记.以及作者的信息),并不增删.改变其中任何文字内容的前提下,欢迎任何读者 以任何形式(包括 ...

  3. Windows驱动开发(中间层)

    Windows驱动开发 一.前言 依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发. 二.初步环境 1.下载安装WDK7.1.0(WinDDK\7600.16385 ...

  4. [windows驱动]内核态驱动架构

    1.windows驱动简介: 1.1 windows组件简介: 1.2 windows驱动类型: windows驱动分为两种基本类型: 用户态驱动在用户态下执行.它们一般提供一套win32应用程序和内 ...

  5. [Windows驱动开发](一)序言

    笔者学习驱动编程是从两本书入门的.它们分别是<寒江独钓——内核安全编程>和<Windows驱动开发技术详解>.两本书分别从不同的角度介绍了驱动程序的制作方法. 在我理解,驱动程 ...

  6. windows驱动开发推荐书籍

    [作者] 猪头三 个人网站 :http://www.x86asm.com/ [序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都 ...

  7. Windows 驱动开发 - 5

    上篇<Windows 驱动开发 - 4>我们已经完毕了硬件准备. 可是我们还没有详细的数据操作,比如接收读写操作. 在WDF中进行此类操作前须要进行设备的IO控制,已保持数据的完整性. 我 ...

  8. Windows 驱动发展基金会(九)内核函数

    Windows 驱动发展基金会系列,转载请注明出处:http://blog.csdn.net/ikerpeng/article/details/38849861 这里主要介绍3类Windows的内核函 ...

  9. windows 驱动开发入门——驱动中的数据结构

    最近在学习驱动编程方面的内容,在这将自己的一些心得分享出来,供大家参考,与大家共同进步,本人学习驱动主要是通过两本书--<独钓寒江 windows安全编程> 和 <windows驱动 ...

随机推荐

  1. java访问数据库的sql

    drop database if exists STOREDB;create database STOREDB;use STOREDB; create table CUSTOMERS ( ID big ...

  2. ACM/ICPC 之 最长公共子序列计数及其回溯算法(51Nod-1006(最长公共子序列))

    这道题被51Nod定为基础题(这要求有点高啊),我感觉应该可以算作一级或者二级题目,主要原因不是动态规划的状态转移方程的问题,而是需要理解最后的回溯算法. 题目大意:找到两个字符串中最长的子序列,子序 ...

  3. 5.nodejs权威指南--HTTP

    1. HTTP 1.1 服务器 var http = require('http'); var server = http.createServer(function(req,rsp){ req.on ...

  4. 1.JS设计模式-this,call&apply

    1. this,call&apply 1.1 this this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用. 1.1.1 普通函数调 ...

  5. 关于TxQBService报的错,腾讯你真牛B啊

    腾讯你真牛B啊,浏览器都7了,还特么的报这么低级的错误,还每10秒写一条windows日志,让人有什么心情用你的浏览器,滚.

  6. Greedy:Linear world(POJ 2674)

      Linear world 题目大意:一些人生活在线性世界中,到达线性世界两端就会消失,两个人的前进方向有两个,相遇会改变各自相遇方向,求最后一个人掉下的人的名字和时间. 其实这一题就是弹性碰撞的模 ...

  7. Java多线程题库

    一.    填空题 处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入____阻塞_____状态. 处于新建状态的线程被启动 ...

  8. Single Number II

    题目: Given an array of integers, every element appears three times except for one. Find that single o ...

  9. maven配置httpclient3.X jar包

    <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging& ...

  10. Mysql之高可用

    使用缓存Memcache, 1,可使用Hash算法由客户端决定路由到哪个Memcache服务器上:客户端完全不用关心数据存储在哪个Memcache服务器上:完全隔离了客户端与服务端:由于是Hash,在 ...