kissfire
驱动牛犊
驱动牛犊
  • 注册日期2004-09-09
  • 最后登录2006-01-05
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1026回复:2

过滤驱动处理READ的问题

楼主#
更多 发布于:2004-10-12 09:51
我做了一个串口过滤驱动,想要拦截串口接收的第一位为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分重谢!
kissfire
驱动牛犊
驱动牛犊
  • 注册日期2004-09-09
  • 最后登录2006-01-05
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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分重谢!
KMK
KMK
驱动大牛
驱动大牛
  • 注册日期2001-09-12
  • 最后登录2017-10-06
  • 粉丝2
  • 关注0
  • 积分42分
  • 威望404点
  • 贡献值2点
  • 好评度58点
  • 原创分1分
  • 专家分1分
  • 社区居民
板凳#
发布于: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]
游客

返回顶部