742 lines
14 KiB
C
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;
|
|
|
|
}
|