|
阅读:1514回复: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 阿
|
|