阅读:1841回复:18
中间层转发问题
用DriverStudio 3.0写的一段代码,每次运行能发出去数据,但每次均返回0x0e的错误(softice捕捉到的)。
请问有什么不对阿? long MyDriverAdapter::TransferBuffer( IN PVOID pBuffer, IN UINT PacketSize, IN KNdisPacket pOldPacket ) { NDIS_STATUS Status = NDIS_STATUS_SUCCESS; PVOID pSendTemp; unsigned int ip; unsigned short port; PETHHDR pEthHdr = (PETHHDR)pBuffer; PIPHDR pIPHdr = (PIPHDR)(&((char *)pEthHdr)[sizeof(ETHHDR)]); PUDPHDR pUdpHdr = (PUDPHDR)(&((char*)pIPHdr)[sizeof(IPHDR)]); PTRANSHDR pTransHdr = (PTRANSHDR)(&((char*)pUdpHdr)[sizeof(UDPHDR)]); KNdisPacket pPacket; KNdisBuffer pNdisBuffer; PNDIS_PACKET pSendPacket; PNDIS_PACKET pRecvedPacket; pRecvedPacket = (PNDIS_PACKET)pOldPacket; // 交换源地址ゆ ip = pIPHdr->sourceIP; port = pUdpHdr->sourcePort; pIPHdr->sourceIP = pIPHdr->destIP; pUdpHdr->sourcePort = pUdpHdr->destPort; pIPHdr->destIP = ip; pUdpHdr->destPort = port; //交换mac地址 ChangeMac((char*)(pEthHdr->h_srcaddr),(char*)(pEthHdr->h_dstaddr)); pUdpHdr->checksun = 0; // SetIPCheckSum(pIPHdr); // SetUDPCheckSum(pUdpHdr); pPacket = m_TxPool.Allocate(); if(pPacket.IsValid()) { Status = NdisAllocateMemoryWithTag(&pSendTemp,BUFFER_SIZE,\'asdf\'); if(NDIS_STATUS_SUCCESS == Status) { NdisZeroMemory (pSendTemp, BUFFER_SIZE); pNdisBuffer = m_MyPool.Allocate(pSendTemp,PacketSize); if(pNdisBuffer.IsValid()) { pSendPacket = (PNDIS_PACKET)pPacket; pPacket.ChainAtFront(pNdisBuffer); pPacket.Fill(pBuffer,PacketSize); pSendPacket->Private.NdisPacketFlags = NDIS_FLAGS_DONT_LOOPBACK; Send(pSendPacket,NDIS_FLAGS_DONT_LOOPBACK); // m_MyPool.Free(pNdisBuffer); } // NdisFreeMemory(pSendTemp, BUFFER_SIZE, 0); } // m_TxPool.Free(pPacket); } return 0; } [编辑 - 12/11/03 by fumo2003] [编辑 - 12/11/03 by fumo2003] |
|
最新喜欢:jzyhum... |
沙发#
发布于:2003-12-11 00:39
错了,是0x0e的错误
查windows 错误代码是\"存储器不足,无法完成此操作\" 哪位大哥能给点意见? |
|
板凳#
发布于:2003-12-12 09:07
各位老大,给点意见好吗?
|
|
地板#
发布于:2003-12-12 11:08
我说点意见,都是我的想法,
NDIS中的packet都是由一个或者多个BUFFER组成的,这些buffer构成的是一个内存链表,称为MDL(memory descriptor list),结构如下: typedef struct _MDL { struct _MDL *Next; CSHORT Size; CSHORT MdlFlags; struct _EPROCESS *Process; PVOID MappedSystemVa; PVOID StartVa; ULONG ByteCount; ULONG ByteOffset; } MDL, *PMDL; 每个packet结构只是纪录这个链表的头buffer和尾buffer指针,而且所有buffer并不一定在虚拟地址上是连续的。你直接把packet当成是连续的字符缓冲来处理是不是不对呢? |
|
|
地下室#
发布于:2003-12-12 14:41
终于有人理我了
但,如果是因为一个内存块的问题 那为什么又能正确发送呢? 我看到的错误是内存访问问题 0x000000D1 DRIVER_IRQL_NOT_LESS_OR_EQUAL 可我实在没找出来 请熟悉ds的xdjm帮帮我好吗? 兄弟实在是比较急 [编辑 - 12/12/03 by fumo2003] |
|
5楼#
发布于:2003-12-12 15:01
系统发出数据的时候,一般一个packet所容纳的buffer较少,通常都是1到3个,而且头信息(包括桢头,ip头,tcp或者udp等这些信息)都放在头一个buffer里,要是只处理头信息,一般只处理头一个buffer就可以了,但是最好别把packet当成是连续的,处理一下这个链表的,使用KNdisBuffer的时候一定要先判断是否有效,用
KNdisBuffer::Isvail()来判断。你试试看吧, |
|
|
6楼#
发布于:2003-12-12 15:10
所有有效性我都判断了
后来,我还截了上层发下来的同样的包,除了它是3块buffer,而我是一块以为,其他没什么差别啊 难道必须是三块? 但,从底下发上来的数据是一块的。 |
|
7楼#
发布于:2003-12-12 15:25
下面来的我只看到头两个buffer是连续的放置的,头两个buffer的首地址正好相差14,其他的我就不知道了。上面送向下面的包不一定是几个buffer,1个2个,3个的情况我都见到了。
|
|
|
8楼#
发布于:2003-12-12 16:17
刚才我又按我截获的发送包的结构,
分三段,mac头,IP头和UDP头,数据,(按截获的包分析的) 组合发送,结果和我一段的发送是一样的 但,我发现截获的包数据中ProtocolReserved字段好像和我的不一样 是不是我也要向下发送一个IRP请求啊? |
|
9楼#
发布于:2003-12-12 16:34
pSendPacket = (PNDIS_PACKET)pPacket;
这样可以么? pSendPacket =pPacket.operator PNDIS_PACKET( ); 这样写看看 |
|
|
10楼#
发布于:2003-12-12 16:56
这个没关系啊
|
|
11楼#
发布于:2003-12-12 17:08
编译不出错,不代表就没有fault
|
|
|
12楼#
发布于:2003-12-12 17:10
因为我分析了,也试了,结果一样
到底是什么原因呢? 我好郁闷啊 郁闷 |
|
13楼#
发布于:2003-12-12 17:16
在windows下0x0e的错误码表示内存空间不够,不能完成这项操作。
softice里也是这个意思么?! 呵呵 。。 |
|
|
14楼#
发布于:2003-12-12 17:19
这个不是softice的错误码
是windows的蓝屏代码 softice最后就是跳转到读取一块无效内存 [编辑 - 12/12/03 by fumo2003] |
|
15楼#
发布于:2003-12-12 17:21
一定是指针用乱了。
|
|
|
16楼#
发布于:2003-12-13 22:10
你检查一下看用指针的时候有没有越界使用,我碰到过这个BSOD错误,经过检查发现是指针时越界访问所造成的。
|
|
|
17楼#
发布于:2003-12-15 09:26
我也查过越界问题,但没发现
而且,如果把send注释掉,就一点问题也没有 |
|
18楼#
发布于:2003-12-16 15:39
终于搞定了,
谢谢ljjlovernet |
|