00:00
嗯,今天呢,主要来讲一下这个驱动对象和驱动便利啊,然后昨天呢,我们来讲了一个双机调试的这个环境搭建,以及第一个hello word这个驱动程序的一个编写,呃,那么今天呢,我们继续啊,我们打首先打开我们的这个虚拟机。进入debug entry。切换出来啊,打开我们的这个调试器。啊,NF5进行运行。等待进入系统。
01:05
骚了。哦,马上就好了啊。OK啊,我们现在呢,已经正式的进入到我们超系统当中了,那么现在呢,我们就来这个学继续啊,学习一下我们的这个今天的内容啊,那么我们继续来创建一个这个WDM的一个驱动啊,点击确定。好,然后新建一个新建项啊,我们还是使用C程序吧。NC。
02:01
好,然后对它呢进行一下设置。跟昨天的设置流程是一样的啊,首先设置下常规里边的这个警告设备错误,然后代码生成啊运行库啊,运行库是MTD啊,然后缓解库关掉,关掉之后呢,在setting里边把它的这个目标版本设置一下啊。啊,应用确定,然后呢,我们现在给它改成X64包含头文件。
03:09
啊,先把它最基本的一个框架给它写出来啊,然后呢,我们指定一下卸载函数啊,就是lo。好,那么现在呢,我们这个基本框架就写完了啊,那我们今天要研究的就是这个东西,这个东西呢叫做什么呢?叫做驱动对象,那它很明显它是一个这个呃结构体啊,那这个呢,一般情况下呢,是由这个我们操系统呢,对它呢进行一个填充,我们直接F12跟进去啊,你可以看到它现在是这样的一些这个成员啊,那我们呢,也可以直接通过问题bug来啊看啊问题bug呢看的更清楚一点啊,因为它有一个偏移量,我们直接把它断下来,断下来之后呢,输入DT啊,然后driver object。
04:16
好,现在呢,我们把它这个拷贝出来啊,这个东西呢,和我们这个里边的实上是一模一样的啊,然后呢,现在呢,我们就来给它复制出来啊,在这儿啊给它显示一下,可以看到啊,有这么多的一个成员啊,前面这个东西呢,是什么东西啊,这就是这个它的偏移量啊,刚才呢,我们输入的指量令叫做T啊,然后呢个结的一个名称,这个T是一个温蒂bug指令啊,温y bug指令地T啊这个DT呢,我们这这套课程呢,现在是第一次用,所以简单给大家介绍一下啊,这个课程呢,主要是用来干呢,看结构体,看结构体啊,它使用方法呢很简单,直接在T后什么呢,参数就什么参数就是结构体,结构体名称,但是一般情况下,它的结构体名称呢,是使用的是什么呢?就是这种的啊这个。
05:17
下划线开头的这种啊叫object啊,他不会去使用的,是像是嗯,就是这个啊,他这个名字好像是用的一样的什么啊,不是啊是这个啊,他一般不会用,用这种不带下划线的啊,第一个它它一般都带用这这种的好,然后呢,现在呢,我们看一下啊,它这个东西是查看结构体名称啊,如果说啊,你想把它这个附加在某一个具体的这个驱动上边,然后来看它的具体的值啊也可以,那么这个时候呢,这个值啊是如何附加的呢?就是放在它的后边,比如说我们现在啊DT啊这个driver object,你后边可以再放一个address啊,这个后边放了address之后呢,它就会把里边的每一个值啊也给解析出来,然后呢,你看完之后呢,你可以看到啊,它这里边这个结构,结构完之后,它前面这部分是什么东西啊,是基于你这个结构的一个偏移啊,一个偏移,比如说啊,这是零偏移上有一个type,然后呢,它是INT2B啊,这个INT2B呢,就占两嘛,这个两字节嘛,然后呢,你可以看到它下一个偏移呢,就是两字节啊,然后呢,后边呢,就是什么呢?它后边再有一就加这个八啊这是。
06:17
是这个九体对齐的一个问题了,好,然后呢,我们现在呢,就要干什么呢?就要来解析他每一个成员啊,比如说第一个成员是干什么,第二个成员干什么,我们首先呢,第一个成员这个东西叫做这个类型啊,类型它是主要是用于定义你这个成员的类型的啊,也就是你现在这个驱动对象的一个类型的,然后通常情况下呢,我们这个驱动对象应该是四啊,我记得应该是四啊它这个类型,然后呢,接下来呢,就是它的一个尺寸啊,这个尺寸指的是什么呢?这个尺寸指的是整个对象的尺寸啊,啊,就是我们现在整个这个driver object的一个尺寸啊,然后再接下来这个什么东西啊,这就是我们的一个这个device object啊,不要把他们俩混淆了,上面这个driver object,这个object device object呢,指的是我们的一个设备对象啊,那么我们在这儿呢,它是什么东西呢?你可以看到它是一个这个PRT64,实际上它是一个设备对象的一个指针啊,它是一个设备对象的一个指针,当你这个程序呢,创建了这个指向设备对。
07:17
之后啊,那么这比如比如说啊,你这个驱动它调用了一个叫做I driver这个device的这个API的时候,那这个成员变量呢,就会被创建出来啊好然后呢,就是flag啊flag呢,它是个这个东是一个标记啊,是一个标记,然后呢是这driver这个东西呢,它是驱动加载到内存中的地址,好然后呢,接下来是driver size,那很明显这个没什么好说的,就是驱动的尺寸吧啊然后接下来啊,再接下来就是我们的这个比较重要的了啊二八这个东西呢,就是我们今天学习的第二个内容啊,驱动便利里边这个需要用到的一个东西啊我们现在呢看他啊,好像说是一个呃,Word的一个成员,但实际上它是指向一个结构啊,它指向一个,指向一个叫做啊这个D。
08:17
R data塔,而第data这个table entry的这么一个结构,好,然后呢,我们这前面呢,给它加上下划线啊,我们也可以直接啊来给它这个显示一下啊,直接使用地T啊,然后给他。查看回车,回车之后呢,这个就出来了啊,出来之后呢,我们现在呢,给它先放到底下进行一个注释,好放在这儿啊,然后我们接着解释后边这个东西啊,然后这个呢,后边这个也是一个结构啊,你可以看到有这么一个结构,这个结构呢,对咱们暂时还没什么用,大家知道有这么一个扩展结构就可以了,你可以看到就是这样的一个结构。
09:00
啊,这是一个这个这是一个这个拓展结构啊,它指向了一个这个我们的啊,这个结构的一个指针啊,它呢是用来这个怎么说呢,它有它有一个叫做这个A的一个东西啊,它是指向这个a device的,而且它这里边唯一一个这个可以用的这个成员其实就是这个呃,A。我这也写一下吧,指向结构啊,接下来呢,这个就是驱动名了嘛,驱动名这东西就没什么没什么好说了,就是驱动对象的一个名称啊,你可以直接对它进行打印啊,因为它是一个unode STEM的一个类型啊,你可以直接使用这个给它打印出去啊啊接下来呢,这个是一个这个呃,注册表。注册表的硬件配置信息啊,你也可以称它为什么呢?也可以称它为硬件数据库啊,硬件数据库的路个相关fast。
10:09
Fast。IO的入口啊,这个东西呢,它用的比较少啊,这个东西呢,只有这个FSDS的一个和这个网络传输驱动啊使用好,然后呢,接下来呢是driver in,这个driver in it呢其实就非常简单了,这个东西其实就是driver entry啊,就是它的入口点。啊,就是driver entry,然后接接下来呢,是有一个叫做这个driver start,呃,Start,嗯,是start IO的一个东西啊,这个driver IO呢,一个I个就会是一个闹啊。如果有的IO。
11:00
就会被设置,否则为闹,然后再下来就是这onload,这没什么好说的,驱动卸载函数对吧?好接下来呢,这个呢是什么东西啊,这个呢,其实是IP的一个派遣啊,派遣函数成员啊,什么叫RP的一个派遣函函数成员呢,我们直接跟进去F12啊在这呢,你可以看到啊这个东西呢,它是一个这个结构啊,我们看一下这个,呃。它这里边的一个内容啊,这个东西呢,实际上就是一个东西,一个什么呢?一个这个叫做怎么说呢,这个东西应该叫做含水针啊,我刚才反应过来了,函数指针啊,你每一个派遣函数呢,都是一个函数指针,然后呢有两个成员,一个是设备对象,一个是RRP啊这个东西的主要是干什么呢?其实呢,它是用来这个的,比如你如果状个下来之后通过的派这个派派呢,你可以对它呢进行一个设置,这个呢,我们在之后两节课呢会讲到啊,就是如何去利用它这个东西创建设备对象,以及进行这个IP通信啊,这个呢,暂时呢,你可以现在有了这么一个成员就可以了,了解完这些东西之后呢,那么就进入到我们今天一个相对重要的一个环节,就是我们这个。
12:31
的这么一个结构啊,这个结构呢,是我们今天要讲的,那么首先呢,我们来看一下啊,这里边呢,最先开始的地方呢,有这么一个这个这样一个成员啊,零天一这有这么一个成员,它的成员类型呢,叫list entry啊这个东西呢,我们首先需要了解一下啊,我们DT一下这个就是所谓的这个list entry啊,我们直接在上边给它进行一下注释。好,你可以看到啊,这个driver entry里边呢,一共有两个成员,一个成员呢,叫做这个fli,一个叫做blink啊,他们两个呢,都是这个啊。
13:06
类似entry类型的啊,然后呢,它是分别在零偏移和八偏移这个位置上,那么这两个东西呢,实际上就是什么呢?就是向上的指针啊,啊不是那个,这个是向下的指针啊,向下的指针和向上的指针,那么它指向什么呢?它每一个指向都指向什么呢?指向list ENT这么一个结构,也就是说呢,这个结构实际上就是一个双向链表,双向链表啊,但是呢,我们有一个特殊的点是什么呢?就是我们在正常使用双向链表的时候呢,我们肯定就是呃,有指向上的,有指向下的,有指针有指针对不对啊,但是我们内核里一般情况下,如果他用双向链表了,它就会是一个双向循环链表啊,也就是说头尾相接。啊头尾相机啊,并且呢,我们这个在灵环里啊,使用这个list entry的时候呢,它通常情况下呢,会有一个这个呃,特殊的情况就是说,你比如说这种哈links啊,它这种东西挂腰上啊,它不会挂在头上啊,你像是我们这个零环啊,一般情况下你不是我们三环啊,一般情况下你使用这种双向链表,你会把它这个结构呢,放在头那啊对不对,然后好寻指,但是呢,因为它这个零环里边这个状态啊,所以说呢啊,它就给你挂腰上了,或者挂尾巴上的也是很正常的,你就说这儿啊,你看这个已经到尾巴这儿了啊,我们这个呢,就是一个双向链表的一个指针啊有fli有bli啊那么好那么好,那么我们确定了这个东西之后呢,我们就可以确定啊,前三个东西啊,都是什么,都是list ENT啊,那我们今天呢,想要这个了解的呢,是什么呢?是其中的一些对象啊,一些成员我们不需要全部了解啊,像是驱动对象我们需要讲,所以说呢,我们就全部了解了一下,但是如果说是这个啊LDR这个N这个东西呢,那。
14:58
不需要全部了解,我们需要选几个重要的了解啊,首先三个表我们要了解一下,首先第一个表,这是什么意思呢?这个呢,就是我们最重要的一个表啊,这个表会把系统所有啊已经加载的,所有已经加载的驱动模块链接到一起啊,链接到一起啊,然后呢,他的第一个成员呢,如果不出意外的情况下,应该就是那个内核啊,然后呢,第二个开始就是这个它的一个驱动模块啊,然后第二个呢,也是类似的一个作用啊,这个第二个呃,我想想第二个这个东西应该是干嘛的,应该是还没有初始化的时候,它就串联起来了啊,然后第三个呢是那什么,第三个呢,是所有调用完这个招entry的啊,然后链接到一起啊,如果没有记错的话,应该是这样的啊,他们三个呢,都是加载这个驱动的一个链表,但是我们用的呢,只是第一个啊,只是第一个,然后呢,这块呢,这个东西呢,比较重要就是它的一个地址,然后再下。
15:58
一个呢就是什么?这就是驱动的一个入驱动的入点,这个是镜像啊,镜像大镜像寸镜大小啊,这个of image,这呢是两但两像,这个个是带着驱动的一个径啊径啊,然后呢,这个底下这个是什么呢?是一个称啊,不带径啊不带径啊,然后底下呢,这是这个标记啊,这是加载总数啊,TS的一个索引啊,然后哈斯link这个东西啊,这个还有这个指针啊,然后那个校验和时间戳啊,然后底下这些东西呢,咱们暂时呢就用不到了啊,但是用不到了,我们需要了解的就这些东西,好那么我们最主要的就是什么呢?就是通过我们的这个driver right把自己当成一个节点啊,在这个成员上边啊,进行一个什么一个转换,然后拿到这个成员的什么呢?这个这个成员,然后找到这个list n。
17:07
Debug。好,这样就可以了,然后呢,我们来写这个便利驱动的一个程序啊。啊,他的这个参数呢,也要把这个P传进来,因为我们要通过他的这个成员来进行驱动的一个便利啊,没点关注的点点关注啊,咱们每周一到周日晚上都有直播,然后呢,有需要往期的课程的,可以联系咱们的老板进行获取啊,老板的这个联系方式就在公屏上,你可以直接叫他。
18:10
啊,然后呢,现在呢,我们开始啊,首先呢,我们需要两个指针啊,两个这个两个这个P啊,两个P的NT,一个是头指针。List首先给它初始,初始化成now啊诶。然后第二个啊,P list entry next list等于呢,好,然后呢,两个成员啊,我们便利的时候打印带路径呢和不带路径的啊,一个是POS。Driver name QS,好,然后呢,我们现在呢,就要来获取它的第一个节点,那它第一个节点在哪呢?我们传进来的一个drive object,那的第一个节点肯定就是这个加二八这个位置的一个成员,但是因为我们的这个结构啊,这个结构我们直接拿过来你看一下。
19:23
它不是一个导出结构啊,你就算把它这个下划线去了,他也不是一个导出结构,所以说呢,我们没有办法直接用它这个结构来使用,当然你也可以用这个结构,怎么用呢?你就根据它这个状态,把它改成这个我们相应的这个对象类型啊,把这些东西都改前面去就可以了,那那如果不这么用呢,那么现在呢,我们有另外一种方式来使用它啊,就是首先啊,我们现在啊一个这个节点。头节点啊,等于强制转换成这个p list driver。Entry,然后调用啊P点这个成员。
20:05
啊,那为什么这样可以呢?首先呢,我们要了解一下这个成员,首先这个成员是指向哪的呢?等于我们这个LENT的一个首地址,那他的这个首地址啊,首地址的成员是什么呢?他0X0X00这个成员是什么呢?0X00这个成员是我们的这个。Load link啊,这个东西啊,你看是这个东西,那么这个东西他的第一个成员是什么东西啊,不是他这个第一个成啊,对他第一个成员什么东西,因为他是绿次entry嘛,所以说它第一个成员是什么东西啊,0X00这个位置啊,它是link,也就是一个向下的指针,那所以说呢,我们现在呢,这三个,这三个东西看上去好像是三个不同的东西,那际上这三个东西指向的是同一个地址,也就是说呢,我们现在指向了driver driver object,它里边的这个成员,那实际上也就是指向了它里边的这个啊,Link啊,它这个列表的f link,所以说呢,他就可以干嘛呢,就指向了第一个成员啊,然后呢,现在呢,我们就可以用它啊,然后来获取下一个成员在哪啊,就是list这个next link啊list,然后用这个东西啊,我直接啊I link就可以了啊,你看现在就找到了它下一个成员在什么地方,那么因为我刚才也说过,它是一个循环链表啊,所以说呢,我们可以直接判断一下头尾相等。
21:28
啊,头尾不相等,就是没到头啊,然后让进行啊,那么这个时候呢,如果说啊,没到头的情下,我们就可以用下一个啊,等自己的下一个啊,下己的link。好,然后呢,在中间啊,我们就可以来获到的这个名字了,因为我们在每实都是么呢,我们的这个en啊,那么现在呢,我们位置,那么我们要的名字呢,一是边个是呢,一个是一个是它的名字啊,所以说呢,我刚才也声明了两个变量,一个是这个啊POS,一个是POS啊,那现在呢,我们可以用们俩获取一下它的具体的一个名字,比如说我们先获取一下他这个名字啊,那名字是什么东西啊,名字呢就是这。
22:17
好,那我们把它复制出来。然后现在呢,我们用它来获取啊,那这个东西呢,首先呢,它肯定是一个p code string的这么一个类型啊,然后我们对它呢,进行一个强势转换啊,强势转换之后呢,那么现在呢,我们要从它的list等进行相加,首先我们要给它套个圈,再套一个圈啊,进行类型的一些强势转换啊,转换成U浪浪,然后呢,这个U浪浪呢,是对这个表的一个强换啊,然后呢用加上零想。呃,0S58啊,0S58的一个偏移啊,然后现在呢,就可以拿到什么呢,拿到它的这个名字了,拿到这个名字之后呢,这是第一个,第二个呢,就是我们还有一个路径啊,路径呢是以它类似的形式啊,直接一个p unde。
23:05
然后。浪漫。List加上048啊,因为这是什么,因为这是四八上面那个全路径嘛,我们来看一下这个成员啊这个。好,那现在呢,我们就可以对它呢,进行一个输出啊,然后来使它进行一个显示的一个功能,直接debug print,然后我们这种呢,这个driver,这个pode,使用WZ啊进行一个输出,所以说在我们两个东西,一个是名字啊名字,然后然后呢中空跟。
24:04
我把这个去掉啊。路径后边啊,也跟一个啊冒号,然后百分号WZ。后边呢,跟的就是什么,跟的就是我们两个变量啊,一个是名称,一个是路径。好,这样呢,我们就OK了,OK之后呢,我们对它呢,进行一个调用啊,在这儿啊进行一个调用,把我们的这个driver object传进去啊,然后直接结束啊,重新生成。好,生成成功啊,现在呢,我们取出它的一个驱动。哎,卡住了吗?啊,我这还没恢复呢,F5啊,把它运行起来啊。
25:03
好,打开管理员运行。啊,没点关注点点关注啊,每周一到周五是赛娜老师直播,每周六周日是我直播啊,每天晚上都有直播啊。哎,我好像把那玩意儿删了是吧。关掉日志,继续运行。清空啊,清空完事之后呢,我们对它呢进行一个安装。安装启动。
26:01
等待啊,稍微等一下啊,他的便利。啊,遍历出来了,历出来之后你可以看到啊,这就没有问题了,对不对啊,这个前边是这个驱动名称啊,到这儿你看是这个SYS结尾,然后后边呢,Driver啊,然后呢,这个不用管啊,这个是签名的问题,后边呢,就是它的一个路径,你可以看到是一个这个完整路径啊,System root啊,这个是一个这个相对路径,然后SYSTEM32啊,然后drivers啊,什么MP什么的啊这种啊这个呢就是完成了它的一个驱动的一个便利,并且呢,我们已经了解完了我们的一个,哎,我先把它卸掉了,停止卸载,好,那么我们也了解完了我们这个这object一个结构的一个基本情况啊好,那这个呢,就是今天的一个技术部的一个全部内容,有问题的呢,现在可以问啊,没问题的呢,咱们一会准备进入下一步骤啊。
我来说两句