slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
阅读:1021回复:3

Passthru移植到Win9X出现蓝屏的困惑!!!

楼主#
更多 发布于:2003-04-18 09:41
    把Passthru移植到Windows 9X下面,下载文件或者打开网页有时(注意:是“有时”,不是“总是”)会出现蓝屏,出错位置出现在MPSend()或者PtReceive()的第一行语句,如下(下面只以PtReceive()为例):

PtReceive(....)
{
  //
  // 这行语句出现异常。
  //
  DbgPrint(\"==> Passthru PtReceive. HeaderSize = %d , LookAheadSize = %d , PacketSize = %d\",HeaderBufferSize,LookAheadBufferSize,PacketSize);
  ...........

}

光从源代码来看没有任何问题,切换到汇编模式,异常位置如下:

PtReceive(....)
{
  PUSH EBP
  MOV  EBP,ESP
  PUSH FF
  PUSH F3F883B8
  PUSH __except_handler3
  PUSH EAX,FS:[00000000]        <====== 有时在这里出现异常
  PUSH EAX
  MOV  FS:[00000000],ESP        <====== 有时又在这里出现异常
  ..........
}

还是看不出有什么问题...:(

考虑到这两行语句跟结构化异常处理有关,把MPSend()和PtReceive()里边的所有结构化异常处理都注释掉(即去掉__try{..} __except(...){}),重新编译,一切正常了。

可是为什么就不能在MPSend()和PtReceive()里边添加结构化异常处理呢???,而在Win2K下面又可以!!!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-04-18 14:13
try是给32位的应用程序用的,不要在驱动里面用

如果用ddk编写驱动,驱动里面尽量用纯C编写,而且不要用C的运行时函数。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-04-18 15:02
我使用的是“__try”,不是“try”,因此代码是没有错的。

而且:

1、《Programming Wnidows Diver Model》也提到了应该使用“__try”。

2、同样的代码在Windows 2000下面没有任何问题。当然已经使用新的编译指示来编译生成Windows 2000的版本。
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-04-24 09:44
.................
游客

返回顶部