阅读:1026回复:2
过滤驱动处理READ的问题
我做了一个串口过滤驱动,想要拦截串口接收的第一位为1的字节,我在过滤驱动中的READ例程中的处理:
NTSTATUS status; KEVENT event; PUCHAR RByte; ULONG Rlenth; UCHAR Rcount; PUCHAR TempBuffer; UCHAR Count0; KeInitializeEvent (&event, NotificationEvent, FALSE); IoCopyCurrentIrpStackLocationToNext (Irp); IoSetCompletionRoutine (Irp, Serenum_FEDO_ReadComplete, &event, TRUE, FALSE, FALSE); status = IoCallDriver (((PFDO_DEVICE_DATA)DeviceObject->DeviceExtension)->TopOfStack, Irp); if (STATUS_PENDING == status) {//2 // wait for it... status = KeWaitForSingleObject (&event, Executive, KernelMode, FALSE, // Not allertable NULL); // No timeout structure ASSERT (STATUS_SUCCESS == status); status = Irp->IoStatus.Status; }//2 if (NT_SUCCESS(status)) {//3 RByte = (UCHAR*)Irp->AssociatedIrp.SystemBuffer; Rlenth = Irp->IoStatus.Information; TempBuffer = ExAllocatePool( PagedPool, Rlenth); RtlZeroMemory(TempBuffer,Rlenth); Count0 = 0; for(Rcount=0;Rcount<Rlenth;Rcount++) {//4 if( *(RByte+Rcount) < 0x80 ) {//5 TempBuffer+Count0) = *(RByte+Rcount); Count0++; }//5 }//4 RtlZeroMemory(Irp->AssociatedIrp.SystemBuffer,Rlenth); RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,TempBuffer,Count0); ExFreePool(TempBuffer); Irp->IoStatus.Information = Count0; } IoCompleteRequest (Irp, IO_NO_INCREMENT); return status; 结果无论我发送什么,我接收到的全是一系列相同的字节0x34 并且接收到的字节数也不会变化。请各位老大帮忙看看。150分重谢! |
|
沙发#
发布于:2004-10-12 09:57
不好意思 搞错了!!!我重发一下
我做了一个串口过滤驱动,想要拦截串口接收的第一位为1的字节,我在过滤驱动中的READ例程中的处理: NTSTATUS status; KEVENT event; PUCHAR RByte; ULONG Rlenth; UCHAR Rcount; PUCHAR TempBuffer; UCHAR Count0; KeInitializeEvent (&event, NotificationEvent, FALSE); IoCopyCurrentIrpStackLocationToNext (Irp); IoSetCompletionRoutine (Irp, Serenum_FEDO_ReadComplete, &event, TRUE, FALSE, FALSE); status = IoCallDriver (((PFDO_DEVICE_DATA)DeviceObject->DeviceExtension)->TopOfStack, Irp); if (STATUS_PENDING == status) {//2 // wait for it... status = KeWaitForSingleObject (&event, Executive, KernelMode, FALSE, // Not allertable NULL); // No timeout structure ASSERT (STATUS_SUCCESS == status); status = Irp->IoStatus.Status; }//2 if (NT_SUCCESS(status)) {//3 RByte = (UCHAR*)Irp->AssociatedIrp.SystemBuffer; Rlenth = Irp->IoStatus.Information; TempBuffer = ExAllocatePool( PagedPool, Rlenth); RtlZeroMemory(TempBuffer,Rlenth); Count0 = 0; for(Rcount=0;Rcount {//4 if( *(RByte+Rcount) < 0x80 ) {//5 *(TempBuffer+Count0) = *(RByte+Rcount); Count0++; }//5 }// RtlZeroMemory(Irp->AssociatedIrp.SystemBuffer,Rlenth); RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,TempBuffer,Count0); ExFreePool(TempBuffer); Irp->IoStatus.Information = Count0; } IoCompleteRequest (Irp, IO_NO_INCREMENT); return status; 结果无论我发送什么,我接收到的全是一系列相同的字节0x34 并且接收到的字节数也不会变化。请各位老大帮忙看看。150分重谢! |
|
板凳#
发布于:2004-10-12 10:41
在IRP_MJ_READ完成後,在Serenum_FEDO_ReadComplete里接收 !!
应当在IRP_MJ_READ完成後(data巳读好),在反回之前去读所要之data. 用IoSetCompletionRoutine()造一callback function,在这function里读data. [编辑 - 10/12/04 by KMK] |
|