zab
zab
驱动小牛
驱动小牛
  • 注册日期2001-07-04
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分126分
  • 威望14点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
阅读:1115回复:3

我写的驱动导致机器不能正常关机和重启!!!

楼主#
更多 发布于:2003-02-26 22:58
用DS写的驱动程序,导致机器不能关机和重启(只能按reset键)。
过程如下:
app通过DeviceIoControl给driver发送一个读数据命令,然后等待数据返回(等待时间是不可预料的,可能很长)。driver接到此命令后将该irp设为pending,并设置了cancel例程CancelReceiveMessageIrp。当驱动程序接收到板卡的数据时,调用device类的成员函数RecMessageEventHandler把数据返回给app。

程序如下:
NTSTATUS MyPCICardDevice::DeviceControl(KIrp I)
{
//其它命令处理略去
case RECEIVE_MESSAGE_IOCTL:
  CancelSpinLock::Acquire();
  I.SetCancelRoutine(LinkTo(CancelReceiveMessageIrp));
  m_IrpReceiveMessageEvent = I;//
  //m_IrpReceiveMessageEvent是device类的KIrp类型的成员变量
  CancelSpinLock::Release();
  status=STATUS_PENDING;
  break;
//其余部分略去
}

VOID MyPCICardDevice::CancelReceiveMessageIrp(KIrp I)
{
  m_IrpReceiveMessageEvent = KIrp(NULL);
  I.Information() = 0;
  CancelSpinLock::Release(I->CancelIrql);
  I.Complete(STATUS_CANCELLED);
}

VOID MyPCICardDevice::RecMessageEventHandler(unsigned char* str,unsigned short Num_of_bytes)
{
  KIrp I = m_IrpReceiveMessageEvent;
  m_IrpReceiveMessageEvent = KIrp(NULL);
  
  unsigned char* pOutBuf=(unsigned char*)I.IoctlBuffer();
  RtlCopyMemory(pOutBuf,str,Num_of_bytes);

  I.Information() = Num_of_bytes;
  I.Complete(STATUS_SUCCESS);
}

运行app发出读数据的命令,经过一段时间driver把数据返回给app。然后停止app的运行,这时就不能够正常的重启和关机了,只能通过按reset键。不知是怎么回事,请各位高手指点,谢谢!!!
X_ray
驱动中牛
驱动中牛
  • 注册日期2003-02-03
  • 最后登录2004-07-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-27 10:40
问题可能在app内,没有把pending的线程结束.
zab
zab
驱动小牛
驱动小牛
  • 注册日期2001-07-04
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分126分
  • 威望14点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-27 20:57
发现新问题:
我在app的主线程里用DeviceIoControl给driver发送一个读数据命令,在driver返回数据之前,调用CancelIo()把这个请求给cancel掉,driver的cancel例程也执行了,可是还是不能正常重启和关机。如果我根本就不发出读数据命令,那么一切正常。就这么几行代码,究竟问题处在哪里呢?这些代码我还是参照ds的帮助里的例子写的。
X_ray
驱动中牛
驱动中牛
  • 注册日期2003-02-03
  • 最后登录2004-07-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-02-27 23:52
你CANCEL的IRP不是PENDING的IRP。
游客

返回顶部