295 lines
8.7 KiB
C
295 lines
8.7 KiB
C
/*++
|
|
|
|
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);
|
|
}
|
|
|