hujing1230
驱动牛犊
驱动牛犊
  • 注册日期2005-04-11
  • 最后登录2005-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1637回复:5

为什么我的代码能发现TCP、UDP包而发现不了ICMP啊,帮我看看代码吧,弄了好久也没出来,

楼主#
更多 发布于:2005-05-31 13:57
我用PING命令测试,怎么也不输出ICMP包,代码是在帖子上拷的,没改动什么啊
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;
PNDIS_BUFFER OriginalBuffer;
UINT PacketLength;
PUCHAR pPacketContent,DataContent;
NDIS_STATUS ntStatus,Status = NDIS_STATUS_SUCCESS;


DBGPRINT(\"==> Passthru Protocol PtReceive\\n\");
DbgPrint(\" CurrentAdapterHandle: %u\\n\", ProtocolBindingContext);
DbgPrint(\" MacReceiveHandle: %u\\n\", MacReceiveContext);
DbgPrint(\" HeaderBufferPointer: %u\\n\", HeaderBuffer);
DbgPrint(\" HeaderBufferSize: %u\\n\", HeaderBufferSize);
DbgPrint(\" LookAheadBufferPointer: %u\\n\", LookAheadBuffer);
DbgPrint(\" LookAheadBufferSize: %u\\n\", LookAheadBufferSize);
DbgPrint(\" PacketSize: %u\\n\", PacketSize);



ntStatus = NdisAllocateMemory(&pPacketContent,2000,0,HighestAcceptableMax);
if(ntStatus != NDIS_STATUS_SUCCESS)
{
return ntStatus;
}
NdisZeroMemory(pPacketContent,2000);

NdisMoveMemory(
pPacketContent,
HeaderBuffer,
HeaderBufferSize
);
NdisMoveMemory(
pPacketContent+HeaderBufferSize,
LookAheadBuffer,
LookAheadBufferSize
);
if(((char *)pPacketContent)[12] == 8 &&((char *)pPacketContent)[13] == 0 &&
((char *)pPacketContent)[23] == 1) {
DbgPrint(\"ICMP!\\n\");
NdisFreeMemory(pPacketContent, 2000, 0);
return NDIS_STATUS_NOT_ACCEPTED;
}
else if(((char *)pPacketContent)[12] == 8 &&
((char *)pPacketContent)[13] == 0 &&
((char *)pPacketContent)[23] == 2)
{
DbgPrint(\"IGMP!\\n\");
NdisFreeMemory(pPacketContent, 2000, 0);
return NDIS_STATUS_NOT_ACCEPTED;
}
else if(((char *)pPacketContent)[12] == 8 &&
((char *)pPacketContent)[13] == 0 &&
((char *)pPacketContent)[23] == 6)
{
DbgPrint(\"TCP!\\n\");
NdisFreeMemory(pPacketContent, 2000, 0);
return NDIS_STATUS_NOT_ACCEPTED;
}
else if
(((char *)pPacketContent)[12] == 8 &&
((char *)pPacketContent)[13] == 0 &&
((char *)pPacketContent)[23] == 17)
{
DbgPrint(\"UDP!\\n\");
NdisFreeMemory(pPacketContent, 2000, 0);
return NDIS_STATUS_NOT_ACCEPTED;
}
NdisFreeMemory(pPacketContent, 2000, 0);


PacketLength=HeaderBufferSize+PacketSize;
NdisAllocateMemoryWithTag(&DataContent, PacketLength, TAG);

if(DataContent != NULL)
{
NdisAllocateBuffer(&Status,
&OriginalBuffer,
pAdapt->RecvPacketPoolHandle,
DataContent,
PacketLength);
if(Status == NDIS_STATUS_SUCCESS)
{
NdisMoveMappedMemory(DataContent, HeaderBuffer, HeaderBufferSize);
NdisAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle);
if(Status == NDIS_STATUS_SUCCESS)
{
if(LookAheadBufferSize == PacketSize)
{
NdisMoveMappedMemory(DataContent + HeaderBufferSize, LookAheadBuffer, PacketSize);
NdisChainBufferAtFront(MyPacket, OriginalBuffer);
}
}
}
}
PrintPacket(MyPacket);
NdisDprFreePacket(MyPacket);


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)
{
DBGPRINT(\"==> Passthru Protocol PtReceive RePacket...\\n\");

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);

NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet);

NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);

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

ASSERT(NDIS_GET_PACKET_STATUS(MyPacket) == NDIS_STATUS_RESOURCES);

PrintPacket(MyPacket);

NdisDprFreePacket(MyPacket);
DBGPRINT(\"<== Passthru Protocol PtReceive RePacket Success...\\n\");
break;
}
}

pAdapt->IndicateRcvComplete = TRUE;
switch(pAdapt->Medium)
{
case NdisMedium802_3:
NdisMEthIndicateReceive(pAdapt->MiniportHandle,
MacReceiveContext,
HeaderBuffer,
HeaderBufferSize,
LookAheadBuffer,
LookAheadBufferSize,
PacketSize);
break;

case NdisMedium802_5:
NdisMTrIndicateReceive(pAdapt->MiniportHandle,
MacReceiveContext,
HeaderBuffer,
HeaderBufferSize,
LookAheadBuffer,
LookAheadBufferSize,
PacketSize);
break;

case NdisMediumFddi:
NdisMFddiIndicateReceive(pAdapt->MiniportHandle,
MacReceiveContext,
HeaderBuffer,
HeaderBufferSize,
LookAheadBuffer,
LookAheadBufferSize,
PacketSize);
break;

default:
ASSERT(0);
break;
}

} while(FALSE);

DBGPRINT(\"<== Passthru Protocol PtReceive\\n\");

return Status;
}

最新喜欢:

xiaojian521xiaoji...
harry_chen
驱动牛犊
驱动牛犊
  • 注册日期2002-07-08
  • 最后登录2007-05-25
  • 粉丝0
  • 关注0
  • 积分31分
  • 威望4点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-31 15:28
会不会是监控icmp的标记被打开?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
hujing1230
驱动牛犊
驱动牛犊
  • 注册日期2005-04-11
  • 最后登录2005-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-31 16:02
不懂,什么意思啊?
Cloudy_hanji
驱动牛犊
驱动牛犊
  • 注册日期2005-01-06
  • 最后登录2005-08-08
  • 粉丝1
  • 关注0
  • 积分56分
  • 威望10点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-06-01 10:36
基本上是没有把显示ICMP包的标志置位。如果你用DebugView应该能看到已经显示分析出IGMP!包了。
hujing1230
驱动牛犊
驱动牛犊
  • 注册日期2005-04-11
  • 最后登录2005-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-01 13:50
我没用标识,更应该能发现ICMP包啊,我用DbgView跟踪的时候TCP和UDP的包被截获都有提示输出,可是一直都没有ICMP和IGMP。
我机器装的是诺顿的防火墙,我已经关了,
可是我PING自己的时候,显示PING成功了,但DbgView中仍然没有ICMP包的信息,
到底是程序的问题?还是我的机器上还有隐藏的防火墙没关啊?
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2005-06-01 19:54
你对PtReceivePacket是怎么处理的?能确认没有走PtReceivePacket吗?
游客

返回顶部