lijun0623
驱动牛犊
驱动牛犊
  • 注册日期2004-02-27
  • 最后登录2004-04-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1679回复:10

请教asmsys有关ddk中的packet例子

楼主#
更多 发布于:2004-04-04 19:57
您好,我想向你请教一下ddk中的\\NTDDK\\src\\network\\ndis\\packet这个例子,我将它改成循环抓包,结果丢包很严重,应该如何改进呢?
打扰你呢,非常感谢
我冒昧给你发了封信,不知你能否收到
我的email:lijun0623@163.com
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-05 09:27
注意一下serialize 和Deserialized的问题,丢包一般是这个问题。
下面是DDK的说明,也许对你有帮助。
NDIS assumes that all connection-oriented miniports are deserialized drivers, regardless of the AttributeFlags that they pass to NdisMSetAttributesEx. That is, any driver that calls NdisMRegisterMiniport with 0x05 as the MajorNdisVersion must be a deserialized miniport。
lijun0623
驱动牛犊
驱动牛犊
  • 注册日期2004-02-27
  • 最后登录2004-04-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-05 09:52
我是将packet编译后直接使用其产生的packet.sys和packet.c中的函数,这是不是意味着丢包问题解决不了了?
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-04-05 09:56
你不是“我将它改成循环抓包”了吗?
lijun0623
驱动牛犊
驱动牛犊
  • 注册日期2004-02-27
  • 最后登录2004-04-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-04-05 10:56
是调用packet。sys,将packet。c中的PacketReceivePacket放在一个循环结构中
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-05 11:14
那就注意返回值是否NDIS_STATUS_PENDING,的异步操作
lijun0623
驱动牛犊
驱动牛犊
  • 注册日期2004-02-27
  • 最后登录2004-04-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-04-05 14:21
PacketReceivePacket中调用的是ReadFile,NDIS_STATUS_PENDING应该在何处查看
virmin
驱动牛犊
驱动牛犊
  • 注册日期2004-02-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-04-06 12:40
packet的处理方式是在PacketReceiveIndicate()/PacketReceivePacket()函数里处理新收的到的包,看看有没有应用程序因为要收包而pending了,有就满足这个应用程序,没有就放弃这个包,所以你的应用程序当然被满足一把后,再次要求数据前,packet已经丢了很多包。在adapter设备对象扩展内开个缓冲区,不清楚其他人是怎么实现不丢包的。
sigh~
lijun0623
驱动牛犊
驱动牛犊
  • 注册日期2004-02-27
  • 最后登录2004-04-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-04-06 16:17
我做的只是抓包,然后显示出来就行了
“在adapter设备对象扩展内开个缓冲区”应该怎么做?
asmsys
驱动老牛
驱动老牛
  • 注册日期2002-03-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望17点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-04-06 16:28
创建一个设备,XPDDK的PASSTHRU有相关的代码可以参考。
lijun0623
驱动牛犊
驱动牛犊
  • 注册日期2004-02-27
  • 最后登录2004-04-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-04-07 14:52
也许我说的不是很清楚,我将那部分的代码贴出来,麻烦你帮我看看

void CDialog2::OnStart()
{
// TODO: Add your control notification handler code here
CString str ;
if( 0 == m_ThreadID )
{
str.LoadString( ID_STOP ) ;
m_start.SetWindowText( str ) ;
}
else
{
if( m_ThreadID )
{
PostThreadMessage(m_ThreadID,WM_CLOSE,0,0) ;
str.LoadString( ID_START ) ;
   m_start.SetWindowText( str ) ;
m_start.EnableWindow(TRUE) ;
}
return ;
}

Filter = Filters[m_Filter.GetCurSel()];
if(Filter !=4){
if(((CTest4App *)AfxGetApp())->packet32.Adapter.OpenInstance != NULL){
BOOL flag = ((CTest4App *)AfxGetApp())->packet32.PacketSetFilter(
(LPADAPTER)((CTest4App *)AfxGetApp())->packet32.Adapter.OpenInstance,
Filter
);
if(flag)
{
AfxBeginThread(ThreadFunc, (LPVOID)this);                                
}
else{
::MessageBox(NULL, TEXT("Set Filter Failed"), TEXT("Error!"), MB_OK);
}
}
else{
::MessageBox(NULL, TEXT("Device not open"), TEXT("Error!"), MB_OK);
return;
}
}
else{
::MessageBox(NULL, TEXT("Set Filter First!"), TEXT("Error!"), MB_OK);
}
}

线程代码如下;

UINT ThreadFunc(LPVOID pParam)
{
CDialog2 *pDlg = static_cast<CDialog2 *>(pParam) ;
char *bufwork = NULL;
MSG   msg ;
// int   iRet ;
// DWORD dwErr ;
    char  *pSource , *pDest ;
IPHEADER *pIpHeader ;
in_addr ina ;
char   szSource [16] , szDest[16] /*, szErr [ 50 ]*/;
char *pLastBuf = NULL ;

int HdrLen, totallen;
WORD sourport, destport;
CString str, strProto, strSourPort, strDestPort, strData, strSize;

struct EtherPacketHead  *pEtherHead;
// struct IPPacketHead *pIPHead;
struct TCPPacketHead *pTCPHead;
struct ARPPacket *pARPHead;
struct ICMPPacketHead *pICMPHead;
struct UDPPacketHead *pUDPHead;
BYTE *pdata = NULL;
LPPACKET  Packet;

PeekMessage(&msg,NULL,WM_USER,WM_USER,PM_NOREMOVE);
pDlg->m_ThreadID = GetCurrentThreadId();

while(TRUE)
{
Packet=((CTest4App *)AfxGetApp())->packet32.PacketAllocatePacket(/*((CTest4App *)AfxGetApp())->packet32.Adapter.OpenInstance*/);
if (Packet != NULL)
{
((CTest4App *)AfxGetApp())->packet32.PacketInitPacket(
Packet,
((CTest4App *)AfxGetApp())->packet32.Adapter.lpMem,
1514
);
if(!((CTest4App *)AfxGetApp())->packet32.PacketReceivePacket(
(LPADAPTER)((CTest4App *)AfxGetApp())->packet32.Adapter.OpenInstance,
Packet,
TRUE,
&((CTest4App *)AfxGetApp())->packet32.Adapter.PacketLength
)) {
::MessageBox(0, TEXT("Read Failed"), TEXT("Error!"), MB_OK);                                
}
}
if(Packet->Buffer)
{
bufwork = (char *)Packet->Buffer;
pEtherHead = (struct EtherPacketHead *)bufwork;
strProto = GetProtoName(pEtherHead->ServType);

switch(ntohs(pEtherHead->ServType))
{
case ETHER_PROTO_IP:
{
pIpHeader = (IPHEADER *)(bufwork + ETHER_HEAD_LEN);
strProto = GetProtoName(pIpHeader->proto);
HdrLen = pIpHeader->header_len&0xf;
HdrLen *= 4;
totallen = ntohs(pIpHeader->total_len);
totallen-=HdrLen;

ina.S_un.S_addr = pIpHeader->sourceIP ;
pSource = inet_ntoa( ina ) ;
strcpy( szSource , pSource ) ;
ina.S_un.S_addr = pIpHeader->destIP ;
pDest = inet_ntoa( ina ) ;
strcpy( szDest , pDest ) ;

switch(pIpHeader->proto)
{
case IPPROTO_ICMP:
{
pICMPHead=(struct ICMPPacketHead *)(bufwork+HdrLen+ETHER_HEAD_LEN);
//strL4.Format(" type:%d code:%d\n",pICMPHead->Type,pICMPHead->Code);
strSourPort = "-";
strDestPort = "-";
pdata=((BYTE *)pICMPHead)+ICMP_HEAD_LEN;
totallen -= ICMP_HEAD_LEN;
break;
}
case IPPROTO_TCP:
{
pTCPHead=(struct TCPPacketHead *)(bufwork+HdrLen+ETHER_HEAD_LEN);
sourport = ntohs(pTCPHead->SourPort);
destport = ntohs(pTCPHead->DestPort);
//strL4.Format(" sour port:%d,dest port:%d",sourport,destport);
strSourPort.Format("%d",sourport);
strDestPort.Format("%d",destport);
HdrLen = (pTCPHead->HLen)>>4;  //in fact only 4 bits
HdrLen *= 4;
pdata=((BYTE *)pTCPHead)+HdrLen;
totallen -= HdrLen;
break;
}
case IPPROTO_UDP:
{
pUDPHead=(struct UDPPacketHead *)(bufwork+HdrLen+ETHER_HEAD_LEN);
sourport = ntohs(pUDPHead->SourPort);
destport = ntohs(pUDPHead->DestPort);
//strL4.Format(" sour port:%d,dest port:%d",sourport,destport);
strSourPort.Format("%d",sourport);
strDestPort.Format("%d",destport);
pdata=((BYTE *)pUDPHead)+UDP_HEAD_LEN;
totallen -= UDP_HEAD_LEN;
break;
}
}
if(pIpHeader->proto == IPPROTO_ICMP)
strData.Format("type:%d code:%d data:%s",pICMPHead->Type,pICMPHead->Code,pdata);
else strData.Format("  %0X",pdata);

strSize.Format("%d",totallen);

//str = strIP+strL4+strData;
pDlg->AddData(strProto,szSource,strSourPort,szDest,strDestPort,strSize,strData);
break;
}
case ETHER_PROTO_ARP:
{
pARPHead=(struct ARPPacket*)(bufwork+ETHER_HEAD_LEN);
pDlg->AddData(strProto,szSource,"0",szDest,"0",strSize,strData);
break;
}
}
}
((CTest4App *)AfxGetApp())->packet32.PacketFreePacket(Packet);
}
return TRUE;
}
游客

返回顶部