mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
4.5 KiB
191 lines
4.5 KiB
/*******************************************************************/
|
|
/* 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);
|
|
}
|