hejy
驱动牛犊
驱动牛犊
  • 注册日期2001-10-29
  • 最后登录2010-09-27
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望10点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:1386回复:4

强烈需要帮助!!! ( 谢谢 )

楼主#
更多 发布于:2007-04-03 10:32
  //类定义片断

class DlsComCardDevice : public KPnpDevice
{
 

    // Member Data
protected:
        // Unit number for this device (0-9)
    ULONG                m_Unit;
    KPnpLowerDevice        m_Lower;
    DlsComCardDevice_DriverManagedQueue m_DriverManagedQueue;
// TODO:    Create additional driver managed queues.  These might be
//            of the same class (DlsComCardDevice_DriverManagedQueue),
//            or you might choose to derive another class.
        // The following members correspond to hardware resources in the
        // device.
 

    MEMBER_DPC (DlsComCardDevice, TimedCallback);
    KTimedCallback  m_Timer;

    KEvent*  m_pEventToSignal;

};


NTSTATUS DlsComCardDevice::DeviceControl(KIrp I)  // 片断

{


       case DLSCOMCARD_IOCTL_SETUP_SIGNAL:
       // app passes event handle in input buffer
            {
            t << "Entering DlsComCardDevice::DLSCOMCARD_IOCTL_SETUP_SIGNAL, " << I << EOL;
                HANDLE hEvent = *(HANDLE*)I.IoctlBuffer();
                if ( m_pEventToSignal ) delete m_pEventToSignal;
                m_pEventToSignal = new(NonPagedPool) KEvent( hEvent );
                 status = (m_pEventToSignal != NULL)? STATUS_SUCCESS : STATUS_INSUFFICIENT_RESOURCES;

            }
            //return I.Complete(status);
            break;
        case DLSCOMCARD_IOCTL_START:
       // app passes event handle in input buffer
            {
                 if ( m_pEventToSignal )  
                {
                 LARGE_INTEGER tm ;
                tm.QuadPart = -2000;  
                 m_Timer.SetPeriodic(tm, 20 , LinkTo(TimedCallback),NULL);
                }
                status =  STATUS_SUCCESS  ;

            }
            //return I.Complete(status);
            break;

}

VOID DlsComCardDevice::TimedCallback(PVOID arg1, PVOID arg2)
{
       if ( m_pEventToSignal )
            m_pEventToSignal->Set();
}

NTSTATUS DlsComCard::AddDevice(PDEVICE_OBJECT Pdo) //片断
{
//...
    DlsComCardDevice * pDevice = new (  NonPagedPool  )    DlsComCardDevice(Pdo, m_Unit);    
//..
}

运行后出现兰屏“DRIVER_IRQL_NOT_LESS_OR_EQUAL"
DQXXX
xp4105
论坛版主
论坛版主
  • 注册日期2006-04-02
  • 最后登录2014-03-29
  • 粉丝1
  • 关注0
  • 积分905分
  • 威望570点
  • 贡献值1点
  • 好评度162点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-04-04 13:09
你整了这些片段代码,大家都看的晕,蓝屏都是经常出现的事情,最好把你想问的说清楚,代码写明白。
时光如流水 抓紧时间实现自我价值
hejy
驱动牛犊
驱动牛犊
  • 注册日期2001-10-29
  • 最后登录2010-09-27
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望10点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-04-05 08:09
谢谢关注!!  
进一步说明如下:

设备没有中断,想用定时器轮巡,KTimedCallback m_Timer; 定时器,TimedCallback回调函数(DPC)
   KEvent* m_pEventToSignal; 是通知应用层的事件,

1  ----- 构造仪器
DlsComCardDevice * pDevice = new ( NonPagedPool )    DlsComCardDevice(Pdo, m_Unit);    
构造仪器时,用非分页内存


2 ---  DLSCOMCARD_IOCTL_SETUP_SIGNAL 是应用层设置事件

m_pEventToSignal = new(NonPagedPool) KEvent( hEvent );

3 ---- DLSCOMCARD_IOCTL_START开始轮巡

4 -----

VOID DlsComCardDevice::TimedCallback(PVOID arg1, PVOID arg2)
{
      if ( m_pEventToSignal )
          m_pEventToSignal->Set();
}
DPC中,判断m_pEventToSignal ,再通知应用层



 if ( m_pEventToSignal )
          m_pEventToSignal->Set();
去掉,没有错误,查了相关的贴子,改到这样,还是有错.


请大家帮忙

谢谢!!!!
DQXXX
xp4105
论坛版主
论坛版主
  • 注册日期2006-04-02
  • 最后登录2014-03-29
  • 粉丝1
  • 关注0
  • 积分905分
  • 威望570点
  • 贡献值1点
  • 好评度162点
  • 原创分1分
  • 专家分0分
地板#
发布于:2007-04-05 16:29
应该是中断级问题。你试试。
时光如流水 抓紧时间实现自我价值
hejy
驱动牛犊
驱动牛犊
  • 注册日期2001-10-29
  • 最后登录2010-09-27
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望10点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-05-10 07:58
能不能说具体一些?
谢谢
DQXXX
游客

返回顶部