windows-nt/Source/XPSP1/NT/net/netbeui/sys/testtdi.c

292 lines
7 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
tstrcv.c
Abstract:
start receive side tests utility
Author:
Dave Beaver (dbeaver) 24-Mar-1991
Revision History:
--*/
//
// download a ub board
//
typedef unsigned char uchar_t;
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <string.h>
//#include <windows.h>
#include <nbf.h>
#define TDIDEV "\\Device\\Nbf"
char Tdidevice[] = TDIDEV; /* default device */
char *Tdidev = Tdidevice;
HANDLE FileHandle;
VOID
usage(
VOID
);
NTSTATUS
main (
IN SHORT argc,
IN PSZ argv[]
)
{
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;
STRING NameString;
UNICODE_STRING unicodeString;
PUCHAR buffer;
ULONG IoControlCode;
int n;
CHAR c;
for( n = 1; n < argc && argv[n][0] == '-' ; ++n ) {
c = argv[n][1];
switch( c ) {
case 's': // send test
IoControlCode = IOCTL_TDI_SEND_TEST;
break;
case 'r': // receive test
IoControlCode = IOCTL_TDI_RECEIVE_TEST;
break;
case 'b': /* both test */
IoControlCode = IOCTL_TDI_SERVER_TEST;
break;
default:
usage ();
break;
}
}
printf ("Opening TDI device: %s \n", Tdidev);
RtlInitString (&NameString, Tdidev);
Status = RtlAnsiStringToUnicodeString(
&unicodeString,
&NameString,
TRUE);
buffer = (PUCHAR)malloc (100);
Status = TdiOpenNetbiosAddress (&FileHandle, buffer, (PVOID)&NameString, NULL);
RtlFreeUnicodeString(&unicodeString);
free (buffer);
if (!NT_SUCCESS( Status )) {
printf ("FAILURE, Unable to open TDI driver %s, status: %lx.\n",
Tdidev,Status);
return (Status);
}
if (!(NT_SUCCESS( IoStatusBlock.Status ))) {
printf ("FAILURE, Unable to open TDI driver %s, IoStatusBlock.Status: %lx.\n",
Tdidev, IoStatusBlock.Status);
return (IoStatusBlock.Status);
}
//
// start the test
//
printf("Starting test.... ");
Status = NtDeviceIoControlFile(
FileHandle,
NULL,
NULL,
NULL,
&IoStatusBlock,
IoControlCode,
NULL,
0,
NULL,
0);
if (!NT_SUCCESS( Status )) {
printf ("FAILURE, Unable to start test: %lx.\n", Status);
return (Status);
}
if (!(NT_SUCCESS( IoStatusBlock.Status ))) {
printf ("FAILURE, Unable to start test: %lx.\n", IoStatusBlock.Status);
return (IoStatusBlock.Status);
}
NtClose (FileHandle);
return STATUS_SUCCESS;
}
NTSTATUS
TdiOpenNetbiosAddress (
IN OUT PHANDLE FileHandle,
IN PUCHAR Buffer,
IN PVOID DeviceName,
IN PVOID Address)
/*++
Routine Description:
Opens an address on the given file handle and device.
Arguments:
FileHandle - the returned handle to the file object that is opened.
Buffer - pointer to a buffer that the ea is to be built in. This buffer
must be at least 40 bytes long.
DeviceName - the Unicode string that points to the device object.
Name - the address to be registered. If this pointer is NULL, the routine
will attempt to open a "control channel" to the device; that is, it
will attempt to open the file object with a null ea pointer, and if the
transport provider allows for that, will return that handle.
Return Value:
An informative error code if something goes wrong. STATUS_SUCCESS if the
returned file handle is valid.
--*/
{
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;
OBJECT_ATTRIBUTES ObjectAttributes;
PFILE_FULL_EA_INFORMATION EaBuffer;
PTRANSPORT_ADDRESS TAAddress;
PTA_ADDRESS AddressType;
PTDI_ADDRESS_NETBIOS AddressName;
PSZ Name;
ULONG Length;
int i;
if (Address != NULL) {
Name = (PSZ)Address;
try {
Length = sizeof (FILE_FULL_EA_INFORMATION) +
sizeof (TRANSPORT_ADDRESS) +
sizeof (TDI_ADDRESS_NETBIOS);
EaBuffer = (PFILE_FULL_EA_INFORMATION)Buffer;
if (EaBuffer == NULL) {
return STATUS_UNSUCCESSFUL;
}
EaBuffer->NextEntryOffset =0;
EaBuffer->Flags = 0;
EaBuffer->EaNameLength = TDI_TRANSPORT_ADDRESS_LENGTH;
EaBuffer->EaValueLength = sizeof (TDI_ADDRESS_NETBIOS) +
sizeof (TRANSPORT_ADDRESS);
for (i=0;i<(int)EaBuffer->EaNameLength;i++) {
EaBuffer->EaName[i] = TdiTransportAddress[i];
}
TAAddress = (PTRANSPORT_ADDRESS)&EaBuffer->EaName[EaBuffer->EaNameLength+1];
TAAddress->TAAddressCount = 1;
AddressType = (PTA_ADDRESS)((PUCHAR)TAAddress + sizeof (TAAddress->TAAddressCount));
AddressType->AddressType = TDI_ADDRESS_TYPE_NETBIOS;
AddressType->AddressLength = TDI_ADDRESS_LENGTH_NETBIOS;
AddressName = (PTDI_ADDRESS_NETBIOS)((PUCHAR)AddressType +
sizeof (AddressType->AddressType) + sizeof (AddressType->AddressLength));
AddressName->NetbiosNameType = TDI_ADDRESS_NETBIOS_TYPE_UNIQUE;
for (i=0;i<16;i++) {
AddressName->NetbiosName[i] = Name[i];
}
} except(EXCEPTION_EXECUTE_HANDLER) {
//
// Couldn't touch the passed parameters; just return an error
// status.
//
return GetExceptionCode();
}
} else {
EaBuffer = NULL;
Length = 0;
}
InitializeObjectAttributes (
&ObjectAttributes,
DeviceName,
0,
NULL,
NULL);
Status = NtCreateFile (
FileHandle,
FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES, // desired access.
&ObjectAttributes, // object attributes.
&IoStatusBlock, // returned status information.
0, // block size (unused).
0, // file attributes.
FILE_SHARE_READ | FILE_SHARE_WRITE, // share access.
FILE_CREATE, // create disposition.
0, // create options.
EaBuffer, // EA buffer.
Length); // EA length.
if (!NT_SUCCESS( Status )) {
return Status;
}
Status = IoStatusBlock.Status;
if (!(NT_SUCCESS( Status ))) {
}
return Status;
} /* TdiOpenNetbiosAddress */
VOID
usage(
VOID
)
{
printf( "usage: tsttdi [-r] [-s] -[b]\n");
printf( "usage: -r run receive test.\n" );
printf( "usage: -b run server test.\n" );
printf( "usage: -s run send test.\n" );
printf( "\n" );
exit( 1 );
}