阅读:1676回复:9
scsi miniport HwScsiInitialize 的IRQL问题
请问, 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是什么? |
|
最新喜欢:jianpi... |
沙发#
发布于:2004-06-14 18:08
HwScsiInitialize的IRQL是不太确定的,DDK文档中没有指出它的IRQL,所以不要对它作出任何假定。
在miniport驱动中,DriverEntry肯定是Passive level,其他的例程就不能肯定是Passive level,有可能会高的! 所以才“不是每次都会蓝屏”。 |
|
|
板凳#
发布于: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??)?? 多谢指点 ~~ |
|
地板#
发布于:2004-06-14 23:10
奇怪了,我也在HwScsiInitialize中调用HwPsCreateSystemThread(),但是却从来没有碰到过蓝屏。真乃奇哉怪也!
|
|
地下室#
发布于: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] |
|
5楼#
发布于:2004-06-15 08:36
如果有非用不可的理由,可以在DriverEntry中调用。或者使用Timer代替。
SCSI miniport 驱动一般是不应该调用 PsCreateSystemThread 这些WDM函数的,当然,调用也没有太大问题(可能通不过WHQL认证:()。 |
|
|
6楼#
发布于:2004-06-15 09:14
HwInitialize是在dispatch_level运行的。我想这个就是问题的所在。建议把这些PsCreateSystemThread 函数放到这里driverentry来做。ddk上说PsCreateSystemThread must run at passivelevel
|
|
7楼#
发布于:2004-06-15 13:50
你可在HwInitialize中调用KeGetCurrentIrql测试一下IRQL是多少不就好了。
PsCreateSystemThread Callers of this routine must be running at IRQL PASSIVE_LEVEL. |
|
|
8楼#
发布于:2004-06-15 13:51
不要忘记把结果公布一下哟
|
|
|
9楼#
发布于:2004-06-15 22:33
我在windbg下面看了,看了几次,irql就是2,所以PsCreateSystemThread会crash应该是正常的,
所以我现在要改用IoQueueWorkItem()一类的api来创建worker thread了~~ |
|