阅读:1474回复:13
关于驱动得一些问题
驱动中得pnp得执行主要步骤是不是通过检测系统注册表中得软硬件注册信息检测驱动和硬件得存在,然后执行addDevice,那么驱动中得DriverEntry在何时是起作用得,按照我得理解,pnp得历程是要在Entry中纪录得.
驱动对象的建立是不是在执行完pnp后就实现了,也就是说,它在addDevice中实现了驱动对象得建立 在一个用户态程序要createfile时,他打开一个驱动文件,哪这时他发出的irp请求是什么. 我在作一个并口驱动,它的模式是普通得spp模式,在98和2000下用.主要目的是为了实现我们系统对并口得占用不与打印机冲突,以前我们得实现方法是用一个开关,每次用时拨到不同得方向,现在想改作驱动来实现他们占用时,排斥对方得使用.不知道可不可以实现. |
|
沙发#
发布于:2002-05-10 15:09
驱动中的driverentry是第一个被调用的,
在驱动被安装的时候,首先调用driverentry初始化其它例程, 然后调用adddevice,pnp调用的次数取决于pnp irp的数量, 但一定是在driverentry和adddevice之后调用的 |
|
|
板凳#
发布于:2002-05-10 15:14
createfile时,对应的是DriverObject->MajorFunction[ IRP_MJ_CREATE ]中你的函数。
|
|
地板#
发布于:2002-05-10 15:14
createfile 的请求是:
IRP_MJ_CREATE |
|
|
地下室#
发布于:2002-05-10 15:20
我补充一下:
对于pnp的硬件(如:PCI卡)。一般是系统通过总线驱动程序发现有硬件了。然后通过察看硬件上的相应寄存器,得到此硬件的ID(什么venderid啊,productid啊),然后再到注册表上去找相应的驱动地址了。如果找不到,那么就出现“发现新硬件。。。”。。。。 所以你开始说,查注册表得到硬件的存在是有问题的。 我是新手,错了请批评。 [编辑 - 5/10/02 作者: JackyWu] |
|
|
5楼#
发布于:2002-05-10 15:23
和我认为的一样。
|
|
6楼#
发布于:2002-05-10 15:36
驱动中得pnp得执行主要步骤是不是通过检测系统注册表中得软硬件注册信息检测驱动和硬件得存在,然后执行addDevice,那么驱动中得DriverEntry在何时是起作用得,按照我得理解,pnp得历程是要在Entry中纪录得.
####################################################### 回答:PNP不一定是通过注册表实现的,部分是通过回调函数,如RESET或HALT之类的!再就是通过OID实现! DRIVERENTRY工作在PASSIVE_LEVEL是在系统装入你的驱动执行的第一个函数,等同与DLL的DLLMAIN函数!其实某种意义上说SYS就是改了名的内核DLL文件! ####################################################### 驱动对象的建立是不是在执行完pnp后就实现了,也就是说,它在addDevice中实现了驱动对象得建立 ####################################################### ADDDEVICE是一个可选的函数!并不是所有的驱动需要用到PNP就必须使用! ####################################################### 在一个用户态程序要createfile时,他打开一个驱动文件,哪这时他发出的irp请求是什么. ####################################################### CREATEFILE的IRP是对应的DISPATH_LEVEL回调函数是IRP_CREATE可是这个函数的主要意义是当APPCREATEFILE函数的时候发个IRP告诉你上面打开你了!一般的主要用途是添加IRP到IRP队列中!实际上如果不处理也没什么大不了的!直接IOCOMPLETE也可以! ####################################################### 我在作一个并口驱动,它的模式是普通得spp模式,在98和2000下用.主要目的是为了实现我们系统对并口得占用不与打印机冲突,以前我们得实现方法是用一个开关,每次用时拨到不同得方向,现在想改作驱动来实现他们占用时,排斥对方得使用.不知道可不可以实现. ####################################################### 理论上应该是可以的!因为LPT口也属于共享中断的设备,只要另一个设备先占用了中断口,你就不可以使用了!就看你怎么保证自己是第一个占用咯! ####################################################### |
|
|
7楼#
发布于:2002-05-10 15:39
谢谢大家的指点,我是新手,在公司里我孤军作战,看资料看得头脑发胀.也没理清个头绪,公司要这月把驱动弄出来,看来工资是.........
|
|
8楼#
发布于:2002-05-10 15:42
top的回答果然很精辟!!
|
|
|
9楼#
发布于:2002-05-10 15:47
只是少工资?我还以为要开掉你呢 :D :D :D :D
|
|
10楼#
发布于:2002-05-10 15:48
哪驱动对象是在什么时候建立的.
|
|
11楼#
发布于:2002-05-10 15:51
驱动对象是系统为你的driver生成的,当调用driverentry的时候
把指针传给你 你说的是device对象吧 可以在adddevice中实现,也可以在driverentry中实现,别的看看高人有什么说法 |
|
|
12楼#
发布于:2002-05-10 15:51
是从DRIVERENTRY的参数那传入的!
|
|
|
13楼#
发布于:2002-05-10 16:00
如果说的是device对象的话,就是有要通过IOCREATE函数调用的了!可以在P层也可以在D层!区别在于在DRIVERENTRY函数以外的函数都要反掉~DO_INITIALIZETION[正确的名字懒得查了!差不多!]这个FLAG后DEVICEOBJECT才可以使用!
|
|
|