windows-nt/Source/XPSP1/NT/net/atm/epvc/sys/wrapper.c
2020-09-26 16:20:57 +08:00

742 lines
14 KiB
C

/*++
Copyright(c) 1992 Microsoft Corporation
Module Name:
wrapper.c
Abstract:
This file contains wrapper for all function calls that call outside atmepvc.sys.
Author:
ADube , 03/31/00
Environment:
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
VOID
epvcOpenProtocolConfiguration(
OUT PNDIS_STATUS Status,
OUT PNDIS_HANDLE ConfigurationHandle,
IN PNDIS_STRING ProtocolSection,
PRM_STACK_RECORD pSR
)
{
TRACE (TL_T, TM_Pt, (" == NdisOpenProtocolConfiguration") );
ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL);
NdisOpenProtocolConfiguration(Status,
ConfigurationHandle,
ProtocolSection);
}
VOID
epvcOpenConfigurationKeyByName(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE ConfigurationHandle,
IN PNDIS_STRING SubKeyName,
OUT PNDIS_HANDLE SubKeyHandle,
PRM_STACK_RECORD pSR
)
{
TRACE (TL_T, TM_Pt, (" == NdisOpenConfigurationKeyByName") );
ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL);
NdisOpenConfigurationKeyByName(
Status,
ConfigurationHandle,
SubKeyName,
SubKeyHandle
);
}
VOID
epvcOpenConfigurationKeyByIndex(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE ConfigurationHandle,
IN ULONG Index,
OUT PNDIS_STRING KeyName,
OUT PNDIS_HANDLE KeyHandle,
PRM_STACK_RECORD pSR
)
{
TRACE (TL_T, TM_Pt, (" == NdisOpenConfigurationKeyByIndex") );
ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL);
NdisOpenConfigurationKeyByIndex(
Status,
ConfigurationHandle,
Index,
KeyName,
KeyHandle);
}
VOID
epvcOpenAdapter(
OUT PNDIS_STATUS Status,
OUT PNDIS_STATUS OpenErrorStatus,
OUT PNDIS_HANDLE NdisBindingHandle,
OUT PUINT SelectedMediumIndex,
IN PNDIS_MEDIUM MediumArray,
IN UINT MediumArraySize,
IN NDIS_HANDLE NdisProtocolHandle,
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_STRING AdapterName,
IN UINT OpenOptions,
IN PSTRING AddressingInformation OPTIONAL,
PRM_STACK_RECORD pSR
)
{
TRACE (TL_T, TM_Pt, (" == epvcOpenAdapter") );
ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL);
NdisOpenAdapter(
Status,
OpenErrorStatus,
NdisBindingHandle,
SelectedMediumIndex,
MediumArray,
MediumArraySize,
NdisProtocolHandle,
ProtocolBindingContext,
AdapterName,
OpenOptions,
AddressingInformation OPTIONAL
);
}
VOID
epvcCloseAdapter(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE NdisBindingHandle,
PRM_STACK_RECORD pSR
)
{
ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL);
TRACE (TL_T, TM_Pt, (" == epvcCloseAdapter") );
NdisCloseAdapter(
Status,
NdisBindingHandle
);
}
NDIS_STATUS
epvcClOpenAddressFamily(
IN NDIS_HANDLE NdisBindingHandle,
IN PCO_ADDRESS_FAMILY AddressFamily,
IN NDIS_HANDLE ProtocolAfContext,
IN PNDIS_CLIENT_CHARACTERISTICS ClCharacteristics,
IN UINT SizeOfClCharacteristics,
OUT PNDIS_HANDLE NdisAfHandle
)
{
TRACE (TL_T, TM_Pt, (" == epvcClOpenAddressFamily") );
ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL);
return NdisClOpenAddressFamily(
NdisBindingHandle,
AddressFamily,
ProtocolAfContext,
ClCharacteristics,
SizeOfClCharacteristics,
NdisAfHandle
);
}
NDIS_STATUS
epvcCoCreateVc(
IN NDIS_HANDLE NdisBindingHandle,
IN NDIS_HANDLE NdisAfHandle OPTIONAL, // For CM signalling VCs
IN NDIS_HANDLE ProtocolVcContext,
IN OUT PNDIS_HANDLE NdisVcHandle
)
{
TRACE (TL_T, TM_Pt, (" == epvcCoCreateVc") );
//ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL);
return NdisCoCreateVc(NdisBindingHandle,
NdisAfHandle OPTIONAL, // For CM signalling VCs
ProtocolVcContext,
NdisVcHandle
);
}
NDIS_STATUS
epvcClCloseCall(
IN NDIS_HANDLE NdisVcHandle
)
{
TRACE (TL_T, TM_Pt, (" == EpvcClCloseCall") );
ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL);
return NdisClCloseCall( NdisVcHandle,
NULL,
NULL,
0);
}
NDIS_STATUS
epvcClMakeCall(
IN NDIS_HANDLE NdisVcHandle,
IN OUT PCO_CALL_PARAMETERS CallParameters,
IN NDIS_HANDLE ProtocolPartyContext OPTIONAL,
OUT PNDIS_HANDLE NdisPartyHandle OPTIONAL
)
{
TRACE (TL_T, TM_Pt, (" == EpvcClMakeCall") );
ASSERT (NdisVcHandle != NULL);
//ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL);
return NdisClMakeCall( NdisVcHandle,
CallParameters,
ProtocolPartyContext OPTIONAL,
NdisPartyHandle OPTIONAL
);
}
NDIS_STATUS
epvcCoDeleteVc(
IN NDIS_HANDLE NdisVcHandle
)
{
TRACE (TL_T, TM_Pt, (" == epvcCoDeleteVc") );
ASSERT (NdisVcHandle!= NULL);
ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL);
return NdisCoDeleteVc(NdisVcHandle);
}
NDIS_STATUS
epvcAllocateMemoryWithTag(
OUT PVOID * VirtualAddress,
IN UINT Length,
IN ULONG Tag
)
{
return NdisAllocateMemoryWithTag(
VirtualAddress,
Length,
Tag
);
}
VOID
epvcFreeMemory(
IN PVOID VirtualAddress,
IN UINT Length,
IN UINT MemoryFlags
)
{
NdisFreeMemory( VirtualAddress,
Length,
MemoryFlags
);
}
VOID
epvcInitializeEvent(
IN PNDIS_EVENT Event
)
{
ASSERT (KeGetCurrentIrql() == PASSIVE_LEVEL);
NdisInitializeEvent(Event);
}
BOOLEAN
epvcWaitEvent(
IN PNDIS_EVENT Event,
IN UINT msToWait
)
{
return (NdisWaitEvent(Event,msToWait));
}
VOID
epvcSetEvent(
IN PNDIS_EVENT Event
)
{
NdisSetEvent(Event);
}
VOID
epvcResetEvent(
IN PNDIS_EVENT Event
)
{
NdisResetEvent(Event);
}
VOID
epvcCoRequestComplete(
IN NDIS_STATUS Status,
IN NDIS_HANDLE NdisAfHandle,
IN NDIS_HANDLE NdisVcHandle OPTIONAL,
IN NDIS_HANDLE NdisPartyHandle OPTIONAL,
IN PNDIS_REQUEST NdisRequest
)
{
TRACE (TL_T, TM_Cl, ("-- epvcCoRequestComplete"));
NdisCoRequestComplete(Status,
NdisAfHandle,
NdisVcHandle OPTIONAL,
NdisPartyHandle OPTIONAL,
NdisRequest
);
}
VOID
epvcEnumerateObjectsInGroup (
PRM_GROUP pGroup,
PFN_RM_GROUP_ENUMERATOR pfnEnumerator,
PVOID pvContext,
PRM_STACK_RECORD pSR
)
{
RmWeakEnumerateObjectsInGroup(pGroup,
pfnEnumerator,
pvContext,
pSR
);
return;
}
VOID
epvcAllocatePacketPool(
OUT PNDIS_STATUS Status,
OUT PEPVC_PACKET_POOL pPktPool,
IN UINT NumberOfDescriptors,
IN UINT NumberOfOverflowDescriptors,
IN UINT ProtocolReservedLength
)
{
EPVC_ZEROSTRUCT(pPktPool);
NdisAllocatePacketPoolEx(
Status,
&pPktPool->Handle,
NumberOfDescriptors,
NumberOfOverflowDescriptors,
ProtocolReservedLength
);
}
VOID
epvcFreePacketPool(
IN PEPVC_PACKET_POOL pPktPool
)
{
//
// Callable at PASSIVE ONLY
//
UINT i = 0;
ASSERT (pPktPool->Handle != NULL);
while (NdisPacketPoolUsage(pPktPool->Handle) != 0)
{
if (i >0)
{
TRACE (TL_I, TM_Mp, ("Looping in epvcFreePacketPool"));
}
NdisMSleep (10000); // 10 ms
i++;
}
NdisFreePacketPool(pPktPool->Handle );
//
// Zero out the Handle,
//
EPVC_ZEROSTRUCT (pPktPool);
}
VOID
epvcAllocatePacket(
OUT PNDIS_STATUS Status,
OUT PNDIS_PACKET * Packet,
IN PEPVC_PACKET_POOL pPktPool
)
{
NdisAllocatePacket(Status,Packet,pPktPool->Handle);
if (*Status == NDIS_STATUS_SUCCESS)
{
NdisInterlockedIncrement (&pPktPool->AllocatedPackets);
}
else
{
Packet = NULL;
}
}
VOID
epvcFreePacket (
IN PNDIS_PACKET pPkt,
IN PEPVC_PACKET_POOL pPool
)
{
NdisInterlockedDecrement (&pPool->AllocatedPackets);
NdisFreePacket(pPkt);
}
VOID
epvcDprFreePacket(
IN PNDIS_PACKET Packet,
IN PEPVC_PACKET_POOL pPool
)
{
NdisInterlockedDecrement (&pPool->AllocatedPackets);
NdisDprFreePacket(Packet);
}
VOID
epvcDprAllocatePacket(
OUT PNDIS_STATUS Status,
OUT PNDIS_PACKET * Packet,
IN PEPVC_PACKET_POOL pPktPool
)
{
NdisDprAllocatePacket( Status,
Packet,
pPktPool->Handle );
if (*Status == NDIS_STATUS_SUCCESS)
{
NdisInterlockedIncrement (&pPktPool->AllocatedPackets);
}
else
{
Packet = NULL;
}
}
NDIS_STATUS
epvcClCloseAddressFamily(
IN NDIS_HANDLE NdisAfHandle
)
{
TRACE (TL_V, TM_Pt, ("epvcClCloseAddressFamily "));
return NdisClCloseAddressFamily(NdisAfHandle);
}
VOID
epvcMIndicateStatus(
IN PEPVC_I_MINIPORT pMiniport ,
IN NDIS_STATUS GeneralStatus,
IN PVOID StatusBuffer,
IN UINT StatusBufferSize
)
{
if (CanMiniportIndicate(pMiniport) == FALSE)
{
return;
}
NdisMIndicateStatus(pMiniport->ndis.MiniportAdapterHandle,
GeneralStatus,
StatusBuffer,
StatusBufferSize
);
}
VOID
epvcMIndicateReceivePacket(
IN PEPVC_I_MINIPORT pMiniport,
IN PPNDIS_PACKET ReceivedPackets,
IN UINT NumberOfPackets
)
{
NdisMIndicateReceivePacket(pMiniport->ndis.MiniportAdapterHandle,
ReceivedPackets,
NumberOfPackets );
}
VOID
epvcFreeBuffer(
IN PNDIS_BUFFER Buffer
)
{
NdisFreeBuffer(Buffer);
}
VOID
epvcAllocateBuffer(
OUT PNDIS_STATUS Status,
OUT PNDIS_BUFFER * Buffer,
IN NDIS_HANDLE PoolHandle,
IN PVOID VirtualAddress,
IN UINT Length
)
{
NdisAllocateBuffer(Status,
Buffer,
PoolHandle,
VirtualAddress,
Length
);
}
VOID
epvcMSendComplete(
IN PEPVC_I_MINIPORT pMiniport,
IN PNDIS_PACKET pPkt,
IN NDIS_STATUS Status
)
{
epvcValidatePacket (pPkt);
NdisMSendComplete(pMiniport->ndis.MiniportAdapterHandle,
pPkt,
Status);
}
VOID
epvcReturnPacketToNdis(
IN PEPVC_I_MINIPORT pMiniport,
IN PNDIS_PACKET pPacket,
IN PRM_STACK_RECORD pSR
)
{
epvcValidatePacket (pPacket);
NdisReturnPackets(&pPacket, 1 );
}
VOID
epvcInitializeWorkItem(
IN PRM_OBJECT_HEADER pObj,
IN PNDIS_WORK_ITEM WorkItem,
IN NDIS_PROC Routine,
IN PVOID Context,
IN PRM_STACK_RECORD pSR
)
{
NdisInitializeWorkItem(WorkItem,
Routine,
Context);
NdisScheduleWorkItem(WorkItem);
}
VOID
epvcCoSendPackets(
IN NDIS_HANDLE NdisVcHandle,
IN PPNDIS_PACKET PacketArray,
IN UINT NumberOfPackets
)
{
ASSERT (NumberOfPackets == 1);
epvcValidatePacket (*PacketArray);
NdisCoSendPackets(NdisVcHandle,PacketArray,NumberOfPackets);
}
VOID
epvcQueryPacket(
IN PNDIS_PACKET _Packet,
OUT PUINT _PhysicalBufferCount OPTIONAL,
OUT PUINT _BufferCount OPTIONAL,
OUT PNDIS_BUFFER * _FirstBuffer OPTIONAL,
OUT PUINT _TotalPacketLength OPTIONAL
)
{
NdisQueryPacket(
_Packet,
_PhysicalBufferCount OPTIONAL,
_BufferCount OPTIONAL,
_FirstBuffer OPTIONAL,
_TotalPacketLength OPTIONAL
);
}
VOID
epvcIMDeInitializeDeviceInstance (
IN PEPVC_I_MINIPORT pMiniport
)
{
TRACE (TL_I, TM_Pt, (" NdisIMDeInitializeDeviceInstance pMiniport %p", pMiniport) );
NdisIMDeInitializeDeviceInstance(pMiniport->ndis.MiniportAdapterHandle);
}
NDIS_STATUS
epvcIMCancelInitializeDeviceInstance (
IN PEPVC_I_MINIPORT pMiniport
)
{
NDIS_STATUS Status;
TRACE (TL_I, TM_Pt, (" NdisIMCancelInitializeDeviceInstance pMiniport %p", pMiniport) );
Status = NdisIMCancelInitializeDeviceInstance (EpvcGlobals.driver.DriverHandle,&pMiniport->ndis.DeviceName);
TRACE (TL_I, TM_Pt, (" Status %x\n", Status) );
return Status;
}