summaryrefslogtreecommitdiffstats
path: root/private/net/netbios/tnetbl.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/net/netbios/tnetbl.c')
-rw-r--r--private/net/netbios/tnetbl.c269
1 files changed, 269 insertions, 0 deletions
diff --git a/private/net/netbios/tnetbl.c b/private/net/netbios/tnetbl.c
new file mode 100644
index 000000000..268877208
--- /dev/null
+++ b/private/net/netbios/tnetbl.c
@@ -0,0 +1,269 @@
+/*++
+
+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;
+}
+