5037|9

78

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

串口读取数据过滤 [复制链接]

在用ddk做驱动时,在对
IRP_MJ_READ截获后
然后改变指向的buffer中的数据
最总发现用串口调试助手读取数据时并没有改变串口读到数据的内容,
请问应该怎样做能够从底层改变收到数据,最终使用串口调试助手时显示的是我修改的数据

最新回复

LZ,问题解决了吗?我也想知道这个问题的答案。 如果解决了,可以把代码贴出来吗?谢谢。  详情 回复 发表于 2011-5-15 12:00
点赞 关注

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
无代码,无真相!!!
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
串口读取数据一般都是标准协议。
lz,能描述得具体一点么?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
> if(irpsp->MajorFunction == IRP_MJ_WRITE)
>            {
>                ULONG len = irpsp->Parameters.Write.Length;
>                PUCHAR buf = NULL;
>                if(irp->MdlAddress != NULL)
>                    buf =
>                    (PUCHAR)
>                    MmGetSystemAddressForMdlSafe(irp->MdlAddress,NormalPagePriority);
>                else
>                    buf = (PUCHAR)irp->UserBuffer;
>                if(buf == NULL)
>                    buf = (PUCHAR)irp->AssociatedIrp.SystemBuffer;
>            }
>
>            IoSkipCurrentIrpStackLocation(irp);
>            return IoCallDriver(s_nextobj,irp);
>        }
如上,代码虽然可以过滤发送的数据,但是即使在添加了IRP_MJ_READ也不能过滤掉接收数据呢
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
不懂,帮顶
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用楼主 zhangweishuang 的回复:
在用ddk做驱动时,在对
IRP_MJ_READ截获后
然后改变指向的buffer中的数据
最总发现用串口调试助手读取数据时并没有改变串口读到数据的内容,
请问应该怎样做能够从底层改变收到数据,最终使用串口调试助手时显示的是我修改的数据
[/quote]

上面代码不是关于这的吧! 再说,楼主好像思维有点混乱,关键是什么问题,哪里的代码与之相关都没弄清除,你给的这段代码似乎不痛不痒,啥都显示不出,对于buf就只有赋值,其他没了!

[quote]引用楼主 zhangweishuang 的回复:
如上,代码虽然可以过滤发送的数据,但是即使在添加了IRP_MJ_READ也不能过滤掉接收数据呢

这个结论又是怎样出来的呢??? 从代码我自认是没看出什么有价值的东西!
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

7
 
if(irpsp->MajorFunction == IRP_MJ_WRITE)
{
ULONG len = irpsp->Parameters.Write.Length;
PUCHAR buf = NULL;
if(irp->MdlAddress != NULL)
buf =  
(PUCHAR)
MmGetSystemAddressForMdlSafe(irp->MdlAddress,NormalPagePriority);
else
buf = (PUCHAR)irp->UserBuffer;
if(buf == NULL)
buf = (PUCHAR)irp->AssociatedIrp.SystemBuffer;
}
  // added  by me
  if(len>=3)
     {
         buf[0] = 'a';
         buf[1] = 'b';
         buf[2] = 'c';
      }
  //
IoSkipCurrentIrpStackLocation(irp);
return IoCallDriver(s_nextobj,irp);
}
后添加部分代码可以将想要发送的数据前三个字节更改
但是如果向下面这样
if(irpsp->MajorFunction == IRP_MJ_WRITE)
{
ULONG len = irpsp->Parameters.Write.Length;
PUCHAR buf = NULL;
buf = (PUCHAR)irp->AssociatedIrp.SystemBuffer;
}
  // added  by me
  if(len>=3)
     {
         buf[0] = 'a';
         buf[1] = 'b';
         buf[2] = 'c';
      }
  //
IoSkipCurrentIrpStackLocation(irp);
return IoCallDriver(s_nextobj,irp);
}
如上在更改读取到的数据时同样想更改数据,但是用串口调试助手得到的数据没有被更改
这回应该说清楚了吧
也就是想了解如果想要从驱动层拦截串口收到的数据然后自己处理再交给应用层改怎么做
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

8
 
如果你想伪造数据,你直接结束这个irp就行了! 无需再往上层传递!

这是我在文件过滤驱动中的做法
...
...
...
RtlCopyMemory(buf,dummy,readLen); //这里就在伪造,随便怎么弄!
//设置irp的IoStatus
Irp->IoStatus.Information = readLen;
Irp->IoStatus.Status = STATUS_SUCCESS;//STATUS_ACCESS_VIOLATION; //violation 违反,违背
...
...
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return Irp->IoStatus.Status;
}
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

9
 

LZ,问题解决了吗?

我也想知道这个问题。

如果楼主解决了,可以发到我邮箱吗?谢谢

邮箱号:353616243@qq.com,谢谢。

 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

10
 
LZ,问题解决了吗?我也想知道这个问题的答案。
如果解决了,可以把代码贴出来吗?谢谢。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
Microchip 直播|利用motorBench开发套件高效开发电机磁场定向控制方案 报名中!
直播主题:利用motorBench开发套件高效开发电机磁场定向控制方案
直播时间:2025年3月25日(星期二)上午10:30-11:30
快来报名!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表