Cloudy_hanji
驱动牛犊
驱动牛犊
  • 注册日期2005-01-06
  • 最后登录2005-08-08
  • 粉丝1
  • 关注0
  • 积分56分
  • 威望10点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1388回复:2

能帮我看下我的PTRECEIVE里发包的代码吗?谢谢

楼主#
更多 发布于:2005-04-04 21:22
NDIS_STATUS
PtReceive(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE MacReceiveContext,
IN PVOID HeaderBuffer, // 包头
IN UINT HeaderBufferSize, // 包头大小,以太网环境下为14
IN PVOID LookAheadBuffer, // 前视缓冲
IN UINT LookAheadBufferSize, // 前视缓冲区大小
IN UINT PacketSize // 数据包总大小(不包括包头)
)
{
PADAPT OutAdapt, pAdapt =(PADAPT)ProtocolBindingContext;
PNDIS_PACKET MyPacket, Packet, MyPacket1;
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;

PNDIS_BUFFER pPacketBuffer, pBakBuffer;
PUCHAR pPacketContent, pBakContent;
UINT PacketLen;

UINT OffsetSize;
UINT BytesTransferred;

PRSVD Rsvd = NULL;
PVOID MediaSpecificInfo = NULL;
ULONG MediaSpecificSize= 0;

//发包用的变量
PNDIS_PACKET SendPacket;
PUCHAR pPacketSend;
NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress;
PVOID MemoryVA;
UINT TotalPacketLength = 2000;
PNDIS_BUFFER PktBuffer;
PNDIS_HANDLE PktBufferPool = NULL;
MDL    *     pNext;


//变量定义结果

DBGPRINT((\"In PtReceive\\n\"));

if(!pAdapt->MiniportHandle)
{
Status = NDIS_STATUS_FAILURE;
}
else do
{
// We should not be getting Receives on a Secondary, this is just specific to our LBFO driver
if(pAdapt->isSecondary)
{
DbgPrint(\"PASSTHRU GETTING RECIEVES ON SECONDARY\\n\");
ASSERT(0);
}
if(FALSE){}
else if(PacketSize <= LookAheadBufferSize)  // 如果 LookAheadBuffer 中包含了全部数据
{
// 分配内存
Status = NdisAllocateMemory(&pPacketContent, BUFFER_SIZE, 0, HighestAcceptableMax);
if(Status != NDIS_STATUS_SUCCESS)
{
DbgPrint(\"PTReceive:NdisAllocateMemory Failed\\n\");
return(NDIS_STATUS_NOT_ACCEPTED);
}
if(pPacketContent == NULL)
{
DbgPrint(\"PTReceive:pPacketContent==NULL\\n\");
return(NDIS_STATUS_NOT_ACCEPTED);
}
// 将包头和 LookAheadBuffer 复制到新分配的内存中
NdisZeroMemory(pPacketContent, BUFFER_SIZE);
NdisMoveMemory(pPacketContent, HeaderBuffer, HeaderBufferSize);
NdisMoveMemory(pPacketContent+ HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize);
PacketLen = PacketSize+HeaderBufferSize;
if(ICMP == 1)
{
P_IP_PACKET p_ip;
p_ip = (P_IP_PACKET)pPacketContent;
// 检测是否为 ICMP 数据包
if(p_ip->H_frame_type == 8 && p_ip->L_frame_type == 0 && p_ip->proto == 1)
{

//发包代码//

Status= NdisAllocateMemory( &pPacketSend, 2000, 0,HighestAcceptableMax);
if (Status!=NDIS_STATUS_SUCCESS ) return Status;
NdisZeroMemory(pPacketSend, 2000);//pPacketSend我已经构建好了
NdisAllocatePacket(&Status,
&SendPacket,
pAdapt->SendPacketPoolHandle);
if(Status != NDIS_STATUS_SUCCESS)
{
//
// Output debug information
//
DbgPrint(\"\\n* Debug Report @ Send: NdisAllocatePacket dose not renturn NDIS_STATUS_SUCCESS\\n\");
DbgPrint(\"and Send will return NDIS_STATUS_FAILURE\\n\");

return (NDIS_STATUS_FAILURE);
}

// Allocate memory with NdisAllocateMemory
//
HighestAcceptableAddress.LowPart = -1;
HighestAcceptableAddress.HighPart = -1;
Status = NdisAllocateMemory(&MemoryVA,
TotalPacketLength, //Maybe add a checksum length
0,
HighestAcceptableAddress);
if(Status == NDIS_STATUS_FAILURE)
{
//
// Output debug information
//
DbgPrint(\"\\n* Debug Report @ MPSend: NdisAllocateMemory returns NDIS_STATUS_FAILURE,\\n\");
DbgPrint(\"and MPSend will return NDIS_STATUS_FAILURE\\n\");
return (NDIS_STATUS_FAILURE);
}

// Allocate buffer-pool
//
// NdisAllocateBufferPool(&Status,
// PktBufferPool,
// 1);
NdisAllocateBufferPool(&Status,&pAdapt->RecvBufferPoolHandle, MIN_PACKET_POOL_SIZE);

//
// Allocate buffer
//
NdisAllocateBuffer(&Status,
&PktBuffer,
PktBufferPool,
MemoryVA,
TotalPacketLength);//Maybe add a checksum length
if(Status == NDIS_STATUS_FAILURE)
{
//
// Release the memory
//
NdisFreeMemory(MemoryVA,
TotalPacketLength, //Maybe add a checksum length
0);
//
// Output debug information
//
DbgPrint(\"\\n* Debug Report @ MPSend: NdisAllocateBuffer returns NDIS_STATUS_FAILURE,\\n\");
DbgPrint(\"and MPSend will return NDIS_STATUS_FAILURE\\n\");
return (NDIS_STATUS_FAILURE);
}
NdisMoveMemory(SendPacket,pPacketSend,2000);//这里我不会写,我不知道怎么把一个PUCHAR的内容正确的移到一个PNDIS_PACKET的包里// Chain the buffer to Mypacket
//

NdisChainBufferAtBack(SendPacket,PktBuffer);
SendPacket->Private.Head = PktBuffer;
SendPacket->Private.Tail = PktBuffer;
NdisSetPacketFlags(SendPacket, NDIS_FLAGS_DONT_LOOPBACK);

NdisSend(&Status,
pAdapt->BindingHandle,
SendPacket);

if(Status != NDIS_STATUS_PENDING)
{
NdisUnchainBufferAtBack(SendPacket,&PktBuffer);
NdisFreeBuffer(PktBuffer);
NdisFreeBufferPool(PktBufferPool);
NdisFreeMemory(MemoryVA,
TotalPacketLength, //Maybe add a checksum length
0);
NdisFreePacket(SendPacket);
}
再接下来的//
// Copy the Media specific information
这段代码我也不知道怎么写因为我这里不存在packet这个包我怎么去
NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(Packet,
&MediaSpecificInfo,
&MediaSpecificInfoSize);
我真的只会写这么多了,大家能帮下忙一起研究一下吗?我已经被在收包时发包的问题困扰了好久了,大家帮我一下吧。
root60931
驱动大牛
驱动大牛
  • 注册日期2002-10-25
  • 最后登录2023-10-29
  • 粉丝2
  • 关注0
  • 积分1013分
  • 威望432点
  • 贡献值0点
  • 好评度311点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-04-05 10:11
蓝屏是在什么地方发生的, 能否详细说明
是不是SendComplete函数处理不当
好好学习,天天向上! root60931@gmail.com
Cloudy_hanji
驱动牛犊
驱动牛犊
  • 注册日期2005-01-06
  • 最后登录2005-08-08
  • 粉丝1
  • 关注0
  • 积分56分
  • 威望10点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-04-05 17:12
可能就是那里把PUCHAR拷到NDIS_PACKET那里有问题。
我已经试着在MPSEND里发包,已经可以实现了,现在我再把移到PTRECEIVE里试试。
root60931你能不能加下我QQ或MSN啊?
我的QQ是36886919
MSN hanji123@hotmail.com
游客

返回顶部