阅读:2655回复:16
调用IoAttachDeviceToDeviceStack就死机,帮忙看看是怎么回事?
我编的一个PCI数据采集卡的驱动,在AddDevice函数中,我如果不调用IoAttachDeviceToDeviceStack把驱动连接到驱动栈的话,用EzInstall安装驱动能进入和退出AddDevice,如果调用IoAttachDeviceToDeviceStack的话,系统就会dump,蓝屏,出错的信自是BAD_POOL_CALLER,请大家帮我诊断一下,
另外,为什么AddDevice退出后,系统不发PNP_IRP给我?我的StartDevice得不到调用, 而且,卸载驱动时,为什么我的DriverUnload得不到调用? 我在DriverEntry里已经把各个入口函数初始化好了呀,请DX们帮看看,谢谢!下面是AddDevice的源代码。 NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo) |
|
沙发#
发布于:2004-08-24 09:38
如果调用IoAttachDeviceToDeviceStack的话,系统就会dump,蓝屏
你是什么时候出的问题?是在调用的时候还是调用成功了返回后在其他时候出的问题???? |
|
|
板凳#
发布于:2004-08-24 12:19
哦,用的是AMCC的s5933作pci的桥接芯片,和我用的一样,这段代码是没有问题的.怎么会在加载的时候蓝屏呢?
|
|
地板#
发布于:2004-08-24 12:40
对,是5933PCI卡,如果把IoAttachDeviceToDeviceStack的那些代码注释掉,则不会蓝屏,而且能进入AddDevice,但不注释掉就会死机,为什么???
对了,楼上的,你的卡插入到机子里再开机,系统会不会提出找到新硬件?我的怎么不会呀?想和你多交流。 |
|
地下室#
发布于:2004-08-24 12:52
对,是5933PCI卡,如果把IoAttachDeviceToDeviceStack的那些代码注释掉,则不会蓝屏,而且能进入AddDevice,但不注释掉就会死机,为什么??? 哦,是这样啊,你的机器自检,操作系统分配资源,都没有检测到你的PCI卡,这样装载驱动程序,系统肯定会奔溃的. 我开发的s5933的PCI卡,当插在机器的PCI插槽上时,系统开机(Windows 2003 .NET系统)会提示发现新硬件,要求安装驱动程序. 这时安装驱动就没问题的. 建议:你在仔细看看,PCI卡是否有问题,或是存储器中烧的程序有问题. |
|
5楼#
发布于:2004-08-24 14:09
你看看开机BIOS中有没有你的PCI资源列表,如果没有,应该不是IoAttachDeviceToDeviceStack的问题,更好象是上层驱动给你发送了IRP_MJ_XXX,然后你驱动中因为没有I/O资源而错误的运行了,某些内存未分配因此出现内存访问错误
|
|
|
6楼#
发布于:2004-08-24 22:38
我用PCIConfig来看我的机器上的PCI卡的状态,发现我的那个卡没有什么问题,VID,DID,BIST,bar0,等都没有问题,后来我知道系统没有找到新硬件的原因是因为装了windriver,后来的卸掉了之后可以找到新硬件了,但装驱动时系统确不选择我编的驱动(我不知道系统靠什么来选择合适的INF文件,靠VID?DID?还是别的?),另外,为什么我用Ezinstall来装我的驱动时它总不调用我的DispatchPNP例程?
AddDevice倒是调用了,但DispatchPNP和DriverUnload都没有被调用,请大家帮忙看看原因,谢谢! |
|
7楼#
发布于:2004-08-25 00:24
我用PCIConfig来看我的机器上的PCI卡的状态,发现我的那个卡没有什么问题,VID,DID,BIST,bar0,等都没有问题,后来我知道系统没有找到新硬件的原因是因为装了windriver,后来的卸掉了之后可以找到新硬件了,但装驱动时系统确不选择我编的驱动(我不知道系统靠什么来选择合适的INF文件,靠VID?DID?还是别的?),另外,为什么我用Ezinstall来装我的驱动时它总不调用我的DispatchPNP例程? 系统安装驱动当然是根据你指定的Inf文件来进行安装的,你的DriverEntry例程应该没有问题吧. |
|
8楼#
发布于:2004-08-26 23:12
我指定了我的INF文件,但系统就是不选择它,后来我硬指定了,终于让它硬是用了我的驱动。但有一个问题,为什么系统不给我发IRP_PNP?我要用PNP的IRP_MN_START_DEVICE来获得分配的资源。
我的DriverEntry没有问题,它只指定了一些分派函数的入口点,AddDevice如果不调用IoAttachDeviceToDeviceStack的话也不会出问题,都能正常结束,现在我的困惑就是系统在什么情况下会发给我的驱动IRP_MJ_PNP? 再次谢谢大家帮助! |
|
9楼#
发布于:2004-08-27 18:09
当你的驱动加载的时候,系统会给你发送IRP_MJ_PNP,
你只需要处理就行. |
|
10楼#
发布于:2004-08-28 04:27
我的程序里有以下语句:
在DriverEntry里 DriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl; 在DispatchPnp里: switch(MinorFunction) 我还有一个AddDevice,我觉得AddDevice执行完后应该就有IRP_MJ_PNP发过来了呀,然后我在DispatchPnp里处理,但很奇怪,为什么我的AddDevice成功执行之后却没有IRP_MJ_PNP发过来呢?也就是说IO管理器(或PNP管理器)不调用我的DispatchPnp呢?我是用EzInstall来安装驱动程序的,显示安装成功。怪事! |
|
11楼#
发布于:2004-08-28 13:05
我的程序里有以下语句: 在DispatchPnp里: switch(MinorFunction) 我还有一个AddDevice,我觉得AddDevice执行完后应该就有IRP_MJ_PNP发过来了呀,然后我在DispatchPnp里处理,但很奇怪,为什么我的AddDevice成功执行之后却没有IRP_MJ_PNP发过来呢?也就是说IO管理器(或PNP管理器)不调用我的DispatchPnp呢?我是用EzInstall来安装驱动程序的,显示安装成功。怪事! [/quote] 你是通过什么说IRP_MJ_PNP没有给你发过来呢? |
|
12楼#
发布于:2004-08-28 15:29
我在DispatchPnp的开头有一个DbgPrint("DispatchPnp:Enteredn");
然后我用EzInstall来装我的驱动,DriverEntry和AddDevice里的DbgPrint里的句子都打印出来了,但DispatchPnp里的句子就是不打印,说明我的DispatchPnp根本没被调用,安装过程中我的DriverMonitor一直是打开的 另外,提供一个信息供各位诊断,刚才我用CreateFile来打开设备,提示设备找到并打开了,但我在DispatchCreate里的DbgPrint同样没有输出到DriverMonitor,所以,很可能我的根本上什么IRP都不到,但AddDevice返回的是STATUS_SUCCESS,所以说明设备还是成功添加了 [编辑 - 8/28/04 by wjnong] 刚才重启后再安装驱动程序,然后调用CreateFile和CloseHandle,发现DispatchCreate和DispatchClose都被调用了,但DispatchPnp还是没被调用,说明系统可能不认为我的驱动支持PNP,但我在Link的时候已经设了个/Driver:WDM开关了,为什么它不给我发工资?为什么它不给我发PNP_IRP?????? [编辑 - 8/28/04 by wjnong] |
|
13楼#
发布于:2004-08-28 16:04
我在DispatchPnp的开头有一个DbgPrint("DispatchPnp:Enteredn"); 建议在贴些源码来判断判断. |
|
14楼#
发布于:2004-08-28 17:48
好,
NTSTATUS NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo) NTSTATUS DispatchPnp(PDEVICE_OBJECT DeviceObject, PIRP Irp) 我觉得相关的就这些了, 再附上编译和链接选项: Compile Option: /nologo /Gz /MLd /W3 /Z7 /Oi /Gy /I "$(DDKROOT)inc" /FI"$(DDKROOT)incwarning.h" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D _X86_=1 /D i386=1 /D "STD_CALL" /D CONDITION_HANDLING=1 /D NT_UP=1 /D NT_INST=0 /D WIN32=100 /D _NT1X_=100 /D WINNT=1 /D _WIN32_WINNT=0x0500 /D _WIN32_IE=0x0400 /D WIN32_LEAN_AND_MEAN=1 /D DBG=1 /D DEVL=1 /D FPO=0 /D "NDEBUG" /D _DLL=1 /D "DRIVER" /D "_IDWBUILD" /D "RDRDBG" /D "SRVDBG" /FR"objchki386/" /Fo"objchki386/" /Fd"objchki386/" /FD /GF /TC /c Link Option: wdm.lib /nologo /base:"0x10000" /version:4.0 /entry:"DriverEntry" /subsystem:windows /pdb:none /debug /debugtype:both /machine:I386 /nodefaultlib /out:"objchki386S5933.sys" /libpath:"$(DDKPATH)libchki386" -SECTION:INIT,d -OPT:REF -FORCE:MULTIPLE -RELEASE -FULLBUILD -IGNORE:4001,4037,4039,4065,4070,4078,4087,4089,4096 -osversion:4.00 -optidata -driver -align:0x20 -subsystem:native,4.00 -debug:notmapped,FULL 谢谢关注! [编辑 - 8/28/04 by wjnong] |
|
15楼#
发布于:2004-08-30 21:31
Problem solved!
原来问题不出在IoAttachDeviceToDeviceStack,死机是在DispatchPnp里死的,而且DispatchPnp被调用了,只不过一调用就死机所以我以为是没调用。 那么为什么把IoAttachDeviceToDeviceStack注释掉了之后就不死机了?因为如果不调用IoAttachDeviceToDeviceStack的话,系统IO管理器根本不会调用我的DispatchPnp,所以不会死机, 谢谢大家的关注! Thread terminated |
|
16楼#
发布于:2004-08-31 11:57
Problem solved! 给分吧. |
|