suerdj2k
驱动牛犊
驱动牛犊
  • 注册日期2004-12-28
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2789回复:3

winpcap中DeviceIoControl与WriteFile的区别?

楼主#
更多 发布于:2005-01-13 08:57
最近看winpcap,有一处向网卡发包,有两种方式:PacketSendPacket(),和PacketSendPackets();

前者用WriteFile(AdapterObject->hFile,lpPacket->Buffer,lpPacket->Length,&BytesTransfered,NULL)

后者用
DeviceIoControl(
  AdapterObject->hFile,
  (Sync)?pBIOCSENDPACKETSSYNC:pBIOCSENDPACKETSNOSYNC,
  (PCHAR)PacketBuff + TotBytesTransfered,
  Size - TotBytesTransfered,
  NULL,
  0,
  &BytesTransfered,
  NULL);

请问两者有什么区别呢?(效率,方式等方面)
============================== 苏州工业园区 NDIS驱动 软件研发
suerdj2k
驱动牛犊
驱动牛犊
  • 注册日期2004-12-28
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-13 12:43
自己找到一些:

操作系统规定应用层和内核通信只能通过固定的接口:
Writefile,readfile,deviceiocontrol等

但是可以换个方式实现,你可以在内核实现你的函数,不过不是像dll那样的通过函数名向外显露,可以用ioctl码,也就是说你在内核定义不同功能的函数,然后在应用层通过deviceiocontrol来调用,然后你可以写个dll来封装这些deviceiocontrol,最后你的应用程序就可以调用dll中的函数来访问内核了,效果是一样的。

如果光写或光读就用write,read.
如果需要写了还需要返回,就用iocontrol.

-----------------------

不过哪个效率更高,这两种方式的实现原理,还望高人指点!

============================== 苏州工业园区 NDIS驱动 软件研发
suerdj2k
驱动牛犊
驱动牛犊
  • 注册日期2004-12-28
  • 最后登录2006-02-08
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-02-15 12:54
自己顶一下!
============================== 苏州工业园区 NDIS驱动 软件研发
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-02-16 13:23
一下是我的理解:
(1)对设备对象的访问方式上
Writefile,readfile:在DriverEntry中由Flags指定是直接访问还是buffer缓存方式。

deviceiocontrol:由控制码指定,控制码是你自己定义的,可以多种。

琢磨悟真知
游客

返回顶部