ghm
ghm
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2003-05-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2585回复:6

在passthru里如何组包,然后发出去?

楼主#
更多 发布于:2002-03-12 20:57
   各位老大,我学驱动时间并不长,很多方面还是一团云雾,如果在此能得到大家的帮助,本人定当感激不尽。
   我的问题是,既然在passthru里的数据包是一个完整的以太桢,那么如果我想在这里组建自己的数据包然后用ndissend发出去的话,则这个数据包也必须是一个完整的以太桢(不知这个看法是否正确?)。在这里,tcp头,ip头都好写,可是这个以太桢头怎么填写呢?怎么获得本机的mac地址,怎么获得目的主机的mac地址呢?为此,只好来麻烦各位了。谢谢。

最新喜欢:

linwnlinwn
rlb
rlb
驱动牛犊
驱动牛犊
  • 注册日期2001-06-20
  • 最后登录2002-08-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-03-13 08:59
必须是一个完整的以太桢?-->应该是吧
可是这个以太桢头怎么填写呢?=》
  首先你可以利用passthru得到一些以太帧,分析一下就知道了。
至于mac,我不清楚如何在驱动里面直接得到(当然可以通过分析以
太桢里面的数据得到本地mac,可以构造arp包然后得到目的mac)
我也正做类似工作,多指教!
rlb
ghm
ghm
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2003-05-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-03-13 10:38
  首先感谢rlb的回答!不过这个答案只是提供了一种思路,方法。说得也不够具体,所以暂时还不能给分。前两天我请教了一个个中高手,他说在passthru里组包然后发出去并不要加以太头。我虽然还没付之实践,但在仔细分析之后,觉得他的话还是有道理的。在packet.sys里,也有发包的例子,不过好象什么结构也没组织(就是发了一连串的\"FFFFFFFFFF\"),当然是否则真正能发出去,我并没有做过试验。
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
地板#
发布于:2002-03-13 11:07
 首先感谢rlb的回答!不过这个答案只是提供了一种思路,方法。说得也不够具体,所以暂时还不能给分。前两天我请教了一个个中高手,他说在passthru里组包然后发出去并不要加以太头。我虽然还没付之实践,但在仔细分析之后,觉得他的话还是有道理的。在packet.sys里,也有发包的例子,不过好象什么结构也没组织(就是发了一连串的\"FFFFFFFFFF\"),当然是否则真正能发出去,我并没有做过试验。


那个个中高手是在胡扯,或者是在骗你。

packet.sys(以及其他protocol driver,imd driver,通过ndissend
方式发送的驱动程序)
能够发出去任何字段的数据包。长度不能大于网卡
支持的最大长度,一般是1514,小于64无所谓,因为网卡会自动
给你补齐。

当然是能够真正发出去。

要得到本机网卡的mac地址,方法非常多。通过向该驱动程序发送
ndisrequest是一个核心态方法,该方法可以参考packet.sys
里面的实现(为什么不好好看看packet.sys?),还有无数的应用
层的方法。最简单的大概是生成一个classID,里面就有mac地址,
还有netbios等方法,2k ddk 里面还有一个sample,提供应用层获
得网卡mac的方法,直接createfile(device)。方法之多,简直不计
其数。似乎我没有必要在这里归纳。

不再回忆从前,我已经生活在幸福当中。
ghm
ghm
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2003-05-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-03-13 21:13
huyg大侠教训的是,于是我又重新把packet看了一遍,问题又来了,第一,在驱动里取mac地址是用哪个OID,OID_802_3_PERMANENT_ADDRESS还是OID_802_3_CURRENT_ADDRESS
??第二,我们知道,在packet里收到的也是物理帧,那它的发包呢?从源码里可知,它对应用层来的发送数据是没有做过任何处理的,只是简单的把write irp的mdl直接挂到发送的packet中,然后通过ndissend发送出去。既然如此,组织发送包的任务当然就应该在应应用层了。可是我看了w2k ddk时packet自带的testapp。它通过WriteFile(
              AdapterObject->hFile,
              lpPacket->Buffer,
              lpPacket->Length,
              &BytesTransfered,
              &lpPacket->OverLapped
              );来发包,我现在想问的是,这个lpPacket->Buffer应该如何组织,要不要加帧头?然后再是ip头....等等?我的意见是,应该是不要加帧头的,否则的话,这个packet.sys如果要用来发包就很难用了。
Songzh
驱动牛犊
驱动牛犊
  • 注册日期2001-12-29
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-03-14 11:16
当然要自定义帧头,你发送的是原始的数据流。
Yss
Yss
驱动牛犊
驱动牛犊
  • 注册日期2002-01-29
  • 最后登录2005-06-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-01 14:52
我用98DDK 里的 SAMPLE 程序发送成功,本机上能够监测到那个包,(返回 SUCCESS),为何在另一台机器上去抓不到呢?
我的代码:

     pPacket1 = PacketAllocatePacket(pAdapter);
if(pPacket1 == NULL) {
PacketCloseAdapter(pAdapter);
FatalError(_T(\"Packet allocation failed.\\n\"));
}
//set the packet\'s buffer and its max. length
PacketInitPacket(pPacket1, uBuffer, 310);
if(PacketSendPacket(pAdapter,pPacket1,FALSE))
wsprintf(szMsg,_T(\"\\nReturned Success\"),NULL);
else
wsprintf(szMsg,_T(\"\\nReturned Pending\"),NULL);
dwWBytes = lstrlen(szMsg);
WriteFile(hFile, szMsg, dwWBytes, &dwWrittenBytes, NULL);

游客

返回顶部