5081|6

18

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

Filter发送NetBufferList蓝屏问题 [复制链接]

  1. VOID
  2. filterSendOriginatedBufferList(
  3.     IN PMS_FILTER                   pFilter
  4.         )
  5.         /*
  6.         Descriptions:
  7.             This function is used to generate a net buffer list first,
  8.                 and then send it out!
  9.         Arguments:
  10.              pFilter - points to the filter module context
  11.                  SendFlags- used by NdisFSendNetBufferList

  12.         */
  13. {
  14.         NET_BUFFER_LIST_POOL_PARAMETERS     PoolParameters;
  15.             ULONG                               PoolTag = 'TAG';
  16.             NDIS_HANDLE                         SendNetBufferListPool;// a pool used to allocate netbufferlst
  17.                 //NDIS_STATUS                         Status;
  18.                 PMDL                                pMdl;
  19.                 ULONG                               BufferSize = 68;// packet size>=64
  20.                 PNET_BUFFER_LIST                    pNetBufferList;
  21.                 USHORT                              EthType = 0x8e88;
  22.                 PTESTPROV_ETH_HEADER                pEthHeader;
  23.                 PUCHAR                              pWriteBuf =  NULL;//all the data should be sent out
  24.                 UCHAR                               SrcMacAddr[TESTPROV_MAC_ADDR_LEN];
  25.         UCHAR                               DstMacAddr[TESTPROV_MAC_ADDR_LEN];
  26.                 ULONG                               MacAddrUlong[TESTPROV_MAC_ADDR_LEN];
  27.                 PUCHAR                              pData;
  28.                 PUCHAR                              pEthFrameNew = NULL;
  29.         UINT                                 j;
  30.         ULONG                               SendFlags = 0;
  31.                 DEBUGP(DL_TEST,("========>filterSendOriginatedBufferList\n"));
  32.      #if DBG
  33.              _asm int 3
  34.      #endif
  35.                 //
  36.                 NdisZeroMemory(&PoolParameters, sizeof(NET_BUFFER_LIST_POOL_PARAMETERS));
  37.                 PoolParameters.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
  38.         PoolParameters.Header.Revision = NET_BUFFER_LIST_POOL_PARAMETERS_REVISION_1;
  39.         PoolParameters.Header.Size = sizeof(PoolParameters);
  40.         PoolParameters.ProtocolId = NDIS_PROTOCOL_ID_IPX ;
  41.         PoolParameters.ContextSize = 0;//unknown
  42.         PoolParameters.fAllocateNetBuffer = TRUE;
  43.         PoolParameters.PoolTag = PoolTag;
  44.                 SendNetBufferListPool = NdisAllocateNetBufferListPool(
  45.                                             pFilter->FilterHandle,
  46.                                             &PoolParameters);  
  47.                 if(SendNetBufferListPool == NULL)
  48.                 {
  49.                  //Status = NDIS_STATUS_RESOURCES;
  50.                          DEBUGP(DL_TEST,("Fail to allocate net buffer list pool\n"));
  51.                         goto Exit;
  52.                 }

  53.        //
  54.                 pWriteBuf = (PUCHAR)NdisAllocateMemoryWithTagPriority(pFilter->FilterHandle,BufferSize,FILTER_ALLOC_TAG, LowPoolPriority);
  55.                 NdisZeroMemory(pWriteBuf,BufferSize);
  56.                 // Try to fill this buffer with some necessary data like Ethernet Header
  57.                 pEthHeader = (PTESTPROV_ETH_HEADER)pWriteBuf;
  58.                
  59.                 //prepare the source and destination mac address, and get mac of wireless NIC is 00-14-78-7A-02-A3
  60.             MacAddrUlong[0]=0x00;
  61.         MacAddrUlong[1]=0x14;
  62.         MacAddrUlong[2]=0x78;
  63.         MacAddrUlong[3]=0x7A;
  64.         MacAddrUlong[4]=0x02;
  65.         MacAddrUlong[5]=0xA3;
  66.                 for (j = 0; j < TESTPROV_MAC_ADDR_LEN; j++)
  67.          {
  68.                 DstMacAddr[j] = (UCHAR)MacAddrUlong[j];
  69.          }
  70.         NdisMoveMemory(pEthHeader->SrcAddr, DstMacAddr, TESTPROV_MAC_ADDR_LEN);//set the source address
  71.                 NdisMoveMemory(pEthHeader->DstAddr, DstMacAddr, TESTPROV_MAC_ADDR_LEN);//set the destionation address with the same to source address
  72.                 pEthHeader->EthType = EthType;

  73.                 //fill the packet into unused buffer
  74.                  pData = (PUCHAR)(pEthHeader +1);
  75.                  for(j=0; j< (BufferSize - sizeof(TESTPROV_ETH_HEADER));j++)
  76.                  {
  77.                     *pData++ = (UCHAR)j;
  78.                  }

  79.                  //<-------------Allocate a MDL------------------------------------------------------->
  80.                  //now allocate MDL and initialize it
  81.                  pEthFrameNew = (PUCHAR)pWriteBuf + BufferSize;//Bytes following the pWriteBuf
  82.                  pMdl = NdisAllocateMdl(pFilter->FilterHandle,
  83.                                pEthFrameNew,   
  84.                                BufferSize);
  85.                 if(pMdl == NULL)
  86.                 {

  87.                   DEBUGP(DL_TEST,("Fail allocate a MDL\n"));
  88.                   goto Exit;
  89.                 }

  90.        //<-------Copy the data into the MDL--------------------------------------------->
  91.                 //copy the Ethernet Header to MDL
  92.                  NdisMoveMemory(pEthFrameNew,pEthHeader, BufferSize);

  93.                  //Now allocate a net_buffer_list and NB
  94.                 pNetBufferList = NdisAllocateNetBufferAndNetBufferList(
  95.                                 SendNetBufferListPool,
  96.                                 0, //Request control offset delta
  97.                                 0,           // back fill size
  98.                                 pMdl,
  99.                                 0,          // Data offset
  100.                                 BufferSize);
  101.                 if(pNetBufferList == NULL)
  102.                 {
  103.                   DEBUGP(DL_TEST,("Fail allocate a Buffer and bufferlist\n"));
  104.                   goto Exit;
  105.                 }
  106.         
  107.                 //<------Send out the packet--------------------------->
  108.                 pNetBufferList->SourceHandle = pFilter->FilterHandle;
  109.                 SendFlags |= NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK;
  110.                 NdisFSendNetBufferLists(        
  111.                         pFilter->FilterHandle,
  112.                         pNetBufferList,
  113.                         NDIS_DEFAULT_PORT_NUMBER,
  114.                         SendFlags);

  115.                //最后函数NdisFSendNetBufferLists调用处了问题,蓝屏
  116.                                 DEBUGP(DL_TEST,("filterSendOriginatedBufferList<========\n"));
  117. Exit:
  118.           return;
  119. }
复制代码

我是想发送一个带有EtherNet header的数据,我想src,和dst MAC地址一样应该没有问题吧。而且我判断过了,pMDL, pNetBufferList都不是NULL,就是到了最后调用发送函数发生问题。可以帮我看看,前面那里出问题了。多谢。

最新回复

这个帖子转移到vc/mfc板块效果可能会更好些。  详情 回复 发表于 2010-1-20 16:04
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
帮顶,不懂
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 3 楼 codesnail 的回复:
这个帖子转移到vc/mfc板块效果可能会更好些。

当场晕死
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
自己搞定
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 1 楼 kyzf 的回复:
帮顶下。

MARK,学习下.

我测试过了,结果是FilterSendNetBufferListComplete()里对自己分配的资源释放有问题。因为这个是自己创建的packet,不能直接调用NdisFsendBufferListCOmoplete,可以直接释放,但是该如何释放呢? 如果我调用NdisFreeNetBufferList还要调用NdisFreeMDL吗,还有那个Pool?


FAULTING_SOURCE_CODE:  
  1081:              NdisFreeNetBufferList(NetBufferLists);
  1082:              pFilter->IsMyPacket = 0;
  1083:                  if(PoolHandle != NULL)
  1084:                NdisFreeNetBufferPool(PoolHandle);
> 1085:      }else{
  1086:         NdisFSendNetBufferListsComplete(pFilter->FilterHandle, NetBufferLists, SendCompleteFlags);
  1087:      }
  1088:          
  1089:
  1090:     DEBUGP(DL_TRACE, ("<===SendNBLComplete.\n"));
我写都是有问题的,原因:
DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high.  This is usually
caused by drivers using improper addresses.
If kernel debugger is available get stack backtrace.
Arguments:
Arg1: 00000004, memory referenced
Arg2: 00000002, IRQL
Arg3: 00000001, value 0 = read operation, 1 = write operation
Arg4: 8dc4746f, address which referenced memory
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
帮顶下。

MARK,学习下.
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

7
 
这个帖子转移到vc/mfc板块效果可能会更好些。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表