|
|
/*++
Copyright (c) 1995-1996 Micrososfft Corporation
Module Name:
pxinit.c
Abstract:
The module contains the init code for the NDIS Proxy.
Author:
Richard Machin (RMachin) Revision History:
Who When What -------- -------- ---------------------------------------------- RMachin 10-3-96 created TonyBe 02-21-99 re-work/re-write
Notes:
--*/
#include <precomp.h>
#define MODULE_NUMBER MODULE_INIT
#define _FILENUMBER 'TINI'
//
// Local defines...
//
NDIS_STATUS GetConfigDword( NDIS_HANDLE Handle, PWCHAR ParameterName, PULONG Destination, ULONG MinValue, ULONG MaxValue );
BOOLEAN InitNDISProxy( VOID ) /*++
Routine Description
The main init routine. We:
read our configuration register as a protocol open the appropriate cards as a client (call ActivateBinding, which: Opens the appropriate address families Opens the cards as a Call Manager)
Arguments
None
Calling Sequence:
Called from pxntinit/DriverEntry
Return Value:
TRUE if initalization succeeds.
--*/ {
NDIS_PROTOCOL_CHARACTERISTICS PxProtocolCharacteristics; NDIS_STATUS Status; NDIS_HANDLE ConfigHandle; PVOID Context; PVOID BindingList; PNDIS_STRING BindingNameString;
PXDEBUGP(PXD_INFO, PXM_INIT, ("InitNdisProxy\n"));
// Registering NDIS protocols.
NdisZeroMemory(&PxProtocolCharacteristics, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
PxProtocolCharacteristics.MajorNdisVersion = NDIS_MAJOR_VERSION; PxProtocolCharacteristics.MinorNdisVersion = NDIS_MINOR_VERSION; PxProtocolCharacteristics.Filler = (USHORT)0; PxProtocolCharacteristics.Flags = NDIS_PROTOCOL_PROXY | NDIS_PROTOCOL_BIND_ALL_CO; PxProtocolCharacteristics.OpenAdapterCompleteHandler = PxCoOpenAdaperComplete; PxProtocolCharacteristics.CloseAdapterCompleteHandler = PxCoCloseAdaperComplete; PxProtocolCharacteristics.TransferDataCompleteHandler = PxCoTransferDataComplete; PxProtocolCharacteristics.ResetCompleteHandler = PxCoResetComplete; PxProtocolCharacteristics.SendCompleteHandler = PxCoSendComplete; PxProtocolCharacteristics.RequestCompleteHandler = PxCoRequestComplete; PxProtocolCharacteristics.ReceiveHandler = NULL; PxProtocolCharacteristics.ReceiveCompleteHandler = PxCoReceiveComplete; PxProtocolCharacteristics.ReceivePacketHandler = NULL; PxProtocolCharacteristics.StatusHandler = NULL; PxProtocolCharacteristics.StatusCompleteHandler = PxCoStatusComplete; PxProtocolCharacteristics.BindAdapterHandler = PxCoBindAdapter; PxProtocolCharacteristics.UnbindAdapterHandler = PxCoUnbindAdapter; PxProtocolCharacteristics.PnPEventHandler = PxCoPnPEvent; PxProtocolCharacteristics.UnloadHandler = PxCoUnloadProtocol; PxProtocolCharacteristics.CoStatusHandler = PxCoStatus; PxProtocolCharacteristics.CoReceivePacketHandler = PxCoReceivePacket; PxProtocolCharacteristics.CoAfRegisterNotifyHandler = PxCoNotifyAfRegistration; NdisInitUnicodeString(&(PxProtocolCharacteristics.Name), PX_NAME);
//
// To block BindAdapter till all RegisterProtocols are done.
//
NdisInitializeEvent(&DeviceExtension->NdisEvent);
//
// Now register ourselves as a CM with NDIS.
//
PXDEBUGP(PXD_LOUD,PXM_INIT, ("Registering Protocol\n")); NdisRegisterProtocol(&Status, &(DeviceExtension->PxProtocolHandle), &PxProtocolCharacteristics, sizeof(PxProtocolCharacteristics));
if (Status != NDIS_STATUS_SUCCESS) { PXDEBUGP(PXD_INFO, PXM_INIT, ("Protocol registration failed!\n")); return FALSE; }
//
// Allow BindAdapter to proceed.
//
NdisSetEvent(&DeviceExtension->NdisEvent);
return TRUE; }
VOID GetRegistryParameters( IN PUNICODE_STRING RegistryPath )
/*++
Routine Description:
This routine stores the configuration information for this device.
Arguments:
RegistryPath - Pointer to the null-terminated Unicode name of the registry path for this driver.
Return Value:
None. As a side-effect, sets DeviceExtension->EventDataQueuLength field
--*/
{ NDIS_STRING ProtocolName; ULONG ulDefaultData = 0; ULONG ulMaxRate = -1; NTSTATUS Status = STATUS_SUCCESS; HANDLE hHandle, hParamsKeyHandle = NULL; NDIS_STRING KeyName; USHORT DefaultMediaType[] = L"Unspecfied ADSL Media";
NdisInitUnicodeString(&ProtocolName, L"NDProxy"); NdisInitUnicodeString(&KeyName, L"Parameters");
//
// Open the Proxy's key in the registry.
//
NdisOpenProtocolConfiguration(&Status, &hHandle, &ProtocolName);
if (Status != NDIS_STATUS_SUCCESS) { Status = STATUS_UNSUCCESSFUL; } else { NdisOpenConfigurationKeyByName(&Status, hHandle, //"HKLM/CCS/NDProxy"
&KeyName, //"Parameters"
&hParamsKeyHandle);
if (NT_SUCCESS(Status)) { ULONG ulResult; PNDIS_CONFIGURATION_PARAMETER pNdisConfigurationParameter;
//
// Gather all of the "user specified" information from
// the registry.
//
Status = GetConfigDword (hParamsKeyHandle, L"TxRate", &DeviceExtension->ADSLTxRate, ulDefaultData, ulMaxRate);
if (!NT_SUCCESS(Status)) { PXDEBUGP(PXD_LOUD, PXM_INIT, ( "GetRegistryParameters: NdisReadConfiguration failed, err=%x\n", Status )); } else { DeviceExtension->RegistryFlags |= ADSL_TX_RATE_FROM_REG; }
//
// Next
//
Status = GetConfigDword (hParamsKeyHandle, L"RxRate", &DeviceExtension->ADSLRxRate, ulDefaultData, ulMaxRate);
if (!NT_SUCCESS(Status)) { PXDEBUGP(PXD_LOUD, PXM_INIT, ( "GetRegistryParameters: NdisReadConfiguration failed, err=%x\n", Status)); } else { DeviceExtension->RegistryFlags |= ADSL_RX_RATE_FROM_REG; }
//
// Dump values
//
PXDEBUGP (PXD_LOUD, PXM_INIT, ( "GetRegistryParameters: ADSLTxRate = %x\n", DeviceExtension->ADSLTxRate )); PXDEBUGP (PXD_LOUD, PXM_INIT, ( "GetRegistryParameters: ADSLRxRate = %x\n", DeviceExtension->ADSLRxRate )); } } }
NDIS_STATUS GetConfigDword( NDIS_HANDLE Handle, PWCHAR ParameterName, PULONG Destination, ULONG MinValue, ULONG MaxValue ) /*++
Routine Description
A routine to read a ulong from the registry. We're given a handle, the name of the key, and where to put it.
Arguments
Handle - Open handle to the parent key. ParameterName - Pointer to name of the parameter. Destination - Where to put the dword. MinValue - Minimum value of the dword allowed. MaxValue - Maximum allowable value.
Return Value:
NDIS_STATUS_SUCCESS if we read in the value, error code otherwise.
--*/ { NDIS_STATUS Status; ULONG Value; NDIS_STRING ParameterNameString; PNDIS_CONFIGURATION_PARAMETER pNdisConfigurationParameter;
NdisInitUnicodeString( &ParameterNameString, ParameterName );
NdisReadConfiguration( &Status, &pNdisConfigurationParameter, Handle, &ParameterNameString, NdisParameterInteger );
if (Status == NDIS_STATUS_SUCCESS) { Value = pNdisConfigurationParameter->ParameterData.IntegerData;
if ((Value >= (ULONG)MinValue) && (Value <= (ULONG)MaxValue)) { *Destination = (ULONG)Value; } }
return (Status); }
|