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.
247 lines
6.5 KiB
247 lines
6.5 KiB
/*++
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ntautodl.c
|
|
|
|
Abstract:
|
|
|
|
NT specific routines for interfacing with the
|
|
RAS AutoDial driver (acd.sys).
|
|
|
|
Author:
|
|
|
|
Anthony Discolo (adiscolo) Aug 30, 1995
|
|
|
|
Revision History:
|
|
|
|
Who When What
|
|
-------- -------- ----------------------------------------------
|
|
adiscolo 08-30-95 created
|
|
|
|
Notes:
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#include <acd.h>
|
|
#include <acdapi.h>
|
|
#include "addr.h"
|
|
#include "tcp.h"
|
|
#include "tcb.h"
|
|
#include "tcpconn.h"
|
|
#include "udp.h"
|
|
#include "tlcommon.h"
|
|
|
|
//
|
|
// Macro for calculating
|
|
// an IP address component.
|
|
//
|
|
|
|
|
|
#define UC(pIpAddr, i) ((ULONG)(((PCHAR)(pIpAddr))[i]) & 0xff)
|
|
|
|
|
|
VOID
|
|
TCPAcdBind();
|
|
|
|
#pragma alloc_text(INIT, TCPAcdBind)
|
|
|
|
//
|
|
// Global variables
|
|
//
|
|
BOOLEAN fAcdLoadedG;
|
|
ACD_DRIVER AcdDriverG;
|
|
ULONG ulDriverIdG = 'Tcp ';
|
|
|
|
VOID
|
|
TCPNoteNewConnection(
|
|
IN TCB * pTCB,
|
|
IN CTELockHandle Handle
|
|
)
|
|
{
|
|
ACD_ADDR addr;
|
|
ACD_ADAPTER adapter;
|
|
|
|
//
|
|
// If there is a NULL source
|
|
// or destination IP address, then return.
|
|
//
|
|
if (!pTCB->tcb_saddr || !pTCB->tcb_daddr) {
|
|
CTEFreeLock(&pTCB->tcb_lock, Handle);
|
|
return;
|
|
}
|
|
//
|
|
// We also know we aren't interested in
|
|
// any connections on the 127 network.
|
|
//
|
|
if (UC(&pTCB->tcb_daddr, 0) == 127) {
|
|
CTEFreeLock(&pTCB->tcb_lock, Handle);
|
|
return;
|
|
}
|
|
//
|
|
// Get the address of the connection.
|
|
//
|
|
addr.fType = ACD_ADDR_IP;
|
|
addr.ulIpaddr = pTCB->tcb_daddr;
|
|
adapter.fType = ACD_ADAPTER_IP;
|
|
adapter.ulIpaddr = pTCB->tcb_saddr;
|
|
//
|
|
// Release the TCB lock handle before
|
|
// calling out of this driver.
|
|
//
|
|
CTEFreeLock(&pTCB->tcb_lock, Handle);
|
|
//
|
|
// Inform the automatic connection driver
|
|
// of the new connection.
|
|
//
|
|
(*AcdDriverG.lpfnNewConnection) (&addr, &adapter);
|
|
} // TCPNoteNewConnection
|
|
|
|
VOID
|
|
TCPAcdBind()
|
|
{
|
|
NTSTATUS status;
|
|
UNICODE_STRING nameString;
|
|
IO_STATUS_BLOCK ioStatusBlock;
|
|
PIRP pIrp;
|
|
PFILE_OBJECT pAcdFileObject;
|
|
PDEVICE_OBJECT pAcdDeviceObject;
|
|
PACD_DRIVER pDriver = &AcdDriverG;
|
|
|
|
//
|
|
// Initialize the name of the automatic
|
|
// connection device.
|
|
//
|
|
RtlInitUnicodeString(&nameString, ACD_DEVICE_NAME);
|
|
//
|
|
// Get the file and device objects for the
|
|
// device.
|
|
//
|
|
status = IoGetDeviceObjectPointer(
|
|
&nameString,
|
|
SYNCHRONIZE | GENERIC_READ | GENERIC_WRITE,
|
|
&pAcdFileObject,
|
|
&pAcdDeviceObject);
|
|
if (status != STATUS_SUCCESS)
|
|
return;
|
|
//
|
|
// Reference the device object.
|
|
//
|
|
ObReferenceObject(pAcdDeviceObject);
|
|
//
|
|
// Remove the reference IoGetDeviceObjectPointer()
|
|
// put on the file object.
|
|
//
|
|
ObDereferenceObject(pAcdFileObject);
|
|
//
|
|
// Initialize our part of the ACD_DRIVER
|
|
// structure.
|
|
//
|
|
KeInitializeSpinLock(&AcdDriverG.SpinLock);
|
|
AcdDriverG.ulDriverId = ulDriverIdG;
|
|
AcdDriverG.fEnabled = FALSE;
|
|
//
|
|
// Build a request to get the automatic
|
|
// connection driver entry points.
|
|
//
|
|
pIrp = IoBuildDeviceIoControlRequest(
|
|
IOCTL_INTERNAL_ACD_BIND,
|
|
pAcdDeviceObject,
|
|
(PVOID) & pDriver,
|
|
sizeof(pDriver),
|
|
NULL,
|
|
0,
|
|
TRUE,
|
|
NULL,
|
|
&ioStatusBlock);
|
|
if (pIrp == NULL) {
|
|
ObDereferenceObject(pAcdDeviceObject);
|
|
return;
|
|
}
|
|
//
|
|
// Submit the request to the
|
|
// automatic connection driver.
|
|
//
|
|
status = IoCallDriver(pAcdDeviceObject, pIrp);
|
|
fAcdLoadedG = (status == STATUS_SUCCESS)? TRUE:FALSE;
|
|
//
|
|
// Close the device.
|
|
//
|
|
ObDereferenceObject(pAcdDeviceObject);
|
|
} // TCPAcdBind
|
|
|
|
VOID
|
|
TCPAcdUnbind()
|
|
{
|
|
NTSTATUS status;
|
|
UNICODE_STRING nameString;
|
|
IO_STATUS_BLOCK ioStatusBlock;
|
|
PIRP pIrp;
|
|
PFILE_OBJECT pAcdFileObject;
|
|
PDEVICE_OBJECT pAcdDeviceObject;
|
|
PACD_DRIVER pDriver = &AcdDriverG;
|
|
|
|
//
|
|
// Don't bother to unbind if we
|
|
// didn't successfully bind in the
|
|
// first place.
|
|
//
|
|
if (!fAcdLoadedG)
|
|
return;
|
|
//
|
|
// Initialize the name of the automatic
|
|
// connection device.
|
|
//
|
|
RtlInitUnicodeString(&nameString, ACD_DEVICE_NAME);
|
|
//
|
|
// Get the file and device objects for the
|
|
// device.
|
|
//
|
|
status = IoGetDeviceObjectPointer(
|
|
&nameString,
|
|
SYNCHRONIZE | GENERIC_READ | GENERIC_WRITE,
|
|
&pAcdFileObject,
|
|
&pAcdDeviceObject);
|
|
if (status != STATUS_SUCCESS)
|
|
return;
|
|
//
|
|
// Reference the device object.
|
|
//
|
|
ObReferenceObject(pAcdDeviceObject);
|
|
//
|
|
// Remove the reference IoGetDeviceObjectPointer()
|
|
// put on the file object.
|
|
//
|
|
ObDereferenceObject(pAcdFileObject);
|
|
//
|
|
// Build a request to unbind from
|
|
// the automatic connection driver.
|
|
//
|
|
pIrp = IoBuildDeviceIoControlRequest(
|
|
IOCTL_INTERNAL_ACD_UNBIND,
|
|
pAcdDeviceObject,
|
|
(PVOID) & pDriver,
|
|
sizeof(pDriver),
|
|
NULL,
|
|
0,
|
|
TRUE,
|
|
NULL,
|
|
&ioStatusBlock);
|
|
if (pIrp == NULL) {
|
|
ObDereferenceObject(pAcdDeviceObject);
|
|
return;
|
|
}
|
|
//
|
|
// Submit the request to the
|
|
// automatic connection driver.
|
|
//
|
|
status = IoCallDriver(pAcdDeviceObject, pIrp);
|
|
//
|
|
// Close the device.
|
|
//
|
|
ObDereferenceObject(pAcdDeviceObject);
|
|
} // TCPAcdUnbind
|
|
|