能力值:
( LV7,RANK:110 )
|
-
-
2 楼
安装是安装驱动服务。
启动是运行驱动。DriverEntry
停止是停止驱动运行。DriverUnload
卸载是卸载驱动服务。
驱动要通过服务的方式运行。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
在麻烦您一下,创建驱动程序的设备句柄和删除驱动程序的设备句柄是怎么实现的呀。
创建是IOCreateDevice吗?谢谢您
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
你目前的认知中有点小的混淆。驱动安装和驱动启动,是针对驱动的二个行为。
一、驱动的安装,这是在用户环境中执行的一个用户行为,本质上是将驱动注册到系统中,安装完成后是否马上启动,取决于安装的类型,是自动启动还是请求后启动等等。驱动的卸载也和上述情况类似,是从系统中脱离。
二、驱动的启动,通常是指内核开始加载驱动代码,根据安装时选择类型的不同,驱动可以随系统启动而启动,也可以由某种请求而启动,启动时,系统会调用上述的驱动进入点(DriverEntry)。
一个驱动对象除了提供环境参数外,本身什么也做不了,所以在代码里需要创建Device,最少要有一个这样的对象。当系统关闭这个驱动的时候,会调用UnloadDriver,但这个调用通常只在系统准备关闭的时候发生。
至于Device是代码中通过IoCreateDevice创建的服务对象,不需要等驱动卸载,只要觉得没有用了,就可以使用IoDeleteDevice删除。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
噢 ,这么说驱动的安装和卸载是R3下用户态的行为,而驱动的启动和停止是R0下的,启动就是DriverEntry停止就是DriverUnload。
还有最后一个问题哈,创建设备句柄和删除设备句柄是用户态的操作吧,在内核中怎么体现是不是IRP_MJ_CREATE和RIP_MJ_CLOSE呀
谢谢啦
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
膜拜大牛…………
我学习好几年了。还是一使五成
|
能力值:
(RANK:50 )
|
-
-
7 楼
Ring3 syscall NtOpenFile->IRP_MJ_CREATE
Ring3 syscall NtCloseHandle->IRP_MJ_CLOSE
推荐用自动生成代码的向导之类的处理这些基本的内容,不用过于纠结
|
能力值:
(RANK:50 )
|
-
-
8 楼
驱动程序的加载是由系统的IO管理器负责的,用户层的程序只是把加载的请求提交给IO管理器,然后由IO管理器完成加载。加载驱动程序的时候会向系统注册初始化例程(比如DriverEntry)、卸载例程等,至于设备的创建,在NT式驱动中,由初始化例程执行AddDevice()实现,WDM式驱动中则是提供一个建立设备的例程的指针,交由系统调用这个例程(其实效果也差不多)。最后IRP处理例程的设置是针对设备的。
要分清楚驱动和设备的概念……
关于Windows NT内核对于驱动程序/设备的管理,可以参考:
《Windows内核原理与实现》
《Windows Internals》
关于驱动程序的编写,可以参考《Windows驱动开发技术详解》,该书对于驱动程序的基本架构介绍比较详细(包括NT式和WDM式)。。。不过没有特殊情况不用纠结这些最基本的东西,现成的例子或者向导生成的代码都可以用,自己写很可能还会搞错某些地方BSOD几次T_T
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
对,楼上说的对。注意到楼上使用了 OpenFile() 和 CloseHandle() 已经明确指出行为的发生,我在这里努力用更简单一点的说法把描述一遍:
一、IRP_MJ_CREATE 这个派遣消息发到你驱动的时候,不是让你去创建一个 Device,而是告诉你,你前面使用 IoCreateDevice 创建的 Device 现在正式开始要提供服务了。通常 IoCreateDevice() 是在初始化驱动的 DriverEntry() 里调用,调用后,根据你的需要来决定你会不会响应 IRP_MJ_XXXX 的设备消息,如果你针对 IRP_MJ_CREATE 消息注册了回调函数,这条消息到达后就会主动调用你注册的回调函数执行。
IRP_MJ_CREATE 怎么发生的?通常是由于用户环境执行了针对这个驱动的 OpenFile() 动作,这个动作一执行,内核就会找到你的驱动程序并加载起来,并调用你驱动的 DriverEntry() ,加载完成后内核会主动发出 IRP_MJ_CREATE 消息的 IRP 包,如果你的 Device 注册了这个消息,内核认为大概你需要在 Device 开始服务前干点啥,所以把这个 IRP 包传递给你。如果你根本没打算干点啥,就可以不注册这个消息。不注册的话,内核自动使用自己的缺省处理函数处理掉。
二、IRP_MJ_CLOSE ,和上面消息一样,这个消息也不是让你去关闭你的 Device,而是通知你 Device 的一次使用的结束。这也是基于你注册了对这个消息的回调,你不注册这个消息,内核也会使用缺省处理函数处理。
IRP_MJ_CLOSE 是怎么发生的?通常是由用户环境调用了关闭设备文件的操作,如 CloseHandle()来关闭刚才的 OpenFile() 句柄,这个操作一旦执行,再就不能访问你的 Device 了,还想访问就需要再次使用 OpenFile()。
IRP_MJ_CLOSE 以后,只是说 Device 不能为用户提供服务了,但驱动本身并不会在内核中卸载出内存。而且完全可以再次调用 OpenFile() 打开这个 Device,再次的调用中,由于驱动还在内存,所以就不会再触发 DriverEntry() 函数,但 IRP_MJ_CREATE 还是会发生。
|
能力值:
(RANK:50 )
|
-
-
10 楼
推荐LZ使用Visual DDK这样的插件配合VS2010(也可以直接用VS2012)开发,这种基本框架这样的细枝末节不用自己操心啦
|
|
|