summaryrefslogblamecommitdiffstats
path: root/private/nw/ndsutils/netperf.c
blob: e509f3fe7dfec2bf1c98678d73a595ade1778973 (plain) (tree)









































































































































                                                                                          
/***

Copyright (c) 1995  Microsoft Corporation

Module Name:

    netperf.c

Abstract:

    Command line test for getting the connection performance.

Author:

    Cory West       [corywest] 17-April-96

***/

#include "ndsapi32.h"
#include "ntddnwfs.h"

int
_cdecl main(
    int argc,
    char **argv
) {

    NTSTATUS ntstatus;
    IO_STATUS_BLOCK IoStatusBlock;
    OBJECT_ATTRIBUTES ObjectAttributes;
    ACCESS_MASK DesiredAccess = SYNCHRONIZE | FILE_LIST_DIRECTORY;
    HANDLE hRdr;

    WCHAR OpenString[] = L"\\Device\\Nwrdr\\*";
    UNICODE_STRING OpenName;

    OEM_STRING OemArg;
    UNICODE_STRING ConnectionName;

    PNWR_REQUEST_PACKET Request;
    ULONG BufferSize = 512;
    ULONG RequestSize;

    //
    // Check the arguments.
    //

    if ( argc != 2 ) {
        printf( "Usage: netperf [remote name]\n" );
        return -1;
    }

    //
    // Allocate buffer space.
    //

    Request = (PNWR_REQUEST_PACKET) LocalAlloc( LMEM_ZEROINIT, BufferSize );

    if ( !Request ) {
       printf( "Insufficient memory to complete the request.\n" );
       return -1;
    }

    //
    // Convert the connect name to unicode.
    //

    ConnectionName.Length = 0;
    ConnectionName.MaximumLength = (USHORT) ( BufferSize - sizeof( NWR_REQUEST_PACKET ) );
    ConnectionName.Buffer = &(Request->Parameters.GetConnPerformance.RemoteName[0]);

    OemArg.Length = strlen( argv[1] );
    OemArg.MaximumLength = OemArg.Length;
    OemArg.Buffer = argv[1];

    RtlOemStringToUnicodeString( &ConnectionName, &OemArg, FALSE );

    //
    // Set up the object attributes.
    //

    RtlInitUnicodeString( &OpenName, OpenString );

    InitializeObjectAttributes( &ObjectAttributes,
                                &OpenName,
                                OBJ_CASE_INSENSITIVE,
                                NULL,
                                NULL );

    ntstatus = NtOpenFile( &hRdr,
                           DesiredAccess,
                           &ObjectAttributes,
                           &IoStatusBlock,
                           FILE_SHARE_VALID_FLAGS,
                           FILE_SYNCHRONOUS_IO_NONALERT );

    if ( !NT_SUCCESS(ntstatus) )
        return ntstatus;

    //
    // Fill out the request packet for FSCTL_NWR_GET_CONN_PERFORMANCE.
    //

    Request->Parameters.GetConnPerformance.RemoteNameLength = ConnectionName.Length;
    RequestSize = sizeof( NWR_REQUEST_PACKET ) + ConnectionName.Length;

    ntstatus = NtFsControlFile( hRdr,
                                NULL,
                                NULL,
                                NULL,
                                &IoStatusBlock,
                                FSCTL_NWR_GET_CONN_PERFORMANCE,
                                (PVOID) Request,
                                RequestSize,
                                NULL,
                                0 );

    if ( !NT_SUCCESS( ntstatus ) ) {
        goto ExitWithClose;
    }

    //
    // Print out the speed and packet size.
    //

    printf( "Speed: %d\n", Request->Parameters.GetConnPerformance.dwSpeed );
    printf( "Flags: %d\n", Request->Parameters.GetConnPerformance.dwFlags );
    printf( "Delay: %d\n", Request->Parameters.GetConnPerformance.dwDelay );
    printf( "Packet Size: %d\n", Request->Parameters.GetConnPerformance.dwOptDataSize );


ExitWithClose:

   LocalFree( Request );
   NtClose( hRdr );
   return ntstatus;

}