292 lines
7 KiB
C
292 lines
7 KiB
C
/*++
|
||
|
||
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 );
|
||
}
|
||
|