Quantcast
Viewing all articles
Browse latest Browse all 10386

Development : NDIS send my packet,return NDIS_STATUS_PENDING

Author: bjsnipper
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 ,

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,
&copysize, 
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

Viewing all articles
Browse latest Browse all 10386

Trending Articles