阅读:2100回复:4
驱动中发IOCTL给串口,为什么串口就一直被占用?
我在驱动中发IOCTL码到串口,只有第一次有反应,后来串口就一直被占用了,需重启机器才行,不知何故?我的代码如下:NTSTATUS BaudDevice::BAUD_IOCTL_800_Handler(KIrp I)
{ NTSTATUS status = STATUS_SUCCESS; t << \"Entering audDevice::BAUD_IOCTL_800_Handler, \" << I << EOL; I.Information() = 0; ULONG Unit = 0; KUnitizedName uname(L\"\\\\Device\\\\Serial\", Unit); KLowerDevice* pSerialPort = new (NonPagedPool) KLowerDevice((PWSTR)uname,FILE_ALL_ACCESS); if (pSerialPort && NT_SUCCESS(pSerialPort->ConstructorStatus())) { SERIAL_BAUD_RATE GetBaud; // global static //------------------------------------------ KIrp I = KIrp::Allocate(pSerialPort->StackRequirement()); I.MajorFunction(NEXT) = IRP_MJ_DEVICE_CONTROL; I.MinorFunction(NEXT) = 0; I.IoctlCode(NEXT) = IOCTL_SERIAL_GET_BAUD_RATE; I.IoctlInputBufferSize(NEXT) = 0; I.IoctlOutputBufferSize(NEXT) = sizeof(SERIAL_BAUD_RATE); I.IoctlBuffer() = &GetBaud; I.SetCompletionRoutine( DeviceIoCompleteRoutine,NULL,TRUE,TRUE,TRUE ); status = pSerialPort->Call(I); } t << \"I.Information()= \" << I.Information(); return status; } |
|
|
沙发#
发布于:2002-07-17 18:11
你的完成例程呢?
|
|
板凳#
发布于:2002-07-17 18:27
完成例程:
NTSTATUS DeviceIoCompleteRoutine ( PDEVICE_OBJECT DeviceObject, PIRP pIrp, PVOID Context) { // the baud rate is in global GetBaud. KIrp::Deallocate(pIrp); return STATUS_MORE_PROCESSING_REQUIRED; } 我发现是因为pSerialPort用new生成后,没有用delete删除,所以串口一直占用,下次再想生成也不行了。但是 把delete pSerialPort直接放到最后会出错。 我现在把new的部分放到设备的构造函数中,delete部分放到析构函数中,勉强可以。但这也不是解决办法,因为必须驱动卸载后串口才能释放!! 怎么才能做到每次控制时new,控制完了delete而不出错呢?请指点!给分!! |
|
|
地板#
发布于:2002-07-17 19:44
driverstudio写的驱动实在看不懂,对不起了。
|
|
|
地下室#
发布于:2002-07-18 11:16
很难看懂,用猜的了。
什么时候IoComplelteRequest呢? |
|