4365|1

64

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

我在NDIS IM 的passthru.dll中在protocol.c中的ProtocolReceivePacket添加的代码,模拟器debug版本编译后行不 [复制链接]

NDIS中直接用CreatThread开启线程好像行不通??看我在NDIS   IM   的passthru.dll中在protocol.c中的ProtocolReceivePacket添加的代码,如下,模拟器debug版本编译后行不通!说CreatThread警告视为错误。我的目的是获取数据包,分配自己的包,获取缓冲区数据然后写入共享内存,应用程序用EVC++写的,没有什么大问题,关键是内核驱动不好搞定,请教高人指点CE内核驱动的编写依据,参考的头文件,最重要的是解决我下面开启线程出错的问题,还有就是一些错误!
INT
ProtocolReceivePacket(
      IN   NDIS_HANDLE   hProtocolBindingContext,
      IN   PNDIS_PACKET   pPacket
)

{
       省略。。。。。

            NdisMIndicateReceivePacket(pBinding-> hMPBinding,   &pIMPacket,   1);
    //++++
DBGPRINT(("++==> PASSTHRU::show   the   copied   packet   buffer   context++++++++\n"));

                  //把数据包内容从Packet拷贝到pPacketContent
                  NdisQueryPacket(   pIMPacket,NULL,NULL,NULL,&PacketSize);
NdisAllocateMemoryWithTag(&pPacketContent,2000,PASSTHRU_MEMORY_TAG);
                if   (pPacketContent!=NULL)   
                  {
                  NdisZeroMemory   (pPacketContent,   2000);
                  NdisQueryBufferSafe(pIMPacket-> Private.Head,   &pBuf,   &BufLength,   32   );
                  NdisMoveMemory(pPacketContent,   pBuf,   BufLength);
                  i   =   BufLength;
                  pNext   =   pIMPacket-> Private.Head;
                  for(;;)
                {
                    if(pNext   ==   pIMPacket-> Private.Tail)
                        break;
                    pNext   =   pNext-> Next;   //指针后移
                    if(pNext   ==   NULL)   
                        break;
                NdisQueryBufferSafe(pNext,&pBuf,&BufLength,32);

                NdisMoveMemory((UCHAR*)pPacketContent+i,pBuf,BufLength);
                i+=BufLength;
                  }
                  DBGPRINT(("+++++++++++++++now   we   should   creat   a   thread   to   copy   data   and   display     ----------\n"));
                }
                //++然后创建线程对内存映射文件建立并且写入数据,
//当写完一个包后关闭文件。
//CreatThread(NULL,0,WriteMMFile, pPacketContent
//使用共享内存方式,因为减少了系统调用的开销,可以避免速度下降。   
                ////添加的代码结束!
            //
            //   Check   if   we   had   indicated   up   the   packet   with   NDIS_STATUS_RESOURCES
            //   NOTE   --   do   not   use   NDIS_GET_PACKET_STATUS(MyPacket)   for   this   since
            //   it   might   have   changed!   Use   the   value   saved   in   the   local   variable.
            //
            if   (status   ==   NDIS_STATUS_RESOURCES)   {
                  //
                  //   Our   ReturnPackets   handler   will   not   be   called   for   this   packet.
                  //   We   should   reclaim   it   right   here.
                  //
                  NdisFreePacket(pIMPacket);
            }

            iCode   =   (status   !=   NDIS_STATUS_RESOURCES)   ?   1   :   0;

      }

cleanUp:
  DBGPRINT(("++++++++++++++ProtocolReceivePacket   Over!!!!!!!!!!   ----------\n"));
      return   iCode;
}
//the   created   thread
INT     WINAPI   WriteThread(PVIOD   pArg)
{     
//创建线程实现传递copy的数据包pIMPacket做为参数传递,获取缓冲区数据。设置全局循环变量N(截取的包的个数)
            //然后等待hWriteEvent(设置超时时间),如返回超时则线程返回,否则等待获得互斥体hMyMutex(设置超时则线程返回)得到权限
            //然后打开内存映射文件,把buffer   data写入内存映射文件N次,
            //释放两次互斥体,线程返回(判断如果截取包次数到达N则设置释放两次互斥体,set   hReadEvent,reset   hWriteEvent,线程返回)
            //利用事件对象hReadEvent促发App等待线程,(App线程在调用等待中获得互斥体,得到对文件的读取权限,读取数据,
            //释放互斥体,set   hWriteEnent,reset   hReadEvent,进入循环等待)代码如下
//------------------------------------------------------------------------------
                                  //把数据包内容从Packet拷贝到pPacketContent
              static   UINT     N=0;   
              static   DWORD     dwOffset=0;
              PNDIS_PACKET   pIMPacket;
              UINT   PacketSize;
              PVOID   pPacketContent;
              LPBYTE   pBuf;
              UINT   BufLength;
              NDIS_BUFFER   *   pNext;
              UINT   i;
              INT   rc;
              *PNDIS_HANDLE   hMyMutex;
              *PNDIS_HANDLE   hMyFile,hMyFileMap;
              PBYTE   pMyFileMem;
              LPTSTR   szMyFileName="MyFile";               
              LPTSTR   lpWriteEventName="MyWriteEvent";
              LPTSTR   lpReadEventName="MyReadEvent";
              LPTSTR   lpMutextName="MyMutex";
              //INT   rs;
              pIMPacket=(PNDIS_PACKET)pArg;
                NdisQueryPacket(   pIMPacket,NULL,NULL,NULL,&PacketSize);
NdisAllocateMemoryWithTag(&pPacketContent,2000,PASSTHRU_MEMORY_TAG);
                if   (pPacketContent!=NULL)   
                  {
                  NdisZeroMemory   (pPacketContent,   2000);
                  NdisQueryBufferSafe(pIMPacket-> Private.Head,   &pBuf,   &BufLength,   32   );
                  NdisMoveMemory(pPacketContent,   pBuf,   BufLength);
                  i   =   BufLength;
                  pNext   =   pIMPacket-> Private.Head;
                  for(;;)
                {
                    if(pNext   ==   pIMPacket-> Private.Tail)
                        break;
                    pNext   =   pNext-> Next;   //指针后移
                    if(pNext   ==   NULL)   
                        break;
                NdisQueryBufferSafe(pNext,&pBuf,&BufLength,32);
                NdisMoveMemory((UCHAR*)pPacketContent+i,pBuf,BufLength);
                i+=BufLength;
                  }   
}
  //然后等待hWriteEvent(设置超时时间),如返回超时则线程返回,否则等待获得互斥体(设置超时则线程返回)得到权限
              hWriteEvent=CreatEvent(NULL,TRUE,TURE,lpWriteEventName);
              hReadEvent=CreatEvent(NULL,TRUE,TRUE,lpReadEnentName);
              if(!hWriteEvent ? ?!hReadEvent)
                return     -1;
              rc=WaitForSingleObject(hWriteEvent,2000);
              if(rc==WAit_OBJECT_0){
              hMyMutex=CreatMutex(NULL,TURE,   lpMutextName);
            //   rs=GetLastError();
            //if(rs==ERROR_ALREADY_EXISTS)
                rc=WaitForSingleObject(hMyMutex,2000);
              if(rc!=WAit_OBJECT_0)
              return   0;
    //然后打开内存映射文件,把buffer   data写入内存映射文件N次,         
                hMyFile   =   CreateFileForMapping   (szMyFileName,   GENERIC_READ   ?   GENERIC_WRITE,
                                                    FILE_SHARE_WRITE,   NULL,   OPEN_EXISTING,   
                                                    FILE_ATTRIBUTE_NORMAL,   NULL);

        if   (hMyFile==   INVALID_HANDLE_VALUE)   {
                hMyFile   =   0;
                return   GetLastError();
        }
      hMyFileMap=CreatFileMapping(hMyFile,NULL,PAGE_MAP_WRITE,0,0,0);
if(hMyFileMap==INVALID_HANDLE_VALUE)
{
CloseHandle(hMyFile);
return   0;
}
    pMyFileMem=(LPBYTE)   MapViewOfFile   (   hMyFileMap,   FILE_MAP_ALL_ACCESS   ,   0,   dwOffset,   0   );
    if(pMyFileMem){
//use   the   data   in   my   file
            NdisMoveMemory(pMyFileMem,pPacketContent,i);
            N++;
            UnmapViewOfFile(pMyFileMem);
            }
  CloseHandle(hMyFileMap);
  CloseHandle(hMyFile);
//释放两次互斥体,线程返回(判断如果截取包次数到达N则设置释放两次互斥体,set   hReadEvent,reset   hWriteEvent,线程返回)
ReleaseMutex(hMyMutex);
ReleaseMutex(hMyMutex);
  if(N> 5)
{
SetEvent(hReadEvent);
ResetEvent(hWriteEvent);
}
return   1;
  
}
else
  return   -1;
}
//添加线程结束

最新回复

怎么没有人回复我呢??天啊,大侠赶紧来啊   详情 回复 发表于 2007-12-1 16:57
点赞 关注

回复
举报

85

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
怎么没有人回复我呢??天啊,大侠赶紧来啊
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【干货上新】电源解决方案和技术第二趴 | DigiKey 应用探索站
当月好物、电源技术资源、特色活动、DigiKey在线实用工具,干货多多~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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

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

北京市海淀区中关村大街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
快速回复 返回顶部 返回列表