Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

269 lines
6.4 KiB

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
tnetbios.c
Abstract:
This module contains code which exercises the NetBIOS dll and driver.
Author:
Colin Watson (ColinW) 13-Mar-1991
Environment:
Application mode
Revision History:
Dave Beaver (DBeaver) 10 August 1991
Modify to support multiple LAN numbers
--*/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <nb30.h>
#include <stdio.h>
// 1234567890123456
#define SPACES " "
#define Hi "Come here Dave, I need you"
#define ClearNcb( PNCB ) { \
RtlZeroMemory( PNCB , sizeof (NCB) ); \
RtlMoveMemory( (PNCB)->ncb_name, SPACES, sizeof(SPACES)-1 );\
RtlMoveMemory( (PNCB)->ncb_callname, SPACES, sizeof(SPACES)-1 );\
}
// Hard code lana-num that is mapped to XNS
#define XNS 1
int Limit = 20;
VOID
usage (
VOID
)
{
printf("usage: tnetbl [-n:lan number][-h] <remote computername> <my computername>\n");
printf(" -n specifies the lan number (0 is the default)\n");
printf(" -h specifies that addresses are hexadecimal numbers \n");
printf(" rather than strings.\n");
printf(" final two arguments are the remote and local computer names.\n");
}
int
main (argc, argv)
int argc;
char *argv[];
{
NCB myncb;
CHAR Buffer2[128];
int i,j;
CHAR localName[16];
CHAR remoteName[16];
CHAR localTemp[32];
CHAR remoteTemp[32];
ULONG lanNumber=0;
BOOLEAN gotFirst=FALSE;
BOOLEAN asHex=FALSE;
UCHAR lsn;
UCHAR name_number;
USHORT length;
if ( argc < 3 || argc > 5) {
usage ();
return 1;
}
//
// dbeaver: added switch to allow 32 byte hex string as name to facilitate
// testing under unusual circumstances
//
for (j=1;j<16;j++ ) {
localTemp[j] = ' ';
remoteTemp[j] = ' ';
}
//
// parse the switches
//
for (i=1;i<argc ;i++ ) {
if (argv[i][0] == '-') {
switch (argv[i][1]) {
case 'n':
if (!NT_SUCCESS(RtlCharToInteger (&argv[i][3], 10, &lanNumber))) {
usage ();
return 1;
}
break;
case 'h':
asHex = TRUE;
break;
default:
usage ();
return 1;
break;
}
} else {
//
// not a switch must be a name
//
if (gotFirst != TRUE) {
RtlMoveMemory (remoteTemp, argv[i], lstrlen( argv[i] ));
gotFirst = TRUE;
} else {
RtlMoveMemory (localTemp, argv[i], lstrlen( argv[i] ));
}
}
}
if (asHex) {
RtlZeroMemory (localName, 16);
RtlZeroMemory (remoteName, 16);
for (j=0;j<16 ;j+=4) {
RtlCharToInteger (&localTemp[j*2], 16, (PULONG)&localName[j]);
}
for (j=0;j<16 ;j+=4) {
RtlCharToInteger (&remoteTemp[j*2], 16, (PULONG)&remoteName[j]);
}
} else {
for (j=1;j<16;j++ ) {
localName[j] = ' ';
remoteName[j] = ' ';
}
RtlMoveMemory( localName, localTemp, 16);
RtlMoveMemory( remoteName, remoteTemp, 16);
}
// Reset
ClearNcb( &myncb );
myncb.ncb_command = NCBRESET;
myncb.ncb_lsn = 0; // Request resources
myncb.ncb_lana_num = lanNumber;
myncb.ncb_callname[0] = 0; // 16 sessions
myncb.ncb_callname[1] = 0; // 16 commands
myncb.ncb_callname[2] = 0; // 8 names
Netbios( &myncb );
// AddName
ClearNcb( &myncb );
myncb.ncb_command = NCBADDNAME;
RtlMoveMemory( myncb.ncb_name, localName, 16);
myncb.ncb_lana_num = (UCHAR)lanNumber;
Netbios( &myncb );
if ( myncb.ncb_retcode != NRC_GOODRET ) {
printf( "Addname returned an error %lx", myncb.ncb_retcode );
return 1;
}
name_number = myncb.ncb_num;
printf( "Starting Listen test\n" );
for ( j = 0; j <= Limit; j++ ) {
printf( "\nStarting Listen " );
// Listen
ClearNcb( &myncb );
myncb.ncb_command = NCBLISTEN | ASYNCH;
RtlMoveMemory( myncb.ncb_name, localName, 16);
RtlMoveMemory( myncb.ncb_callname, remoteName, 16);
myncb.ncb_lana_num = (UCHAR)lanNumber;
myncb.ncb_rto = myncb.ncb_rto = 0; //10; 10*500 milliseconds timeout
myncb.ncb_num = name_number;
Netbios( &myncb );
printf( "Listen returned " );
while ( myncb.ncb_cmd_cplt == NRC_PENDING ) {
printf( "." );
Sleep(500);
}
printf( " Listen completed\n" );
if ( myncb.ncb_retcode != NRC_GOODRET ) {
break;
}
lsn = myncb.ncb_lsn;
while ( 1 ) {
// Receive
ClearNcb( &myncb );
myncb.ncb_command = NCBRECV | ASYNCH;
myncb.ncb_lana_num = (UCHAR)lanNumber;
myncb.ncb_length = sizeof( Buffer2 );
myncb.ncb_buffer = Buffer2;
myncb.ncb_lsn = lsn;
Netbios( &myncb );
printf( "R" );
while ( myncb.ncb_cmd_cplt == NRC_PENDING ) {
// printf( "." );
// Sleep(250);
}
printf( "r" );
if ( myncb.ncb_retcode != NRC_GOODRET ) {
break;
}
//printf( ":%s\n", Buffer2);
length = myncb.ncb_length;
// Send
ClearNcb( &myncb );
myncb.ncb_command = NCBSEND;
myncb.ncb_lana_num = (UCHAR)lanNumber;
myncb.ncb_length = length;
myncb.ncb_buffer = Buffer2;
myncb.ncb_lsn = lsn;
Netbios( &myncb );
if ( myncb.ncb_retcode != NRC_GOODRET ) {
break;
}
}
// Hangup
ClearNcb( &myncb );
myncb.ncb_command = NCBHANGUP;
myncb.ncb_lana_num = (UCHAR)lanNumber;
myncb.ncb_lsn = lsn;
Netbios( &myncb );
if ( myncb.ncb_retcode != NRC_GOODRET ) {
break;
}
}
// Reset
ClearNcb( &myncb );
myncb.ncb_command = NCBRESET;
myncb.ncb_lsn = 1; // Free resources
Netbios( &myncb );
printf( "Ending NetBios\n" );
return 0;
}