阅读:1342回复:1
调用别的驱动阻塞住,怎么办
我做了一个虚拟串口,然后读写都转发到一个真是的usb设备上,usb的驱动就是DDK提供的bulkusb。
首先我在接受到IRP_MJ_CREATE的时候,调用如下函数 NTSTATUS CreateUSB(PDEVICE_OBJECT fdo) { PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension; PWSTR USB_Name = NULL; IoGetDeviceInterfaces(&GUID_CLASS_I82930_BULK,NULL,0,&USB_Name); if (USB_Name==NULL || USB_Name[0]==0) { KdPrint(("can not find the usb\n")); return STATUS_INVALID_PARAMETER; } KdPrint(("usb interface:%ws",USB_Name)); CUString devName(USB_Name); OBJECT_ATTRIBUTES objectAttributes; IO_STATUS_BLOCK ioStatus; InitializeObjectAttributes( &objectAttributes, &(UNICODE_STRING)devName, OBJ_CASE_INSENSITIVE, NULL, NULL ); NTSTATUS ntStatus = ZwCreateFile( &pdx->hUSBLogFile, GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE, &objectAttributes, &ioStatus, NULL, FILE_ATTRIBUTE_NORMAL, 0, FILE_OPEN_IF, FILE_SYNCHRONOUS_IO_ALERT, NULL, 0 ); return ntStatus; } 在处理IRP_MJ_WRITE中,加入如下 IO_STATUS_BLOCK ioStatus; ntStatus = ZwWriteFile( pdx->hUSBLogFile, NULL, NULL, NULL, &ioStatus, pdx->Buffer, DataLen, NULL, NULL); 可是都会阻塞在ZwWriteFile里,而打出了来的log说明bulkusb的驱动的写的完成例程已经结束,为什么会阻塞在这里面呢。因为会阻塞在这里,虚拟串口的写irp也不会完成,串口调试程序无法退出,每次只能暴力关机,sigh,即便我在前面设置了cancel例程,也不会进入cancel例程。 |
|
|
沙发#
发布于:2007-06-01 09:45
debugging 阿
|
|