FredLiu
驱动牛犊
驱动牛犊
  • 注册日期2004-01-07
  • 最后登录2004-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1676回复:9

scsi miniport HwScsiInitialize 的IRQL问题

楼主#
更多 发布于:2004-06-14 17:17
请问, scsi miniport 的HwScsiInitilize routine的irql是什么?
我在这个routine中用PsCreateSystemThread创建了一个worker thread,但是系统在加载我的miniport的时候,当运行到PsCreateSystemThread这句的时候,有时候会蓝平重启,windbg给出的原因是:
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high.  This is
caused by drivers that have corrupted the system pool.

似乎是因为在HwScsiInitilize中不能用PsCreateSystemThread,
但问题是,并不是每次都会蓝平,有时候我的miniport就可以正常工作~~
请问这是为什么?HwScsiInitialize 的irql是什么?

最新喜欢:

jianpinglijianpi...
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
沙发#
发布于:2004-06-14 18:08
HwScsiInitialize的IRQL是不太确定的,DDK文档中没有指出它的IRQL,所以不要对它作出任何假定。
在miniport驱动中,DriverEntry肯定是Passive level,其他的例程就不能肯定是Passive level,有可能会高的!

所以才“不是每次都会蓝屏”。
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
FredLiu
驱动牛犊
驱动牛犊
  • 注册日期2004-01-07
  • 最后登录2004-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-14 22:58
多谢老大回复,
既然HwScsiInitialize的irql不确定,也就是说只能再其中调用PASSIVE_LEVEL的api了?

另外,还有一个问题,根据ddk, PsCreateSystemThread 必须要在passive_level下运行。但是,如此一来,如何用PsCreateSystemThread在DISPACH_LEVEL的环境中,创建一个PASSIVE_LEVEl的worker thread 呢? (也就是说,要创建worker thread是不是必须要用IoAllocateWorkItem之类的api,而不能直接用PsCreateSystemThread??)??

多谢指点 ~~
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-14 23:10
奇怪了,我也在HwScsiInitialize中调用HwPsCreateSystemThread(),但是却从来没有碰到过蓝屏。真乃奇哉怪也!
FredLiu
驱动牛犊
驱动牛犊
  • 注册日期2004-01-07
  • 最后登录2004-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-14 23:22
slwqw
我确实遇到兰坪,而且频率还很高
并且应该就是PsCreateSystemThread造成的,
因为在windbg中看到,每次crash的时候,都是停在PsCreateSystemThread处~~~

下面是简单的临crash 时候的 stack text的最上面几项:

nt!RtlpBreakWithStatusInstruction
nt!KiBugCheckDebugBreak+0x19
nt!KeBugCheck2+0x46d
nt!KeBugCheckEx+0x19
nt!KiTrap0E+0x2ad  
nt!PsCreateSystemThread <<--问题应该在这
vdisk!InitializeWorker+0xae <<-从这开始 [c:\winddk\workspace\vcdrom\vdisk\sysspec.cpp @ 107]
vdisk!VDiskInitialize+0x25 [c:\winddk\workspace\vcdrom\vdisk\vdisk.cpp @ 198]
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
5楼#
发布于:2004-06-15 08:36
如果有非用不可的理由,可以在DriverEntry中调用。或者使用Timer代替。

SCSI miniport 驱动一般是不应该调用 PsCreateSystemThread 这些WDM函数的,当然,调用也没有太大问题(可能通不过WHQL认证:()。
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
terrychen
驱动小牛
驱动小牛
  • 注册日期2002-04-15
  • 最后登录2014-03-13
  • 粉丝0
  • 关注0
  • 积分174分
  • 威望68点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-15 09:14
HwInitialize是在dispatch_level运行的。我想这个就是问题的所在。建议把这些PsCreateSystemThread 函数放到这里driverentry来做。ddk上说PsCreateSystemThread must run at passivelevel
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-06-15 13:50
你可在HwInitialize中调用KeGetCurrentIrql测试一下IRQL是多少不就好了。

PsCreateSystemThread Callers of this routine must be running at IRQL PASSIVE_LEVEL.
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-06-15 13:51
不要忘记把结果公布一下哟
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
FredLiu
驱动牛犊
驱动牛犊
  • 注册日期2004-01-07
  • 最后登录2004-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-06-15 22:33
我在windbg下面看了,看了几次,irql就是2,所以PsCreateSystemThread会crash应该是正常的,
所以我现在要改用IoQueueWorkItem()一类的api来创建worker thread了~~
游客

返回顶部