NT4/private/ntos/tdi/nbf/nbfpnp.c
2020-09-30 17:12:29 +02:00

211 lines
5.4 KiB
C

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
nbfpnp.c
Abstract:
This module contains code which allocates and initializes all data
structures needed to activate a plug and play binding. It also informs
tdi (and thus nbf clients) of new devices and protocol addresses.
Author:
Jim McNelis (jimmcn) 1-Jan-1996
Environment:
Kernel mode
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
#ifdef _PNP_POWER
PCONFIG_DATA NbfConfig = NULL;
SuccessfulOpens = 0;
#ifdef RASAUTODIAL
VOID
NbfAcdBind();
VOID
NbfAcdUnbind();
#endif // RASAUTODIAL
VOID
NbfProtocolBindAdapter(
OUT PNDIS_STATUS NdisStatus,
IN NDIS_HANDLE BindContext,
IN PNDIS_STRING DeviceName,
IN PVOID SystemSpecific1,
IN PVOID SystemSpecific2
)
/*++
Routine Description:
This routine activates a transport binding and exposes the new device
and associated addresses to transport clients. This is done by reading
the registry, and performing any one time initialization of the transport
and then natching the device to bind to with the linkage information from
the registry. If we have a match for that device the bind will be
performed.
Arguments:
NdisStatus - The status of the bind.
BindContext - A context used for NdisCompleteBindAdapter() if
STATUS_PENDING is returned.
DeviceName - The name of the device that we are binding with.
SystemSpecific1 - Unused (a pointer to an NDIS_STRING to use with
NdisOpenProtocolConfiguration. This is not used by nbf
since there is no adapter specific information when
configuring the protocol via the registry.
SystemSpecific2 - Currently unused.
Return Value:
None.
--*/
{
ULONG j;
NTSTATUS status;
if (NbfConfig == NULL) {
//
// This allocates the CONFIG_DATA structure and returns
// it in NbfConfig.
//
status = NbfConfigureTransport(&NbfRegistryPath, &NbfConfig);
if (!NT_SUCCESS (status)) {
PANIC (" Failed to initialize transport, Nbf binding failed.\n");
*NdisStatus = NDIS_STATUS_RESOURCES;
return;
}
#if DBG
//
// Allocate the debugging tables.
//
NbfConnectionTable = (PVOID *)ExAllocatePoolWithTag(NonPagedPool,
sizeof(PVOID) *
(NbfConfig->InitConnections + 2 +
NbfConfig->InitRequests + 2 +
NbfConfig->InitUIFrames + 2 +
NbfConfig->InitPackets + 2 +
NbfConfig->InitLinks + 2 +
NbfConfig->InitAddressFiles + 2 +
NbfConfig->InitAddresses + 2),
' FBN');
ASSERT (NbfConnectionTable);
#if 0
if (NbfConnectionTable == NULL) {
*NdisStatus = NDIS_STATUS_RESOURCES;
return;
}
#endif
NbfRequestTable = NbfConnectionTable + (NbfConfig->InitConnections + 2);
NbfUiFrameTable = NbfRequestTable + (NbfConfig->InitRequests + 2);
NbfSendPacketTable = NbfUiFrameTable + (NbfConfig->InitUIFrames + 2);
NbfLinkTable = NbfSendPacketTable + (NbfConfig->InitPackets + 2);
NbfAddressFileTable = NbfLinkTable + (NbfConfig->InitLinks + 2);
NbfAddressTable = NbfAddressFileTable +
(NbfConfig->InitAddressFiles + 2);
#endif
}
for (j=0;j<NbfConfig->NumAdapters;j++ ) {
//
// Loop through all the adapters that are in the configuration
// information structure until we find the one that ndis is calling
// Protocol bind adapter for.
//
if (NdisEqualString(DeviceName, &NbfConfig->Names[j], TRUE)) {
break;
}
}
SuccessfulOpens += NbfInitializeOneDeviceContext(NdisStatus,
NbfDriverObject,
NbfConfig, j
);
if (SuccessfulOpens == 1 && *NdisStatus == NDIS_STATUS_SUCCESS) {
#if DBG
DbgPrint("Calling NbfAcdBind()\n");
#endif
//
// If this is the first successful open.
//
#ifdef RASAUTODIAL
//
// Get the automatic connection
// driver entry points.
//
NbfAcdBind();
#endif // RASAUTODIAL
}
return;
}
VOID
NbfProtocolUnbindAdapter(
OUT PNDIS_STATUS NdisStatus,
IN NDIS_HANDLE ProtocolBindContext,
IN PNDIS_HANDLE UnbindContext
)
/*++
Routine Description:
This routine deactivates a transport binding. Currently unimplemented.
Arguments:
NdisStatus - The status of the bind.
ProtocolBindContext - the context from the openadapter call
UnbindContext - A context for async unbinds.
Return Value:
None.
--*/
{
*NdisStatus = STATUS_NOT_IMPLEMENTED;
return;
}
#endif // _PNP_POWER