eric.hee
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2002-10-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1664回复:9

60分!关于驱动程序向应用程序传送数据。

楼主#
更多 发布于:2002-06-05 18:45
各位高手,小弟最近写了一个
使用IP Filter Hook Driver的包过滤程序,
希望能把具体的协议信息传送到用户界面上
显示出来,结构如下:

该如何进行程序设计,谢谢!
roger_chen35
驱动牛犊
驱动牛犊
  • 注册日期2002-11-19
  • 最后登录2004-04-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-19 19:06
对不起请教一下:
那现在如果我要在IM或 protocol driver 内 send packe是否要自行填入 mac address
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-08 10:52
各位高手,小弟最近写了一个
使用IP Filter Hook Driver的包过滤程序,
希望能把具体的协议信息传送到用户界面上
显示出来,结构如下:

该如何进行程序设计,谢谢!
 


    如果需要的内存不是很大,可以考虑在驱动程序DriverEntry例程中分配一块(比如说10K)非分页内存,然后在Dispatch例程中将其映身至用户线程,然后应用程序和驱动程序就可以共享这块内存。

具体数据结构如下:
typedef struct _PACKAGE_INFO {
USHORT SrcPort; // 16位源端口号
USHORT DstPort; // 16位目的端口号
ULONG SrcIP;//源IP
ULONG DSTIP;//目的IP
short Protocol;//协议类型
}PACKAGEINFO,*PPACKAGEINFO;
谢谢

关于这个问题的解决方法,pjf兄的方法很好。我曾经用过的一种方法如下:
1)除了创建上述的共享内存以外,还要创建共享事件。在应用程序端创建EVENT(CreateEvent),然后通过DeviceIoControl传至驱动
程序。
2)将你上面的数据结构作一些修改,在里面加一个数据项(有的资料上称为TimeStamp),如下:
#pragma pack(1)
typedef struct _PACKAGE_INFO
{
BOOLEAN bPickUp;
ULONG   DataLength; //供应用程序用
PVOID   pNext;  // 供驱动程序用

USHORT SrcPort; // 16位源端口号
USHORT DstPort; // 16位目的端口号
ULONG SrcIP;//源IP
ULONG DSTIP;//目的IP
short Protocol;//协议类型
}PACKAGEINFO,*PPACKAGEINFO;
#pragma pack()

这些数据块在共享内存中顺序存放,存放时,驱动程序将bPickUp置1,应用程序取走后,将其置0,这样就保证了读取的同步。同时,增加的pNext域,指向共享内存中下一块数据将存放的地方,DataLength域用于在应用程序中下一块数据存放的地方(因为驱动程序中的指针不能在应用程序中直接使用).这样可以保证数据地址能够正确地被索取。

仅供参考。
Tom_lyd
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-06-07 23:30
同上。可以直接抄filemon的方法。简单极了。
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-06 09:17
 
非常感谢您的回复,但考虑我做的是一个抓包程序,
所以还有以下问题:

当我完成一个抓包过程,该怎么及时通知
应用程序,如果由应用程序不断的用DeviceIoControl
发IRP,不知道会不会漏包,而且如果把上次已经抓过的包
的信息拿过来怎么办?

谢谢!


如果是这样,就需要你自己在驱动中维护一个包的队列,具体做法楼上的说的挺好。
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-06 08:30
比较简单的做法,大致可以这样:
驱动中用一个变量记录当前收到的包数,每收一个包增一并将包存入一个队列(因后面的方法要先进先出),同时用事件机制唤醒挂起等待的用户线程。当用户线程获取控制时可能驱动已收了几个包(一般没这么快),所以每次用户线程用DeviceIoControl询问那个变量值同时将其清零(原子操作),再读问到的那么多包。
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-06-05 21:43
我感觉你最好还是在驱动里面用链表把分析结果保存起来等待应用程序来取吧!不然如果让驱动程序得到数据包分析完成之后再告诉应用程序很可能会出问题的
eric.hee
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2002-10-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-06-05 19:10
非常感谢您的回复,但考虑我做的是一个抓包程序,
所以还有以下问题:

当我完成一个抓包过程,该怎么及时通知
应用程序,如果由应用程序不断的用DeviceIoControl
发IRP,不知道会不会漏包,而且如果把上次已经抓过的包
的信息拿过来怎么办?

谢谢!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-06-05 19:06
在应用程序中申请内存,然后将缓冲区句宾传给驱动,在驱动中将数据复制到缓冲区中,应用程序就可以用了
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
eric.hee
驱动牛犊
驱动牛犊
  • 注册日期2002-05-21
  • 最后登录2002-10-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-06-05 18:46
具体数据结构如下:

typedef struct _PACKAGE_INFO {
 USHORT SrcPort; // 16位源端口号
 USHORT DstPort; // 16位目的端口号
 ULONG SrcIP;//源IP
 ULONG DSTIP;//目的IP
 short Protocol;//协议类型
}PACKAGEINFO,*PPACKAGEINFO;
谢谢
游客

返回顶部