Author: bjsnipper
Subject: NDIS send my packet,return NDIS_STATUS_PENDING
Posted: 20 May 2013 at 11:05am
Hi,
Edited by bjsnipper - 12 hours 52 minutes ago at 11:08am
Subject: NDIS send my packet,return NDIS_STATUS_PENDING
Posted: 20 May 2013 at 11:05am
Hi,
I wanna tranform the received packets to one machine, NdisSend always return NDIS_STATUS_PENDING, What's wrong?
here is code snippet ,
here is code snippet ,
UCHAR g_server_mac[] = {0x00, 0x0c, 0x29, 0x33, 0x4a, 0xf8};
UCHAR g_client_mac[] = {0x00, 0x0c, 0x29, 0x5f, 0x78, 0xd4};
ULONG g_uSrcIp = 855746752;//192.168.1.51
ULONG g_uDestIp = 989964480;//192.168.1.59
*************************************
NDIS_STATUS
MySendPacket (
NDIS_HANDLE NdisBindingHandle,
NDIS_HANDLE NdisSendPacketPool,
PVOID pBuffer,
ULONG dwBufferLength
)
{
NDIS_STATUS status;
PNDIS_PACKET pSendPacket = NULL;
PNDIS_BUFFER pSendPacketBuffer = NULL;
PUCHAR pSendBuffer = NULL;
ULONG dwSendBufferLength;
NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress;
PSEND_RSVD SendRsvd = NULL;
if (!NdisBindingHandle)
return NDIS_STATUS_FAILURE;
if (!pBuffer)
return NDIS_STATUS_FAILURE;
if (dwBufferLength > ETH_MAX_PACKET_SIZE)
return NDIS_STATUS_FAILURE;
HighestAcceptableAddress.QuadPart = -1;
dwSendBufferLength = max(dwBufferLength, ETH_MIN_PACKET_SIZE);
status = NdisAllocateMemory(&pSendBuffer, dwSendBufferLength, 0, HighestAcceptableAddress);
if (status != NDIS_STATUS_SUCCESS)
{
return status;
}
RtlZeroMemory(pSendBuffer, dwSendBufferLength);
RtlMoveMemory(pSendBuffer, pBuffer, dwSendBufferLength);
NdisAllocatePacket(&status, &pSendPacket, NdisSendPacketPool);
if (status != NDIS_STATUS_SUCCESS)
{
NdisFreeMemory(pSendBuffer, dwSendBufferLength, 0);
return status;
}
NdisAllocateBuffer( &status,
&pSendPacketBuffer,
NdisSendPacketPool,
pSendBuffer,
dwSendBufferLength );
if (status != NDIS_STATUS_SUCCESS)
{
NdisFreeMemory(pSendBuffer, dwSendBufferLength, 0);
NdisDprFreePacket(pSendPacket);
return status;
}
NdisChainBufferAtFront(pSendPacket, pSendPacketBuffer);
SendRsvd = (PSEND_RSVD)(pSendPacket->ProtocolReserved);
SendRsvd->OriginalPkt = NULL;
pSendPacket->Private.Head->Next=NULL;
pSendPacket->Private.Tail=NULL;
NdisSetPacketFlags(pSendPacket, NDIS_FLAGS_DONT_LOOPBACK);
NdisSend(&status, NdisBindingHandle, pSendPacket);
if (status != STATUS_PENDING)
{
NdisUnchainBufferAtFront(pSendPacket ,&pSendPacketBuffer);
NdisQueryBufferSafe( pSendPacketBuffer,
(PVOID *)&pSendBuffer,
&dwSendBufferLength,
HighPagePriority );
NdisFreeBuffer(pSendPacketBuffer);
NdisFreeMemory(pSendBuffer, dwSendBufferLength, 0);
NdisDprFreePacket(pSendPacket);
}
return status;
}
NDIS_STATUS
FakePacket(
PNDIS_PACKET pPacket ,
PADAPT pAdapt ,
BOOLEAN bSender
)
{
NDIS_STATUS nRet = NDIS_STATUS_FAILURE;
PUCHAR pPacketContent = NULL;
PUCHAR pCustomPacketContent = NULL;
PNDIS_BUFFER NdisBuffer ;
UINT TotalPacketLength = 0;
UINT copysize = 0;
UINT DataOffset = 0 ;
UINT PhysicalBufferCount;
UINT BufferCount ;
PUCHAR tembuffer = NULL ;
UINT ActualDataLength=0;
PVOID VirtualAddress;
UINT Length=0;
UINT DataToCopy;
PNDIS_BUFFER Buffer;
UINT HeaderSize = 0;
PIP_HEADER pIpHeader;
UINT uOldPacketSize;
UINT uIpHeader = IP_HEADER_LENGTH;
UINT uTcpHeader = TCP_HEADER_LENGTH;
UINT uUdpHeader = UDP_HEADER_LENGTH;
UINT uIcmpHeader =ICMP_HEADER_LENGTH;
UINT uRealDataSize = 0;
UINT nIndex = 0;
UINT nHeaderLen = 0;
do
{
if ( pPacket == NULL ) break;
//if( g_nTimesSend == 0 ) break;
HeaderSize = NDIS_GET_PACKET_HEADER_SIZE(pPacket);
nRet = NdisAllocateMemoryWithTag( &pPacketContent, 2048, TAG);
if( nRet != NDIS_STATUS_SUCCESS ) break;
NdisZeroMemory( pPacketContent, 2048 ) ;
NdisQueryPacket(pPacket,
&PhysicalBufferCount,
&BufferCount,
&NdisBuffer,
&TotalPacketLength
);
while(TRUE){
NdisQueryBufferSafe(NdisBuffer,
&tembuffer,
©size,
NormalPagePriority
);
if(tembuffer != NULL){
NdisMoveMemory( pPacketContent + DataOffset , tembuffer, copysize) ;
DataOffset += copysize;
}
NdisGetNextBuffer(NdisBuffer , &NdisBuffer ) ;
if( NdisBuffer == NULL )
break ;
}
if(NTOHS(((PETHERNET_FRAME)pPacketContent)->FrameType)!=ETHERTYPE_IP)
{
DBGPRINT(("==========> IP packet\n"));
break;
}
if( bSender == TRUE )
{
if(TotalPacketLength<ETHERNET_FRAME_LENGTH+IP_HEADER_LENGTH)
{
break;
}
else
pIpHeader=(PIP_HEADER)&pPacketContent[ETHERNET_FRAME_LENGTH];
switch(pIpHeader->Protocol)
{
case PROTOCOL_TCP:
uRealDataSize = TotalPacketLength - ETHERNET_FRAME_LENGTH - IP_HEADER_LENGTH - TCP_HEADER_LENGTH;
DBGPRINT((" ======> [TCP] uRealDataSize : %d\n" , uRealDataSize ));
nHeaderLen = ETHERNET_FRAME_LENGTH + IP_HEADER_LENGTH + TCP_HEADER_LENGTH;
break;
case PROTOCOL_UDP:
uRealDataSize = TotalPacketLength - ETHERNET_FRAME_LENGTH - IP_HEADER_LENGTH - UDP_HEADER_LENGTH;
DBGPRINT((" ======> [UDP] uRealDataSize : %d\n" , uRealDataSize ));
nHeaderLen = ETHERNET_FRAME_LENGTH + IP_HEADER_LENGTH + UDP_HEADER_LENGTH;
break;
case PROTOCOL_ICMP:
uRealDataSize = TotalPacketLength - ETHERNET_FRAME_LENGTH - IP_HEADER_LENGTH - ICMP_HEADER_LENGTH;
DBGPRINT((" ======> [ICMP] uRealDataSize : %d\n" , uRealDataSize ));
nHeaderLen = ETHERNET_FRAME_LENGTH + IP_HEADER_LENGTH + ICMP_HEADER_LENGTH;
break;
default: break;
}
if ( uRealDataSize > 0 )
{
custom_header_info csHeaderInfo = {0};
nRet = NdisAllocateMemoryWithTag( &pCustomPacketContent , uRealDataSize + sizeof(custom_header_info) , TAG );
if( nRet != NDIS_STATUS_SUCCESS ) break;
NdisZeroMemory( pCustomPacketContent, uRealDataSize + sizeof(custom_header_info) ) ;
//build our special header
RtlCopyMemory( csHeaderInfo.szMd5 , DEF_szMd5Flag , FLAG_LEN );
csHeaderInfo.protocol_type = _htons(CHALLENGE_PACKET);
//rebuild real data
NdisMoveMemory( pCustomPacketContent , &csHeaderInfo , sizeof(custom_header_info) );
NdisMoveMemory( pCustomPacketContent + sizeof(custom_header_info) , &pPacketContent[nHeaderLen] , uRealDataSize );
NdisZeroMemory( &pPacketContent[nHeaderLen], uRealDataSize ) ;
NdisMoveMemory( pPacketContent + nHeaderLen , pCustomPacketContent , uRealDataSize + sizeof(custom_header_info) );
pIpHeader->DestinationIp = g_uDestIp;
pIpHeader->SourceIp = g_uSrcIp;
//calc modified packet size
pIpHeader->DatagramLength = _htons( TotalPacketLength + sizeof(custom_header_info) );
//checksum IP header
pIpHeader->CheckSum = 0;
pIpHeader->CheckSum = checksum( &pPacketContent[ETHERNET_FRAME_LENGTH] , IP_HEADER_LENGTH );
DBGPRINT(( "[sender] FakePacket Checksum : 0x%x , DatagramLength : %d\n" , pIpHeader->CheckSum , NTOHS(pIpHeader->DatagramLength) ));
//send modified packet
nRet = MySendPacket(pAdapt->BindingHandle, pAdapt->SendPacketPoolHandle, &pPacketContent, NTOHS(pIpHeader->DatagramLength) );
if (nRet != NDIS_STATUS_SUCCESS && nRet != NDIS_STATUS_PENDING)
{
DbgPrint("MySendPacket error : 0x%08x\n", nRet);
}
}
}
} while (0);
if( pPacketContent != NULL )
NdisFreeMemory(pPacketContent, 0, 0);
if( pCustomPacketContent != NULL )
NdisFreeMemory(pCustomPacketContent, 0, 0);
return nRet;
}
Edited by bjsnipper - 12 hours 52 minutes ago at 11:08am