0){NdisQueryMdl(CurrentMdl,&pSrc,&CurrLength,NormalPagePriority);if(pSrc==NULL){bytesCopied=0;break;}////Currentbufferlengthisgreaterthantheoffsettothebuffer//if(CurrLength>Of" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

拷貝MDL中數據到緩沖區

系統 1901 0
    //Copy the packet into a buffer
  while (CurrentMdl && DataLength > 0)
    {
      NdisQueryMdl(CurrentMdl, &pSrc, &CurrLength, NormalPagePriority);
      if (pSrc == NULL)
        {
	  bytesCopied = 0;
	  break;
        }
        
      //
      //  Current buffer length is greater than the offset to the buffer
      //
      
      if (CurrLength > Offset)
        {
	  pSrc += Offset;
	  CurrLength -= Offset;
	  
	  if (CurrLength > DataLength)
            {
	      CurrLength = DataLength;
            }
	  DataLength -= CurrLength;
	  NdisMoveMemory(pDest, pSrc, CurrLength);
	  bytesCopied += CurrLength;
            
	  pDest += CurrLength;
	  Offset = 0;
        }
      else
        {
	  Offset -= CurrLength;
        }
      NdisGetNextMdl(CurrentMdl, &CurrentMdl);
      
    }
  

?

這段代碼就是拷貝數據到緩沖區。其中CurrMDL,offset和dataLength來自Net_Buffer:

    pNetBuffer = NET_BUFFER_LIST_FIRST_NB(pNetBufferList);
  
  //
  // Try to get the 1p data from OOB data
  //
  if(NET_BUFFER_LIST_INFO(pNetBufferList, Ieee8021QNetBufferListInfo) != 0)
    {
      Ndis8021QInfo.Value = NET_BUFFER_LIST_INFO(pNetBufferList, Ieee8021QNetBufferListInfo);
      UserPriority  = (UCHAR)Ndis8021QInfo.TagHeader.UserPriority;
    }     
  
  //copy the packet into a buffer
  pDest = packetBuffer;
  
  CurrentMdl = pNetBuffer->MdlChain;
  Offset = pNetBuffer->DataOffset;
  DataLength = pNetBuffer->DataLength;
  

?其中NET_BUFFER_LIST_FIRST_NB返回的是第一個Net_Buffer.? CurrentMDL指向MDL的list.現在來看看如何拷貝數據的。其中NdisQueryMdl返回MDL虛擬地址的基地址Psrc,和對應的緩沖區長度CurrLength

拷貝MDL中數據到緩沖區
?
?1、如果CurrLenght >?offset,那么把Psrc+offset,指向used data.同樣,CurrLength-offset,表示當前的MDL中有用的數據長度。然后執行NdisMoveMemory的拷貝操作.緊接著把,dataLength-CurrLength,因為已經拷貝好了一部分,然后再把offset置零,因為現在指針已經到了可用數據區。

2、當再次得到下一個MDL的Psrc,和CurrLength時,因為offset已經=0,所以CurrLength肯定大于0,所以即使執行PSrc+=offset, CurrLength-=offset.最后拷貝整個長度的空間(以圖為例,不都是這樣!!),dataLength-CurrLength.

3、最后第三次得到pSrc,和CurrLength,但是CurrLength,已經大于dataLength,所以只拷貝dataLength的長度數據。就完成了所有數據拷貝。

4、但是如果第一次的時候offset>CurrLength,那么就是比如圖中第一個MDL為unused data區,執行offset-=CurrLength.如下圖:


拷貝MDL中數據到緩沖區
?

?這樣之后又回到了前面所說的CurrLength>offset了。

這就是拷貝數據到緩沖區的過程。不知有何疏漏,或者錯誤,見諒~
?

拷貝MDL中數據到緩沖區


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久国产三级精品 | 毛片毛片毛片毛片毛片 | 五月婷婷综合在线 | 久久蝌蚪| 99久久久国产精品免费播放器 | 99久久免费精品视频 | 国产精品国产高清国产专区 | 欧美三级欧美成人高清www | 国产成人在线视频网站 | 在线观看国产精美视频 | 中文字幕亚洲欧美一区 | 亚洲成人网在线播放 | 国产片欧美片亚洲片久久综合 | 久久精品中文字幕首页 | 手机看片日韩日韩国产在线看 | 国产欧美亚洲精品第3页在线 | 九九99久久精品国产 | 99re热线精品视频 | 国产精品视频福利 | 久久se精品动漫一区二区三区 | 成人精品区| 毛片毛片毛片毛片毛片毛片毛片 | 成年网站视频在线观看 | 欧美三级纯黄版 | 欧美videos粗暴高清性 | 韩国爱情片免费大全 | 国产成人综合亚洲动漫在线 | 成人精品一区二区三区校园激情 | 玖玖草视频| 亚洲成a人v欧美综合天 | 美女久久久久久久久久久 | 婷婷久久五月天 | 久久久午夜精品 | 亚洲欧美字幕 | 四只虎免费永久观看地址 | 精品一区二区乱码久久乱码 | 一级特级欧美aaaaa毛片 | 亚洲成年人在线观看 | 国产亚洲精品自在久久77 | 国产欧美在线观看不卡 | 欧美国产片 |