summaryrefslogtreecommitdiffstats
path: root/private/ntos/tdi/isn/rip/ipxbind.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/tdi/isn/rip/ipxbind.c')
-rw-r--r--private/ntos/tdi/isn/rip/ipxbind.c191
1 files changed, 191 insertions, 0 deletions
diff --git a/private/ntos/tdi/isn/rip/ipxbind.c b/private/ntos/tdi/isn/rip/ipxbind.c
new file mode 100644
index 000000000..e4da3867e
--- /dev/null
+++ b/private/ntos/tdi/isn/rip/ipxbind.c
@@ -0,0 +1,191 @@
+/*******************************************************************/
+/* Copyright(c) 1993 Microsoft Corporation */
+/*******************************************************************/
+
+//***
+//
+// Filename: ipxbind.c
+//
+// Description: binding to the IPX driver
+//
+// Author: Stefan Solomon (stefans) October 18, 1993.
+//
+// Revision History:
+//
+//***
+
+#include <ntos.h>
+#include "rtdefs.h"
+
+NTSTATUS
+ReadIpxDeviceName(VOID);
+
+ULONG
+IsWanGlobalNetRequested(VOID);
+
+// global handle of the IPX driver
+HANDLE FileHandle;
+
+UNICODE_STRING UnicodeFileName;
+PWSTR FileNamep;
+
+NTSTATUS
+BindToIpxDriver(PIPX_INTERNAL_BIND_RIP_OUTPUT *IpxBindBuffpp)
+{
+ NTSTATUS Status;
+ IO_STATUS_BLOCK IoStatusBlock;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ PUCHAR bufferp;
+ UINT outbuflen, inbuflen;
+ PIPX_INTERNAL_BIND_INPUT bip;
+
+ // Read Ipx exported device name from the registry
+ ReadIpxDeviceName();
+
+ InitializeObjectAttributes(
+ &ObjectAttributes,
+ &UnicodeFileName,
+ OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL
+ );
+
+ Status = NtCreateFile(
+ &FileHandle,
+ SYNCHRONIZE | GENERIC_READ,
+ &ObjectAttributes,
+ &IoStatusBlock,
+ NULL,
+ FILE_ATTRIBUTE_NORMAL,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ FILE_OPEN,
+ FILE_SYNCHRONOUS_IO_NONALERT,
+ NULL,
+ 0L
+ );
+
+ if (!NT_SUCCESS(Status)) {
+
+ RtPrint(DBG_INIT, ("IpxRouter: Open of the IPX driver failed with %lx\n", Status));
+ return Status;
+ }
+
+ RtPrint(DBG_INIT, ("IpxRouter: Open of the IPX driver was successful!\n"));
+
+ // First, send a IOCTL to find out how much data we need to allocate
+ inbuflen = sizeof(IPX_INTERNAL_BIND_INPUT);
+ if((bip = ExAllocatePool(PagedPool, inbuflen)) == NULL) {
+
+ NtClose(FileHandle);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ // fill in our bind data
+ bip->Version = 1;
+ bip->Identifier = IDENTIFIER_RIP;
+ bip->BroadcastEnable = TRUE;
+ bip->LookaheadRequired = IPXH_HDRSIZE;
+ bip->ProtocolOptions = 0;
+ bip->ReceiveHandler = RtReceive;
+ bip->ReceiveCompleteHandler = RtReceiveComplete;
+ bip->StatusHandler = RtStatus;
+ bip->SendCompleteHandler = RtSendComplete;
+ bip->TransferDataCompleteHandler = RtTransferDataComplete;
+ bip->FindRouteCompleteHandler = RtFindRouteComplete;
+ bip->LineUpHandler = RtLineUp;
+ bip->LineDownHandler = RtLineDown;
+ bip->ScheduleRouteHandler = RtScheduleRoute;
+
+ if(IsWanGlobalNetRequested()) {
+
+ bip->RipParameters = IPX_RIP_PARAM_GLOBAL_NETWORK;
+ }
+ else
+ {
+ bip->RipParameters = 0;
+ }
+
+ Status = NtDeviceIoControlFile(
+ FileHandle, // HANDLE to File
+ NULL, // HANDLE to Event
+ NULL, // ApcRoutine
+ NULL, // ApcContext
+ &IoStatusBlock, // IO_STATUS_BLOCK
+ IOCTL_IPX_INTERNAL_BIND, // IoControlCode
+ bip, // Input Buffer
+ inbuflen, // Input Buffer Length
+ NULL, // Output Buffer
+ 0); // Output Buffer Length
+
+
+ if (Status == STATUS_PENDING) {
+ Status=NtWaitForSingleObject(
+ FileHandle,
+ (BOOLEAN)FALSE,
+ NULL);
+ }
+
+ if (Status != STATUS_BUFFER_TOO_SMALL) {
+
+ RtPrint(DBG_INIT, ("IpxRouter: Ioctl to the IPX driver failed with %lx\n", Status));
+
+ ExFreePool(bip);
+ NtClose(FileHandle);
+ return STATUS_INVALID_PARAMETER;
+ }
+ outbuflen = IoStatusBlock.Information;
+
+ if((bufferp = ExAllocatePool(PagedPool, outbuflen)) == NULL) {
+
+ ExFreePool(bip);
+ NtClose(FileHandle);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+
+ Status = NtDeviceIoControlFile(
+ FileHandle, // HANDLE to File
+ NULL, // HANDLE to Event
+ NULL, // ApcRoutine
+ NULL, // ApcContext
+ &IoStatusBlock, // IO_STATUS_BLOCK
+ IOCTL_IPX_INTERNAL_BIND, // IoControlCode
+ bip, // Input Buffer
+ inbuflen, // Input Buffer Length
+ bufferp, // Output Buffer
+ outbuflen); // Output Buffer Length
+
+
+ if (Status == STATUS_PENDING) {
+ Status=NtWaitForSingleObject(
+ FileHandle,
+ (BOOLEAN)FALSE,
+ NULL);
+ }
+
+ if (Status != STATUS_SUCCESS) {
+
+ RtPrint(DBG_INIT, ("IpxRouter: Ioctl to the IPX driver failed with %lx\n", IoStatusBlock.Status));
+
+ ExFreePool(bip);
+ ExFreePool(bufferp);
+ NtClose(FileHandle);
+ return Status;
+ }
+
+ RtPrint(DBG_INIT, ("IpxRouter: Succesfuly bound to the IPX driver\n"));
+
+ ExFreePool(bip);
+
+ *IpxBindBuffpp = (PIPX_INTERNAL_BIND_RIP_OUTPUT)bufferp;
+
+ return Status;
+}
+
+
+VOID
+UnbindFromIpxDriver(VOID)
+{
+ NtClose(FileHandle);
+ ExFreePool(FileNamep);
+}