Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1033 lines
16 KiB

/*++
Copyright (c) 1992-1996 Microsoft Corporation
Module Name:
protos.h
Abstract:
This file contains the function proto-types and macros.
Author:
Jameel Hyder ([email protected]) July 1996
Environment:
Kernel mode
Revision History:
--*/
#ifndef _PROTOS_
#define _PROTOS_
#define POOL_TAG_PG 'AprA'
#define POOL_TAG_VC 'VprA'
#define POOL_TAG_INTF 'IprA'
#define POOL_TAG_ADDR 'AprA'
#define POOL_TAG_BUF 'BprA'
#define POOL_TAG_REQ 'RprA'
#define POOL_TAG_SAP 'SprA'
#define POOL_TAG_BLK 'KprA'
#define POOL_TAG_MARS 'MprA'
#if DBG
extern
PVOID
ArpSAllocMem(
IN UINT Size,
IN ULONG FileLine,
IN ULONG Tag,
IN BOOLEAN Paged
);
extern
VOID
ArpSFreeMem(
IN PVOID pMem,
IN ULONG FileLine
);
#define ALLOC_NP_MEM(_size, _tag) ArpSAllocMem(_size, __LINE__ | _FILENUM_, _tag, FALSE)
#define ALLOC_PG_MEM(_size) ArpSAllocMem(_size, __LINE__ | _FILENUM_, POOL_TAG_PG, TRUE)
#define FREE_MEM(_p) ArpSFreeMem(_p, __LINE__ | _FILENUM_)
#else
#define ALLOC_NP_MEM(_size, _tag) ExAllocatePoolWithTag(NonPagedPool, _size, _tag)
#define ALLOC_PG_MEM(_size) ExAllocatePoolWithTag(PagedPool, _size, POOL_TAG_PG)
#define FREE_MEM(_p) ExFreePool(_p)
#endif
#define ZERO_MEM(_p, _size) RtlZeroMemory(_p, _size)
#define COPY_MEM(_d, _s, _size) RtlCopyMemory(_d, _s, _size)
#define MOVE_MEM(_d, _s, _size) RtlMoveMemory(_d, _s, _size)
#define COMP_MEM(_p1, _p2, _size_) RtlEqualMemory(_p1, _p2, _size_)
#define INITIALIZE_SPIN_LOCK(_l) KeInitializeSpinLock(_l)
#define ACQUIRE_SPIN_LOCK(_l, _i) KeAcquireSpinLock(_l, _i)
#define ACQUIRE_SPIN_LOCK_DPC(_l) KeAcquireSpinLockAtDpcLevel(_l)
#define RELEASE_SPIN_LOCK(_l, _i) KeReleaseSpinLock(_l, _i)
#define RELEASE_SPIN_LOCK_DPC(_l) KeReleaseSpinLockFromDpcLevel(_l)
#define INITIALIZE_MUTEX(_m_) KeInitializeMutex(_m_, 0xFFFF)
#define RELEASE_MUTEX(_m_) KeReleaseMutex(_m_, FALSE);
#define WAIT_FOR_OBJECT(_S_, _O_, _TO_) (_S_) = KeWaitForSingleObject(_O_, \
Executive, \
KernelMode, \
TRUE, \
_TO_) \
#define INIT_EVENT(_pEv) NdisInitializeEvent(_pEv)
#define SET_EVENT(_pEv) NdisSetEvent(_pEv)
#define WAIT_FOR_EVENT(_pEv) NdisWaitEvent(_pEv, 0)
extern
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
extern
NTSTATUS
ArpSDispatch(
IN PDEVICE_OBJECT pDeviceObject,
IN PIRP pIrp
);
extern
NTSTATUS
ArpSHandleIoctlRequest(
IN PIRP pIrp,
IN PIO_STACK_LOCATION pIrpSp
);
extern
NTSTATUS
ArpSEnumerateInterfaces(
IN PUCHAR pBuffer,
IN OUT PULONG_PTR pSize
);
extern
NTSTATUS
ArpSFlushArpCache(
IN PINTF pIntF
);
extern
NTSTATUS
ArpSQueryOrAddArpEntry(
IN PINTF pIntF,
IN OUT PIOCTL_QA_ENTRY pQaBuf,
IN OPERATION Operation
);
extern
NTSTATUS
ArpSQueryArpCache(
IN PINTF pIntF,
IN PUCHAR pBuf,
IN OUT PULONG_PTR pSize
);
extern
NTSTATUS
ArpSQueryArpStats(
IN PINTF pIntF,
OUT PARP_SERVER_STATISTICS pArpStats
);
extern
NTSTATUS
ArpSQueryMarsCache(
IN PINTF pIntF,
IN PUCHAR pBuf,
IN OUT PULONG_PTR pSize
);
extern
NTSTATUS
ArpSQueryMarsStats(
IN PINTF pIntF,
OUT PMARS_SERVER_STATISTICS pMarsStats
);
extern
VOID
ArpSResetStats(
IN PINTF pIntF
);
extern
VOID
ArpSUnload(
IN PDRIVER_OBJECT DriverObject
);
extern
VOID
ArpSShutDown(
VOID
);
extern
NDIS_STATUS
ArpSStopInterface(
IN PINTF pIntF,
IN BOOLEAN bCloseAdapter
);
extern
NDIS_STATUS
ArpSPnPEventHandler(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNET_PNP_EVENT pNetPnPEvent
);
extern
PINTF
ArpSCreateIntF(
IN PNDIS_STRING DeviceName,
IN PNDIS_STRING ConfigString,
IN NDIS_HANDLE BindingContext
);
extern
VOID
ArpSReqThread(
IN PVOID Context
);
extern
VOID
ArpSTimerThread(
IN PVOID Context
);
extern
NTSTATUS
ArpSReadGlobalConfiguration(
IN PUNICODE_STRING RegistryPath
);
extern
NDIS_STATUS
ArpSReadAdapterConfigFromRegistry(
IN PINTF pIntF,
OUT PATMARPS_CONFIG pConfig
);
extern
NDIS_STATUS
ArpSReadAdapterConfiguration(
IN PINTF pIntF
);
extern
VOID
ArpSConvertStringToIpPair(
OUT PNDIS_STATUS pStatus,
IN PNDIS_STRING pString,
IN PMCS_ENTRY pMcsEntry
);
extern
BOOLEAN
IPConvertStringToAddress(
IN PWCHAR AddressString,
OUT PULONG IpAddress
);
extern
VOID
ArpSReadArpCache(
IN PINTF pIntF
);
extern
BOOLEAN
ArpSWriteArpCache(
IN PINTF pIntF,
IN PTIMER Timer,
IN BOOLEAN TimerShuttingDown
);
extern
VOID
MarsReqThread(
IN PVOID Context
);
extern
VOID
MarsHandleRequest(
IN PINTF pIntF,
IN PARP_VC Vc,
IN PMARS_HEADER Header,
IN PNDIS_PACKET Packet
);
extern
VOID
MarsHandleJoin(
IN PINTF pIntF,
IN PARP_VC Vc,
IN PMARS_HEADER Header,
IN PNDIS_PACKET Packet
);
extern
VOID
MarsHandleLeave(
IN PINTF pIntF,
IN PARP_VC Vc,
IN PMARS_HEADER Header,
IN PNDIS_PACKET Packet
);
extern
PCLUSTER_MEMBER
MarsLookupClusterMember(
IN PINTF pIntF,
IN PHW_ADDR pHwAddr
);
extern
PCLUSTER_MEMBER
MarsCreateClusterMember(
IN PINTF pIntF,
IN PHW_ADDR pHwAddr
);
extern
VOID
MarsDeleteClusterMember(
IN PINTF pIntF,
IN PCLUSTER_MEMBER pMember
);
extern
PMARS_ENTRY
MarsLookupMarsEntry(
IN PINTF pIntF,
IN IPADDR GrpAddr,
IN BOOLEAN bCreateNew
);
extern
BOOLEAN
MarsIsAddressMcsServed(
IN PINTF pIntF,
IN IPADDR IPAddress
);
extern
VOID
MarsPunchHoles(
IN PMCAST_ADDR_PAIR pGrpAddrRange,
IN PGROUP_MEMBER pGroupList,
IN PINTF pIntF,
IN IPADDR UNALIGNED * pOutBuf OPTIONAL,
OUT PUSHORT pMinMaxCount,
OUT BOOLEAN * pAnyHolesPunched
);
extern
BOOLEAN
MarsAddClusterMemberToGroups(
IN PINTF pIntF,
IN PCLUSTER_MEMBER pMember,
IN PMCAST_ADDR_PAIR pGrpAddrRange,
IN PNDIS_PACKET Packet,
IN PMARS_JOIN_LEAVE JHdr,
IN UINT Length,
OUT PNDIS_PACKET * ppClusterPacket
);
extern
VOID
MarsUnlinkAllGroupsOnClusterMember(
IN PINTF pIntF,
IN PCLUSTER_MEMBER pMember
);
extern
BOOLEAN
MarsDelClusterMemberFromGroups(
IN PINTF pIntF,
IN PCLUSTER_MEMBER pMember,
IN PMCAST_ADDR_PAIR pGrpAddrRange,
IN PNDIS_PACKET Packet,
IN PMARS_JOIN_LEAVE LHdr,
IN UINT Length,
OUT PNDIS_PACKET * ppClusterPacket
);
extern
PNDIS_PACKET
MarsAllocControlPacket(
IN PINTF pIntF,
IN ULONG PacketLength,
OUT PUCHAR * pPacketStart
);
extern
VOID
MarsFreePacket(
IN PNDIS_PACKET Packet
);
extern
PNDIS_PACKET
MarsAllocPacketHdrCopy(
IN PNDIS_PACKET Packet
);
extern
VOID
MarsSendOnClusterControlVc(
IN PINTF pIntF,
IN PNDIS_PACKET Packet OPTIONAL
);
extern
VOID
MarsFreePacketsQueuedForClusterControlVc(
IN PINTF pIntF
);
extern
BOOLEAN
MarsDelMemberFromClusterControlVc(
IN PINTF pIntF,
IN PCLUSTER_MEMBER pMember,
IN BOOLEAN fIfLocked,
IN KIRQL OldIrql OPTIONAL
);
extern
VOID
MarsAddMemberToClusterControlVc(
IN PINTF pIntF,
IN PCLUSTER_MEMBER pMember
);
extern
PCO_CALL_PARAMETERS
MarsPrepareCallParameters(
IN PINTF pIntF,
IN PHW_ADDR pHwAddr,
IN BOOLEAN IsMakeCall
);
extern
BOOLEAN
MarsSendRedirect(
IN PINTF pIntF,
IN PTIMER Timer,
IN BOOLEAN TimerShuttingDown
);
extern
VOID
MarsAbortAllMembers(
IN PINTF pIntF
);
extern
VOID
MarsStopInterface(
IN PINTF pIntF
);
extern
VOID
MarsDumpPacket(
IN PUCHAR Packet,
IN UINT PktLen
);
extern
VOID
MarsDumpIpAddr(
IN IPADDR IpAddr,
IN PCHAR String
);
extern
VOID
MarsDumpAtmAddr(
IN PATM_ADDRESS AtmAddr,
IN PCHAR String
);
extern
VOID
MarsDumpMap(
IN PCHAR String,
IN IPADDR IpAddr,
IN PATM_ADDRESS AtmAddr
);
extern
NTSTATUS
ArpSInitializeNdis(
VOID
);
extern
VOID
ArpSDeinitializeNdis(
VOID
);
extern
VOID
ArpSOpenAdapterComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status,
IN NDIS_STATUS OpenErrorStatus
);
extern
VOID
ArpSCloseAdapterComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status
);
extern
VOID
ArpSStatus(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS GeneralStatus,
IN PVOID StatusBuffer,
IN UINT StatusBufferSize
);
extern
VOID
ArpSReceiveComplete(
IN NDIS_HANDLE ProtocolBindingContext
);
extern
VOID
ArpSStatusComplete(
IN NDIS_HANDLE ProtocolBindingContext
);
VOID
ArpSQueryAdapter(
IN PINTF pIntF
);
extern
VOID
ArpSSendNdisRequest(
IN PINTF pIntF,
IN NDIS_OID Oid,
IN PVOID pBuffer,
IN ULONG BufferLength
);
extern
VOID
ArpSRequestComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_REQUEST pRequest,
IN NDIS_STATUS Status
);
extern
VOID
ArpSBindAdapter(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE BindContext,
IN PNDIS_STRING DeviceName,
IN PVOID SystemSpecific1,
IN PVOID SystemSpecific2
);
extern
VOID
ArpSUnbindAdapter(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE UnbindContext
);
extern
VOID
ArpSCoSendComplete(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolVcContext,
IN PNDIS_PACKET Packet
);
extern
VOID
ArpSCoStatus(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE ProtocolVcContext OPTIONAL,
IN NDIS_STATUS GeneralStatus,
IN PVOID StatusBuffer,
IN UINT StatusBufferSize
);
extern
NDIS_STATUS
ArpSCoRequest(
IN NDIS_HANDLE ProtocolAfContext,
IN NDIS_HANDLE ProtocolVcContext OPTIONAL,
IN NDIS_HANDLE ProtocolPartyContext OPTIONAL,
IN OUT PNDIS_REQUEST NdisRequest
);
extern
VOID
ArpSCoRequestComplete(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolAfContext,
IN NDIS_HANDLE ProtocolVcContext OPTIONAL,
IN NDIS_HANDLE ProtocolPartyContext OPTIONAL,
IN PNDIS_REQUEST NdisRequest
);
extern
VOID
ArpSCoAfRegisterNotify(
IN NDIS_HANDLE ProtocolBindingContext,
IN PCO_ADDRESS_FAMILY AddressFamily
);
extern
NDIS_STATUS
ArpSCreateVc(
IN NDIS_HANDLE ProtocolAfContext,
IN NDIS_HANDLE NdisVcHandle,
OUT PNDIS_HANDLE ProtocolVcContext
);
extern
NDIS_STATUS
ArpSDeleteVc(
IN NDIS_HANDLE ProtocolVcContext
);
extern
VOID
ArpSOpenAfComplete(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolAfContext,
IN NDIS_HANDLE NdisAfHandle
);
extern
VOID
ArpSCloseAfComplete(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolAfContext
);
extern
VOID
ArpSRegisterSap(
IN PINTF pIntF
);
extern
VOID
ArpSRegisterSapComplete(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolSapContext,
IN PCO_SAP Sap,
IN NDIS_HANDLE NdisSapHandle
);
extern
VOID
ArpSDeregisterSapComplete(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolSapContext
);
extern
VOID
ArpSMakeCallComplete(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolVcContext,
IN NDIS_HANDLE NdisPartyHandle OPTIONAL,
IN PCO_CALL_PARAMETERS CallParameters
);
extern
VOID
ArpSCloseCallComplete(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolVcContext,
IN NDIS_HANDLE ProtocolPartyContext OPTIONAL
);
extern
VOID
ArpSAddPartyComplete(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolPartyContext,
IN NDIS_HANDLE NdisPartyHandle,
IN PCO_CALL_PARAMETERS CallParameters
);
extern
VOID
ArpSDropPartyComplete(
IN NDIS_STATUS Status,
IN NDIS_HANDLE ProtocolPartyContext
);
extern
NDIS_STATUS
ArpSIncomingCall(
IN NDIS_HANDLE ProtocolSapContext,
IN NDIS_HANDLE ProtocolVcContext,
IN OUT PCO_CALL_PARAMETERS CallParameters
);
extern
VOID
ArpSIncomingDropParty(
IN NDIS_STATUS DropStatus,
IN NDIS_HANDLE ProtocolPartyContext,
IN PVOID CloseData OPTIONAL,
IN UINT Size OPTIONAL
);
extern
VOID
ArpSCallConnected(
IN NDIS_HANDLE ProtocolVcContext
);
extern
VOID
ArpSIncomingCloseCall(
IN NDIS_STATUS CloseStatus,
IN NDIS_HANDLE ProtocolVcContext,
IN PVOID CloseData OPTIONAL,
IN UINT Size OPTIONAL
);
extern
VOID
ArpSIncomingCallQoSChange(
IN NDIS_HANDLE ProtocolVcContext,
IN PCO_CALL_PARAMETERS CallParameters
);
extern
VOID
ArpSInitiateCloseCall(
IN PARP_VC Vc
);
extern
UINT
ArpSHandleArpRequest(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_HANDLE ProtocolVcContext,
IN PNDIS_PACKET Packet
);
extern
PARP_ENTRY
ArpSLookupEntryByIpAddr(
IN PINTF pIntF,
IN IPADDR IpAddr
);
extern
PARP_ENTRY
ArpSLookupEntryByAtmAddr(
IN PINTF pIntF,
IN PATM_ADDRESS Address,
IN PATM_ADDRESS SubAddress OPTIONAL
);
extern
PARP_ENTRY
ArpSAddArpEntry(
IN PINTF pIntF,
IN IPADDR IpAddr,
IN PATM_ADDRESS Address,
IN PATM_ADDRESS SubAddress OPTIONAL,
IN PARP_VC Vc OPTIONAL
);
extern
PARP_ENTRY
ArpSAddArpEntryFromDisk(
IN PINTF pIntF,
IN PDISK_ENTRY pDiskEntry
);
extern
VOID
ArpSUpdateArpEntry(
IN PINTF pIntF,
IN PARP_ENTRY ArpEntry,
IN IPADDR IpAddr,
IN PHW_ADDR HwAddr,
IN PARP_VC Vc
);
extern
VOID
ArpSBuildArpReply(
IN PINTF pIntF,
IN PARP_ENTRY ArpEntry,
IN PARPS_HEADER Header,
IN PNDIS_PACKET Pkt
);
extern
BOOLEAN
ArpSAgeEntry(
IN PINTF pIntF,
IN PTIMER Timer,
IN BOOLEAN TimerShuttingDown
);
extern
BOOLEAN
ArpSDeleteIntFAddresses(
IN PINTF pIntF,
IN INT NumAddresses,
IN PATM_ADDRESS AddrList
);
extern
VOID
ArpSQueryAndSetAddresses(
IN PINTF pIntF
);
VOID
ArpSValidateAndSetRegdAddresses(
IN PINTF pIntF,
IN KIRQL OldIrql
);
VOID
ArpSMakeRegAddrCallComplete(
IN NDIS_STATUS Status,
IN PREG_ADDR_CTXT pRegAddrCtxt
);
VOID
ArpSCloseRegAddrCallComplete(
IN NDIS_STATUS Status,
IN PREG_ADDR_CTXT pRegAddrCtxt
);
VOID
ArpSIncomingRegAddrCloseCall(
IN NDIS_STATUS Status,
IN PREG_ADDR_CTXT pRegAddrCtxt
);
VOID
ArpSValidateOneRegdAddress(
IN PINTF pIntF,
IN KIRQL OldIrql
);
VOID
ArpSSetupValidationCallParams(
IN PREG_ADDR_CTXT pRegAddrCtxt, // LOCKIN LOCKOUT (pIntF lock)
IN PATM_ADDRESS pAtmAddr
);
VOID
ArpSUnlinkRegAddrCtxt(
PINTF pIntF, // LOCKIN NOLOCKOUT
KIRQL OldIrql
);
VOID
ArpSLogFailedRegistration(
PATM_ADDRESS pAtmAddress
);
extern
BOOLEAN
ArpSReferenceIntF(
IN PINTF pIntF
);
extern
PINTF
ArpSReferenceIntFByName(
IN PINTERFACE_NAME pInterface
);
extern
VOID
ArpSDereferenceIntF(
IN PINTF pIntF
);
extern
BOOLEAN
ArpSReferenceVc(
IN PARP_VC Vc,
IN BOOLEAN bSendRef
);
extern
VOID
ArpSDereferenceVc(
IN PARP_VC Vc,
IN BOOLEAN KillArpEntry,
IN BOOLEAN bSendComplete
);
extern
VOID
ArpSSleep(
IN UINT TimeInMs
);
extern
VOID
ArpSFreeGlobalData(
VOID
);
extern
VOID
ArpSTimerCancel(
IN PTIMER pTimerList
);
extern
VOID
ArpSTimerEnqueue(
IN PINTF pIntF,
IN PTIMER pTimer
);
extern
PVOID
ArpSAllocBlock(
IN PINTF pIntF,
IN ENTRY_TYPE EntryType
);
extern
VOID
ArpSFreeBlock(
IN PVOID pBlock
);
BOOLEAN
ArpSValidAtmAddress(
IN PATM_ADDRESS AtmAddr,
IN UINT MaxSize
);
VOID
DeregisterAllAddresses(
IN PINTF pIntF
);
BOOLEAN
MarsIsValidClusterMember(
PINTF pIntF,
PCLUSTER_MEMBER pPossibleMember
);
VOID
ArpSTryCloseAdapter(
IN PINTF pIntF // NOLOCKIN LOLOCKOUT
);
#if DBG
extern
VOID
ArpSDumpPacket(
IN PUCHAR Packet,
IN UINT PktLen
);
extern
VOID
ArpSDumpAddress(
IN IPADDR IpAddr,
IN PHW_ADDR HwAddr,
IN PCHAR String
);
extern
VOID
ArpSDumpIpAddr(
IN IPADDR IpAddr,
IN PCHAR String
);
extern
VOID
ArpSDumpAtmAddr(
IN PATM_ADDRESS AtmAddr,
IN PCHAR String
);
#else
#define ArpSDumpPacket(_Packet, _PktLen)
#define ArpSDumpAddress(_IpAddr, _HwAddr, _String)
#define ArpSDumpIpAddr(_IpAddr, _String)
#define ArpSDumpAtmAddr(_AtmAddr, _String)
#endif
/*
* The following macros deal with on-the-wire integer and long values
*
* On the wire format is big-endian i.e. a long value of 0x01020304 is
* represented as 01 02 03 04. Similarly an int value of 0x0102 is
* represented as 01 02.
*
* The host format is not assumed since it will vary from processor to
* processor.
*/
#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(INIT, ArpSReadGlobalConfiguration)
#pragma alloc_text(INIT, ArpSInitializeNdis)
#pragma alloc_text(PAGE, ArpSReadArpCache)
#pragma alloc_text(PAGE, ArpSWriteArpCache)
#pragma alloc_text(PAGE, ArpSSleep)
#pragma alloc_text(PAGE, ArpSReqThread)
#pragma alloc_text(PAGE, ArpSTimerThread)
#pragma alloc_text(PAGE, ArpSDispatch)
#pragma alloc_text(PAGE, ArpSLookupEntryByIpAddr)
#pragma alloc_text(PAGE, ArpSLookupEntryByAtmAddr)
#pragma alloc_text(PAGE, ArpSAddArpEntry)
#pragma alloc_text(PAGE, ArpSAddArpEntryFromDisk)
#pragma alloc_text(PAGE, ArpSCreateIntF)
#pragma alloc_text(PAGE, MarsReqThread)
#endif // _PROTOS_