写点理解的东西-想到哪我就写到哪

Windows驱动编程,就目前涉及到的模型为NT和WDM模型(WDF还没学到^-^!),NT式的驱动是比较老一点的,WDM的最大更新便是支持的设备的即插即用(PNP),实现此功能是一个非常复杂的过程,先略。^0^....
两者比较:
NT式驱动,是在DriverEntry函数内创建驱动自己的设备,或者进行设备绑定等操作,并在函数内初始化各个IRP类型的派遣函数
WDM式驱动,程序入口函数仍为DriverEntry,然后在函数内进行IRP的派遣函数的指定。关于驱动自己设备的创建,是放到的AddDevice回调函数内。且回调函数和DriverEntry函数都是由系统进程(ID:4)调用的。WDM式的驱动必须分派IRP_MJ_PNP类型的派遣函数,此类型的派遣函数内,根据次IRP类型号进行不同的处理,例如:IRP_MN_REMOVE_DEVICE、IRP_MN_START_DEVICE、IRP_SURPRISE_REMOVE_DEVICE等等。
WDM式的驱动程序是按分层驱动的框架来设计的,其实是属于NT驱动的一种特例。WDM驱动在AddDevice函数内创建自己的设备属于功能设备(FDO),然后将FDO挂载到物理设备上(PDO),PDO一般是系统总线创建的,通过AddDevice的参数传递进来。


按照设备链的连接方式,可以分类为水平设备链和垂直设备链。
水平设备链指是由同一个驱动程序创建的设备,由DriverObject的子域PDEVICE_OBJECT DeviceObject指向驱动创建的第一个设备,然后由DEVICE_OBJECT的子域PDEVICE_OBEJCT NextDevice指向驱动创建的下一个设备,由此可以遍历一个驱动创建的所有设备。
垂直设备链是指分层驱动中,挂载设备而形成的一种设备链,若驱动A 的设备A,挂载到驱动B的设备B上,则B的子域的PDEVICE_OBJECT AttachedDevice将指向驱动A的设备A的设备对象指针。并且在DEVICE_OBJECT 的CCHAR StackSize子域中记录了栈的大小,即当前设备挂载的层数。


在windows的应用程序中,主要的就是消息通讯机制,通过一个消息泵将不同类型的消息调用不同的处理函数。而在windows内核层,最主要的通讯载体是IRP(IO请求包),内核层驱动相当于是设备的载体,一个设备只能属于一个驱动,一个驱动可以创建1到n个设备,而真正通讯时设备和设备之间的通讯,而设备之间最主要的通讯载体便是刚刚所说的IRP。
IRP的产生可以是应用层调用API,然后调用ntdll的nt函数,然后ntdll调用内核层的API,内核设备管理对象收到通知后,会产生一个对应类型的IRP并下发给
指定的设备。例如应用层ReadFile、WriteFile、CloseHandle等API 将对应在内核层产生IRP_MJ_READ、IRP_MJ_WRITE、IRP_MJ_CLOSE、IRP_MJ_CLEANUP等类型的IRP,根据不同的类型IRP,将分发给对应的派遣函数。
每一个IRP的完成都是通过IoCompleteRequest函数返回的,当然派遣函数可以将IRP直接完成,若是挂载到其他设备上的(就是说有底层的驱动),也可以将IRP下发给底层驱动来完成。
其中涉及到同步与异步的实现,同步的基本少用且简单, 
异步是较为复杂的,方式1,直接IoMarkPending(IRP)标记为pending状态,然后ioskipcurrentstackloacion,并调用iocalldriver将irp下发到底层驱动。
方式2, 异步方式并使用setcompletionroutine设置完成例程函数。完成例程函数只能返回两种status,返回STATUS_SUCCESS,此时完成例程内需要判断irp的PendingReturned标志位,然后在满足的条件下使用IoMarkPending(IRP)。另外一种返回STATUS_MORE_PROECING_REQUIEDR,测试完成例程内不能设置IoMarkPending设置IRP,因为此时底层驱动完成irp通过挂载设备栈向上回卷时被终止了,IRP的堆栈被破坏了不用在向上层驱动发送IRP了,此时驱动获得了IRP的控制权,可以接着向底层驱动发送IRP,或者使用IoCompleteRequest通知上层驱动IRP完成。


有关应用程序内存和内核内存的问题:
系统总线分为:数据总线、控制总线、地址总线。在32位系统上,最大访问的内存为2^32即4GB的空间。在Windows系统上无论是应用层的内存操作还是内核层内存操作都是不是直接操作真正的内存。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值