fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1841回复:18

中间层转发问题

楼主#
更多 发布于:2003-12-10 17:40
用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]

最新喜欢:

jzyhummeljzyhum...
fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-12-11 00:39
错了,是0x0e的错误
查windows 错误代码是\"存储器不足,无法完成此操作\"

哪位大哥能给点意见?
fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-12-12 09:07
各位老大,给点意见好吗?
ljjlovernet
驱动小牛
驱动小牛
  • 注册日期2003-10-10
  • 最后登录2004-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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当成是连续的字符缓冲来处理是不是不对呢?
我是来学习的。不打扫卫生
fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-12-12 14:41
终于有人理我了

但,如果是因为一个内存块的问题
那为什么又能正确发送呢?
我看到的错误是内存访问问题
0x000000D1  DRIVER_IRQL_NOT_LESS_OR_EQUAL
可我实在没找出来
请熟悉ds的xdjm帮帮我好吗?
兄弟实在是比较急

[编辑 -  12/12/03 by  fumo2003]
ljjlovernet
驱动小牛
驱动小牛
  • 注册日期2003-10-10
  • 最后登录2004-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-12-12 15:01
系统发出数据的时候,一般一个packet所容纳的buffer较少,通常都是1到3个,而且头信息(包括桢头,ip头,tcp或者udp等这些信息)都放在头一个buffer里,要是只处理头信息,一般只处理头一个buffer就可以了,但是最好别把packet当成是连续的,处理一下这个链表的,使用KNdisBuffer的时候一定要先判断是否有效,用
KNdisBuffer::Isvail()来判断。你试试看吧,
我是来学习的。不打扫卫生
fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-12-12 15:10
所有有效性我都判断了

后来,我还截了上层发下来的同样的包,除了它是3块buffer,而我是一块以为,其他没什么差别啊

难道必须是三块?

但,从底下发上来的数据是一块的。
ljjlovernet
驱动小牛
驱动小牛
  • 注册日期2003-10-10
  • 最后登录2004-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-12-12 15:25
下面来的我只看到头两个buffer是连续的放置的,头两个buffer的首地址正好相差14,其他的我就不知道了。上面送向下面的包不一定是几个buffer,1个2个,3个的情况我都见到了。
我是来学习的。不打扫卫生
fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-12-12 16:17
刚才我又按我截获的发送包的结构,
分三段,mac头,IP头和UDP头,数据,(按截获的包分析的)
组合发送,结果和我一段的发送是一样的

但,我发现截获的包数据中ProtocolReserved字段好像和我的不一样

是不是我也要向下发送一个IRP请求啊?
ljjlovernet
驱动小牛
驱动小牛
  • 注册日期2003-10-10
  • 最后登录2004-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-12-12 16:34
pSendPacket = (PNDIS_PACKET)pPacket;
这样可以么?
pSendPacket =pPacket.operator PNDIS_PACKET( );

这样写看看
我是来学习的。不打扫卫生
fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-12-12 16:56
 这个没关系啊
ljjlovernet
驱动小牛
驱动小牛
  • 注册日期2003-10-10
  • 最后登录2004-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-12-12 17:08
编译不出错,不代表就没有fault
我是来学习的。不打扫卫生
fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-12-12 17:10
 因为我分析了,也试了,结果一样
 到底是什么原因呢?
 我好郁闷啊
 郁闷
ljjlovernet
驱动小牛
驱动小牛
  • 注册日期2003-10-10
  • 最后登录2004-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-12-12 17:16
在windows下0x0e的错误码表示内存空间不够,不能完成这项操作。
softice里也是这个意思么?!
呵呵
。。
我是来学习的。不打扫卫生
fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-12-12 17:19
 这个不是softice的错误码
是windows的蓝屏代码

 softice最后就是跳转到读取一块无效内存


[编辑 -  12/12/03 by  fumo2003]
ljjlovernet
驱动小牛
驱动小牛
  • 注册日期2003-10-10
  • 最后登录2004-12-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-12-12 17:21
一定是指针用乱了。
我是来学习的。不打扫卫生
right_wind
驱动中牛
驱动中牛
  • 注册日期2001-10-12
  • 最后登录2018-05-29
  • 粉丝1
  • 关注0
  • 积分60分
  • 威望66点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
16楼#
发布于:2003-12-13 22:10
你检查一下看用指针的时候有没有越界使用,我碰到过这个BSOD错误,经过检查发现是指针时越界访问所造成的。
good good study, day day up。
fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-12-15 09:26
我也查过越界问题,但没发现
而且,如果把send注释掉,就一点问题也没有
fumo2003
驱动牛犊
驱动牛犊
  • 注册日期2003-11-03
  • 最后登录2004-01-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-12-16 15:39
终于搞定了,
谢谢ljjlovernet
游客

返回顶部