Reply To: Create New Ethernet Packet problem

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

#6368
Vadim Smirnov
Keymaster

    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.