fanzi
驱动小牛
驱动小牛
  • 注册日期2004-12-09
  • 最后登录2013-12-19
  • 粉丝1
  • 关注0
  • 积分1004分
  • 威望754点
  • 贡献值0点
  • 好评度93点
  • 原创分0分
  • 专家分0分
阅读:1226回复:1

调用别的驱动阻塞住,怎么办

楼主#
更多 发布于:2007-05-30 10:47
我做了一个虚拟串口,然后读写都转发到一个真是的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例程。
张帆的内核学习论坛 http://bbs.kerneldev.com
GoodOnline
驱动小牛
驱动小牛
  • 注册日期2007-04-11
  • 最后登录2009-02-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望204点
  • 贡献值0点
  • 好评度191点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-06-01 09:45
debugging 阿
游客

返回顶部