XinHuaSoft
驱动牛犊
驱动牛犊
  • 注册日期2005-07-19
  • 最后登录2012-06-11
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望167点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
阅读:1954回复:2

串口过滤驱动程序导致串口调试助手死掉

楼主#
更多 发布于:2010-01-10 16:28
最近在做一个串口过滤驱动,在挂接成功后一旦串口调试助手打开串口就会死掉,不知道为什么,把代码发上来请大家指导!
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
    KdPrint(("Enter DriverEntry!\n"));
    for(int i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
        DriverObject->MajorFunction = DispatchPassthrough;
        
    DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IoCtlPassthrough;
    DriverObject->MajorFunction[IRP_MJ_READ] = Read;
    DriverObject->MajorFunction[IRP_MJ_WRITE] = Write;
    DriverObject->DriverUnload = DriverUnload;
    
    KdPrint(("Leave DriverEntry!\n"));
    return CreateDevice(DriverObject);
}

NTSTATUS CreateDevice(IN PDRIVER_OBJECT DriverObject)
{
    KdPrint(("Enter CreateDevice!\n"));
    NTSTATUS status = STATUS_SUCCESS;
    UNICODE_STRING DeviceName;
    RtlInitUnicodeString(&DeviceName, L"\\Device\\MYCOMMFILTER");
    PDEVICE_OBJECT DeviceObject = NULL;
    if(!NT_SUCCESS(IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), &DeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &DeviceObject)))
    {
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    PDEVICE_EXTENSION DevExt = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
    DevExt->DeviceObject = DeviceObject;
    DevExt->AttachedObject = NULL;
    UNICODE_STRING SymbolicLink;
    RtlInitUnicodeString(&SymbolicLink, L"\\??\\COMMFILTER");
    IoCreateSymbolicLink(&SymbolicLink, &DeviceName);
    DevExt->SymbolicLink = SymbolicLink;
    
    /*********************测试用*****************************/
    UNICODE_STRING TestDevice;
    RtlInitUnicodeString(&TestDevice, L"\\Device\\Serial0");
    if(!NT_SUCCESS(status = IoAttachDevice(DeviceObject, &TestDevice, &DevExt->AttachedObject)))
    {
        IoDeleteSymbolicLink(&SymbolicLink);
        IoDeleteDevice(DeviceObject);
        return status;
    }
    /********************************************************/
    DeviceObject->Flags |= DO_BUFFERED_IO;
    DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
    KdPrint(("Leave CreateDevice!\n"));
    return status;
}

NTSTATUS Read(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    KdPrint(("Enter Read!\n"));
    //PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
    PDEVICE_EXTENSION DevExt = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
    IoCopyCurrentIrpStackLocationToNext(Irp);
    IoSetCompletionRoutine(Irp, OnRead, DeviceObject, TRUE, TRUE, TRUE);
    KdPrint(("Leave Read!\n"));
    return IoCallDriver(DevExt->AttachedObject, Irp);
}

NTSTATUS OnRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
{
    KdPrint(("Enter OnRead!\n"));
    if(NT_SUCCESS(Irp->IoStatus.Status))
    {
        PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
        PCHAR pBuff = (PCHAR)Irp->AssociatedIrp.SystemBuffer;
        ULONG lBuffLen = Irp->IoStatus.Information;
        for(ULONG i = 0; i < lBuffLen; i++)
        {
            KdPrint(("0x%x", pBuff));
        }
        KdPrint(("\n"));
    }
    if(Irp->PendingReturned)
    {
        KdPrint(("Mark Pending!\n"));
        IoMarkIrpPending(Irp);
    }
    KdPrint(("Leave OnRead!\n"));
    return Irp->IoStatus.Status;
}
XinHuaSoft
驱动牛犊
驱动牛犊
  • 注册日期2005-07-19
  • 最后登录2012-06-11
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望167点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-01-11 09:20
原来是我没有结束IRP,改成下面这样就不会死了,但是运行一会儿之后就会BugCheck了,不知道为什么?
NTSTATUS Read(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    KdPrint(("Enter Read!\n"));
    //PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
    PDEVICE_EXTENSION DevExt = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
    IoCopyCurrentIrpStackLocationToNext(Irp);
    IoSetCompletionRoutine(Irp, OnRead, DeviceObject, TRUE, TRUE, TRUE);
    KdPrint(("Leave Read!\n"));
    NTSTATUS status = IoCallDriver(DevExt->AttachedObject, Irp);
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return status;
}
XinHuaSoft
驱动牛犊
驱动牛犊
  • 注册日期2005-07-19
  • 最后登录2012-06-11
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望167点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-01-13 21:59
程序主要有以下几个问题:
1、在将新建的设备挂接到串口之后,需要将串口的DeviceType和Characteristic赋值给新建的设备的相应成员中
2、对于过滤驱动,由于不知道下层设备的IO方式到底是哪种,所以需要将Flags |= lowerDev->Flags & (DO_BUFFERED_IO | DO_DIRECT_IO)
3、只有在完成例程返回STATUS_MORE_PROCESSING_REQUIRED时才需要由上层驱动结束IRP(IoCompleteRequest)
4、过滤驱动派遣函数的默认处理中应该将IRP转发至下层驱动,否则下层驱动会有很多IRP接收不到,这样会出问题
游客

返回顶部