阅读:1245回复:0
帮驱动牛犊看看这个小问题吧!
//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()啊? 暂时就这几个问题了有了再问大家! 新年快乐! |
|