Leaked source code of windows server 2003
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.
|
|
// Copyright (c) 1997, Microsoft Corporation, all rights reserved
//
// main.c
// RAS L2TP WAN mini-port/call-manager driver
// Main routine (DriverEntry) and global data definitions
//
// 01/07/97 Steve Cobb
#include "l2tpp.h"
#include "main.tmh"
//-----------------------------------------------------------------------------
// Local prototypes
//-----------------------------------------------------------------------------
NDIS_STATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath );
// Mark routine to be unloaded after initialization.
//
#pragma NDIS_INIT_FUNCTION(DriverEntry)
PDRIVER_OBJECT g_DriverObject = NULL;
VOID LmpUnload( PVOID DriverObject) { if(g_DriverObject != NULL) { WPP_CLEANUP(g_DriverObject); } }
//-----------------------------------------------------------------------------
// Routines
//-----------------------------------------------------------------------------
NDIS_STATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )
// Standard 'DriverEntry' driver initialization entrypoint called by the
// I/0 system at IRQL PASSIVE_LEVEL before any other call to the driver.
//
// On NT, 'DriverObject' is the driver object created by the I/0 system
// and 'RegistryPath' specifies where driver specific parameters are
// stored. These arguments are opaque to this driver (and should remain
// so for portability) which only forwards them to the NDIS wrapper.
//
// Returns the value returned by NdisMRegisterMiniport, per the doc on
// "DriverEntry of NDIS Miniport Drivers".
//
{ NDIS_STATUS status; NDIS_MINIPORT_CHARACTERISTICS nmc; NDIS_HANDLE NdisWrapperHandle;
TRACE( TL_N, TM_Init, ( "DriverEntry" ) );
// Register this driver with the NDIS wrapper. This call must occur
// before any other NdisXxx calls.
//
NdisMInitializeWrapper( &NdisWrapperHandle, DriverObject, RegistryPath, NULL );
// Set up the mini-port characteristics table that tells NDIS how to call
// our mini-port.
//
NdisZeroMemory( &nmc, sizeof(nmc) );
nmc.MajorNdisVersion = NDIS_MajorVersion; nmc.MinorNdisVersion = NDIS_MinorVersion; nmc.Reserved = NDIS_USE_WAN_WRAPPER; // no CheckForHangHandler
// no DisableInterruptHandler
// no EnableInterruptHandler
nmc.HaltHandler = LmpHalt; // no HandleInterruptHandler
nmc.InitializeHandler = LmpInitialize; // no ISRHandler
// no QueryInformationHandler (see CoRequestHandler)
nmc.ResetHandler = LmpReset; // no SendHandler (see CoSendPacketsHandler)
// no WanSendHandler (see CoSendPacketsHandler)
// no SetInformationHandler (see CoRequestHandler)
// no TransferDataHandler
// no WanTransferDataHandler
nmc.ReturnPacketHandler = LmpReturnPacket; // no SendPacketsHandler (see CoSendPacketsHandler)
// no AllocateCompleteHandler
nmc.CoActivateVcHandler = LmpCoActivateVc; nmc.CoDeactivateVcHandler = LmpCoDeactivateVc; nmc.CoSendPacketsHandler = LmpCoSendPackets; nmc.CoRequestHandler = LmpCoRequest;
// Register this driver as the L2TP mini-port. This will result in NDIS
// calling back at LmpInitialize.
//
TRACE( TL_V, TM_Init, ( "NdisMRegMp" ) ); status = NdisMRegisterMiniport( NdisWrapperHandle, &nmc, sizeof(nmc) ); TRACE( TL_A, TM_Init, ( "NdisMRegMp=$%x", status ) );
if (status == NDIS_STATUS_SUCCESS) { { extern CALLSTATS g_stats; extern NDIS_SPIN_LOCK g_lockStats;
NdisZeroMemory( &g_stats, sizeof(g_stats) ); NdisAllocateSpinLock( &g_lockStats ); }
#ifdef PSDEBUG
{ extern LIST_ENTRY g_listDebugPs; extern NDIS_SPIN_LOCK g_lockDebugPs;
InitializeListHead( &g_listDebugPs ); NdisAllocateSpinLock( &g_lockDebugPs ); } #endif
// WPP tracing support
NdisMRegisterUnloadHandler(NdisWrapperHandle, LmpUnload); g_DriverObject = DriverObject; WPP_INIT_TRACING(DriverObject, RegistryPath); } else { NdisTerminateWrapper( NdisWrapperHandle, NULL ); }
return status; }
|