代码参考aoe 
#define htons(x) (USHORT)((((x) << 8) & 0xff00) | (((x) >> 8) & 0xff)) #define ntohs(x) (USHORT)((((x) << 8) & 0xff00) | (((x) >> 8) & 0xff)) #define AOEPROTOCOLID 0x88a2 VOID ProtocolTransferDataComplete(IN NDIS_HANDLE ProtocolBindingContext, IN PNDIS_PACKET Packet, IN NDIS_STATUS Status, IN UINT BytesTransferred) { PNDIS_BUFFER Buffer; UINT HeaderSize, DataSize; PUCHAR Data = NULL; PEH_HEADER Header = NULL; // 通过包描述符的NDIS_BUFFER链表的表头取得包的剩余部分的NDIS_BUFFER描述符, 见ProtocolReceive函数 NdisUnchainBufferAtFront(Packet, & Buffer); if (Buffer != NULL) { // 得到包的剩余部分的内存地址和大小 NdisQueryBuffer(Buffer, & Data, & DataSize); NdisFreeBuffer(Buffer); } else { DBGPRINT(( " ProtocolTransferDataComplete Data (front) Buffer == NULL\\n " )); } // 通过包描述符的NDIS_BUFFER链表的表尾取得包的剩余部分的NDIS_BUFFER描述符, 见ProtocolReceive函数 NdisUnchainBufferAtBack(Packet, & Buffer); if (Buffer != NULL) { /// /得到包头的内存地址和大小 NdisQueryBuffer(Buffer, & Header, & HeaderSize); NdisFreeBuffer(Buffer); } else { DBGPRINT(( " ProtocolTransferDataComplete Header (back) Buffer == NULL\\n " )); } if (Header != NULL && Data != NULL) { DBGPRINT(( " 完整包大小为%d " , HeaderSize + DataSize)); } // AoEReply(Header->SourceMac, Header->DestinationMac, Data, DataSize); if (Header != NULL) ExFreePool(Header); if (Data != NULL) ExFreePool(Data); NdisFreePacket(Packet); } NDIS_STATUS ProtocolReceive(IN NDIS_HANDLE ProtocolBindingContext, IN NDIS_HANDLE MacReceiveContext, IN PVOID HeaderBuffer, IN UINT HeaderBufferSize, IN PVOID LookAheadBuffer, IN UINT LookaheadBufferSize, IN UINT PacketSize) { PADAPTER Context = (PADAPTER)ProtocolBindingContext; NDIS_STATUS Status; PNDIS_PACKET Packet; PNDIS_BUFFER Buffer; PEH_HEADER Header; PUCHAR HeaderCopy, Data; UINT BytesTransferred; DBGPRINT(( " ProtocolReceive\\n " )); if (HeaderBufferSize != sizeof (ETH_HEADER)) { DbgPrint( " ProtocolReceive HeaderBufferSize %d != sizeof(HEADER) %d\\n " ); return NDIS_STATUS_NOT_ACCEPTED; } Header = (PEH_HEADER)HeaderBuffer; /* if (ntohs(Header->EthType) != AOEPROTOCOLID) return NDIS_STATUS_NOT_ACCEPTED; */ if (LookaheadBufferSize == PacketSize) { // AoEReply(Header->SourceMac, Header->DestinationMac, LookAheadBuffer, PacketSize); return NDIS_STATUS_SUCCESS; } // 不完整的包 DBGPRINT(( " 不完整的包 " )); // 分配内存把包头保存包头 if ((HeaderCopy = (PUCHAR)ExAllocatePool(NonPagedPool, HeaderBufferSize)) == NULL) { DbgPrint( " ProtocolReceive ExAllocatePool HeaderCopy\\n " ); return NDIS_STATUS_NOT_ACCEPTED; } RtlCopyMemory(HeaderCopy, HeaderBuffer, HeaderBufferSize); // 分配内存保存包的剩余部分 if ((Data = (PUCHAR)ExAllocatePool(NonPagedPool, PacketSize)) == NULL) { DbgPrint( " ProtocolReceive ExAllocatePool HeaderData\\n " ); ExFreePool(HeaderCopy); return NDIS_STATUS_NOT_ACCEPTED; } // 分配一个包描述符 NdisAllocatePacket( & Status, & Packet, Context -> RecvPacketPoolHandle); if ( ! NT_SUCCESS(Status)) { DBGPRINT(( " ProtocolReceive NdisAllocatePacket " , Status)); ExFreePool(Data); ExFreePool(HeaderCopy); return NDIS_STATUS_NOT_ACCEPTED; } // 分配一个NDIS_BUFFER描述符,关联内存Data NdisAllocateBuffer( & Status, & Buffer, Context -> RecvBufferPool, Data, PacketSize); if ( ! NT_SUCCESS(Status)) { DBGPRINT(( " ProtocolReceive NdisAllocateBuffer (Data) " , Status)); NdisFreePacket(Packet); ExFreePool(Data); ExFreePool(HeaderCopy); return NDIS_STATUS_NOT_ACCEPTED; } // 即将这个NDIS_BUFFER放到包描述符的NDIS_BUFFER链表的表头 NdisChainBufferAtFront(Packet, Buffer); // 在分配一个NDIS_BUFFER描述符,关联内存HeaderCopy NdisAllocateBuffer( & Status, & Buffer, Context -> RecvBufferPool, HeaderCopy, PacketSize); if ( ! NT_SUCCESS(Status)) { DBGPRINT(( " ProtocolReceive NdisAllocateBuffer (HeaderCopy) " , Status)); NdisUnchainBufferAtFront(Packet, & Buffer); NdisFreeBuffer(Buffer); NdisFreePacket(Packet); ExFreePool(Data); ExFreePool(HeaderCopy); return NDIS_STATUS_NOT_ACCEPTED; } // 将描述包头的NDIS_BUFFER放到包描述符的NDIS_BUFFER链表的尾节点 NdisChainBufferAtBack(Packet, Buffer); NdisTransferData( & Status, Context -> BindingHandle, MacReceiveContext, 0 , PacketSize, Packet, & BytesTransferred); if (Status != NDIS_STATUS_PENDING) ProtocolTransferDataComplete(ProtocolBindingContext, Packet, Status, BytesTransferred); return Status; }