📄 send.c
字号:
/*——————————————————————————————————————
文件:send.c
工程:xpassthru
概述:演示NDIS中间驱动程序输出封包结构信息
版权所有(c) 2001-2002 X 工作室
http://www.xfilt.com
xstudio@xfilt.com
*/
#include "prexsim.h"
#pragma hdrstop
NDIS_STATUS
MPSendOnePacket(
IN NDIS_HANDLE MiniportAdapterContext,
IN PNDIS_PACKET Packet,
IN UINT Flags
)
{
PADAPT pAdapt = (PADAPT)MiniportAdapterContext;
NDIS_STATUS Status;
PNDIS_PACKET MyPacket;
PRSVD Rsvd;
PVOID MediaSpecificInfo = NULL;
ULONG MediaSpecificInfoSize = 0;
if (IsIMDeviceStateOn (pAdapt) == FALSE)
return NDIS_STATUS_FAILURE;
NdisAllocatePacket(&Status, &MyPacket, pAdapt->SendPacketPoolHandle);
if (Status == NDIS_STATUS_SUCCESS)
{
PNDIS_PACKET_EXTENSION Old, New;
Rsvd = (PRSVD)(MyPacket->ProtocolReserved);
Rsvd->OriginalPkt = Packet;
MyPacket->Private.Flags = Flags;
MyPacket->Private.Head = Packet->Private.Head;
MyPacket->Private.Tail = Packet->Private.Tail;
NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);
NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(MyPacket),
NDIS_OOB_DATA_FROM_PACKET(Packet),
sizeof(NDIS_PACKET_OOB_DATA));
NdisIMCopySendPerPacketInfo(MyPacket, Packet);
NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(
Packet, &MediaSpecificInfo, &MediaSpecificInfoSize);
if (MediaSpecificInfo || MediaSpecificInfoSize)
{
NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(
MyPacket, MediaSpecificInfo, MediaSpecificInfoSize);
}
NdisSend(&Status, pAdapt->BindingHandle, MyPacket);
//Rsvd->IsPrivate=1;
if (Status != NDIS_STATUS_PENDING)
{
NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket);
//NdisFreePacket(MyPacket);
//PrintPacket(Packet);
}
}
return(Status);
}
NDIS_STATUS
MPSend(
IN NDIS_HANDLE MiniportAdapterContext,
IN PNDIS_PACKET Packet,
IN UINT Flags
)
{
PADAPT pAdapt = (PADAPT)MiniportAdapterContext;
NDIS_STATUS Status;
//DBGPRINT("==>Passthru Miniport MPSend\n");
ASSERT (pAdapt->pSecondaryAdapt);
pAdapt = pAdapt->pSecondaryAdapt;
Status = MPSendOnePacket(pAdapt, Packet, Flags);
return(Status);
}
VOID
MPSendPackets(
IN NDIS_HANDLE MiniportAdapterContext,
IN PPNDIS_PACKET PacketArray,
IN UINT NumberOfPackets
)
{
PADAPT pAdapt = (PADAPT)MiniportAdapterContext;
NDIS_STATUS Status;
UINT i;
pAdapt = pAdapt->pSecondaryAdapt;
for (i = 0; i < NumberOfPackets; i++)
{
PNDIS_PACKET Packet;
Packet = PacketArray[i];
Status = MPSendOnePacket(pAdapt, Packet, NdisGetPacketFlags(Packet));
if (Status != NDIS_STATUS_PENDING)
{
NdisMSendComplete(
pAdapt->pPrimaryAdapt->MiniportHandle, Packet, Status);
}
}
}
NDIS_STATUS
MPTransferData(
OUT PNDIS_PACKET Packet,
OUT PUINT BytesTransferred,
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_HANDLE MiniportReceiveContext,
IN UINT ByteOffset,
IN UINT BytesToTransfer
)
{
PADAPT pAdapt = (PADAPT)MiniportAdapterContext;
NDIS_STATUS Status;
//DBGPRINT("==>Passthru Miniport MPTransferData\n");
if (IsIMDeviceStateOn(pAdapt) == FALSE)
{
return NDIS_STATUS_FAILURE;
}
pAdapt = pAdapt->pPrimaryAdapt;
NdisTransferData(&Status,
pAdapt->BindingHandle,
MiniportReceiveContext,
ByteOffset,
BytesToTransfer,
Packet,
BytesTransferred);
if(Status == NDIS_STATUS_SUCCESS)
{
//PrintPacket(Packet);
//DbgPrint(" BytesTransferred: %u\n", *BytesTransferred);
}
return(Status);
}
VOID
PtSendComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_PACKET Packet,
IN NDIS_STATUS Status
)
{
PADAPT pAdapt =(PADAPT)ProtocolBindingContext;
PNDIS_PACKET Pkt;
PRSVD Rsvd;
PNDIS_BUFFER pPacketBuffer;
PUCHAR pPacketContent;
UINT BufLength;
DBGPRINT("==> Passthru Protocol PtSendComplete\n");
//PrintPacket(Packet);
pAdapt = pAdapt->pPrimaryAdapt;
Rsvd =(PRSVD)(Packet->ProtocolReserved);
Pkt = Rsvd->OriginalPkt;
pPacketBuffer = (PNDIS_BUFFER)Rsvd->pMyBuffer;
pPacketContent = (PUCHAR)Rsvd->pMyContent;
DBGPRINT("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
DbgPrint("Rsvd->IsPrivate: %u\n", Rsvd->IsPrivate);
DBGPRINT("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
if (!Rsvd->IsPrivate)
{
NdisIMCopySendCompletePerPacketInfo (Pkt, Packet);
NdisDprFreePacket(Packet);
NdisMSendComplete(pAdapt->MiniportHandle, Pkt,Status);
DBGPRINT("<== Passthru Protocol PtSendComplete\n");
}
else
{
NdisUnchainBufferAtFront(Packet,&pPacketBuffer);
NdisQueryBufferSafe(pPacketBuffer,&pPacketContent,&BufLength,32);
NdisFreeBuffer(pPacketBuffer);
if(pPacketContent != NULL)
NdisFreeMemory(pPacketContent,BufLength,0);
NdisDprFreePacket(Packet);
}
}
VOID
PtTransferDataComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_PACKET Packet,
IN NDIS_STATUS Status,
IN UINT BytesTransferred
)
{
PADAPT pAdapt = (PADAPT)ProtocolBindingContext;
pAdapt = pAdapt->pPrimaryAdapt;
//DBGPRINT("<== Passthru Protocol PtTransferDataComplete\n");
//PrintPacket(Packet);
if(pAdapt->MiniportHandle)
{
NdisMTransferDataComplete(
pAdapt->MiniportHandle, Packet, Status, BytesTransferred);
}
//DBGPRINT("<== Passthru Protocol PtTransferDataComplete\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -