|
|
/*++
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
|