diff options
Diffstat (limited to '')
-rw-r--r-- | private/ntos/tdi/nbf/testtdi.c | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/private/ntos/tdi/nbf/testtdi.c b/private/ntos/tdi/nbf/testtdi.c new file mode 100644 index 000000000..6cf1b335f --- /dev/null +++ b/private/ntos/tdi/nbf/testtdi.c @@ -0,0 +1,291 @@ +/*++ + +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 ); +} + |