阅读:1726回复:7
再问NdisIMInitializeDeviceInstanceEx?????
我是自己写的驱动,再调用ProtocolBindAdapter里面,我使用了NdisOpenAdapter函数,但是,而且在其前面进行了POOL的和PACKET的分配,这些初始化的过程没有出错,但是在其后调用NdisIMInitializeDeviceInstanceEx向NDIS申明调用MiniportInit的时候却荡机了,是出现了页错误,我看了NdisIMInitializeDeviceInstanceEx函数的说明,是要求必须保证NdisOpenAdapter调用成功,但是,我的NdisOpenAdapter返回的是NDIS_STATUS_PENDING,我跟踪了passthru,它也是返回的NDIS_STATUS_PENDING,但它的调用却是成功的,请各位指明方向,先谢谢了
|
|
沙发#
发布于:2002-12-06 17:31
Passthru 中,如果 NdisOpenAdapter 返回 NDIS_STATUS_PENDING,它会等待操作完成之后才继续执行。
|
|
板凳#
发布于:2002-12-06 17:37
你这样做试试看
ProtocolBindAdapter函数里 // 此处Status为调用NdisOpenAdapter的返回状态 if( Status != NDIS_STATUS_PENDING ) ProtocolOpenAdapterComplte( ...) 在ProtocolOpenAdapterComplete函数里 if( Status == NDIS_STATUS_SUCCESS ) NdisIMInitializeDeviceInstanceEx(...) 也就是说你应该在你的ProtocolOpenAdapterComplete函数里进行初始化 |
|
地板#
发布于:2002-12-06 17:40
谢谢,那么所谓的操作是不是指的是指系统会去调用NdisCompleteOpenAdapter???,还是指的其他的操作呢?我看Passthru的上面的系统调用中也没有做什么事情呀?或者你指的是等待那个SPINLOCK??
|
|
地下室#
发布于:2002-12-06 17:42
就是,你不看这句吗?
if(*Status == NDIS_STATUS_PENDING) { NdisWaitEvent(&pAdapt->Event, 0); *Status = pAdapt->Status; } if(*Status != NDIS_STATUS_SUCCESS) { break; } |
|
5楼#
发布于:2002-12-06 17:44
bingjie,你是指的是直接手动调用ProtocolCompleteAdapterOpen这个函数,你上面是不是应该把!=换成==??
|
|
6楼#
发布于:2002-12-06 17:47
谢谢frack,有人讨论的感觉真是帅呆了,再问一下,所谓的Event,是必须的,也就是说等待是必须的???我没有搞清楚,在Passthru中这样做的目的???好像是多次用到的???
|
|
7楼#
发布于:2002-12-06 17:49
我注释掉这句也没有问题呀???
|
|