阅读:2081回复:3
用passthru实现nat,遇到一些问题.......
1.在做地址转换的时候,怎么知道本机还有哪些未用的port,从里面分配一个来改写ip包中的源地址port?
返回的时候再释放这个port,以供下一次分配. 有相应的函数,还是需要自己写,怎么实现呢? 2.在PtRecivePacket里, 能不能先NdisAllocatePacket(......,newpacket,....), 接着NdisAllocateMemory(VirtualAddress,.....), 然后将原有packet里的buffer链表依次copy到VirtualAddress所指的空间, 再NdisAllocateBuffer(....,newbuffer,..,VirtualAddress,...), 再循环调用NdisUnchainBufferAtFront(packet,buffer)和NdisFreeBuffer(buffer)释放原packet占用的内存. .............(这里可以对newbuffer进行处理,过滤). 把copy好的newbuffer用NdisChainBufferAtFront(newpacket,newbuffer)链接到newpacket上. 下面再转发的时候,就转发这个新构造的packet.新分配的内存,packet在PtReceiveComplete的时候进行释放. 这样处理可行么? 或者直接把新的buffer用NdisChainBufferAtFront()链结到原packet中,再转发它.可以么? 3.对于NDIS_PACKET这个结构 typedef struct _NDIS_PACKET { NDIS_PACKET_PRIVATE Private; union { struct { UCHAR MiniportReserved[2*sizeof(PVOID)]; UCHAR WrapperReserved[2*sizeof(PVOID)]; }; struct { UCHAR MiniportReservedEx[3*sizeof(PVOID)]; UCHAR WrapperReservedEx[sizeof(PVOID)]; }; struct { UCHAR MacReserved[4*sizeof(PVOID)]; }; }; ULONG_PTR Reserved[2]; UCHAR ProtocolReserved[1]; } NDIS_PACKET, *PNDIS_PACKET, **PPNDIS_PACKET; 看了介绍后仍不太明白,有很多疑问. 例如:NDIS_PACKET_PRIVATE这个结构,我就不知道它的具体定义,在ddk中找不到.对于Packet->Private.Head这样的应用自然不明白了. 别的地方有更详细的介绍么? 4.我用的是2000ddk编译,softice4.0调试.不知道DBGPRINT()的输出在哪里能看到? 5.ndis的相关信息来源除了ddk文档和驱动开发网(driverdevelop.com)以外,还有哪些网站有详细介绍或讨论? 谢谢指教! |
|
最新喜欢:antspo... |
沙发#
发布于:2001-11-27 11:35
typedef struct _NDIS_PACKET_PRIVATE { UINT PhysicalCount; // number of physical pages in packet. UINT TotalLength; // Total amount of data in the packet. PNDIS_BUFFER Head; // first buffer in the chain PNDIS_BUFFER Tail; // last buffer in the chain // if Head is NULL the chain is empty; Tail doesn\'t have to be NULL also PNDIS_PACKET_POOL Pool; // so we know where to free it back to UINT Count; ULONG Flags; BOOLEAN ValidCounts; UCHAR NdisPacketFlags; // See fPACKET_xxx bits below USHORT NdisPacketOobOffset; } NDIS_PACKET_PRIVATE, * PNDIS_PACKET_PRIVATE; www.pcausa.com |
|
|
板凳#
发布于:2001-11-27 14:13
非常感谢!
还剩下一个问题,请大家帮忙: 1.在做地址转换的时候,怎么知道本机还有哪些未用的port,从里面分配一个来改写ip包中的源地址port? 返回的时候再释放这个port,以供下一次分配. 有相应的函数,还是需要自己写,怎么实现呢? 谢谢! |
|
地板#
发布于:2001-11-29 08:26
版主啊,帮帮忙吧.......
还有,我觉得firstbuffer包含headbuffer+lookaheadbuffer,不知对不对? |
|