我利用如下函数进行数据包过滤,在过滤中我想得到URL地址。不在规则中URL我则过滤。能得到数据包,但是怎么得到这个数据包中URL地址呢?代码如下,红色部分是要大家帮忙解决的地方。FILTER_STATUS AnalysisPacket(PNDIS_PACKET Packet,  BOOLEAN bRecOrSend)
{
FILTER_STATUS status = STATUS_PASS; // 默认全部通过
PNDIS_BUFFER NdisBuffer ;
UINT TotalPacketLength = 0;
UINT copysize = 0;
UINT DataOffset = 0 ;
UINT PhysicalBufferCount;
UINT BufferCount   ;
PUCHAR pPacketContent = NULL;
char* tcsPrintBuf = NULL;
char* tcsTempBuf = NULL;
PUCHAR tembuffer = NULL ; 
ANSI_STRING strTemp;
UINT j;
UINT i; __try{ status = NdisAllocateMemoryWithTag( &pPacketContent, 2048, TAG); 
if( status != NDIS_STATUS_SUCCESS ){
status = NDIS_STATUS_FAILURE ;
__leave;
} NdisZeroMemory( pPacketContent, 2048 ) ; // 找到第一个Ndis_Buffer。然后通过通过NdisGetNextBuffer来获得后续的NDIS_BUFFER。
// 如果只是找第一个节点,更快且方便的方法是调用NdisGetFirstBufferFromPacket。
NdisQueryPacket(Packet,  // NDIS_PACKET        
&PhysicalBufferCount,// 内存中的物理块数
&BufferCount,  // 多少个NDIS_BUFFER包
&NdisBuffer,         // 将返回第一个包
&TotalPacketLength  // 总共的包数据长度
); while(TRUE){ // 取得Ndis_Buffer中存储缓冲区的虚拟地址。
// 这个函数的另一个版本是NdisQueryBuffer。
// 后者在系统资源低或者甚至耗尽的时候,会产生Bug Check,导致蓝屏。
NdisQueryBufferSafe(NdisBuffer,
&tembuffer,// 缓冲区地址
&copysize, // 缓冲区大小
NormalPagePriority
); // 如果tembuffer为NULL,说明当前系统资源匮乏。
if(tembuffer != NULL){
NdisMoveMemory( pPacketContent + DataOffset , tembuffer, copysize) ;
DataOffset += copysize;
} // 获得下一个NDIS_BUFFER。
// 如果得到的是一个NULL指针,说明已经到了链式缓冲区的末尾,我们的循环应该结束了。
NdisGetNextBuffer(NdisBuffer , &NdisBuffer ) ; if( NdisBuffer == NULL )
break ;
} // 取得数据包内容后,下面将对其内容进行过滤。
// 我们在这个函数中的实现,仅仅简单地打印一些可读的Log信息。
if(pPacketContent[12] == 8 &&  pPacketContent[13] == 0 )  //is ip packet
{
PIP_HEADER pIPHeader = (PIP_HEADER)(pPacketContent + IP_OFFSET);

//如果是发送的则获取URL地址
if( !bRecOrSend )
{
if( pPacketContent[54] == 'G'
&& pPacketContent[55] == 'E'
&& pPacketContent[56] == 'T' )
{
DbgPrint("SEND GET URL");
                                              //如何在这个地方获取URL地址? }
}
}
else if(pPacketContent[12] == 8 &&  pPacketContent[13] == 6 )
{
if(bRecOrSend)
DbgPrint("Receive ARP packet");
else
DbgPrint("Send ARP packet mod");
}
else
{
if(bRecOrSend)
DbgPrint("Receive unknown packet");
else
DbgPrint("Send unknown packet mod");
} // 简单打印出包数据内容
/*
status = NdisAllocateMemoryWithTag( &tcsPrintBuf, 2048*3, TAG);  //分配内存块
if( status != NDIS_STATUS_SUCCESS )
{
status = NDIS_STATUS_FAILURE ;
__leave;
}
for(j=0;j<=DataOffset;j++)
RtlStringCbPrintfA(tcsPrintBuf+j*3, 2048*3-j*3, "%2x ",pPacketContent[j]); DbgPrint(tcsPrintBuf);
*/ }
__finally
{
if(pPacketContent)NdisFreeMemory(pPacketContent, 0, 0);
if(tcsPrintBuf)NdisFreeMemory(tcsPrintBuf, 0, 0);
} return STATUS_PASS;
}