summaryrefslogtreecommitdiffstats
path: root/private/ntos/tdi/nbf/testtdi.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/tdi/nbf/testtdi.c')
-rw-r--r--private/ntos/tdi/nbf/testtdi.c291
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 );
+}
+