阅读:2096回复:2
串口过滤驱动程序导致串口调试助手死掉
最近在做一个串口过滤驱动,在挂接成功后一旦串口调试助手打开串口就会死掉,不知道为什么,把代码发上来请大家指导!
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; } |
|
沙发#
发布于: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; } |
|
板凳#
发布于: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接收不到,这样会出问题 |
|