阅读:1734回复:9
启动 MediaPlay 导致系统 宕机? 苦!苦!苦!
Ndis drvier在不启动media play 之前运行如常. 一旦启动media play, 系统即告宕机. 屡试滤中!
blue stop show the following message: Bug Check 0xD1 DRIVER_IRQL_NOT_LESS_OR_EQUAL (0, 2, 0, 0) 依照文档来看,该错误是因为 A driver tried to access an address that is pageable (or that is completely invalid) while the IRQL was too high. 可是我访问的都是non page 的内存, 好像没有pageable 的内存. 原因不知? Please help me. |
|
沙发#
发布于:2003-05-16 10:15
检查代码,看那地方的参数用错了,该用指针的指针的时候用的指针一类的。
|
|
|
板凳#
发布于:2003-05-16 10:16
对着你的代码发呆就可以了
|
|
|
地板#
发布于:2003-05-16 10:50
Thanks for your reply
有道理! 有说总比没说好! 我会考虑一下! :o :D ;) |
|
地下室#
发布于:2003-05-16 11:35
这个错误是说,你在错误的中断级别调用了某些系统函数,请检查你的系统中断级,一般是在Dispatch级叫了Passive级的函数。可以用SoftIce跟,看当在哪儿,检查你有没有DPC之类的。
|
|
5楼#
发布于:2003-05-16 15:45
我的做法如下:
1. 建立一个thread passive 进行数据分析, 如有有效数据, 则启动 timer 2. timer dispatch 在此中取出数据, 进行indicate packet 我在(1)中有调用一些dispatch_level 的function, 比如RemoveEntryList IsListEmpty 估计可能是在这里了. 在2中, 没有调用passive_level 的function. 可是唯一不解的是, 为什么 不启动media play 就没事 |
|
6楼#
发布于:2003-05-16 16:50
不是,在Passive调要求<+Dispatch的没事,反过来不行,因为Dispatch实时性要求较高,常常因为在Dispatch调了只能运行在Passive级别的函数导致你出现的错误。所以你要看你的Timer里处理的够不够快,你的现象应该出在Timer里,似乎在Run media play时触发了Timer才当了.
|
|
7楼#
发布于:2003-05-16 17:09
仔细检查你的每一个函数调用,是否有参数传递不对。
看你编译出来的build.wrn, |
|
|
8楼#
发布于:2003-05-16 17:10
我觉得不是的, 因为我的timer dpc 是比较简单的那种, 如果出问题, 很容易看得出的, 至于 timer dpc 中的处理速度我认为还是比较快的, 以下是主要的 source code, 相烦看看, 有无错误的隐患,
Thanks a lot! // Acquire to the spinlock to the adapter NdisAcquireSpinLock(&Adapter->RcvLock); while (!IsListEmpty(&Adapter->RecvPendList)) { pMpRfd = (PMP_RFD)RemoveHeadList(&Adapter->RecvPendList); PacketArray[PacketArrayCount] = pMpRfd->NdisPacket; PacketArrayCount++; AllPacketCount++; } NdisReleaseSpinLock(&Adapter->RcvLock); // Return Packet from the MiniportRetuanPacket routine NdisMIndicateReceivePacket( Adapter->MiniportAdapterHandle, PacketArray, PacketArrayCount ); // Reacquire the spinlock to the Adapter structure NdisAcquireSpinLock(&Adapter->RcvLock); Adapter->IndicatingReceives = FALSE; MP_DEC_INDICATE_TIMER_REF(Adapter); Count = MP_GET_INDICATE_TIMER_REF(Adapter); NdisReleaseSpinLock(&Adapter->RcvLock); DBGPRINT(MP_WARN, (\"IndicateTimerThread, Count =%d AllPacketCount==%d\\n\", Count, AllPacketCount)); if (Count==0) { NdisSetEvent(&Adapter->EventIndicateTimer); DBGPRINT(MP_WARN, (\"TimerRefCount=%d\\n\", Count)); DBGPRINT(MP_WARN, (\"Set EventIndicateTimer ...\\n\")); } *****the end 另外以我的经验, 在passive_level 调用 dispatch_level 的 function, 好像还是会system crash, 而且极不安全。 也许暂时没事, 可是久了, 难免会出问题. |
|
9楼#
发布于:2003-05-19 09:26
Keep in push up!
:mad: :mad: :mad: |
|