阅读:1115回复:3
我写的驱动导致机器不能正常关机和重启!!!
用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键。不知是怎么回事,请各位高手指点,谢谢!!! |
|
沙发#
发布于:2003-02-27 10:40
问题可能在app内,没有把pending的线程结束.
|
|
板凳#
发布于:2003-02-27 20:57
发现新问题:
我在app的主线程里用DeviceIoControl给driver发送一个读数据命令,在driver返回数据之前,调用CancelIo()把这个请求给cancel掉,driver的cancel例程也执行了,可是还是不能正常重启和关机。如果我根本就不发出读数据命令,那么一切正常。就这么几行代码,究竟问题处在哪里呢?这些代码我还是参照ds的帮助里的例子写的。 |
|
地板#
发布于:2003-02-27 23:52
你CANCEL的IRP不是PENDING的IRP。
|
|