Reply To: Create New Ethernet Packet problem

Home Forums Discussions Support Portal Create New Ethernet Packet problem Reply To: Create New Ethernet Packet problem

#6368

Vadim Smirnov
Moderator

I can’t say what exactly may be wrong with your code, proofreading someones code is beyond support obligations, however here is the simple sample code which is confirmed to work:


/*************************************************************************/
/* Copyright (c) 2000-2007 NT Kernel Resources. */
/* All Rights Reserved. */
/* http://www.ntkernel.com */
/* ndisrd@ntkernel.com */
/* */
/* Module Name: sender.cpp */
/* */
/* Abstract: Defines the entry point for the console application */
/* */
/*************************************************************************/
// sender.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
TCP_AdapterList AdList;
DWORD iIndex;
CNdisApi api;
ETH_REQUEST Request;
INTERMEDIATE_BUFFER PacketBuffer;
HANDLE hEvent;

USHORT ntohs( USHORT netshort )
{
PUCHAR pBuffer;
USHORT nResult;

nResult = 0;
pBuffer = (PUCHAR )&netshort;

nResult = ( (pBuffer[ 0 ] < < 8) & 0xFF00 )
| ( pBuffer[ 1 ] & 0x00FF );

return( nResult );
}

int main(int argc, char* argv[])
{
UINT counter = 0;
ether_header* pEthHeader = NULL;

if (argc < 3)
{
printf ("Command line syntax:ntsender.exe index numntindex - network interface index.ntnum - number or packets to sendntYou can use ListAdapters to determine correct index.n");
return 0;
}

iIndex = atoi(argv[1]) - 1;
counter = atoi(argv[2]);

if(!api.IsDriverLoaded())
{
printf ("Driver not installed on this system of failed to load.n");
return 0;
}

api.GetTcpipBoundAdaptersInfo ( &AdList );

if ( iIndex + 1 > AdList.m_nAdapterCount )
{
printf("There is no network interface with such index on this system.n");
return 0;
}

// Initialize Request
ZeroMemory ( &Request, sizeof(ETH_REQUEST) );
ZeroMemory ( &PacketBuffer, sizeof(INTERMEDIATE_BUFFER) );
Request.EthPacket.Buffer = &PacketBuffer;
Request.hAdapterHandle = (HANDLE)AdList.m_nAdapterHandle[iIndex];

pEthHeader = (ether_header*)PacketBuffer.m_IBuffer;

memcpy(&pEthHeader->h_source, AdList.m_czCurrentAddress[iIndex], ETH_ALEN);
memset(&pEthHeader->h_dest, 0xFF, ETH_ALEN);
pEthHeader->h_proto = ETH_P_IP;
Request.EthPacket.Buffer->m_Length = MAX_ETHER_FRAME;

while (counter--)
api.SendPacketToAdapter(&Request);

return 0;
}

This simple application sends over network the specified amount of Ethernet broadcast frames filled with zeros. It’s work can be easily seen with any network sniffer.