mirror of https://github.com/lianthony/NT4.0
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.
272 lines
6.9 KiB
272 lines
6.9 KiB
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
usrv.c
|
|
|
|
Abstract:
|
|
|
|
Test program for the LAN Manager server.
|
|
|
|
Author:
|
|
|
|
David Treadwell (davidtr) 20-Oct-1989
|
|
Chuck Lenzmeier (chuckl)
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "usrv.h"
|
|
|
|
|
|
NTSTATUS
|
|
main (
|
|
IN SHORT argc,
|
|
IN PSZ argv[],
|
|
IN PSZ envp[]
|
|
)
|
|
{
|
|
|
|
NTSTATUS status;
|
|
HANDLE redirThreadHandle[MAX_NUMBER_REDIRS];
|
|
SHORT i;
|
|
SHORT argPtr;
|
|
ULONG ActualNumberOfRedirs;
|
|
ULONG redirThreadCount = 0;
|
|
PDESCRIPTOR Redir = NULL;
|
|
|
|
envp; // prevent compiler warnings
|
|
|
|
printf( "LAN Manager Server Test entered\n" );
|
|
|
|
DebugParameter = 0;
|
|
|
|
//
|
|
// Parse command-line arguments to determine redir threads to start.
|
|
//
|
|
|
|
ActualNumberOfRedirs = 0;
|
|
|
|
argc--;
|
|
argPtr = 1;
|
|
|
|
while ( (argc > 0) && (*argv[argPtr] == '-') ) {
|
|
PSZ arg = argv[argPtr] + 1;
|
|
switch ( *arg ) {
|
|
case 'b': // set redir's max buffer size
|
|
case 'B':
|
|
RedirBufferSize = (USHORT)atol( arg + 1 );
|
|
break;
|
|
case 'd': // set debug flags
|
|
case 'D':
|
|
DebugParameter = atolx( arg + 1 );
|
|
break;
|
|
case 'l':
|
|
case 'L':
|
|
DefaultDialect = (UCHAR)( atol( arg + 1 ) & 0x7 );
|
|
break;
|
|
case 'n':
|
|
case 'N':
|
|
DefaultNegotiate = (BOOLEAN)(!DefaultNegotiate);
|
|
case 'p':
|
|
case 'P':
|
|
PromptForNextTest = (BOOLEAN)(!PromptForNextTest);
|
|
break;
|
|
case 's': // set server name
|
|
case 'S':
|
|
arg++;
|
|
for ( i = 1;
|
|
(i <= COMPUTER_NAME_LENGTH) && (*arg != '\0');
|
|
i++, arg++ ) {
|
|
ServerName[i] = (CHAR)toupper( *arg );
|
|
}
|
|
if ( *arg != '\0' ) {
|
|
printf( "USRV: Server name too long\n" );
|
|
goto usage;
|
|
}
|
|
for ( ; i <= COMPUTER_NAME_LENGTH + 1; i++ ) {
|
|
ServerName[i] = ' ';
|
|
}
|
|
break;
|
|
case 'r':
|
|
case 'R':
|
|
NoUsrvInit = (BOOLEAN)(!NoUsrvInit);
|
|
break;
|
|
case 't': // set prompting redir count
|
|
case 'T':
|
|
redirThreadCount = atol( arg + 1 );
|
|
break;
|
|
case 'x': // set transport name
|
|
case 'X':
|
|
Transport = arg + 1;
|
|
break;
|
|
default:
|
|
printf( "USRV: Invalid switch\n" );
|
|
goto usage;
|
|
}
|
|
argc--;
|
|
argPtr++;
|
|
}
|
|
|
|
if ( (argc == 0) && !PromptForNextTest ) {
|
|
//printf( "USRV: No test name given; assuming \"-P\"\n" );
|
|
PromptForNextTest = TRUE;
|
|
}
|
|
|
|
if ( (argc != 0) && (redirThreadCount != 0) ) {
|
|
printf( "USRV: Must not specify both test name and \"-T\"\n" );
|
|
goto usage;
|
|
}
|
|
|
|
if ( (argc == 0) && (redirThreadCount == 0) ) {
|
|
redirThreadCount = 1;
|
|
}
|
|
|
|
while ( (argc > 0) || (redirThreadCount > 0) ) {
|
|
|
|
Redir = malloc( sizeof(DESCRIPTOR) );
|
|
|
|
Redir->RedirNumber = ActualNumberOfRedirs;
|
|
Redir->MaxBufferSize = RedirBufferSize;
|
|
|
|
if ( argc > 0 ) {
|
|
|
|
Redir->TestNumber = MatchTestName( argv[argPtr] );
|
|
|
|
switch ( Redir->TestNumber ) {
|
|
|
|
case (CLONG)-1:
|
|
|
|
printf( "Unknown test specified: %s\n", argv[argPtr] );
|
|
goto usage;
|
|
|
|
case (CLONG)-2:
|
|
|
|
printf( "Test name ambiguous: %s\n", argv[argPtr] );
|
|
goto usage;
|
|
|
|
}
|
|
|
|
Redir->argc = argPtr;
|
|
Redir->argv = &argv[argPtr++];
|
|
|
|
while( (--argc > 0) && (*argv[argPtr] != '|') ) {
|
|
argPtr++;
|
|
}
|
|
|
|
Redir->argc = argPtr - Redir->argc;
|
|
argPtr++; // skip over '|'
|
|
--argc;
|
|
|
|
} else {
|
|
|
|
Redir->TestNumber = -3;
|
|
Redir->argc = 0;
|
|
--redirThreadCount;
|
|
|
|
}
|
|
|
|
//
|
|
// Don't create a redir thread if exactly one explicit test, or
|
|
// -Tn was specified and this is the last thread to be created.
|
|
// Instead, execute the RedirThread routine directly outside of
|
|
// the loop.
|
|
//
|
|
|
|
if ( (argc > 0) ||
|
|
(ActualNumberOfRedirs > 0) ||
|
|
(redirThreadCount > 0) ) {
|
|
|
|
IF_DEBUG(1) {
|
|
printf( "***Starting redir thread #%ld.\n",
|
|
Redir->RedirNumber );
|
|
}
|
|
|
|
status = RtlCreateUserThread(
|
|
NtCurrentProcess(),
|
|
NULL,
|
|
FALSE,
|
|
0L,
|
|
0L,
|
|
0L,
|
|
(PUSER_THREAD_START_ROUTINE)RedirThreadWrapper,
|
|
(PVOID)Redir,
|
|
&redirThreadHandle[ActualNumberOfRedirs++],
|
|
NULL
|
|
);
|
|
|
|
if ( !NT_SUCCESS(status) ) {
|
|
printf( "NtCreateThread (redir thread) failed: %X\n",
|
|
status);
|
|
status = STATUS_UNSUCCESSFUL;
|
|
goto exit;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( ActualNumberOfRedirs == 0 ) {
|
|
|
|
//
|
|
// If if exactly one explicit test was specified, run the redir
|
|
// thread directly, rather than spawning a thread.
|
|
//
|
|
|
|
status = RedirThread( Redir );
|
|
|
|
} else {
|
|
|
|
status = NtWaitForMultipleObjects(
|
|
(CHAR)ActualNumberOfRedirs,
|
|
redirThreadHandle,
|
|
WaitAll,
|
|
FALSE,
|
|
NULL
|
|
);
|
|
if ( !NT_SUCCESS(status) ) {
|
|
status = STATUS_UNSUCCESSFUL;
|
|
printf( "NtWaitForMultipleObjects failed: %X\n", status );
|
|
goto exit;
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// All done.
|
|
//
|
|
|
|
goto exit;
|
|
|
|
usage:
|
|
|
|
printf( "usage: USRV [-Bbuffer-size] [-Ddebug-flags] [-P]\n" );
|
|
printf( " [-Tthread-count] [-Sserver-name] "
|
|
"[-Xtransport-name] [-N] [-R]\n" );
|
|
printf( " test-name [args] [| test-name [args]]...\n" );
|
|
printf( "\n" );
|
|
printf( " buffer-size, thread-count are in decimal\n" );
|
|
printf( " debug-flags is in hex\n" );
|
|
printf( " -P reverses state of prompt mode\n" );
|
|
printf( " -R indicates that USRVINIT.CMD should not be run\n" );
|
|
printf( " -N indicates that no negotiate SMB should be sent\n" );
|
|
printf( "\n" );
|
|
printf( " -T and \"test-name [args]\" are mutually-exclusive;\n" );
|
|
printf( " threads created with -T always prompt for test-name\n" );
|
|
printf( "\n" );
|
|
printf( " \"USRV\" alone creates one prompting redir thread\n" );
|
|
printf( "\n" );
|
|
|
|
status = STATUS_UNSUCCESSFUL;
|
|
|
|
exit:
|
|
|
|
IF_DEBUG(1) printf( "LAN Manager Server Test exiting: %X\n",
|
|
status );
|
|
return status;
|
|
|
|
} // main
|
|
|