dingshine
驱动小牛
驱动小牛
  • 注册日期2002-04-12
  • 最后登录2007-12-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5234回复:16

怎么解决IRQL_NOT_LESS_OR_EQUAL的错误

楼主#
更多 发布于:2002-05-14 16:47
刚开始运行测试程序还没问题,运行了十几次后,弹出softice窗口,提示有这样的错误:STOP: 0x000000D1 (0x00000018, 0x00000002, 0x00000001, 0xBCB8940F)
Driver_IRQL_NOT_LESS_OR_EQUAL
ADDRESS BC8E540F,DATASTAMP 373BB6E3-XXXX.SYS
Begning dump of physical memory
是不是引用了过多分页内存的问题?还是irql的问题。

最新喜欢:

leavepeaceleavep...
驱动,俺不懂,有没有人管啊?
your_ying
驱动牛犊
驱动牛犊
  • 注册日期2002-05-13
  • 最后登录2009-04-03
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望5点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-05-14 17:03
在该irql访问了不对应的内存。
好象是在高中断级访问了分页内存。
我需要帮助,我也会帮助别人
dingshine
驱动小牛
驱动小牛
  • 注册日期2002-04-12
  • 最后登录2007-12-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-14 19:22
这是我的isr,高手看看,有什么不对?
m_IntStatus=m_CsrMemoryRange.ind((ULONG)0x0008);//IF MASK ?
    DbgPrint(\"m_IntStatus=%x\\n\",m_IntStatus);
if((m_IntStatus&0x80000001)!=0x80000001) return FALSE;
m_IntStatus1=m_CsrMemoryRange.ind((ULONG)0x0000);
DbgPrint(\"m_IntStatus1=%x\\n\",m_IntStatus1);
if((m_IntStatus1&0x0001)==0x0001)
{
m_CsrMemoryRange.outd((ULONG)0x0004,(ULONG)0x0001);
   m_IntStatus2=m_CtlMemoryRange.inw((ULONG)0x0000);
   DbgPrint(\"m_IntStatus2=%x\\n\",m_IntStatus2);
   if((m_IntStatus2&0x0808)==0x0808)
{
m_CtlMemoryRange.outw((ULONG)0x0000,0x0b0b);    
            t << \"Interrupt Occur!\\n\";
   m_DpcFor_Irq.Request(NULL, NULL);
   return TRUE;
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
驱动,俺不懂,有没有人管啊?
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-05-14 19:34
ISR里面不能使用分页内存。
一般工作irql必然比apc level 高的。

[编辑 -  5/14/02 by  zdhe]
dingshine
驱动小牛
驱动小牛
  • 注册日期2002-04-12
  • 最后登录2007-12-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-05-14 19:39
能否具体针对我这个指点一下。
驱动,俺不懂,有没有人管啊?
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-05-14 23:44
把所有关于内寸分配,数据结构定义关系的东西都贴出来才能分析
否则你让大家怎么猜呢? 用的时候出错了,不一定是某句代码的问题.
dingshine
驱动小牛
驱动小牛
  • 注册日期2002-04-12
  • 最后登录2007-12-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-05-15 08:42
这是我的一段代码
NTSTATUS Pci2040Device::PCI_READWORD_Handler(KIrp I)
{
NTSTATUS status;
    PULONG    *pBuffer;
ULONG   ByteOffset;
USHORT   Data_Receive;
PCHAR    *pAddr;
ULONG    length;
t << \"Entering Pci2040Device::PCI_READWORD_Handler, \" << I << EOL;
// TODO: Verify that the input parameters are correct
// If not, return STATUS_INVALID_PARAMETER

// TODO: Handle the the PCI_READWORD request, or
// defer the processing of the IRP (i.e. by queuing) and set
// status to STATUS_PENDING.

// TODO: Assuming that the request was handled here. Set I.Information
// to indicate how much data to copy back to the user.
pBuffer=(PULONG*)I.IoctlBuffer();
    ByteOffset=(ULONG)pBuffer[0];
DbgPrint(\"ByteOffset: %x\\n\",ByteOffset);

Data_Receive=(USHORT)m_CtlMemoryRange.inw((ULONG)ByteOffset);
DbgPrint(\"Data_Receive: %x\\n\",Data_Receive);

length=sizeof(Data_Receive);
DbgPrint(\"length: %x\\n\",length);
if (I.IoctlOutputBufferSize()>=length)
{
KMemory Mem(I.Mdl());
memcpy(Mem.MapToSystemSpace(),&Data_Receive,length);
   pAddr=(PCHAR*)Mem.MapToSystemSpace();
   DbgPrint(\"pAddr : %x\\n\",pAddr[0]);
   I.Information() = length;
   status = STATUS_SUCCESS;
   return status;
}
else
{
I.Information() = 0;
return I.Complete(STATUS_BUFFER_TOO_SMALL);
}
}

Devicecontrol中:
case PCI_WRITEWORD:
pKPciConfiguration->Initialize(m_Lower.TopOfStack());//must init
            pKPciConfiguration->WriteCommandRegister( 0x0002 );
status = PCI_WRITEWORD_Handler(I);
break;

OnStartDevice中
pKPciConfiguration=new(NonPagedPool)KPciConfiguration(m_Lower.TopOfStack());
    pKPciConfiguration->Control(cmdMemoryAccess,TRUE); //允许内存映射
pKPciConfiguration->Control(cmdIoAccess,FALSE);
pKPciConfiguration->ReadHeader(&m_MyConfiguration,0,sizeof(PCI_CONFIG_HEADER_0));
驱动,俺不懂,有没有人管啊?
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-05-15 09:13
建议你使用softice跟踪一下
确定出那行代码使得系统崩溃
然后再分析和该代码有关的其他代码
这叫缩小范围
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2002-05-15 13:19
按楼上说的作,是正经。

看source,除非错误明显,被人也只能猜。 我不知道你的device io ctrl flag定义,你怎么就能确认I.Mdl()里是有效的buffer呢? I.Mdl()为NULL时应该使用assoatiateIpr.SystemBuffer

具体使用哪一个根据BUFFERIO, DIRECTIO, NEITHIO来确定。


if (I.IoctlOutputBufferSize()>=length)
{
KMemory Mem(I.Mdl());
memcpy(Mem.MapToSystemSpace(),&Data_Receive,length); ????
pAddr=(PCHAR*)Mem.MapToSystemSpace();

其它地方没细看,好好跟跟吧
dingshine
驱动小牛
驱动小牛
  • 注册日期2002-04-12
  • 最后登录2007-12-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-05-15 19:54
读写的数据是正确的啊?我只是想问哪儿占用了分页内存。我用directio
驱动,俺不懂,有没有人管啊?
dingshine
驱动小牛
驱动小牛
  • 注册日期2002-04-12
  • 最后登录2007-12-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-05-16 09:34
再给点指点吧,大牛们!
驱动,俺不懂,有没有人管啊?
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2002-05-16 12:22
感觉你的态度。。。。要知道这是你的工作。不是别人的。

可以猜的大约是下面的东西

m_IntStatus,
m_CsrMemoryRange,
m_IntStatus1,
m_IntStatus2等等是全局变量吧

把所有这一类变量声明再有名的同一个DATA SECTION里,使用
MmLockPagableDataSection把所有再ISR里需要使用的数据都LOCK在内存中。

同时使用MmLockPagableCodeSection把所有isr调用的代码锁定在内存中。

这样,执行中无论数据或者代码都不会被PAGING OUT.
dingshine
驱动小牛
驱动小牛
  • 注册日期2002-04-12
  • 最后登录2007-12-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-05-16 12:55
大哥,误解我了,我虽是这么问,可别以为我在坐以待毙噢,你所说的这个需要锁定吗?感觉没必要,但我可以试试。
驱动,俺不懂,有没有人管啊?
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2002-05-16 13:11
是否必然不知道。
呵呵,我遇到过代码和全局变量被swapout的情况。毕竟你不是做文件系统极的玩艺。文件系统的情况下,普通passive,paging io 下apc, completeroutine里极少情况下dispatch,所以无所谓。
你的情况下,可能需要。

你可以不忙改代码,把pagefile 关掉,如果不再出错,就是这个原因了。

------
还有,STACK也要小心,在>dispath irql的情况下,如果内存紧张,大于4K就有swapout的可能。

-〉这时我的教训之一。

[编辑 -  5/16/02 by  zdhe]
dingshine
驱动小牛
驱动小牛
  • 注册日期2002-04-12
  • 最后登录2007-12-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-05-16 13:21
多谢!
驱动,俺不懂,有没有人管啊?
leavepeace
驱动牛犊
驱动牛犊
  • 注册日期2003-02-08
  • 最后登录2004-07-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-05-14 20:40
楼上的朋友,你是如何解决你的这个问题的?指点一下阿。
送分!
icebreaker
驱动牛犊
驱动牛犊
  • 注册日期2010-03-09
  • 最后登录2010-07-02
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2010-03-13 10:08
给你指点一下,用WINDBG远程调试,可以直接找到出错的那一行。
怎么安装你自己去找一下。
游客

返回顶部