/*++ 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; }