用NDIS中的passthru实现NAT的若干问题....
7 2001-11-19 04:58:02 请多帮忙,谢谢!
1.ndis的相关信息来源除了ddk文档和驱动开发网(driverdevelop.com)以外,还有哪些网站有详细介绍或讨论?
2.对于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这样的应用自然不明白了.
别的地方有更详细的介绍么?
3.我用的是2000ddk编译,softice4.0调试.不知道DBGPRINT()的输出在哪里能看到?
4.在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的时候进行释放.
这样处理可行么?
5.上面只copy了packet里的raw data,对于oob数据要怎么copy到新packet中呢?
具体有哪些oob数据,属性要copy?
6.有没有什么函数可以从本机所有未用的port中分配出一个,此port在未收回之前不再进行分配.
相应的一个函数将上面分配的port在使用结束后进行收回.
这两个函数我想在作NAT转换时应用.