waiwai88
驱动牛犊
驱动牛犊
  • 注册日期2006-04-26
  • 最后登录2008-01-06
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1245回复:0

帮驱动牛犊看看这个小问题吧!

楼主#
更多 发布于:2007-02-11 10:39
  //KSPIN_LOCK        GlobalArraySpinLock;
//KIRQL            GIrqL;

NDIS_HANDLE        GBufferPool = NULL;

VOID OnSendDone(IN PNDIS_PACKET pPacket) {
  PNDIS_BUFFER anNdisBufferP;
   PVOID aBufferP;
   UINT aBufferLen;
   DbgPrint("passthruEx.sys : OnSendDone called\n");
   //__asm int 3
   /* aquire lock, release only when send is complete */
//    KeAcquireSpinLock(&GlobalArraySpinLock, &GIrqL);
   NdisUnchainBufferAtFront( pPacket, &anNdisBufferP );
   if(anNdisBufferP) {
       NdisQueryBuffer( anNdisBufferP, &aBufferP, &aBufferLen);
       if(aBufferP)
           NdisFreeMemory( aBufferP, aBufferLen, 0 );
       NdisFreeBuffer(anNdisBufferP);
   }
   NdisReinitializePacket(pPacket);
   NdisFreePacket(pPacket);
   /* release so we can send next.. */
//    KeReleaseSpinLock(&GlobalArraySpinLock, GIrqL);
  return;
}
BOOLEAN DestoryMySendPacket(){

   if(GBufferPool != NULL)
       NdisFreeBufferPool(GBufferPool);
   GBufferPool = NULL;
  
}

VOID SendRaw( NDIS_HANDLE hAdapter, NDIS_HANDLE hPacketPool, NDIS_HANDLE hBufferPool, char *c, int len ) {
   NDIS_STATUS aStat;
   /* aquire lock, release only when send is complete */
//    KeAcquireSpinLock(&GlobalArraySpinLock, &GIrqL);
   if( c && hPacketPool && hBufferPool){
       PNDIS_PACKET aPacketP;
       NdisAllocatePacket( &aStat, &aPacketP, hPacketPool );
       if(NDIS_STATUS_SUCCESS == aStat)
       {
           PVOID aBufferP;
           PNDIS_BUFFER anNdisBufferP;
           NDIS_PHYSICAL_ADDRESS phyaddr    = {-1};
           NdisAllocateMemory( &aBufferP, len, 0, phyaddr );
           memcpy( aBufferP, (PVOID)c, len);
           NdisAllocateBuffer( &aStat, &anNdisBufferP, hBufferPool, aBufferP, len );
           if(NDIS_STATUS_SUCCESS == aStat)
           {
               NdisChainBufferAtBack(aPacketP, anNdisBufferP);    
               NdisSend( &aStat, hAdapter, aPacketP );
               if (aStat != NDIS_STATUS_PENDING )
                   OnSendDone( aPacketP );    
           }
           else
               DbgPrint("passthruEx.sys : error 0x%X NdisAllocateBuffer\n");
       }
       else
           DbgPrint("passthruEx.sys : error 0x%X NdisAllocatePacket\n");
   }
   /* release so we can send next.. */
//    KeReleaseSpinLock(&GlobalArraySpinLock, GIrqL);
}

不知道哪里有错误了 GBufferPool 在初始化时已经分配好了,softice装不上(装上也不会用)windbg不会用,不会调试程序,不会看dump文件,只能看点调试信息,驱动的一些基本概念也不大清楚,大家帮我看看吧。
'//' 后边的几行代码都去了不知道有用不?
不知道哪里有错误一发包就死机?
另外万一NdisSend返回NDIS_STATUS_PENDING由谁来执行OnSendDone()啊?
暂时就这几个问题了有了再问大家!
新年快乐!
游客

返回顶部