newbiewalker
驱动牛犊
驱动牛犊
  • 注册日期2003-02-18
  • 最后登录2005-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1734回复:9

启动 MediaPlay 导致系统 宕机? 苦!苦!苦!

楼主#
更多 发布于:2003-05-16 10:11
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.

mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-16 10:15
检查代码,看那地方的参数用错了,该用指针的指针的时候用的指针一类的。

学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-16 10:16
对着你的代码发呆就可以了
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
newbiewalker
驱动牛犊
驱动牛犊
  • 注册日期2003-02-18
  • 最后登录2005-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-16 10:50
Thanks for your reply

有道理!
有说总比没说好! 我会考虑一下!
 
 :o :D ;)
robin_wxg
驱动小牛
驱动小牛
  • 注册日期2003-02-10
  • 最后登录2009-09-21
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-16 11:35
这个错误是说,你在错误的中断级别调用了某些系统函数,请检查你的系统中断级,一般是在Dispatch级叫了Passive级的函数。可以用SoftIce跟,看当在哪儿,检查你有没有DPC之类的。
newbiewalker
驱动牛犊
驱动牛犊
  • 注册日期2003-02-18
  • 最后登录2005-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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 就没事

robin_wxg
驱动小牛
驱动小牛
  • 注册日期2003-02-10
  • 最后登录2009-09-21
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望6点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-05-16 16:50
不是,在Passive调要求<+Dispatch的没事,反过来不行,因为Dispatch实时性要求较高,常常因为在Dispatch调了只能运行在Passive级别的函数导致你出现的错误。所以你要看你的Timer里处理的够不够快,你的现象应该出在Timer里,似乎在Run media play时触发了Timer才当了.
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-05-16 17:09
仔细检查你的每一个函数调用,是否有参数传递不对。

看你编译出来的build.wrn,
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
newbiewalker
驱动牛犊
驱动牛犊
  • 注册日期2003-02-18
  • 最后登录2005-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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, 而且极不安全。 也许暂时没事, 可是久了, 难免会出问题.
newbiewalker
驱动牛犊
驱动牛犊
  • 注册日期2003-02-18
  • 最后登录2005-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-05-19 09:26
Keep in push up!

 :mad: :mad: :mad:
游客

返回顶部