总版主
|
阅读:1409回复:4
关于协议驱动例子packet的求助
我在win98上安装了98ddk上的协议驱动的例子packet,DriverEntry等等函数的调试信息也输出了,而且也调用了绑定函数,为什么重启之后,从来不见收到数据包呢(看不见Receive的调试信息),各位兄弟能帮帮忙吗?
|
沙发#
发布于:2003-03-05 16:00
可能写错了
|
|
板凳#
发布于:2003-03-05 16:12
把你的receive函数贴上来。看看
|
|
|
总版主
|
地板#
发布于:2003-03-05 17:39
这个Receive就是98DDK中的Packet的Receive,我只加了一句话
NDIS_STATUS NDIS_API PacketReceiveIndicate ( IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID pvHeaderBuffer, IN UINT uiHeaderBufferSize, IN PVOID pvLookAheadBuffer, IN UINT uiLookaheadBufferSize, IN UINT uiPacketSize ) /*++ Routine Description: Arguments: Return Value: Status is returned. --*/ #define pOpen ((POPEN_INSTANCE)ProtocolBindingContext) { PLIST_ENTRY PacketListEntry; PNDIS_PACKET pPacket; ULONG ulSizeToTransfer; NDIS_STATUS Status; UINT uiBytesTransferred; PPACKET_RESERVED pReserved; PNDIS_BUFFER pNdisBuffer; PVOID pvActualVirtualAddress; UINT uiActualLength; // we wait to print the trace to see if we even have a buffer PACKETASSERT( (pOpen != NULL) ); // // See if there are any pending read that we can satisfy // NdisAcquireSpinLock( &pOpen->RcvQSpinLock ); PacketListEntry = PacketRemoveHeadList( &pOpen->RcvList ); NdisReleaseSpinLock( &pOpen->RcvQSpinLock ); _Debug_Printf_Service(\"接收到包了!\"); if ( PacketListEntry == NULL ) { return NDIS_STATUS_SUCCESS; } TRACE_ENTER( \"IndicateReceive\" ); pReserved = CONTAINING_RECORD( PacketListEntry, PACKET_RESERVED, ListElement ); pPacket = CONTAINING_RECORD( pReserved, NDIS_PACKET, ProtocolReserved ); // Let\'s only print this when PACKET_DEBUG_VERY_LOUD is set IF_PACKETDEBUG( PACKET_DEBUG_VERY_LOUD ) { IF_TRACE_MSG( \" Reserved : %lx\", pReserved ); IF_TRACE_MSG( \" pPacket : %lx\", pPacket ); IF_TRACE_MSG2( \" Header : %lx %lx\", pvHeaderBuffer, uiHeaderBufferSize ); IF_TRACE_MSG2( \" LookAhead : %lx %lx\", pvLookAheadBuffer, uiLookaheadBufferSize ); IF_TRACE_MSG( \" PacketSize : %lx\", uiPacketSize ); } PACKETASSERT( (pReserved != NULL) ); PACKETASSERT( (pPacket != NULL) ); // Clear total uiBytesTransferred = 0; // Get pointer to private buffer pNdisBuffer = pPacket->Private.Head; // Save private buffer\'s start address pvActualVirtualAddress = pNdisBuffer->VirtualAddress; uiActualLength = pNdisBuffer->Length; // Copy header buffer into client buffer if ( uiHeaderBufferSize > 0 ) { if ( uiHeaderBufferSize > pNdisBuffer->Length ) uiHeaderBufferSize = pNdisBuffer->Length; // copy the header buffer NdisMoveMemory( pNdisBuffer->VirtualAddress, pvHeaderBuffer, uiHeaderBufferSize ); // update bytes transferred uiBytesTransferred += uiHeaderBufferSize; // Advance the NDIS_BUFFER address to the end of the header (BYTE *)(pNdisBuffer->VirtualAddress) += uiHeaderBufferSize; // Adjust the NDIS_BUFFER Length pNdisBuffer->Length -= uiHeaderBufferSize; } // Copy look ahead buffer into client buffer if ( uiLookaheadBufferSize > 0 ) { if ( uiLookaheadBufferSize > pNdisBuffer->Length ) uiLookaheadBufferSize = pNdisBuffer->Length; NdisMoveMemory( pNdisBuffer->VirtualAddress, pvLookAheadBuffer, uiLookaheadBufferSize ); // update bytes transferred uiBytesTransferred += uiLookaheadBufferSize; // Advance the NDIS_BUFFER address to the end of the Lookahead data (BYTE *)(pNdisBuffer->VirtualAddress) += uiLookaheadBufferSize; // Adjust the NDIS_BUFFER Length pNdisBuffer->Length -= uiLookaheadBufferSize; } // Save bytes transferred to client buffer so far *(pReserved->lpcbBytesReturned) = uiBytesTransferred; // Copy any remaining bytes in packet if ( uiLookaheadBufferSize < uiPacketSize ) { if ( uiPacketSize >= 1500 ) { _asm { int 3 } } // Adjust packet size by the look ahead buffer ulSizeToTransfer = uiPacketSize - uiLookaheadBufferSize; // Make sure we only copy as many bytes as the client buffer can handler if ( ulSizeToTransfer > pNdisBuffer->Length ) ulSizeToTransfer = pNdisBuffer->Length; // Call the Mac to transfer the packet NdisTransferData( &Status, // ndis status pOpen->AdapterHandle, // from NdisOpenAdapter MacReceiveContext, // handle from NIC uiLookaheadBufferSize, // offset from start of buffer ulSizeToTransfer, // number of bytes to copy pPacket, // packet descriptor pointer &uiBytesTransferred ); // number of bytes actually copied // Restore the private buffer\'s address pointer pNdisBuffer->VirtualAddress = pvActualVirtualAddress; pNdisBuffer->Length = uiActualLength; if ( Status != NDIS_STATUS_PENDING ) { // If it didn\'t pend, call the completeion routine now PacketTransferDataComplete( pOpen, // protocol context pPacket, // packet descriptor pointer Status, // ndis status uiBytesTransferred );// number of bytes actually copied } } else { // The entire packet was in the look ahead buffer Status = NDIS_STATUS_SUCCESS; // Restore the private buffer\'s address pointer pNdisBuffer->VirtualAddress = pvActualVirtualAddress; pNdisBuffer->Length = uiActualLength; PacketTransferDataComplete( pOpen, // protocol context pPacket, // packet descriptor pointer Status, // ndis status 0 ); // number of bytes copied by NdisTransferData } TRACE_LEAVE( \"IndicateReceive\" ); return NDIS_STATUS_SUCCESS; |
总版主
|
地下室#
发布于:2003-03-05 17:44
但是我觉得不是这个Receive有错,而是奇怪为何我已经绑定了网卡,这个Receive却总是得不到调用呢?
我另外又找了VtoolD下的一个协议驱动例子ndisprol,这个更邪气了。inf文件中拷贝到目的文件夹明明是11,结果却总是拷贝到c:\\windows下。调试信息是这样的: -51.182749 Default TRANS31 : OnSysDynamicDeviceInit Entry... -51.182710 Default TRANS31 : DriverEntry Entry... -51.182687 Default TRANS31 : Calling NdisRegisterProtocol... -51.182613 Default TRANS31 : NdisRegisterProtocol succeeded ,然后就什么都没有了!重起之后也没有什么,连ProtocolBindAdapter都没有调用。更别说调用ProtocolRecieve了 |