00:00
嗯,我们今天跟大家讲一下,就是二三与二零的一个通信,然后像通信之前的话,可能这个代码不太好理解,所以说需要,呃给大家讲一些就是铺垫知识。我们都应该知道,就是呃,保护模式啊。啊,只是我们之前学的这些专业保护基础啊,这些专业的一些保护模式。它主要保护的是什么?其实保护的主要就是硬件。啊,保护的主要是硬件,那它最好的一个简单又有效的一个保护手段是什么?那就是加以权限。最简单的呃保护嗯手段就是嗯分与权限。换句话说的话就是什么,嗯。二三。啊可以啊,不可以啊,访问硬件二零呢就可以访问硬件。
01:07
啊,就是最简单的有效的一个方法啊,就是嗯,操作系统,因为它是二零代码,它也可以去访问硬件,然后呢,二三它就不可以去操作硬件,那这个就是一个最简单的一个保护手段,对吧,但是就是操作系统有个致命的一个问题。致命的问题。他不开发硬件。然后呢,然后他还是嗯,支持各个各个厂家。啊,什么意思啊,操作系统它是自己不做鼠标键盘这这些硬件的,对吧,也不做什么啊主主板什么摄像头之类的,然后呢,它还能支持各个成家的一个硬件,就比如说我今天啊键盘换个机械键盘,明天换个圆口键盘,然后呢,今天显卡换个什么啊华硕的七彩虹的对吧,可以来回更换。
02:03
它是支持各个硬件的。那么成家。成家就是开发这个硬件,呃的成家他肯定是有这个要写这个代码的呀,他也得去操作硬件,所以说成家这个代码,成家写写出来的代码啊,必须能访问硬件,能访问到硬件,也就是换句话说的话,厂家写的代码的话啊,必须是什么二零权限,如果是二三权限的话,对吧,那我们自己也可以去什么呃,去开发这个模模仿这个成家这个代码去操作硬件,那这个保护模式不就失效了吗?所以说,厂家写出来的代码必须是二零权限。那操作系统还还要什么支持各个厂家的一个硬件,对吧,所以说他必须要留,必须要统一接口。
03:02
啊,必须要同一接口。那这个接口的话,就是我们常说的这个点SYS啊,就是我们这个驱动文件。嗯,也就是说操作系统。一启动啊,把所有的。啊,点SYS文件啊,加载上来啊,就相当于是操作系统的一部分嘛,那这个啊,就是点SYS基本就是我们这个,嗯。嗯,就是操作系统给这个成家留了一个接口啊,这个就是我们现在所写的一个驱动文件,那为什么就是说,嗯,我们现在呃不去开发硬件也能去写这个点这个什么驱动,呃点这个驱动文件,那是因为我们这个写出来的这个东西的话啊,它没有这个什么硬件,所以说他就。统称为这个什么内核驱动啊,就是这么个来的。嗯。那么我们现在就可以理解了,对吧,换换句话说的话就是说,嗯。
04:04
硬件驱动。是不是只是一个服务啊。啊,其实就是一个服务程序。啊,专门去服务什么。服务,呃。服务这个硬件。对吧,也就是说呃,硬件驱动就是现在这个我们写的这个硬件这些驱动啊,其实就是操作系统专门给这个硬件呈现啊的一个服务程序啊,也就是说操作系统给嗯硬件厂家的厂家的开发框架。只不过我们现在写的这些代码都是在模拟这个厂家去开发这个什么硬件驱动,对吧。也就是说现在我们写的这个什么驱动,其实就是呃开发框架,那么既然是成家的一个开发框架的话,那么操作系统。必须要什么?
05:01
支持所有硬件的。操作对吧。什么鼠标键盘,它必须所有硬件它都需要去支持,所以说的话,呃,面对这么多的硬件的话,操作系统的话,就抽象出了什么,呃,设备的概念。对吧,鼠标键盘这些东西它就全抽象了啊,抽象成一个设备的概念。也就是我那个在object。啊,这个一会就是我们通讯的一个重点啊,就是二零的啊object。啊。设备对象。之后呢?抽象出这个设备对象概念之后啊,你就可以理解为啊,这是一个对象,啊,这是一个对象。
06:05
啊,这个也是一个对象啊,这个就什么鼠标键盘摄像头。鼠标。啊,键盘啊,摄像头。啊,设备对象啊,这些都别抽象为设备对象了。他抽出来这些设备对象之后,嗯,并没有用,对吧,是他只是把这个抽象为对象了,但是你怎么去操作这些对象啊,对吧,鼠标键盘啊,我应该怎么去操作这个鼠标,怎么操作这个键盘,我这个渠道啊,我这个呃框架我还得什么,嗯。抽象出他们的同一操作。框架需要抽象出他们的统一操作。嗯,因为什么?因为他们那个键盘鼠标的一个读写方式不同,对吧,键盘可能摁一下键盘对吧,我去读数据读的是什么一个字母啊,那摄像头呢,我感觉摄像头的话,它应该没有读数据吧,就算有读数数据的话,应该就是读出来的是一个画面程序对吧?所以说他们的一个什么操作不同。
07:13
那这样的话就是操作系统的话,就抽象又抽象出了一个什么嗯,IO。对吧,因为什么啊,你不管什么设备都需要读和写的这些操作吧,只是你们读写的方式是不同的,但是你们的嗯,往上往。底层抽象的话就是一个读写操作,对吧,每个设备你都有读写操作,所以说操作系统有一个叫做IO管理器的东西啊,就是在设备上面的话,它会有一个什么啊,内核当中它会有一个IO管理器。但是IO这个东西太底层了吧,对吧?呃,不方便我们去二三的用户操作,所以说什么操作系统啊,就聪明的抽象出了文件的概念啊,啊,一切借文件啊,都应该听过这句话。
08:02
街。啊,一切都是文件嘛,什么意思,也就是说嗯,我去读文件,我先把文件和你这个设备去绑定啊。我的什么R3操作文件,我这个文件先和你这个设备去绑定起来,我去读打开这个文件,我就相当于去打开你这个鼠标设备,我去读这个文件就相当于去读你这个鼠标设备,我去写这个文件的话,我就相当于去写你这个鼠标设备,那这样的话,我这个操作这个抽象出来这个框架是不是就比较简单还通用。等于操作啊,设备对象啊,简单通用。啊,所以说的话,二三的想和二零通信啊,非常简单,就是什么创建文件啊,打开文件啊,什么啊读文件啊写文件。
09:07
呃,但是问题又来了,对吧,523去操作这些东西的话,IO管理器是怎么知道的,所以说二三当去操作这些API的时候啊,啊操作这些文件API的时候啊,它就会什么像设备这个IO管理器去发送这个IRRP请求。比如说我去创建文件,它就会发发送一个什么创建IP的一个请求,那这个操作的话就有点像我们这个阿三的一个,呃,窗口程序对吧。啊,像。对吧,你创建窗口的时候,它就会什么。他就会来什么WM回馈的消息。那现在呢,只不过什么换了,现在不是窗口了,是设备了,你去创建设备的时候,它就会发送什么创建IP的一个请求,那这个IIP校级的话,它只能什么设备去接收。
10:04
只能设备去接受。嗯,再简单来来点说,就是以前呢,我们写的窗口程序,所有的什么消息,他被被封装成了message这个结构体啊,它只能什么窗口程序接收。那现在呢?呃,我们的这些设备校区被封装成了什么ARP,它只能什么啊设备去接受。那以前我们这个窗口是不是都需要去写这些回调函数啊,对吧,因为什么啊,当你来校区的时候,他也不知道你要去这个创建校区,你要干什么,对吧?你是不是得注册一些回调函数,那现在IO管理器也是你这个IP消息来了之后,我不知道你你这个IP创建要要做什么事情,对吧?所以说什么呃,在我们去创建那个设备的时候啊。创建设备的时候需要提供啊回调函数啊,这个就和我们这个窗口就有点像了,对吧,那你当你去注册这个回调函数的时候,你现在来这个什么IP效果IO管理器就能找到你这个设备的什么,嗯,回调函数对吧,也就是这么个逻辑。
11:23
嗯,那知道这些知识点之后的话,我们就写这个代码就比较简单了,对吧。嗯,还有一些就是比较杂碎的,就是在我们写代码的时候写就可以了,就比如说你创建创建这个文件的时候,你怎么知道这个设二零创建的一个设备在什么位置,所以说还需要一个什么,呃,对对象名字对吧,设备对象名字,那这些名字的话,它都是有什么?呃,格式的啊,就是我们常说的符号连接啊,都是需要格式的,那一会我们去写这个API啊的时候,我们就知道了。然后我们先去写这个什么二零的一个代码,二零的代码。
12:05
那第一件事的话,220的话,肯定是需要什么。嗯,去创建设备对象对吧。你得先有这个设备对象。啊,我先把这个拿出来。那创建设备对象的话,就是什么IO。Driver。然后我们就可以什么,嗯,看一下F1对吧,它的参数。啊,第一个就是你这个设备对象肯定和你这个驱动是挂钩的,对吧,所以说对吧,第一个参数就是我们的一个驱动对象。第二个参数的话,就是你这个设备的一个扩展字节的一个大小,我们现在我们根本就没有设备对吧,我们这个设备是被虚拟出来的啊,所以说嗯,我这个扩展这个位置我们先填零就可以了。
13:08
第三个参数的话就是说了,刚才比较重要的就是说什么,呃设备设备这个名字对吧,23怎么知道你你这个设备叫什么名字,所以说您得需要什么提供一个呃符号连接的一个名字。存说先去什么啊?创建设备对象名字,也就是我们常说的符号连接。优妮蔻的啊,使劲准备出来。有。嗯,这这这这个叫什么,嗯,有。啊内。
14:00
好。然后什么把我们这个什么设备名字拿过来。嗯,当然我们现在还没写呢,我们一会再去写,然后就是你这个设备的一个类型,对吧,设备的一个类型。嗯,然后我们看一下我们那个设备类型,我们是,嗯,没有设备的对吧,我们什么设备都不是啊,我们找一下我们什么设备都不是的话,就是什么,嗯,所以我。我不知道我这个设备是什么类型啊,在后面。然后我们填一下设备的一个类型。然后就是我们的一个设备的属性是吧,然后我们回来设备的属性的话,我们看大多数驱动程序,我们就填这个默认值就可以了啊,他推荐我们填的这个。呃,最后啊,还有两个参数,就表示这个设备是你独占嘛啊,独不独占啊,我们可以独占对吧,因为这个程序的话,就我们自己用啊。
15:04
嗯,别的这个程序它是不用的啊,我们只是服务于我们自己啊,我们可以独占。最后的话就是说他创建出来的一个什么设备对象的一个啊指诊他就会传给你啊。然后我们把这个设备对象拿出来。嗯,然后就是什么,我们的一个什么P。第一。Object。要把它存过来。嗯。能取看见啊,用取例子吧。指向变量的指针是吧。二级之证对吧,没错。然后的话,我们就可以什么去判断一下他这个返回值对吧。
16:07
然后。如果。嗯,我们可以直接用这个红啊判断是否成功,然后取个反就可以了。啊,我们就可以吃吗?不用烫了。吃个饭。然后打印一下。如果失败了怎么办?啊,如果失败了,我们就是可以这么直接返回的,对吧。啊,那我们现在这个设备就有了。那设备有了之后的话,嗯,你得这个我们还得去设置一个通信的一个方式,二三和二零的一个通信方式,对吧,毕竟我们现在用的内存的话,不是一块内存了,对吧,二三用的是他二三的内存,二零呢,他用的是二零的内存,所以说我们得需要设置一下,你到底你和你们两个,两个只是二三和二零的方式是什么,我好给你准备好对吧,然后呢,我们就可以什么在这个。
17:29
嗯,送到一个flag。然后我们去和上。嗯,或等于。嗯,常见的通通信方式的话,它有三种啊,然后我们可以看一下。嗯,我们找一下flag。诶,这个是进哪去了啊,我们进那个驱动对象去了,我来到设备对象。啊,那么找到这个flag。
18:01
嗯,你看可以看到这是什么啊,IO管理器对吧,缓冲类型。呃,我们用的是什么,我们现在就用一下就是嗯。就用这个环冲雷型就可以了啊。然后常见的啊,它这个通讯方式有很多啊,嗯,我们先简单介绍一种啊,就是这个。缓冲去毒血,我们现在用的就是缓冲去毒血。嗯,你可以理解为什么,嗯,缓冲缓冲区读写的方式的话,就是二三发过来这个数据的话。操作系统。就是我们这个OS操作系统,他把二三的这个缓冲区这个数据啊,拷贝到啊copy到啊内核啊地址,然后呢,我们内核地址啊去读,就是中间多了一一个拷贝的一个操作,那还有一个就是什么,嗯,直接读写的一些方式啊。
19:09
啊,这个以后我们来介绍直接读写方式的话就是二三。R0啊,指向。同一物理啊,我们就直接啊共享内存啊,这个我们这个在这个二三下的话,应该听到我共享内存那个东西啊,这个就直接读写的话,就是一个共共享内存,还有就是一个呃,其他读写。啊,就是说什么二零直接去这个读这个二三,那个读这个二三的一个内存,那这种方式的话,它是一个不安全的啊,一旦发生这个什么进程切换啊,它就容易什么啊蓝屏,因为什么地址就错了对吧。所以说我们写代码的话,基本全是用这个缓冲去读写啊,啊,我们直接给它设置上去就可以了。呃,设置上去之后的话,就是说二三现在是找不到你这个什么啊,这个设备名称的啊,这个设备名的话,你可以理解为现在的话只是2.0去用,所以说我们需要去通过它去创建那个什么符号连接啊,然后呢,我们还得准备一个符号连接,然后呢,有。
20:18
就包括这个吸盘啊,我们看到的这个吸盘啊,这个东西它也是一个符号连接,它真实的名字它不是这个啊,它在这个二零下的话,这个吸盘它这个名字它根本就不是这个这个C盘啊,C杠号冒啊CC杠冒号杠这个种东西就是一个符号连接,所以说我们得准备一个什么u link name。然后呢,我们去什么?嗯,创建这个符号连接IO,嗯,性link。然后把我们的一个什么符号连接名字拿过来。
21:00
然后呢,嗯,设备这个名字拿过来,让他通过你这个设备去创建一个防护连接,然后我们也用这个状态去接收一下。嗯。嗯,然后现在创建防护连接失败的话,但是我们那个设备出来了,对吧,所以说我们得什么,呃,把这个设备给它删除了。啊p drive啊给它删除掉啊,删除设备。最后的话就是什吧,刚才说了对吧,你现在是不是就需要去注册这些回调函数啊,啊操作系统这些什么读写这些都帮我们写好了,对吧?啊都给我们提供好了这个接口,那我们去注册就可以了,那怎么注册呢?嗯,就比如说。嗯,我们这个他提供了很多个啊。啊,这个在哪在哪找我们就可以去什么这个嗯,P。
22:00
这个就在我们这个设备里啊,设备里对象里,然后有一个数组,你可以看到这个数组就是我们的一个什么啊回调函数啊,可以理解为这个为了就是我们的一个回调函数。然后他也准备了一个红,你可以看一下这个就是他为我们他能操作系统能想到的啊,这些常见的一些操作啊,啊,就比如说这个创建啊关闭啊读写那这个就是啊,我们比较常用的嘛,啊剩下的话就是一些其他的啊。其他的硬件相关的啊,就跟我们没有什么太大的关系了,那我们就可以什么去注册了呗。啊,把这些什么印的。I等于零。哎。小于什么这个数组的一个最大数数量对吧,加上一个一,然后呢,I加加。之后呢,我们就可以什么啊去注册。
23:04
啊,回调函数。啊,每个按项我们都给它等于一个什么默认的处理函数。啊,默先给他整一个默认的处理,然后我们把那个什么,它那个回调函数的一个原型拿出来。然后拿过来。然后我们写到这里操作这个就是我们那个默认的啊回调。默认处理。嗯,默认。然后我们先给他。
24:02
嗯,注册默认回调函数。然后你想具体去修改的,比如说我们要写,先写个读和写对吧,读写操作我们得最至少我们得有读写操作吧,嗯,然后你再改对吧,嗯,然后你不知道他这个啊第几项到底是读写对吧,他就给你提供了这个红。ARP,然后m go read之类的,就刚才我们见到了对吧。对吧,就比如说他你不知道这个第几号是,然后你记住这个红就可以了啊。凸显。然后再来一个。写对吧。啊,鞋。然后我们去写写几个读写去覆盖它就可以了,对吧。先别让他报错,然后再写一个读和写的一个操作。啊,然后就是read。
25:04
然后呢,外部。啊,读一些操作拿过来。嗯。然后这个还有一个最常用的就是一个控制啊,这个控制我们一会再讲,我们先把它写出来P。控制啊,这个我们现在给它注释掉。然后我们看看我们还有还有什么啊,这个就是在呃驱动的创建啊,我们基本就是什么注册都已经剪完了,那在卸载的时候,我们可以想一下卸载,你这个驱动都卸载了,那你这些什么符号连接和这些设备对象都属于是内核对象,对吧?那我是不是应该也得释放掉啊,所以说在驱动卸载的时候我们要什么?呃,删除符号链接。
26:03
啊,把他这个名字删除符号连接啊,删除他这个设备我们都得去啊给它卸掉。然后呢,我们先准备一个什么,用力后的,嗯。石俊。嗯,有link。Name。然后什么IO delete?啊,删除发号链接对吧。举例子。还得擅出什么?嗯,删除这个设备对象对吧,然后设设备对象的话就是IO delete。在我,但是我这个里面的话,我们是不是找不到这个设备对象了,但是我们在这个位置是不是都给他绑定好了呀,跟确定对象都已经绑定好了,对吧,所以我在。在哪绑定呢?我们看一下是不是在这个函数里我们就进行了一个绑定啊,啊,那在删除的时候我们也没有什么问题了。之后的话就是,嗯,你这个名字我们是不是还没初始化进行一个写啊,所以说我们得找一下。
27:05
他这个名字。嗯。啊,命名。命名。嗯。我们找一下。对吧,这个就是他给我们。案例啊,他这两个名字。我们可以给他。拷贝过来。嗯,拽我啊,两个下划线对吧,然后一个什么。然后这个是,嗯。嗯。符号连接名字应该是啊。这个应该是符号连接名字,这个这个就是符号连接名字,你可以看到啊,IO的什么设备MDOS啊,设备名称以已创建什么,例如下面的这个格式,那这个就是一个皇后连接名字的一个格式啊,然后我们就可以整两个宏。
28:02
井号地犯。嗯。D专用内蒙啊设备名字。嗯,设备名称的话,给他拷贝过来。啊,就按他这个格式来就可以了,出国内蒙。然后再来一个什么,呃,符号连接名的对吧。在我link内嘛。啊,要令的内容啊。Link。Name,然后看看这该是四个下划线是吧。啊,不是。啊,是叫这个名字。然后呢?睡觉。嗯。就叫宁吧。
29:01
好,有了这些名字,有了名字之后的话。我们在刚才创建的时候是吧,我们就可以用我们之前学的那个字符串操作啊,给它进行一个初始化。嗯,首先的话,还有这个位置也得初始换一下啊,Rtl in it。用扣的试卷。然后取离子。然后呢,找到我们这个link name对吧。然后这个操作。复制一下。来到这里是吧。一个是link。内蒙。还有一个是中国内蒙。好。然后我们就可以去写这个什么默认的一个处理函数了,对吧。
30:05
默认处理,默认处理的话,首先的话,我们得返回一个状态。这个状态是我们这个用什么23API的一个返回结果啊。返回结果。但不代表。操作完成什么意思?假设你去读这个文件,呃,读1000个字节的话,嗯,你用的是这种异步,还有对吧,就是说函数不堵塞立马就返回这种你是读成功了,但是你没读完对吧。你可能1000个字节你读只这回第一次你只读了500个字节,你操作是成功了,但不代表完成啊,就这个意思,这个呢就是代表函数的一个返回结果,但不代表你把1000个字节全部读完了,所以说二三的游戏API的话,就是有一些就是你的一个实际读取的一个结果,对吧。
31:03
这个反馈值就是这么个意思。那怎么代表这个函数已经完成了啊,你这个RP已经完成了,就在这个RP里的一个IO状态有一个。然后呢,叫呃状态。我们就可以什么给他设置一个什么完成。代表ARP操作完成,比如说读文件1000字节,那这个当你设置上这个时候,你才算真正的一个完成,对吧,然后呢,还有呢,就是你实际的一个读取的一个字节数。这个就像我刚才说的,你这个函数返回成功了,但不代表你全读完了,你实际的读取的一个字节数就在这里去设置,就刚才我设的对吧,你这个位置假设设一个未完成,比如说设置了一个比其他的没完成,比如说零对吧?啊就啊这个一就代表没完成。
32:02
然后呢,你要读1000个字节,你函数返回了啊,函数返回成功了,但是你这个里写了500,那你是不是还剩500个字节没读啊,所以说这个操作啊,就是这么玩的啊,那现在的话,我们默认操作不不涉及到这些对吧?啊就。就写这些东西,然后呢,IO。对吧,嗯,然后呢,告诉他我这个IO已经完成了。哎,哎呦。对吧,哎,我请求完成。就是可以告他结束这个IP了。啊,把我们那个什么,呃,IP拿过来。然后最后一个参数,我看一下啊,有点忘了这个最后一个参数。
33:02
我们看一下啊,最后一个参数啊,常量呃,错误,因此现成啊。如果你这个有的API对吧,就像刚才说我这个堵塞的这个AAPI,你如果没有去结束aip,它这个线程是被挂起的,那你填这个红的话,你就告诉他你个线程不用等了,你就可以去啊,可以线程去恢复正常去执行了啊,我们就填这个红就可以了啊,那就我们的一个默认处理啊,就结束了。结束之后的话,我们就来到了我们这些读写操作呗,那读写操作的话,其实对吧。第一步都先去什么成功,但是读和写不一样,不一样了,我们得首先先要去获取一下当前战。嗯,然后我们先写一下这个函数啊,IP get car。那那。
34:00
获取一下当前赞啊,一会儿来解释一下为什么要这么写代码。然后呢,它会返回。当前站。拿过来。P。嗯,这个什么意思。嗯,我们可以想一下,我刚才说了对吧,我们这个通讯框架通这个写的这个框架是window是提供给硬件的,对吧。但是我们想一下,你去开发硬件的时候,其实也会遇到一个问题,对吧?呃,你比如说你去开发一个鼠标或者键盘,我们就比如说这个键盘啊。你去开发这个键盘驱弄的时候,你肯定会有个通信对吧,通信点SYS,这是必必必然会有的,对吧?啊,你这个键盘你可以去调设置一些按键对吧,现在你装有一些牛逼的键盘,你去弄一些快捷键啊嗯,去啊可以就是快捷快捷一些对吧,那个通二三和二零通信的方式肯定是有的,但是呢,还会有一个什么比较底层的一个芯片点SYS,就是完全和你这个键盘就是最底层的一个部分,对吧,你肯定是会有的。
35:17
那这时候的话。对吧,你就什么,嗯。二三发来一个请求包,这个发来一个IP对吧。你这个通信点SYS是不是做不完呢?你是不是还得去向下去传递啊。对吧,你通讯Y s.SY啊,有些事情。做不完。需要向下传递对吧,然后呢,传递给这个芯片点什么SYS。那你就可以想象了一下,这个是不是有点像这个函数调用了呀,那你是不是就间接性的就成了一个什么啊对战呢。间接性的这个传递下去就成了一个我们函数调用的一个对战一样,对吧,但是有些参数的话,它是共用的对吧,所以说它会有一个IP头。
36:11
你就比如说二三传递的一些数据对吧,缓冲区这些参数,你是不是就通信需要用,芯片可能也需要用,所以说我投的位置是一些共享的数据。ARP这个美城的一个什么调用站呢,它是一个持有的一个数据啊。是有的啊,所以说嗯,我们先要在我们这层战的时候,需要先获取一下我们那个对战数据啊,然后呢。投的这个数据是我们每层都是可以共享的啊。所以说我们要写一下这这行代码,就是要获取当前站,那你们就可能问了。为什么键键盘要这么去设计什么通信和芯片啊,因为你可以想一下,你开发的键盘也有很多种对吧?嗯,比如说以前的那种圆口键盘啊,就是我小时候用的那种,就是那种圆口的键盘,对吧?然后到现在的一些USB键盘,到现在的一些什么呃,无线键盘,那你可以想一下通信这些操作是不是共有的呀。
37:19
对吧。那你如果你不给他分,就是Windows不提供那个分层,分层驱动的话啊,那你这个芯片对吧,这个代码是不是和这个通信是站一起的呀,但是你可以看一下,不管你是哪哪种哪种键盘的,你这个通信的这些代码是永远不会动的,你动的都是这些底层的这个啊芯片点SYS对吧,所以说Windows啊设计的这种分层啊,分层驱动的概念概念。啊,分层驱动啊,就是这么出来的啊,但是对于Windows来说的话,它其实是一个整体啊。但是对于写代码的来人来说的话,它就是一个分开的啊,所以说我们要先去获取当前对战啊,然后呢,我们还得告刚才我写的这个什么。
38:06
I,这个告诉这个什么完成这个请求,这个位置正常的话,我们是结束这个IP请求的,对吧?啊告诉这个IP结束了,但你如果是一个分层驱动的话,你就可以调用其他API对吧,叫做IO,靠啊拽网啊就是。调用下一层驱动啊,就是比如说你有这个通信点SYS,你就继续把这个irp啊,向下去传递啊,就这么个意思。啊,就是这么用的。向下传递IP好啊,这两行代码的话,就是现在就是已经解释完了啊,如果你不懂的话,你可以再去私信问我。那之后之后的话,我获取到当前战之后的话,我是不是肯定是要什么啊拿到。阿三缓冲区。对吧,那肯定就是刚才说了这些东西的话,可能就是在这个IP头里,对吧,因为缓冲区这个东西它是共用的。
39:07
那你就可以什么拿到我们这个ARP。找到。系统的嘛。的缓冲区对吧,然后呢,P vop8核。然后呢,读取我就可以什么读取里面的一个长度对吧。嗯。就是诶毒现在我们写的是毒啊,毒是给这个二三啊,那我拿到232缓冲区,然后呢,我还得什么,嗯。呃,读取长度的一个内容对吧。那就是在这个当前站里。啊,你的长度,嗯。P,我瞅一下P。是这个礼拜吗?我看一下啊。嗯,长度应该是在。
40:01
在什么位置呢?我看一下还有。Read。他这个操作啊,可以看到啊,这个战当前站操作的很多对吧,有这个读写操作啊读操作,然后呢,就能拿到它这个长度。冷。然后呢,这个就是要读取的一个长度。但是我们好像毒应该用不上啊,然后我们可以用什么,嗯,流浪。啊,有罪的。啊,读取的一个长度,嗯,然后的话我就还给二三对吧,二三要读的话,我就还他,给他一个什么hello word就可以了,然后我就可以什么流浪还是。嗯,七二那。嗯。WPS的,因为我们那个是UN扣的,对吧,啊,就一个hello read word。
41:06
加上一个加一,然后杠零嘛。然后乘上一个什么。塞子哦,马叉。对吧,然后这个是二三要读取的一个长度,他要我们就得比对吧,你要读几个字节,如果你比我比我这个大,我没没有东西给你了,对吧?所以说我需要去求出来,嗯,我的一个缓冲区长度和你要读的一个什么最小值,对吧?不然的话你要读100个字节,我现在没有数据给你,对吧。比如说嗯,你要读的一个长度。如果大于我这个字符串的一个长度。你要读的一个长度。大于我这个长度,那我就什么。
42:03
返回ST。否则呢?你这个你这个大,你这个大我就还给他们。你这个大我就还给你。如果啊,如果瑞德呢,大于啊,应该是这么个逻辑。对,应该是这个逻辑,然后呢,我们就什么把这个什么r TL copy memory。给到什么,嗯。批发这个里面对吧,你这个二三的一个缓冲区别的。然后呢?就是我要给他什么读这个玩意儿,Hello word对吧。能拷贝多少对吧,这个最小的一个数据。
43:04
之后就可以去设置这个什么状态状态了,对吧,IP这个。对吧,你实际读了多少个字节,就是我这个什么。这个位置右面啊,然后结束IP就好了,对吧,那我这个毒应该是没什么问题了,然后我们现在写先写一下这个二三代码啊。毒是没什么问题的。嗯,然后现在的话写一下这个二三的那个代码。而申代码的话就比较简单了,就是刚才我说的这些读写操作对吧,但是读写操作的话也需要什么啊,这个符号连接的一个名字,还有这个什么设备的一个名字。我们得准备出来啊。那只需要一个符号连接就可以了。然后他二三的话,只是需要四个字节四个杠。然后最后呢,这个位置的话应该是个点,然后我们一会儿看一下就知道了。
44:05
轴线的话就是create file。然后你要打开的是我的一个房后连接的一个名字,然后我们F一看一下。啊,我们看一下。嗯,怎么找一下。嗯。看一下啊,诶。23的防护链接,我看一下,23找一下。嗯,反斜杠,然后路径上滑两个下划线杠。然后一个杠。
45:01
然后我看一下啊,应该是这个。看一下。我记得应该是啊,他只要两个杠。看一下,嗯,设备命名,设备对象空间,然后。然后看一下二三啊,可以看到啊,这个位置,这个位置就有二三的啊,四个杠一个点两个杠对吧,没有错。然后正好的话,我们把它这个位置给它全拷贝下来啊。那这个位置我们就不用去写了,给他拷贝下来。这个改这个给它改成二啊,因为我们一会儿还要写一个什么。嗯。方便到时候写个二。
46:06
啊,然后什么零。空什么,嗯,常见的,然后这个为什么填点我看一下啊。属性属性的话,它有应该也有个木问的啊,我天木问的啊。这个位置我点个问呢啊就好了。然后啊,我们那个句柄,Handle h five。之后的话就是什么,嗯,现在文件就创建出来了呗,但是我们现在没有写这个创建的一个IP对吧,所以说嗯,在这个位置我们就是什么可以用什么,嗯。Fail。H,对吧,HQ拿过来。嗯,然后准备一个什么,嗯,又差。
47:05
啊八部啊,然后准备一个什么马克斯帕。然后。啊,缓冲区对吧。然后max。A pass。然后你的实际读的一个字节数对吧,然后这个就是刚才我说的。嗯,有了。DW。RE。最后一个就是一个重叠IO这个位置的话,就是一个异步的,我们现在这么写的话,它就是一直去把啊,你想读的一个字节数啊全部读出来,它才返回啊,现在写的是堵塞的,那你这个如果学过这个重重叠模型的话啊,你最后一个参数填异步的,那你就应该能理解刚才我说的这个位置啊,为什么这个不代表完成啊。
48:06
然后的一个返回值。然后把什么啊,如果。然后F一下对吧。啊瑞的。嗯。醉的。Read的一个次节数啊,表达成B。然后把这个什么。嗯,读的一个字节数打印出来。然后W的对吧,我们现在是一个款字节了。北方完是刚刚看。把这个hello word打印出来,但现在hello word的话,可能没有这个杠铃,对吧,那有的时候是我现在给他加一个杠铃。
49:01
读的一个字节数。啊,乘二加一给他补一个什么杠零。然后我现在去生成一下,然后最后可是handle对吧。可能是憨。然后虚拟机。啊,拿过来。呃,驱动拿过来。我应该忘记干的差了是吧?
50:02
安装启动。怎么蓝屏了呢,我们看一下啊。应该我我之前的没卸载是什么,我看啊蓝屏的是吧。嗯,文凭的。呃,我先暂停一下,应该是我之前写的那些东西没卸载。嗯,我是刚才瞄了一眼啊,发现这个位置啊,是这个初始化的设备名称,这个位置写写错了啊,然后我再重新生成一下。如果还有问题的话,我们就简单调试一下啊,我们先看看。什么问题?是不是刚才我那个名字的一个问题啊。然后重新过来。然后装一下。安装启动。啊,现在没蓝屏对吧,那就说明应该没什么问题,然后把我们这个什么拿过来。
51:04
诶,你就可以看到对吧,Hello with word啊就出来了,那现在读肯定是没有什么问题的。然后那就差血呗。对吧,还缺一个斜操作。嗯,鞋操作的话,我感觉。其实都差不多啊。这个读和写,然后那我们写一下吧,还是。唱一个企业操作。那斜扫周的话,同样的操作对吧,先获取当前赞啊,这个位置你得拿到。嗯,然后解锁IP对吧,你你你也需要有。嗯,然后就是。现在的话是你给内核写数据对吧,你现在还是拿到二三的一个缓冲区对吧。然后你要拿到二三你写的一个长度对吧。然后我们就得可以准备一个用力扣的。
52:02
Unicode实训类型。对吧,这结构体。那就什么。RTL。In it。用力扣的时间。取地址对吧。然后就是什么阿三的缓冲区P8个啊初始化的,然后就可以打印了呗,嗯,第八个F加X对吧。百分号WG。当然,更。然后把他的一个什么P8打印拿出来。
53:00
嗯,然后再把这个白袍地也给他弄去吧。这个是血的一个长度啊,然后。嗯,完成请求了呗,啊。然后你写的一个长度对吧,就在这个位置。然然后重新上传。那二三代码对吧。拿过来。二三代码。那读写完了。写。写的话就是什么。苹果的DW。嗯,你要写的一个长度对吧。嗯,血W啊W。一个一个有一个返回长度,有个你要写的一个长度。对吧,要写的长度,我现在就要写一个什么,嗯。嗯,写个什么呢,W7S。
54:04
Hello。IP对吧。然后乘上塞个off。长度。嗯。然后先让他俩算。嗯,好之后呢,就是什么。Fail。对吧,然后H。还有什么,呃,缓冲区,缓冲区就是。这个位置吧,给他准准备一个常量。还去吧。嗯,你要写的一个长度对吧,写的一个长度,然后呃,你写你实际写的有多少个长度,对吧,这也是一个那啥,然后最后一个重叠模型没有。
55:05
嗯,然后结束的话,分到F,打印一下百分号D,刚才刚才对吧,你实际写的一个长度。啊,这个位置。然后重新生成。嗯,回来虚拟机诶。那这个位置。不用了。拷贝一下。来到虚拟机。一个。然后还有个驱动是吧。驱动也重新生成一下。是吧,安装启动。然后是吧。运行过来对吧。19对吧,这是那个hello IP什么19个字节对吧,然后看看这个里面。
56:06
WZ99A。我打印的是什么呀。啊,我打印错了对吧,打印P8过去了对吧。然后我们重新来一下。重,我就重新来一下。卸载。然后重新来一下,重新上传。安装启动。然后运行了。嗯。看一下啊,初始化怎么失败了呢?嗯,拿到二三缓冲去p buff,然后嫩。嗯,然后in UN使劲。看一下为什么。百分号WG。
57:06
百分后W。YD。嗯,用力扣的试卷。然后嫩。我打印的是什么?啊,WZ。猛了。然后重新来一下。下我重新拿一下。嗯,安装启动啊,然后现在来还是19个字节,然后我们看到hello hello玩IIP对吧,19,然后还给他呢啊这就没有什么问题了。嗯,然后这些都是一些读写操作,然后为什么说会有个控制啊,你可以想一下读写的话,你想去,嗯去做一些其的事情就不不太好,就比如说嗯,像我们以前写那些圆控啊,什么一代表什么,二代表什么,三代表什么,但是你光用这个血缓冲区,你只有一个缓冲区,对吧,你根本不知道你想去做什么,就比较麻烦,那这个控制呢,就可以带一些控制码,对吧,你这个控制码一代表什么,二代表什么,三代表什么,你就可以写Switch配置之类的,那你是光这个写的话,你只携带了一个缓冲区对不对,那你是不是去区分这些你想做的一些事情就比较麻烦,所以说它会有一个控制啊,控制。
58:33
那个控制的话,你就可以去定义一些,嗯。麻之类的啊,那我现在的话都可以去定义什么控制码。呃,控制码的话,它有一个什么,嗯,起始值就和我们那个用户阿三的用户自定义消息是一样的啊,它有一个就是基础的一个值。啊,有个基础值好像是零差800啊。
59:03
啊,你看8000我记得之后呢,我们就可以什么。井号集判。嗯,IP。IO ctrl吧,扣的,然后呢,我们自己碰撞一个红啊,传递这个I值。因为这个控制码它比较格式比较麻烦啊,啊这个ctl扣的。然后我们可以进来。啊,你就可以看一下啊,啊第一个。是我们那个驱动的设备类型,然后呢,是一个什么啊基数值对吧。加上一个多少,呃,之后的话就是一个传递IO传递的一个方式啊,有这个我们采用这个什么缓冲去读写对吧。嗯,这个是什么?In缓冲句那个光光是这个,呃,In是这个。呃,这个缓冲读读写读,然后out呢,它就这个红就是光光是out,然后你写你这个是两个都不是对吧,那这个的话我们就是IO诠释啊,之后就是一些检查这个访问的一些权限。
60:12
呃,那我现在的话。我们这个设备就是什么都不是对吧。饭友。嗯,Drivers。嗯,什么都不是,嗯,不知道啊,No。没有这个。是他。然后第二个红轴是什么,我这个奇数值对吧。啊,加上一个,每次都加上一个爱啊。之后的话就是什么,呃,我这个buff。啊。
61:05
最后就是一个权限。啊,所有这个权限拿回来之后的话,你就可以什么在井号底范对吧。比如说我们上节课写了一个什么,嗯,我这个控制码叫什么,嗯I,嗯,获取什么进程对吧,那个什么get。干的对吧。然后呢,你这个红再替换。你比如说给他一个零对吧,那你以后对吧,还有个什么获取别的,那你这个位置就写个一对吧,那你这些控制码是不是就规范进来了。嗯,有了控制码之后,我们就可以写这个控制了。啊,我那空着没写是吧,控制函数啊,再来一个空的。啊,这个就要看旧。
62:03
啊,然后把这个啊也给它注射起来。注册起来之后,嗯,代码,嗯,同样获取这个IP的一个当前站。然后的话就是先要去,现在的话是不是就得获取控制码了呀。啊,我现在去获取这个我这个控制码。控制了。嗯,这叫扣的吧。从我这个当前站对吧,这个控制码肯定是当前站了啊,你这个当前站携带的参数啊。啊,嗯,有一个什么控制控制对吧。然后呢,找到我们的什么扣的啊,找到这个控制码。然后就是我们那个什么输入输输入,嗯,输出缓冲区。啊,拿到这个输输出换灯具没。嗯。
63:01
有个P的对吧,Buff,然后瑞的嫩啊。拿过来。嗯,然后就是还有个。嗯,写的吧,也得。我先把那个删掉。还有个white对吧。嗯,然后的话就是。获取这个缓冲区指针啊,那这个现在的话就是什么Z和这个什么,呃,White这个缓冲区,它其实都是用一个了。就是在这个IP。啊用找输输出都用一个站,然后呢,他这个什么。
64:04
嗯,长度也是。嗯。等于。等于等于。那这个读写应该不是了吧,我看一下啊。读写的话,我看看当前战力。读写的话我看看啊,读写赞。他现在应该是共用一个呢,我找一下。嗯,有点堵啊。读写PM。应该找到控制啊,在这个里面找到控制,我没找没看见啊,控制就是。
65:04
控制里面看看有没有。啊,控制控制的话也。Output input什么?嗯,Input buff应该是他吧,然后这个应该就是输入输出这个啊,它这个缓冲距长度。然后我们拿过来。那还是在控制里,然后我们写一下,嗯。当前站。传递的参数。然后找到控制。找到什么,嗯。Input。B,然后还有outut b啊,其实都有一个一个意思啊,我就写一起的,然后Switch,然后我们就可以什么,嗯,Switch case呗,判断这个什么啊code的一个控制码,然后你就可以写K是什么。
66:03
嗯。开始我们刚才写的那什么呢?对吧,是它,如果你这个控制码等于它。对吧,我又可以什么把这个缓冲去打打打印一下。看看你这个里面有没有什么数据对吧。呃呃,那个缓冲区离子呢,叫什么呢啊,P瑞的八块是吧。啊,然后。嗯,那这个还不太好用,V的buff应该叫印buff,然后我给他什么,嗯,我阿三传给我之后了,对吧,我现在是共用的一个幻冲军对吧,RTL这个。
67:06
Memory。然后把什么out put b,对吧,也就是我的,我要给他写回去。那我给他1024。然后什么嗯,我就去,嗯。获取一下长度对吧,我要给他写个什么回去,就比如说有账。嗯,返回它的一个长度来。给他写个str。我就给他还一个。啊,控制对吧。OK。然后什么r TL copy。给他还给什么写在一个缓冲区里啊。然后写着这个东西。
68:04
然后什么长度。啊,给他给他之后的话是什么呢?呃,设置这些IP成功了没。啊,这个位置我就给他一个零对吧,这个位置的话,嗯。这个实际写的一个长度是什么,是我这个什么RTR这个。对吧。然后结束IIP啊就返回。好,我们重新上传这个,这个是我们的一个驱动就好了。拿过来。然后二三呢,我们再写个二三。23的话,那我就。没有写个外循环吗?
69:06
啊。嗯。一千两二四,呃,一个是Z的。Buff。然后再来一个。White吧。嗯,然后来个D。嗯。啊,一返回这个长度,然后什么嗯,分F。啊,输入字符串。好看。来看S。啊,取地址啊,这个瑞吧。然后就是什么二三怎么怎么去发送这个控制啊,他专门提供了这个API,嗯,专业。
70:01
嗯,摔过什么玩意儿呢?嗯,哎,Oo啊。然后你要给谁法对吧,还是H法。嗯,发的一个控制码,那控制码拿过来。打塔的吧。然后就是你的input b对吗?然后再是。嗯。然后什么你的一个奥buff,就是我我回来了一个buff,我这个名字好像起起反了啊。然后就是。嗯。是什么啊,返回的一个字节数啊。
71:02
啊为这个位置好最后一个重叠啊零。之后的话就什么。嗯,跟F。杠二杠N。摆放D。嗯,这是返回字结束对吧。然后再来一个百分号S,百分号S啊。一个打印什么。嗯,应该是一个就够了。胖S。呃,实际输出的字节数。然后再来一个。嗯,回来的对吧,回来的应该是在这洗的这个位置,然后生成一下。然后呢?
72:00
拿过来。然后安装。启动,安装启动。过来。然后看一下。你bug。啊,这个IP正常是没问题的,对吧,这个读写是之前的啊,现在打印的都是之前的,然后我现在输入一个。嗯。SDK。打住,配过来。啊,界面就输入了对吧,SDKWDK过来的,然后就是。嗯。然后我看一眼啊。好像没有返回回去是吧,哈,这个。看一下为什么没有返回回去。啊,在控制这个里面。嗯,他打印成功了。然后。状态对了,然后buff。然后。呃,Copy memory OK,然后它这头没打印出来是吧,输入字符串。
73:14
然后返回四零是吧,我看一下哪个位置写错了。俺上看一眼。嗯。0BUFF,然后我看看这面。不wake不wi之后啊,不wi课之后,我这个位置给他设置为零了,对吧,这这个位置就白设置了,所以说在这个位置我得改一下。因为这个不能这么不能这么写啊,这个位置给它设置为零的,那我就直接在这个位置就返回吧。啊,我直接在这个位置进行一个返回。嗯。那这个位置再来一个。然后。
74:00
然后在这结束LP流程。然后再在这啊返回。啊,这么写,然后我们重新正常。啊,生应该生成不了啊。然后拿过来。啊,过来安装启动。过来。然后。啊,你可以看到123456对吧,然后这面回了个什么。啊,18个字节对吧,啊,这个COK啊,然后就正常就可以通信了,对吧,456。啊,这个就是一个简单的图。冲进框架吧啊。然后这节课就到这里。
我来说两句