📄 mux.h
字号:
/*++
Copyright (c) 1992-2001 Microsoft Corporation
Module Name:
mux.h
Abstract:
Data structures, defines and function prototypes for the MUX driver.
Environment:
Kernel mode only.
Revision History:
--*/
#ifdef NDIS51_MINIPORT
#define MUX_MAJOR_NDIS_VERSION 5
#define MUX_MINOR_NDIS_VERSION 1
#else
#define MUX_MAJOR_NDIS_VERSION 4
#define MUX_MINOR_NDIS_VERSION 0
#endif
#ifdef NDIS51
#define MUX_PROT_MAJOR_NDIS_VERSION 5
#define MUX_PROT_MINOR_NDIS_VERSION 0
#else
#define MUX_PROT_MAJOR_NDIS_VERSION 4
#define MUX_PROT_MINOR_NDIS_VERSION 0
#endif
#define TAG 'SxuM'
#define WAIT_INFINITE 0
#if DBG
//
// Debug levels: lower values indicate higher urgency
//
#define MUX_EXTRA_LOUD 20
#define MUX_VERY_LOUD 10
#define MUX_LOUD 8
#define MUX_INFO 6
#define MUX_WARN 4
#define MUX_ERROR 2
#define MUX_FATAL 0
extern INT muxDebugLevel;
#define DBGPRINT(lev, Fmt) \
{ \
if ((lev) <= muxDebugLevel) \
{ \
DbgPrint("MUX-IM: "); \
DbgPrint Fmt; \
} \
}
#else
#define DBGPRINT(lev, Fmt)
#endif //DBG
#define ETH_IS_LOCALLY_ADMINISTERED(Address) \
(BOOLEAN)(((PUCHAR)(Address))[0] & ((UCHAR)0x02))
// forward declarations
typedef struct _ADAPT ADAPT, *PADAPT;
typedef struct _VELAN VELAN, *PVELAN;
typedef struct _MUX_NDIS_REQUEST MUX_NDIS_REQUEST, *PMUX_NDIS_REQUEST;
typedef
VOID
(*PMUX_REQ_COMPLETE_HANDLER) (
IN PADAPT pAdapt,
IN struct _MUX_NDIS_REQUEST * pMuxRequest,
IN NDIS_STATUS Status
);
// This OID specifies the NDIS version in use by the
// virtual miniport driver. The high byte is the major version.
// The low byte is the minor version.
#define VELAN_DRIVER_VERSION ((MUX_MAJOR_NDIS_VERSION << 8) + \
(MUX_MINOR_NDIS_VERSION))
// media type, we use ethernet, change if necessary
#define VELAN_MEDIA_TYPE NdisMedium802_3
// change to your company name instead of using Microsoft
#define VELAN_VENDOR_DESC "Microsoft"
// Highest byte is the NIC byte plus three vendor bytes, they are normally
// obtained from the NIC
#define VELAN_VENDOR_ID 0x00FFFFFF
#define VELAN_MAX_MCAST_LIST 32
#define VELAN_MAX_SEND_PKTS 5
#define ETH_MAX_PACKET_SIZE 1514
#define ETH_MIN_PACKET_SIZE 60
#define ETH_HEADER_SIZE 14
#define VELAN_SUPPORTED_FILTERS ( \
NDIS_PACKET_TYPE_DIRECTED | \
NDIS_PACKET_TYPE_MULTICAST | \
NDIS_PACKET_TYPE_BROADCAST | \
NDIS_PACKET_TYPE_PROMISCUOUS | \
NDIS_PACKET_TYPE_ALL_MULTICAST)
#define MUX_ADAPTER_PACKET_FILTER \
NDIS_PACKET_TYPE_PROMISCUOUS
//
// Define flag bits we set on send packets to prevent
// loopback from occurring on the lower binding.
//
#ifdef NDIS51
#define MUX_SEND_PACKET_FLAGS NDIS_FLAGS_DONT_LOOPBACK
#else
#define NDIS_FLAGS_SKIP_LOOPBACK_WIN2K 0x400
#define MUX_SEND_PACKET_FLAGS (NDIS_FLAGS_DONT_LOOPBACK | \
NDIS_FLAGS_SKIP_LOOPBACK_WIN2K)
#endif
#define MIN_PACKET_POOL_SIZE 255
#define MAX_PACKET_POOL_SIZE 4096
typedef UCHAR MUX_MAC_ADDRESS[6];
//
// Our context stored in packets sent down to the
// lower binding. Note that this sample driver only forwards
// sends down; it does not originate sends itself.
// These packets are allocated from the SendPacketPool.
//
typedef struct _MUX_SEND_RSVD
{
PVELAN pVElan; // originating ELAN
PNDIS_PACKET pOriginalPacket; // original packet
} MUX_SEND_RSVD, *PMUX_SEND_RSVD;
#define MUX_RSVD_FROM_SEND_PACKET(_pPkt) \
((PMUX_SEND_RSVD)(_pPkt)->ProtocolReserved)
//
// Our context stored in each packet forwarded up to an
// ELAN from a lower binding. The original packet refers to
// a packet indicated up to us that should be returned via
// NdisReturnPackets when our packet is returned to us. This
// is set to NULL there isn't such a packet.
// These packets are allocated from the RecvPacketPool.
//
typedef struct _MUX_RECV_RSVD
{
PNDIS_PACKET pOriginalPacket;
#if IEEE_VLAN_SUPPORT
PNDIS_BUFFER AllocatedNdisBuffer;
#endif
} MUX_RECV_RSVD, *PMUX_RECV_RSVD;
#define MUX_RSVD_FROM_RECV_PACKET(_pPkt) \
((PMUX_RECV_RSVD)(_pPkt)->MiniportReserved)
//
// Make sure we don't attempt to use more than the allowed
// room in MiniportReserved on received packets.
//
C_ASSERT(sizeof(MUX_RECV_RSVD) <= sizeof(((PNDIS_PACKET)0)->MiniportReserved));
//
// Out context stored in each packet that we use to forward
// a TransferData request to the lower binding.
// These packets are allocated from the RecvPacketPool.
//
typedef struct _MUX_TD_RSVD
{
PVELAN pVElan;
PNDIS_PACKET pOriginalPacket;
} MUX_TD_RSVD, *PMUX_TD_RSVD;
#define MUX_RSVD_FROM_TD_PACKET(_pPkt) \
((PMUX_TD_RSVD)(_pPkt)->ProtocolReserved)
#ifndef NDIS_PACKET_FIRST_NDIS_BUFFER
#define NDIS_PACKET_FIRST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Head)
#endif
#ifndef NDIS_PACKET_LAST_NDIS_BUFFER
#define NDIS_PACKET_LAST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Tail)
#endif
#ifndef NDIS_PACKET_VALID_COUNTS
#define NDIS_PACKET_VALID_COUNTS(_Packet) ((_Packet)->Private.ValidCounts)
#endif
//
// Default values:
//
#define MUX_DEFAULT_LINK_SPEED 100000 // in 100s of bits/sec
#define MUX_DEFAULT_LOOKAHEAD_SIZE 512
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
NTSTATUS
PtDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NDIS_STATUS
PtRegisterDevice(
VOID
);
NDIS_STATUS
PtDeregisterDevice(
VOID
);
//
// Protocol proto-types
//
VOID
PtOpenAdapterComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status,
IN NDIS_STATUS OpenErrorStatus
);
VOID
PtQueryAdapterInfo(
IN PADAPT pAdapt
);
VOID
PtQueryAdapterSync(
IN PADAPT pAdapt,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength
);
VOID
PtRequestAdapterAsync(
IN PADAPT pAdapt,
IN NDIS_REQUEST_TYPE RequestType,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
IN PMUX_REQ_COMPLETE_HANDLER pCallback
);
VOID
PtCloseAdapterComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status
);
VOID
PtResetComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS Status
);
VOID
PtRequestComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_REQUEST NdisRequest,
IN NDIS_STATUS Status
);
VOID
PtCompleteForwardedRequest(
IN PADAPT pAdapt,
IN PMUX_NDIS_REQUEST pMuxNdisRequest,
IN NDIS_STATUS Status
);
VOID
PtPostProcessPnPCapabilities(
IN PVELAN pVElan,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength
);
VOID
PtCompleteBlockingRequest(
IN PADAPT pAdapt,
IN PMUX_NDIS_REQUEST pMuxNdisRequest,
IN NDIS_STATUS Status
);
VOID
PtDiscardCompletedRequest(
IN PADAPT pAdapt,
IN PMUX_NDIS_REQUEST pMuxNdisRequest,
IN NDIS_STATUS Status
);
VOID
PtStatus(
IN NDIS_HANDLE ProtocolBindingContext,
IN NDIS_STATUS GeneralStatus,
IN PVOID StatusBuffer,
IN UINT StatusBufferSize
);
VOID
PtStatusComplete(
IN NDIS_HANDLE ProtocolBindingContext
);
VOID
PtSendComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_PACKET Packet,
IN NDIS_STATUS Status
);
VOID
PtTransferDataComplete(
IN NDIS_HANDLE ProtocolBindingContext,
IN PNDIS_PACKET Packet,
IN NDIS_STATUS Status,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -