Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

309 lines
6.4 KiB

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
autodial.c
Abstract:
NT specific routines for interfacing with the
RAS AutoDial driver (rasacd.sys).
Author:
Anthony Discolo (adiscolo) 27-May-1996
Revision History:
Who When What
-------- ----------- ---------------------------------------------
adiscolo 27-May-1996 created
Notes:
--*/
#include "precomp.h"
#pragma hdrstop
#ifdef RASAUTODIAL
#include <acd.h>
#include <acdapi.h>
//
// Global variables
//
BOOLEAN fAcdLoadedG;
ACD_DRIVER AcdDriverG;
ULONG ulDriverIdG = 'Rdr ';
VOID
RdrRetryCallServer(
IN BOOLEAN fSuccess,
IN PVOID *pArgs
)
/*++
Routine Description:
This routine is called indirectly by the automatic
connection driver to continue the connection process
after an automatic connection has been made.
Arguments:
fSuccess - TRUE if the connection attempt was successful.
pArgs - a pointer to the argument vector
Return Value:
None.
--*/
{
HANDLE hEvent = pArgs[0];
#ifdef DBG
DbgPrint(
"RdrRetryCallServer: fSuccess=%d, hEvent=0x%x\n",
fSuccess,
hEvent);
#endif
KeSetEvent(hEvent, IO_NETWORK_INCREMENT, FALSE);
} /* RdrRetryCallServer */
VOID
RdrAttemptAutoDial(
IN PUNICODE_STRING pServer
)
/*++
Routine Description:
Call the automatic connection driver to attempt an
automatic connection.
Arguments:
pServer - a pointer to UNICODE_STRING containing the server name
Return Value:
TRUE if the automatic connection was started successfully,
FALSE otherwise.
--*/
{
NTSTATUS status;
ACD_ADDR addr;
PVOID pArgs[1];
OEM_STRING AnsiPath;
KEVENT event;
//
// Get the address of the connection.
//
status = RtlUnicodeStringToOemString(&AnsiPath, pServer, TRUE);
if (!NT_SUCCESS(status))
return;
addr.fType = ACD_ADDR_NB;
RtlCopyMemory(addr.cNetbios, AnsiPath.Buffer, 16);
RtlFreeOemString(&AnsiPath);
#ifdef DBG
DbgPrint("RdrAttemptAutoDial: Server=%-15.15s\n", addr.cNetbios);
#endif
//
// Create an event that will be signalled
// by RdrRetryCallServer when the connection
// process has completed.
//
KeInitializeEvent(&event, SynchronizationEvent, FALSE);
//
// Attempt to start the connection. RdrRetryCallServer
// will be called when the connection process has
// completed.
//
pArgs[0] = &event;
if (!(*AcdDriverG.lpfnStartConnection)(
ulDriverIdG,
&addr,
0,
RdrRetryCallServer,
1,
pArgs))
{
return;
}
//
// Wait for the connection to complete.
//
status = KeWaitForSingleObject(
&event,
Executive,
KernelMode,
FALSE,
NULL);
} // RdrAttemptAutoDial
VOID
RdrAcdBind(VOID)
{
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);
//
// Close the device.
//
ObDereferenceObject(pAcdDeviceObject);
} // RdrAcdBind
VOID
RdrAcdUnbind(VOID)
{
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 uRdrnd 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 uRdrnd 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);
} // RdrAcdUnbind
#endif // RASAUTODIAL