xiaxia0053
驱动牛犊
驱动牛犊
  • 注册日期2006-03-27
  • 最后登录2010-04-26
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望46点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
阅读:1817回复:0

我的isa驱动为什么会在重启系统后偶尔进入不了中断服务程序(少数情况,此时无法收到数据),附代码

楼主#
更多 发布于:2010-03-25 13:57
驱动就是用ds的向导生成的,主要改了下面两个例程,其他地方基本上没有动,驱动能够正常工作,接收isa的中断和数据,但是不知道为什么在重启5-6次之中,总会发生一次接受不到中断的情况。故障时,用windriver可以收到数据,所以我觉得应该是我这个驱动的问题,请教大家,还要从哪方面找找原因.
NTSTATUS IsaDevice::DeviceControl(KIrp I)
{
    NTSTATUS status;

    t << "Entering IsaDevice::Device Control, " << I << EOL;
    switch (I.IoctlCode())
    {
        case Event_Isa:
            {    
            HANDLE hEvent = *(HANDLE*)I.IoctlBuffer();

            if (m_pEvent)
            delete m_pEvent;

            m_pEvent = new (NonPagedPool) KEvent(hEvent, OBJECT_TYPE_ALL_ACCESS);
            return I.Complete(STATUS_SUCCESS);        
            }
        case GetData_Isa:
            {    
            m_ResetIntr = (UCHAR)0;                                            //清中断

            if (SynchronizeInterrupt(&m_Irq, LinkTo(ReadData), PIRP(I)) )
            return I.Complete(STATUS_SUCCESS);
    
            else
            return I.Complete(STATUS_UNSUCCESSFUL);
            return STATUS_UNSUCCESSFUL;
            }
        case EZ_ISA_IOCTL_802:
            break;

        case EZ_ISA_IOCTL_803:
            break;

        case EZ_ISA_IOCTL_804:
            break;

        case EZ_ISA_IOCTL_805:
            break;

        case EZ_ISA_IOCTL_806:
            break;

        default:
            // Unrecognized IOCTL request
            status = STATUS_INVALID_PARAMETER;
            break;
    }


BOOLEAN Ez_isaDevice::Isr_Irq(void)
{
    //Get Data

    m_IoPortRange.outw(0x00, 0x0020);
    m_IoPortRange.inb(0x02, &m_Buf[1], m_DataSize);

    m_ResetIntr = (UCHAR)0;                                            //清中断

    if(m_pEvent)
    {
                         m_pEvent->Set();
    }


    
    return TRUE;
    
}

游客

返回顶部