wengyu100
驱动牛犊
驱动牛犊
  • 注册日期2003-10-10
  • 最后登录2006-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1264回复:1

我的一个很简单的源代码,谁帮我看看,我以及郁闷了一个星期了!

楼主#
更多 发布于:2003-12-07 13:49
这是安装胡大侠所说的方法修改的passthru
功能是 数据包直通
但安装后就是不能上网
大家帮我看看由什么问题?
谢谢
NDIS_STATUS
PtReceive(
IN  NDIS_HANDLE ProtocolBindingContext,
IN  NDIS_HANDLE MacReceiveContext,
IN  PVOID HeaderBuffer,
IN  UINT HeaderBufferSize,
IN  PVOID LookAheadBuffer,
IN  UINT LookAheadBufferSize,
IN  UINT PacketSize
)

{
PADAPT pAdapt =(PADAPT)ProtocolBindingContext;
PNDIS_PACKET MyPacket, Packet, MyPacket2;
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
PNDIS_BUFFER    PacketBuffer, OffsetBuffer;

PUCHAR  pPacketContent,pBakBuffer;
UINT PacketLen, OffsetSize;
PRSVD Resvd;
UINT BytesTransferred;
NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress;
HighestAcceptableAddress.LowPart = -1;
HighestAcceptableAddress.HighPart = -1;


if(!pAdapt->MiniportHandle)
{
Status = NDIS_STATUS_FAILURE;
}
else do
{

if(pAdapt->isSecondary)
{
DBGPRINT(\"PASSTHRU GETTING RECIEVES ON SECONDARY\\n\");
ASSERT(0);
}

Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);
if(Packet != NULL)
{
//
// Get a packet off the pool and indicate that up
//
NdisDprAllocatePacket(&Status, &MyPacket,pAdapt->RecvPacketPoolHandle);

if(Status == NDIS_STATUS_SUCCESS)
{
 MyPacket->Private.Head = Packet->Private.Head;
 MyPacket->Private.Tail = Packet->Private.Tail;


 NDIS_SET_ORIGINAL_PACKET(MyPacket,NDIS_GET_ORIGINAL_PACKET(Packet));
 NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize);

 //
 // Set Packet Flags
 //
 NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet);

 //
 // Make sure the status is set to NDIS_STATUS_RESOURCES.
 //set NDIS_STATUS_RESOURCES 后windows就会拷贝完整的包
 //然后就可以直接释放MyPacket

 ////////////// arp process

 NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);

 NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1);

 ASSERT(NDIS_GET_PACKET_STATUS(MyPacket) == NDIS_STATUS_RESOURCES);
 NdisDprFreePacket(MyPacket);
 break;
}
}

else if ( PacketSize <= LookAheadBufferSize)*/
if ( PacketSize <= LookAheadBufferSize)
{
Status = NdisAllocateMemory(
&pPacketContent,
2000,
0,
HighestAcceptableAddress);

/* if (Status != NDIS_STATUS_SUCCESS )
{
DbgPrint(\"ptreceive :ndisallocatememory failed\\n\");
// return NDIS_STATUS_NOT_ACCEPTED ;
}

if(pPacketContent == NULL)
{
DbgPrint(\"prreceive:pPacketContent == NULL\\n\");
// return NDIS_STATUS_NOT_ACCEPTED ;
}*/

NdisZeroMemory ( pPacketContent, 2000);
NdisMoveMemory ( pPacketContent, HeaderBuffer, HeaderBufferSize);
NdisMoveMemory ( pPacketContent+HeaderBufferSize, LookAheadBuffer,
LookAheadBufferSize);

PacketLen = PacketSize+HeaderBufferSize;

NdisDprAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle);

if(Status == NDIS_STATUS_SUCCESS)
{
NdisAllocateBuffer(&Status, &PacketBuffer,
pAdapt->BufferPoolHandle,pPacketContent,PacketLen);

NdisChainBufferAtFront( MyPacket, PacketBuffer );

MyPacket->Private.Head->Next=NULL;
MyPacket->Private.Tail=NULL;
Resvd =(PRSVD)(MyPacket->MiniportReserved);
Resvd->OriginalPkt = NULL;

NDIS_SET_PACKET_HEADER_SIZE( MyPacket, HeaderBufferSize );


NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); // 这个函数调用之后ndis就只能调用protocol的ptrecievepacket了。

if ( NDIS_GET_PACKET_STATUS( MyPacket ) != NDIS_STATUS_PENDING )
{
NdisFreeBuffer( PacketBuffer);
NdisFreeMemory( pPacketContent, 2000, 0);
NdisFreePacket( MyPacket);
}

break;
}
}

else
{
Status = NdisAllocateMemory(
&pPacketContent,
2000,
0,
HighestAcceptableAddress);

/* if (Status != NDIS_STATUS_SUCCESS )
{
DbgPrint(\"ptreceive :ndisallocatememory failed\\n\");
// return NDIS_STATUS_NOT_ACCEPTED ;
}

if(pPacketContent == NULL)
{
DbgPrint(\"prreceive:pPacketContent == NULL\\n\");
// return NDIS_STATUS_NOT_ACCEPTED ;
}*/

RtlZeroMemory(pPacketContent, 2000 );

NdisDprAllocatePacket(&Status,
&MyPacket,
pAdapt->RecvPacketPoolHandle);


NdisAllocateMemory(
&pBakBuffer,
2000,
0,
HighestAcceptableAddress);

/* if(Status != NDIS_STATUS_SUCCESS)
{
DbgPrint(\"ptreceive:allcate bak buffer failed\\n\");
// return NDIS_STATUS_NOT_ACCEPTED;
}*/
NdisAllocateBuffer(&Status,&PacketBuffer,pAdapt->BufferPoolHandle,
pPacketContent,PacketSize-LookAheadBufferSize);
NdisChainBufferAtFront( MyPacket, PacketBuffer );
MyPacket->Private.Head->Next=NULL;
MyPacket->Private.Tail=NULL;

OffsetSize = HeaderBufferSize + LookAheadBufferSize;

NdisMoveMemory(pBakBuffer,HeaderBuffer,HeaderBufferSize);
NdisMoveMemory((PVOID)((PUCHAR)pPacketContent+HeaderBufferSize),LookAheadBuffer,
LookAheadBufferSize);
PacketLen = HeaderBufferSize + PacketSize;

NdisDprAllocatePacket(&Status,&MyPacket2,
pAdapt->RecvPacketPoolHandle);
NdisAllocateBuffer(&Status,&OffsetBuffer,pAdapt->BufferPoolHandle ,
pBakBuffer,OffsetSize);
NdisChainBufferAtFront(MyPacket2,OffsetBuffer);

Resvd =(PRSVD)(MyPacket->MiniportReserved);
Resvd->OriginalPkt = (PNDIS_PACKET)MyPacket2;

NDIS_SET_PACKET_HEADER_SIZE( MyPacket, HeaderBufferSize );

NdisTransferData(&Status,
pAdapt->BindingHandle ,
MacReceiveContext,
LookAheadBufferSize,
PacketSize-LookAheadBufferSize ,
MyPacket,
&BytesTransferred);

if ( Status != NDIS_STATUS_PENDING )
{

PtTransferDataComplete( (NDIS_HANDLE)pAdapt, MyPacket,
Status, BytesTransferred );
}

}



} while(FALSE);

return Status;
}
wengyu100
驱动牛犊
驱动牛犊
  • 注册日期2003-10-10
  • 最后登录2006-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-12-07 22:37
对了
对我的 直通 程序
我还发现了一个问题
就是当ping包小的时候可以ping通其他机器
大一点的ping包就ping不通其他机器

大家帮我看看是怎么回事啊?
我都急死了!
此题有50分
游客

返回顶部