阅读:2587回复:6
在passthru里如何组包,然后发出去?
各位老大,我学驱动时间并不长,很多方面还是一团云雾,如果在此能得到大家的帮助,本人定当感激不尽。
我的问题是,既然在passthru里的数据包是一个完整的以太桢,那么如果我想在这里组建自己的数据包然后用ndissend发出去的话,则这个数据包也必须是一个完整的以太桢(不知这个看法是否正确?)。在这里,tcp头,ip头都好写,可是这个以太桢头怎么填写呢?怎么获得本机的mac地址,怎么获得目的主机的mac地址呢?为此,只好来麻烦各位了。谢谢。 |
|
最新喜欢:![]() |
沙发#
发布于: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); |
|
板凳#
发布于:2002-03-14 11:16
当然要自定义帧头,你发送的是原始的数据流。
|
|
地板#
发布于: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如果要用来发包就很难用了。 |
|
地下室#
发布于: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)。方法之多,简直不计 其数。似乎我没有必要在这里归纳。 |
|
|
5楼#
发布于:2002-03-13 10:38
首先感谢rlb的回答!不过这个答案只是提供了一种思路,方法。说得也不够具体,所以暂时还不能给分。前两天我请教了一个个中高手,他说在passthru里组包然后发出去并不要加以太头。我虽然还没付之实践,但在仔细分析之后,觉得他的话还是有道理的。在packet.sys里,也有发包的例子,不过好象什么结构也没组织(就是发了一连串的\"FFFFFFFFFF\"),当然是否则真正能发出去,我并没有做过试验。
|
|
6楼#
发布于:2002-03-13 08:59
必须是一个完整的以太桢?-->应该是吧
可是这个以太桢头怎么填写呢?=》 首先你可以利用passthru得到一些以太帧,分析一下就知道了。 至于mac,我不清楚如何在驱动里面直接得到(当然可以通过分析以 太桢里面的数据得到本地mac,可以构造arp包然后得到目的mac) 我也正做类似工作,多指教! |
|
|