twain3.0/3rdparty/ddk/ndis.h

12457 lines
382 KiB
C

/*++ BUILD Version: ???? // Increment this if a change has global effects
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
ndis.h
Abstract:
This module defines the structures, macros, and functions available
to NDIS drivers.
Revision History:
--*/
#if !defined(_NDIS_)
#define _NDIS_
#if !defined(NDIS_WDM)
#define NDIS_WDM 0
#endif
//
// Set BINARY_COMPATIBLE to 0 if it is not defined. Error out if user tries
// to build a Win9x binary compatible driver using this DDK.
//
#if !defined(BINARY_COMPATIBLE)
#define BINARY_COMPATIBLE 0
#else
#if (BINARY_COMPATIBLE != 0)
#error "can not build Win9x binary compatible drivers, please remove the definition for BINARY_COMPATIBLE or set it to 0"
#endif
#endif
//
// BEGIN INTERNAL DEFINITIONS
//
#include <ntddk.h>
//
// END INTERNAL DEFINITIONS
//
// The following definitions may be used by NDIS drivers, except as noted.
//
#ifndef __NET_PNP__
#define __NET_PNP__
#pragma once
//
// PnP and PM event codes that can be indicated up to transports
// and clients.
//
typedef enum _NET_PNP_EVENT_CODE
{
NetEventSetPower,
NetEventQueryPower,
NetEventQueryRemoveDevice,
NetEventCancelRemoveDevice,
NetEventReconfigure,
NetEventBindList,
NetEventBindsComplete,
NetEventPnPCapabilities,
NetEventPause,
NetEventRestart,
NetEventPortActivation,
NetEventPortDeactivation,
NetEventIMReEnableDevice,
NetEventMaximum
} NET_PNP_EVENT_CODE, *PNET_PNP_EVENT_CODE;
//
// Networking PnP event indication structure.
//
typedef struct _NET_PNP_EVENT
{
//
// Event code describing action to take.
//
NET_PNP_EVENT_CODE NetEvent;
//
// Event specific data.
//
PVOID Buffer;
//
// Length of event specific data.
//
ULONG BufferLength;
//
// Reserved values are for use by respective components only.
//
// Note: these reserved areas must be pointer aligned.
//
ULONG_PTR NdisReserved[4];
ULONG_PTR TransportReserved[4];
ULONG_PTR TdiReserved[4];
ULONG_PTR TdiClientReserved[4];
} NET_PNP_EVENT, *PNET_PNP_EVENT;
//
// The following structure defines the device power states.
//
typedef enum _NET_DEVICE_POWER_STATE
{
NetDeviceStateUnspecified = 0,
NetDeviceStateD0,
NetDeviceStateD1,
NetDeviceStateD2,
NetDeviceStateD3,
NetDeviceStateMaximum
} NET_DEVICE_POWER_STATE, *PNET_DEVICE_POWER_STATE;
#endif // __NET_PNP__
#pragma once
//
// Indicate that we're building for NT. NDIS_NT is always used for
// miniport builds.
//
#define NDIS_NT 1
#if defined(NDIS_DOS)
#undef NDIS_DOS
#endif
//
// Define status codes and event log codes.
//
#include <ntstatus.h>
#include <netevent.h>
#include <driverspecs.h>
#pragma warning(push)
#pragma warning(disable:4201) // (nonstandard extension used : nameless struct/union)
#pragma warning(disable:4214) // (extension used : bit field types other than int)
//
// Define a couple of extra types.
//
#if !defined(_WINDEF_) // these are defined in windows.h too
typedef signed int INT, *PINT;
typedef unsigned int UINT, *PUINT;
#endif
typedef UNICODE_STRING NDIS_STRING, *PNDIS_STRING;
//
// Landmarks for PFD and SDV to detect kernel mode drivers
//
__drv_Mode_impl(NDIS_INCLUDED)
//
// Portability extentions
//
#define NDIS_INIT_FUNCTION(_F) alloc_text(INIT,_F)
#define NDIS_PAGABLE_FUNCTION(_F) alloc_text(PAGE,_F)
#define NDIS_PAGEABLE_FUNCTION(_F) alloc_text(PAGE,_F)
//
// This file contains the definition of an NDIS_OID as
// well as #defines for all the current OID values.
//
//
// Define NDIS_STATUS and NDIS_HANDLE here
//
typedef PVOID NDIS_HANDLE, *PNDIS_HANDLE;
typedef int NDIS_STATUS, *PNDIS_STATUS; // note default size
#if (!defined(NDIS_WRAPPER))
#if defined(NTDDI_VERSION)
#if (NTDDI_VERSION > NTDDI_WIN7)
#error "unsupported NTDDI_VERSION"
#endif
#endif
//
//
// error out if driver has defined these values
//
#if (defined(NDIS_MINIPORT_MAJOR_VERSION) || \
(defined(NDIS_MINIPORT_MINOR_VERSION)) || \
(defined(NDIS_PROTOCOL_MAJOR_VERSION)) || \
(defined(NDIS_PROTOCOL_MINOR_VERSION)) || \
(defined(NDIS_FILTER_MAJOR_VERSION)) || \
(defined(NDIS_FILTER_MINOR_VERSION)))
#error "Driver is re-defining NDIS reserved macros"
#endif
#if (defined(NDIS_MINIPORT_DRIVER))
//
// for Miniports versions 5.0 and up, provide a consistent way to match
// Ndis version in their characteristics with their makefile defines
//
#if (defined(NDIS620_MINIPORT))
#define NDIS_MINIPORT_MAJOR_VERSION 6
#define NDIS_MINIPORT_MINOR_VERSION 20
#elif (defined(NDIS61_MINIPORT))
#define NDIS_MINIPORT_MAJOR_VERSION 6
#define NDIS_MINIPORT_MINOR_VERSION 1
#elif (defined(NDIS60_MINIPORT))
#define NDIS_MINIPORT_MAJOR_VERSION 6
#define NDIS_MINIPORT_MINOR_VERSION 0
#elif (defined(NDIS51_MINIPORT))
#define NDIS_MINIPORT_MAJOR_VERSION 5
#define NDIS_MINIPORT_MINOR_VERSION 1
#elif (defined(NDIS50_MINIPORT))
#define NDIS_MINIPORT_MAJOR_VERSION 5
#define NDIS_MINIPORT_MINOR_VERSION 0
#else
#error ("Only NDIS miniport drivers with version >= 5 are supported")
#endif
//
// disallow invalid major/minor combination
//
#if ((NDIS_MINIPORT_MAJOR_VERSION == 6) && \
(NDIS_MINIPORT_MINOR_VERSION != 20) && \
(NDIS_MINIPORT_MINOR_VERSION != 1) && \
(NDIS_MINIPORT_MINOR_VERSION != 0))
#error "Invalid Miniport major/minor version"
#elif ((NDIS_MINIPORT_MAJOR_VERSION == 5) && \
(NDIS_MINIPORT_MINOR_VERSION != 1) && \
(NDIS_MINIPORT_MINOR_VERSION != 0))
#error "Invalid Miniport major/minor version"
#endif
//
// make sure the target platform is consistent with miniport version
//
#if (NDIS_MINIPORT_MAJOR_VERSION == 6) && \
((NDIS_MINIPORT_MINOR_VERSION == 20 && NTDDI_VERSION < NTDDI_WIN7) || \
(NDIS_MINIPORT_MINOR_VERSION == 1 && NTDDI_VERSION < NTDDI_VISTA) || \
(NDIS_MINIPORT_MINOR_VERSION == 0 && NTDDI_VERSION < NTDDI_VISTA))
#error "Wrong NDIS or DDI version specified"
#elif ((NDIS_MINIPORT_MAJOR_VERSION == 5) && \
(((NDIS_MINIPORT_MINOR_VERSION == 1) && (NTDDI_VERSION < NTDDI_WINXP)) || \
((NDIS_MINIPORT_MINOR_VERSION == 0) && (NTDDI_VERSION < NTDDI_WIN2K))))
#error "Wrong NDIS or DDI version specified"
#endif
#endif // NDIS_MINIPORT_DRIVER
#if (defined(NDIS30))
#error "Only NDIS Protocol drivers versions >= 4 are supported"
#endif
//
// for protocol versions 4.0 and up, provide a consistent way to match
// Ndis version in their characteristics with their makefile defines
//
//
// a protocol only or filter driver
//
#if (defined(NDIS620))
#define NDIS_PROTOCOL_MAJOR_VERSION 6
#define NDIS_PROTOCOL_MINOR_VERSION 20
#define NDIS_FILTER_MAJOR_VERSION 6
#define NDIS_FILTER_MINOR_VERSION 20
#elif (defined(NDIS61))
#define NDIS_PROTOCOL_MAJOR_VERSION 6
#define NDIS_PROTOCOL_MINOR_VERSION 1
#define NDIS_FILTER_MAJOR_VERSION 6
#define NDIS_FILTER_MINOR_VERSION 1
#elif (defined(NDIS60))
#define NDIS_PROTOCOL_MAJOR_VERSION 6
#define NDIS_PROTOCOL_MINOR_VERSION 0
#define NDIS_FILTER_MAJOR_VERSION 6
#define NDIS_FILTER_MINOR_VERSION 0
#elif (defined(NDIS51))
#define NDIS_PROTOCOL_MAJOR_VERSION 5
#define NDIS_PROTOCOL_MINOR_VERSION 1
#elif (defined(NDIS50))
#define NDIS_PROTOCOL_MAJOR_VERSION 5
#define NDIS_PROTOCOL_MINOR_VERSION 0
#elif(defined(NDIS40))
#define NDIS_PROTOCOL_MAJOR_VERSION 4
#define NDIS_PROTOCOL_MINOR_VERSION 0
#endif // (defined(NDIS60))
#if (!defined(NDIS_MINIPORT_DRIVER) && !defined (NDIS_PROTOCOL_MAJOR_VERSION))
//
// if it is not a miniport and
// NDIS_PROTOCOL_MAJOR_VERSION is not defined, define it here
//
#define NDIS40
#define NDIS_PROTOCOL_MAJOR_VERSION 4
#define NDIS_PROTOCOL_MINOR_VERSION 0
#endif // (!defined(NDIS_MINIPORT_DRIVER) && !defined (NDIS_PROTOCOL_MAJOR_VERSION))
#if defined (NDIS_FILTER_MAJOR_VERSION)
//
// disallow invalid major/minor combination
//
#if ((NDIS_FILTER_MAJOR_VERSION == 6) && \
(NDIS_FILTER_MINOR_VERSION != 20) && \
(NDIS_FILTER_MINOR_VERSION != 1) && \
(NDIS_FILTER_MINOR_VERSION != 0))
#error "Invalid Filter version"
#endif
#endif // defined (NDIS_FILTER_MAJOR_VERSION)
#if defined (NDIS_PROTOCOL_MAJOR_VERSION)
//
// disallow invalid major/minor combination
//
#if ((NDIS_PROTOCOL_MAJOR_VERSION == 6) && \
(NDIS_PROTOCOL_MINOR_VERSION != 20) && \
(NDIS_PROTOCOL_MINOR_VERSION != 1) && \
(NDIS_PROTOCOL_MINOR_VERSION != 0))
#error "Invalid Protocol version"
#elif ((NDIS_PROTOCOL_MAJOR_VERSION == 5) && \
(NDIS_PROTOCOL_MINOR_VERSION != 1) && (NDIS_PROTOCOL_MINOR_VERSION != 0))
#error "Invalid Protocol version"
#elif ((NDIS_PROTOCOL_MAJOR_VERSION == 4) && (NDIS_PROTOCOL_MINOR_VERSION != 0))
#error "Invalid Protocol major/minor version"
#endif
//
// make sure the target platform is consistent with protocol version
// but don't stop NDIS protocol drivers older than 6.0 from specifying NTDDI_VISTA
//
#if ((NDIS_PROTOCOL_MAJOR_VERSION == 6) && (NTDDI_VERSION < NTDDI_VISTA))
#error "Wrong NDIS or DDI version specified"
#endif
#endif // defined (NDIS_PROTOCOL_MAJOR_VERSION)
#endif // !NDIS_WRAPPER
//
// identify Legacy miniport drivers
//
#if !defined(NDIS_LEGACY_MINIPORT)
#if ((defined(NDIS_MINIPORT_DRIVER) && (NDIS_MINIPORT_MAJOR_VERSION < 6)) || NDIS_WRAPPER)
#define NDIS_LEGACY_MINIPORT 1
#else
#define NDIS_LEGACY_MINIPORT 0
#endif // ((defined(NDIS_MINIPORT_DRIVER) && (NDIS_MINIPORT_MAJOR_VERSION < 6)) || NDIS_WRAPPER)
#endif // !defined(NDIS_LEGACY_MINIPORT)
//
// identify Legacy protocol drivers
//
#if !defined(NDIS_LEGACY_PROTOCOL)
#if ((defined(NDIS_PROTOCOL_MAJOR_VERSION) && (NDIS_PROTOCOL_MAJOR_VERSION < 6)) || NDIS_WRAPPER)
#define NDIS_LEGACY_PROTOCOL 1
#else
#define NDIS_LEGACY_PROTOCOL 0
#endif // ((defined(NDIS_PROTOCOL_MAJOR_VERSION) && (NDIS_PROTOCOL_MAJOR_VERSION < 6)) || NDIS_WRAPPER)
#endif // !defined(NDIS_LEGACY_PROTOCOL)
//
// use something to identify legacy (pre NDIS 6 drivers) + NDIS itself
//
#if !defined(NDIS_LEGACY_DRIVER)
#if (NDIS_LEGACY_MINIPORT || NDIS_LEGACY_PROTOCOL || NDIS_WRAPPER)
#define NDIS_LEGACY_DRIVER 1
#else
#define NDIS_LEGACY_DRIVER 0
#endif // either protocol is legacy or miniport is legacy or this is NDIS
#endif // !defined(NDIS_LEGACY_DRIVER)
//
// and something to identify Vista+ drivers + NDIS itself
//
#if !defined(NDIS_SUPPORT_NDIS6)
#if ((defined (NDIS_MINIPORT_MAJOR_VERSION) && (NDIS_MINIPORT_MAJOR_VERSION >= 6)) || \
(defined (NDIS60)) || NDIS_WRAPPER)
#define NDIS_SUPPORT_NDIS6 1
#else
#define NDIS_SUPPORT_NDIS6 0
#endif
#endif // !defined(NDIS_SUPPORT_NDIS6)
//
// and something to identify Server 2008+ drivers + NDIS itself
//
#if !defined(NDIS_SUPPORT_NDIS61)
#if (((defined (NDIS_MINIPORT_MAJOR_VERSION) && (NDIS_MINIPORT_MAJOR_VERSION >= 6)) && \
(defined (NDIS_MINIPORT_MINOR_VERSION) && (NDIS_MINIPORT_MINOR_VERSION >= 1))) || \
(defined (NDIS61)) || NDIS_WRAPPER)
#define NDIS_SUPPORT_NDIS61 1
#else
#define NDIS_SUPPORT_NDIS61 0
#endif
#endif // !defined(NDIS_SUPPORT_NDIS61)
//
// and something to identify new (Win7 and up) drivers + NDIS itself
//
#if !defined(NDIS_SUPPORT_NDIS620)
#if (((defined (NDIS_MINIPORT_MAJOR_VERSION) && (NDIS_MINIPORT_MAJOR_VERSION >= 6)) && \
(defined (NDIS_MINIPORT_MINOR_VERSION) && (NDIS_MINIPORT_MINOR_VERSION >= 20))) || \
(defined (NDIS620)) || NDIS_WRAPPER)
#define NDIS_SUPPORT_NDIS620 1
#else
#define NDIS_SUPPORT_NDIS620 0
#endif
#endif // !defined(NDIS_SUPPORT_NDIS620)
//
// Enable NDIS61 defines for NDIS 62 drivers
//
#if (NDIS_SUPPORT_NDIS620)
#undef NDIS_SUPPORT_NDIS61
#define NDIS_SUPPORT_NDIS61 1
#endif
//
// Enable NDIS60 defines for NDIS 61 drivers
//
#if (NDIS_SUPPORT_NDIS61)
#undef NDIS_SUPPORT_NDIS6
#define NDIS_SUPPORT_NDIS6 1
#endif
//
// Enable deprecated NDIS 6.0/1 APIs for NDIS 6.20+ drivers
// that also want to run the same binary on NDIS 6.0/1
// In this case, such a driver would need to define both
// NDIS620_MINIPORT and NDIS60/61_MINIPORT
// Note: We cannot use NDIS_SUPPORT_NDIS6/61 in this check because
// that would be defined even for NDIS 6.20+
//
#if defined(NDIS61_MINIPORT) || defined(NDIS60_MINIPORT) || \
defined(NDIS61) || defined(NDIS60) || \
defined(NDIS_WRAPPER) || defined(NDIS_LEGACY_DRIVER)
#define NDIS_SUPPORT_60_COMPATIBLE_API 1
#else
#define NDIS_SUPPORT_60_COMPATIBLE_API 0
#endif
#include <ntddndis.h>
//
// Ndis defines for configuration manager data structures
//
typedef CM_MCA_POS_DATA NDIS_MCA_POS_DATA, *PNDIS_MCA_POS_DATA;
typedef CM_EISA_SLOT_INFORMATION NDIS_EISA_SLOT_INFORMATION, *PNDIS_EISA_SLOT_INFORMATION;
typedef CM_EISA_FUNCTION_INFORMATION NDIS_EISA_FUNCTION_INFORMATION, *PNDIS_EISA_FUNCTION_INFORMATION;
//
// Define an exported function.
//
#if defined(NDIS_WRAPPER)
#define EXPORT
#else
#define EXPORT DECLSPEC_IMPORT
#endif
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_GENERIC_OBJECT
{
NDIS_OBJECT_HEADER Header;
PVOID Caller;
PVOID CallersCaller;
PDRIVER_OBJECT DriverObject;
} NDIS_GENERIC_OBJECT, *PNDIS_GENERIC_OBJECT;
EXPORT
PNDIS_GENERIC_OBJECT
NdisAllocateGenericObject(
PDRIVER_OBJECT DriverObject OPTIONAL,
ULONG Tag,
USHORT Size
);
EXPORT
VOID
NdisFreeGenericObject(
IN PNDIS_GENERIC_OBJECT NdisObject
);
#endif // NDIS_SUPPORT_NDIS6
//
// Memory manipulation functions.
//
#define NdisMoveMemory(Destination, Source, Length) RtlCopyMemory(Destination, Source, Length)
#define NdisZeroMemory(Destination, Length) RtlZeroMemory(Destination, Length)
#define NdisEqualMemory(Source1, Source2, Length) RtlEqualMemory(Source1, Source2, Length)
#define NdisFillMemory(Destination, Length, Fill) RtlFillMemory(Destination, Length, Fill)
#define NdisRetrieveUlong(Destination, Source) RtlRetrieveUlong(Destination, Source)
#define NdisStoreUlong(Destination, Value) RtlStoreUlong(Destination, Value)
#define NDIS_STRING_CONST(x) {sizeof(L##x)-2, sizeof(L##x), L##x}
//
// On a RISC machine, I/O mapped memory can't be accessed with
// the Rtl routines.
//
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisMoveMappedMemory(Destination,Source,Length) RtlCopyMemory(Destination,Source,Length)
#define NdisZeroMappedMemory(Destination,Length) RtlZeroMemory(Destination,Length)
#elif defined(_M_IA64)
#define NdisMoveMappedMemory(Destination,Source,Length) \
{ \
PUCHAR _Src = (Source); \
PUCHAR _Dest = (Destination); \
PUCHAR _End = _Dest + (Length); \
while (_Dest < _End) \
{ \
*_Dest++ = *_Src++; \
} \
}
#define NdisZeroMappedMemory(Destination,Length) \
{ \
PUCHAR _Dest = (Destination); \
PUCHAR _End = _Dest + (Length); \
while (_Dest < _End) \
{ \
*_Dest++ = 0; \
} \
}
#endif
#define NdisMoveToMappedMemory(Destination,Source,Length) \
NdisMoveMappedMemory(Destination,Source,Length)
#define NdisMoveFromMappedMemory(Destination,Source,Length) \
NdisMoveMappedMemory(Destination,Source,Length)
//
// definition of the basic spin lock structure
//
typedef struct _NDIS_SPIN_LOCK
{
KSPIN_LOCK SpinLock;
KIRQL OldIrql;
} NDIS_SPIN_LOCK, * PNDIS_SPIN_LOCK;
//
// definition of the ndis event structure
//
typedef struct _NDIS_EVENT
{
KEVENT Event;
} NDIS_EVENT, *PNDIS_EVENT;
#pragma warning(push)
#pragma warning(disable:4115) // named type definition in parenthesis
typedef VOID (*NDIS_PROC)(struct _NDIS_WORK_ITEM *, PVOID);
#pragma warning(pop)
//
// Definition of an ndis work-item
//
typedef struct _NDIS_WORK_ITEM
{
PVOID Context;
NDIS_PROC Routine;
UCHAR WrapperReserved[8*sizeof(PVOID)];
} NDIS_WORK_ITEM, *PNDIS_WORK_ITEM;
#define NdisInterruptLatched Latched
#define NdisInterruptLevelSensitive LevelSensitive
typedef KINTERRUPT_MODE NDIS_INTERRUPT_MODE, *PNDIS_INTERRUPT_MODE;
//
// Configuration definitions
//
//
// Possible data types
//
typedef enum _NDIS_PARAMETER_TYPE
{
NdisParameterInteger,
NdisParameterHexInteger,
NdisParameterString,
NdisParameterMultiString,
NdisParameterBinary
} NDIS_PARAMETER_TYPE, *PNDIS_PARAMETER_TYPE;
typedef struct
{
USHORT Length;
PVOID Buffer;
} BINARY_DATA;
//
// To store configuration information
//
typedef struct _NDIS_CONFIGURATION_PARAMETER
{
NDIS_PARAMETER_TYPE ParameterType;
union
{
ULONG IntegerData;
NDIS_STRING StringData;
BINARY_DATA BinaryData;
} ParameterData;
} NDIS_CONFIGURATION_PARAMETER, *PNDIS_CONFIGURATION_PARAMETER;
//
// Definitions for the "ProcessorType" keyword
//
typedef enum _NDIS_PROCESSOR_TYPE
{
NdisProcessorX86,
NdisProcessorMips,
NdisProcessorAlpha,
NdisProcessorPpc,
NdisProcessorAmd64,
NdisProcessorIA64
} NDIS_PROCESSOR_TYPE, *PNDIS_PROCESSOR_TYPE;
//
// Definitions for the "Environment" keyword
//
typedef enum _NDIS_ENVIRONMENT_TYPE
{
NdisEnvironmentWindows,
NdisEnvironmentWindowsNt
} NDIS_ENVIRONMENT_TYPE, *PNDIS_ENVIRONMENT_TYPE;
//
// Possible Hardware Architecture. Define these to
// match the HAL INTERFACE_TYPE enum.
//
typedef enum _NDIS_INTERFACE_TYPE
{
NdisInterfaceInternal = Internal,
NdisInterfaceIsa = Isa,
NdisInterfaceEisa = Eisa,
NdisInterfaceMca = MicroChannel,
NdisInterfaceTurboChannel = TurboChannel,
NdisInterfacePci = PCIBus,
NdisInterfacePcMcia = PCMCIABus,
NdisInterfaceCBus = CBus,
NdisInterfaceMPIBus = MPIBus,
NdisInterfaceMPSABus = MPSABus,
NdisInterfaceProcessorInternal = ProcessorInternal,
NdisInterfaceInternalPowerBus = InternalPowerBus,
NdisInterfacePNPISABus = PNPISABus,
NdisInterfacePNPBus = PNPBus,
NdisInterfaceUSB,
NdisInterfaceIrda,
NdisInterface1394,
NdisMaximumInterfaceType
} NDIS_INTERFACE_TYPE, *PNDIS_INTERFACE_TYPE;
//
// Stuff for PCI configuring
//
typedef CM_PARTIAL_RESOURCE_LIST NDIS_RESOURCE_LIST, *PNDIS_RESOURCE_LIST;
//
// The structure passed up on a WAN_LINE_UP indication
//
typedef struct _NDIS_WAN_LINE_UP
{
IN ULONG LinkSpeed; // 100 bps units
IN ULONG MaximumTotalSize; // suggested max for send packets
IN NDIS_WAN_QUALITY Quality;
IN USHORT SendWindow; // suggested by the MAC
IN UCHAR RemoteAddress[6];
IN OUT UCHAR LocalAddress[6];
IN ULONG ProtocolBufferLength; // Length of protocol info buffer
IN PUCHAR ProtocolBuffer; // Information used by protocol
IN USHORT ProtocolType; // Protocol ID
IN OUT NDIS_STRING DeviceName;
} NDIS_WAN_LINE_UP, *PNDIS_WAN_LINE_UP;
//
// The structure passed up on a WAN_LINE_DOWN indication
//
typedef struct _NDIS_WAN_LINE_DOWN
{
IN UCHAR RemoteAddress[6];
IN UCHAR LocalAddress[6];
} NDIS_WAN_LINE_DOWN, *PNDIS_WAN_LINE_DOWN;
//
// The structure passed up on a WAN_FRAGMENT indication
//
typedef struct _NDIS_WAN_FRAGMENT
{
IN UCHAR RemoteAddress[6];
IN UCHAR LocalAddress[6];
} NDIS_WAN_FRAGMENT, *PNDIS_WAN_FRAGMENT;
//
// The structure passed up on a WAN_GET_STATS indication
//
typedef struct _NDIS_WAN_GET_STATS
{
IN UCHAR LocalAddress[6];
OUT ULONG BytesSent;
OUT ULONG BytesRcvd;
OUT ULONG FramesSent;
OUT ULONG FramesRcvd;
OUT ULONG CRCErrors; // Serial-like info only
OUT ULONG TimeoutErrors; // Serial-like info only
OUT ULONG AlignmentErrors; // Serial-like info only
OUT ULONG SerialOverrunErrors; // Serial-like info only
OUT ULONG FramingErrors; // Serial-like info only
OUT ULONG BufferOverrunErrors; // Serial-like info only
OUT ULONG BytesTransmittedUncompressed; // Compression info only
OUT ULONG BytesReceivedUncompressed; // Compression info only
OUT ULONG BytesTransmittedCompressed; // Compression info only
OUT ULONG BytesReceivedCompressed; // Compression info only
} NDIS_WAN_GET_STATS, *PNDIS_WAN_GET_STATS;
//
// Ndis Buffer is actually an Mdl
//
typedef MDL NDIS_BUFFER, *PNDIS_BUFFER;
#if NDIS_LEGACY_DRIVER
struct _NDIS_PACKET;
typedef NDIS_HANDLE PNDIS_PACKET_POOL;
//
//
// wrapper-specific part of a packet
//
typedef struct _NDIS_PACKET_PRIVATE
{
UINT PhysicalCount; // number of physical pages in packet.
UINT TotalLength; // Total amount of data in the packet.
PNDIS_BUFFER Head; // first buffer in the chain
PNDIS_BUFFER Tail; // last buffer in the chain
// if Head is NULL the chain is empty; Tail doesn't have to be NULL also
PNDIS_PACKET_POOL Pool; // so we know where to free it back to
UINT Count;
ULONG Flags;
BOOLEAN ValidCounts;
UCHAR NdisPacketFlags; // See fPACKET_xxx bits below
USHORT NdisPacketOobOffset;
} NDIS_PACKET_PRIVATE, * PNDIS_PACKET_PRIVATE;
//
// The bits define the bits in the Flags
//
#define NDIS_FLAGS_PROTOCOL_ID_MASK 0x0000000F // The low 4 bits are defined for protocol-id
// The values are defined in ntddndis.h
#define NDIS_FLAGS_MULTICAST_PACKET 0x00000010 // don't use
#define NDIS_FLAGS_RESERVED2 0x00000020 // don't use
#define NDIS_FLAGS_RESERVED3 0x00000040 // don't use
#define NDIS_FLAGS_DONT_LOOPBACK 0x00000080 // Write only
#define NDIS_FLAGS_IS_LOOPBACK_PACKET 0x00000100 // Read only
#define NDIS_FLAGS_LOOPBACK_ONLY 0x00000200 // Write only
#define NDIS_FLAGS_RESERVED4 0x00000400 // don't use
#define NDIS_FLAGS_DOUBLE_BUFFERED 0x00000800 // used by ndis
#define NDIS_FLAGS_SENT_AT_DPC 0x00001000 // the protocol sent this packet at DPC
#define NDIS_FLAGS_USES_SG_BUFFER_LIST 0x00002000 // used by Ndis
#define NDIS_FLAGS_USES_ORIGINAL_PACKET 0x00004000 // used by Ndis
#define NDIS_FLAGS_PADDED 0x00010000 // used by NDIS
#define NDIS_FLAGS_XLATE_AT_TOP 0x00020000 // used by NDIS
//
// Low-bits in the NdisPacketFlags are reserved by NDIS Wrapper for internal use
//
#define fPACKET_WRAPPER_RESERVED 0x3F
#define fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO 0x40
#define fPACKET_ALLOCATED_BY_NDIS 0x80
#endif // NDIS_LEGACY_DRIVER
//
// Definition for layout of the media-specific data. More than one class of media-specific
// information can be tagged onto a packet.
//
typedef enum _NDIS_CLASS_ID
{
NdisClass802_3Priority,
NdisClassWirelessWanMbxMailbox,
NdisClassIrdaPacketInfo,
NdisClassAtmAALInfo
} NDIS_CLASS_ID;
typedef struct _MEDIA_SPECIFIC_INFORMATION
{
UINT NextEntryOffset;
NDIS_CLASS_ID ClassId;
UINT Size;
UCHAR ClassInformation[1];
} MEDIA_SPECIFIC_INFORMATION, *PMEDIA_SPECIFIC_INFORMATION;
#if NDIS_LEGACY_DRIVER
typedef struct _NDIS_PACKET_OOB_DATA
{
union
{
ULONGLONG TimeToSend;
ULONGLONG TimeSent;
};
ULONGLONG TimeReceived;
UINT HeaderSize;
UINT SizeMediaSpecificInfo;
PVOID MediaSpecificInformation;
NDIS_STATUS Status;
} NDIS_PACKET_OOB_DATA, *PNDIS_PACKET_OOB_DATA;
#define NDIS_GET_PACKET_PROTOCOL_TYPE(_Packet_) ((_Packet_)->Private.Flags & NDIS_PROTOCOL_ID_MASK)
#define NDIS_OOB_DATA_FROM_PACKET(_p) \
(PNDIS_PACKET_OOB_DATA)((PUCHAR)(_p) + \
(_p)->Private.NdisPacketOobOffset)
#define NDIS_GET_PACKET_HEADER_SIZE(_Packet) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->HeaderSize
#define NDIS_GET_PACKET_STATUS(_Packet) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->Status
#define NDIS_GET_PACKET_TIME_TO_SEND(_Packet) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->TimeToSend
#define NDIS_GET_PACKET_TIME_SENT(_Packet) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->TimeSent
#define NDIS_GET_PACKET_TIME_RECEIVED(_Packet) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->TimeReceived
#define NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(_Packet, \
_pMediaSpecificInfo, \
_pSizeMediaSpecificInfo) \
{ \
if (!((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS) ||\
!((_Packet)->Private.NdisPacketFlags & fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO))\
{ \
*(_pMediaSpecificInfo) = NULL; \
*(_pSizeMediaSpecificInfo) = 0; \
} \
else \
{ \
*(_pMediaSpecificInfo) =((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +\
(_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation;\
*(_pSizeMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +\
(_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo;\
} \
}
#define NDIS_SET_PACKET_HEADER_SIZE(_Packet, _HdrSize) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->HeaderSize = (_HdrSize)
#define NDIS_SET_PACKET_STATUS(_Packet, _Status) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->Status = (_Status)
#define NDIS_SET_PACKET_TIME_TO_SEND(_Packet, _TimeToSend) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->TimeToSend = (_TimeToSend)
#define NDIS_SET_PACKET_TIME_SENT(_Packet, _TimeSent) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->TimeSent = (_TimeSent)
#define NDIS_SET_PACKET_TIME_RECEIVED(_Packet, _TimeReceived) \
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->TimeReceived = (_TimeReceived)
#define NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(_Packet, \
_MediaSpecificInfo, \
_SizeMediaSpecificInfo) \
{ \
if ((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS) \
{ \
(_Packet)->Private.NdisPacketFlags |= fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO;\
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation = (_MediaSpecificInfo);\
((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
(_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo = (_SizeMediaSpecificInfo);\
} \
}
//
// packet definition
//
typedef struct _NDIS_PACKET
{
NDIS_PACKET_PRIVATE Private;
union
{
struct // For Connection-less miniports
{
UCHAR MiniportReserved[2*sizeof(PVOID)];
UCHAR WrapperReserved[2*sizeof(PVOID)];
};
struct
{
//
// For de-serialized miniports. And by implication conn-oriented miniports.
//
UCHAR MiniportReservedEx[3*sizeof(PVOID)];
UCHAR WrapperReservedEx[sizeof(PVOID)];
};
struct
{
UCHAR MacReserved[4*sizeof(PVOID)];
};
};
ULONG_PTR Reserved[2]; // For compatibility with Win95
UCHAR ProtocolReserved[1];
} NDIS_PACKET, *PNDIS_PACKET, **PPNDIS_PACKET;
#endif // NDIS_LEGACY_DRIVER
//
// NDIS per-packet information.
//
typedef enum _NDIS_PER_PACKET_INFO
{
TcpIpChecksumPacketInfo,
IpSecPacketInfo,
TcpLargeSendPacketInfo,
ClassificationHandlePacketInfo,
NdisReserved,
ScatterGatherListPacketInfo,
Ieee8021QInfo,
OriginalPacketInfo,
PacketCancelId,
OriginalNetBufferList,
CachedNetBufferList,
ShortPacketPaddingInfo,
MaxPerPacketInfo
} NDIS_PER_PACKET_INFO, *PNDIS_PER_PACKET_INFO;
#if NDIS_LEGACY_DRIVER
typedef struct _NDIS_PACKET_EXTENSION
{
PVOID NdisPacketInfo[MaxPerPacketInfo];
} NDIS_PACKET_EXTENSION, *PNDIS_PACKET_EXTENSION;
#define NDIS_PACKET_EXTENSION_FROM_PACKET(_P) ((PNDIS_PACKET_EXTENSION)((PUCHAR)(_P) + (_P)->Private.NdisPacketOobOffset + sizeof(NDIS_PACKET_OOB_DATA)))
#define NDIS_PER_PACKET_INFO_FROM_PACKET(_P, _Id) ((PNDIS_PACKET_EXTENSION)((PUCHAR)(_P) + (_P)->Private.NdisPacketOobOffset + sizeof(NDIS_PACKET_OOB_DATA)))->NdisPacketInfo[(_Id)]
#define NDIS_GET_ORIGINAL_PACKET(_P) NDIS_PER_PACKET_INFO_FROM_PACKET(_P, OriginalPacketInfo)
#define NDIS_SET_ORIGINAL_PACKET(_P, _OP) NDIS_PER_PACKET_INFO_FROM_PACKET(_P, OriginalPacketInfo) = _OP
#define NDIS_GET_PACKET_CANCEL_ID(_P) NDIS_PER_PACKET_INFO_FROM_PACKET(_P, PacketCancelId)
#define NDIS_SET_PACKET_CANCEL_ID(_P, _cId) NDIS_PER_PACKET_INFO_FROM_PACKET(_P, PacketCancelId) = _cId
//
// Ndis 5.1 entry points for setting/gettign packet's CancelId and cancelling send packets
//
/*
EXPORT
VOID
NdisSetPacketCancelId(
IN PNDIS_PACKET Packet,
IN PVOID CancelId
);
*/
#define NdisSetPacketCancelId(_Packet, _CancelId) NDIS_SET_PACKET_CANCEL_ID(_Packet, _CancelId)
/*
EXPORT
PVOID
NdisGetPacketCancelId(
IN PNDIS_PACKET Packet
);
*/
#define NdisGetPacketCancelId(_Packet) NDIS_GET_PACKET_CANCEL_ID(_Packet)
typedef struct _NDIS_PACKET_STACK
{
ULONG_PTR IMReserved[2];
ULONG_PTR NdisReserved[4];
} NDIS_PACKET_STACK, *PNDIS_PACKET_STACK;
#endif // NDIS_LEGACY_DRIVER
//
// Per-packet information for TcpIpChecksumPacketInfo.
//
typedef struct _NDIS_TCP_IP_CHECKSUM_PACKET_INFO
{
union
{
struct
{
ULONG NdisPacketChecksumV4:1;
ULONG NdisPacketChecksumV6:1;
ULONG NdisPacketTcpChecksum:1;
ULONG NdisPacketUdpChecksum:1;
ULONG NdisPacketIpChecksum:1;
} Transmit;
struct
{
ULONG NdisPacketTcpChecksumFailed:1;
ULONG NdisPacketUdpChecksumFailed:1;
ULONG NdisPacketIpChecksumFailed:1;
ULONG NdisPacketTcpChecksumSucceeded:1;
ULONG NdisPacketUdpChecksumSucceeded:1;
ULONG NdisPacketIpChecksumSucceeded:1;
ULONG NdisPacketLoopback:1;
} Receive;
ULONG Value;
};
} NDIS_TCP_IP_CHECKSUM_PACKET_INFO, *PNDIS_TCP_IP_CHECKSUM_PACKET_INFO;
//
// Per-packet information for Ieee8021QInfo.
//
typedef struct _NDIS_PACKET_8021Q_INFO
{
union
{
struct
{
UINT32 UserPriority:3; // 802.1p priority
UINT32 CanonicalFormatId:1; // always 0
UINT32 VlanId:12; // VLAN Identification
UINT32 Reserved:16; // set to 0
} TagHeader;
PVOID Value;
};
} NDIS_PACKET_8021Q_INFO, *PNDIS_PACKET_8021Q_INFO;
#if NDIS_LEGACY_DRIVER
//
// Old definitions, to be obsoleted.
//
#define Ieee8021pPriority Ieee8021QInfo
typedef UINT IEEE8021PPRIORITY;
//
// WAN Packet. This is used by WAN miniports only. This is the legacy model.
// Co-Ndis is the preferred model for WAN miniports
//
typedef struct _NDIS_WAN_PACKET
{
LIST_ENTRY WanPacketQueue;
PUCHAR CurrentBuffer;
ULONG CurrentLength;
PUCHAR StartBuffer;
PUCHAR EndBuffer;
PVOID ProtocolReserved1;
PVOID ProtocolReserved2;
PVOID ProtocolReserved3;
PVOID ProtocolReserved4;
PVOID MacReserved1;
PVOID MacReserved2;
PVOID MacReserved3;
PVOID MacReserved4;
} NDIS_WAN_PACKET, *PNDIS_WAN_PACKET;
//
// Routines to get/set packet flags
//
/*++
UINT
NdisGetPacketFlags(
IN PNDIS_PACKET Packet
);
--*/
#define NdisGetPacketFlags(_Packet) ((_Packet)->Private.Flags)
#define NDIS_PACKET_FIRST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Head)
#define NDIS_PACKET_LAST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Tail)
#define NDIS_PACKET_VALID_COUNTS(_Packet) ((_Packet)->Private.ValidCounts)
/*++
VOID
NdisSetPacketFlags(
IN PNDIS_PACKET Packet,
IN UINT Flags
);
--*/
#define NdisSetPacketFlags(_Packet, _Flags) (_Packet)->Private.Flags |= (_Flags)
#define NdisClearPacketFlags(_Packet, _Flags) (_Packet)->Private.Flags &= ~(_Flags)
#endif // NDIS_LEGACY_DRIVER
//
// Request types used by NdisRequest; constants are added for
// all entry points in the MAC, for those that want to create
// their own internal requests.
//
#if NDIS_SUPPORT_NDIS6
typedef enum _NDIS_REQUEST_TYPE
{
NdisRequestQueryInformation,
NdisRequestSetInformation,
NdisRequestQueryStatistics,
NdisRequestOpen,
NdisRequestClose,
NdisRequestSend,
NdisRequestTransferData,
NdisRequestReset,
NdisRequestGeneric1,
NdisRequestGeneric2,
NdisRequestGeneric3,
NdisRequestGeneric4,
NdisRequestMethod,
} NDIS_REQUEST_TYPE, *PNDIS_REQUEST_TYPE;
#else
typedef enum _NDIS_REQUEST_TYPE
{
NdisRequestQueryInformation,
NdisRequestSetInformation,
NdisRequestQueryStatistics,
NdisRequestOpen,
NdisRequestClose,
NdisRequestSend,
NdisRequestTransferData,
NdisRequestReset,
NdisRequestGeneric1,
NdisRequestGeneric2,
NdisRequestGeneric3,
NdisRequestGeneric4,
} NDIS_REQUEST_TYPE, *PNDIS_REQUEST_TYPE;
#endif // NDIS_SUPPORT_NDIS6
#if NDIS_LEGACY_DRIVER
//
// Structure of requests sent via NdisRequest
//
typedef struct _NDIS_REQUEST
{
UCHAR MacReserved[4*sizeof(PVOID)];
NDIS_REQUEST_TYPE RequestType;
union _DATA
{
struct _QUERY_INFORMATION
{
NDIS_OID Oid;
PVOID InformationBuffer;
UINT InformationBufferLength;
UINT BytesWritten;
UINT BytesNeeded;
} QUERY_INFORMATION;
struct _SET_INFORMATION
{
NDIS_OID Oid;
PVOID InformationBuffer;
UINT InformationBufferLength;
UINT BytesRead;
UINT BytesNeeded;
} SET_INFORMATION;
} DATA;
#if (defined(NDIS50) || defined(NDIS51) || defined(NDIS50_MINIPORT) || defined(NDIS51_MINIPORT))
UCHAR NdisReserved[9*sizeof(PVOID)];
union
{
UCHAR CallMgrReserved[2*sizeof(PVOID)];
UCHAR ProtocolReserved[2*sizeof(PVOID)];
};
UCHAR MiniportReserved[2*sizeof(PVOID)];
#endif
} NDIS_REQUEST, *PNDIS_REQUEST;
#endif
//
// NDIS Address Family definitions.
//
typedef ULONG NDIS_AF, *PNDIS_AF;
#define CO_ADDRESS_FAMILY_Q2931 ((NDIS_AF)0x1) // ATM
#define CO_ADDRESS_FAMILY_PSCHED ((NDIS_AF)0x2) // Packet scheduler
#define CO_ADDRESS_FAMILY_L2TP ((NDIS_AF)0x3)
#define CO_ADDRESS_FAMILY_IRDA ((NDIS_AF)0x4)
#define CO_ADDRESS_FAMILY_1394 ((NDIS_AF)0x5)
#define CO_ADDRESS_FAMILY_PPP ((NDIS_AF)0x6)
#define CO_ADDRESS_FAMILY_INFINIBAND ((NDIS_AF)0x7)
#define CO_ADDRESS_FAMILY_TAPI ((NDIS_AF)0x800)
#define CO_ADDRESS_FAMILY_TAPI_PROXY ((NDIS_AF)0x801)
//
// The following is OR'ed with the base AF to denote proxy support
//
#define CO_ADDRESS_FAMILY_PROXY 0x80000000
//
// Address family structure registered/opened via
// NdisCmRegisterAddressFamily
// NdisClOpenAddressFamily
//
typedef struct
{
NDIS_AF AddressFamily; // one of the CO_ADDRESS_FAMILY_xxx values above
ULONG MajorVersion; // the major version of call manager
ULONG MinorVersion; // the minor version of call manager
} CO_ADDRESS_FAMILY, *PCO_ADDRESS_FAMILY;
//
// Definition for a SAP
//
typedef struct
{
ULONG SapType;
ULONG SapLength;
UCHAR Sap[1];
} CO_SAP, *PCO_SAP;
//
// Definitions for physical address.
//
typedef PHYSICAL_ADDRESS NDIS_PHYSICAL_ADDRESS, *PNDIS_PHYSICAL_ADDRESS;
typedef struct _NDIS_PHYSICAL_ADDRESS_UNIT
{
NDIS_PHYSICAL_ADDRESS PhysicalAddress;
UINT Length;
} NDIS_PHYSICAL_ADDRESS_UNIT, *PNDIS_PHYSICAL_ADDRESS_UNIT;
/*++
ULONG
NdisGetPhysicalAddressHigh(
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress
);
--*/
#define NdisGetPhysicalAddressHigh(_PhysicalAddress) \
((_PhysicalAddress).HighPart)
/*++
VOID
NdisSetPhysicalAddressHigh(
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress,
IN ULONG Value
);
--*/
#define NdisSetPhysicalAddressHigh(_PhysicalAddress, _Value) \
((_PhysicalAddress).HighPart) = (_Value)
/*++
ULONG
NdisGetPhysicalAddressLow(
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress
);
--*/
#define NdisGetPhysicalAddressLow(_PhysicalAddress) \
((_PhysicalAddress).LowPart)
/*++
VOID
NdisSetPhysicalAddressLow(
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress,
IN ULONG Value
);
--*/
#define NdisSetPhysicalAddressLow(_PhysicalAddress, _Value) \
((_PhysicalAddress).LowPart) = (_Value)
//
// Macro to initialize an NDIS_PHYSICAL_ADDRESS constant
//
#define NDIS_PHYSICAL_ADDRESS_CONST(_Low, _High) \
{ (ULONG)(_Low), (LONG)(_High) }
//
// block used for references...
//
typedef struct _REFERENCE
{
KSPIN_LOCK SpinLock;
USHORT ReferenceCount;
BOOLEAN Closing;
} REFERENCE, * PREFERENCE;
//
// Types of Memory (not mutually exclusive)
//
#define NDIS_MEMORY_CONTIGUOUS 0x00000001
#define NDIS_MEMORY_NONCACHED 0x00000002
//
// Open options
//
//
// This flag has been deprecated
//
#pragma deprecated(NDIS_OPEN_RECEIVE_NOT_REENTRANT)
#define NDIS_OPEN_RECEIVE_NOT_REENTRANT 0x00000001
//
// NDIS_STATUS values used in status indication
//
#define NDIS_STATUS_ONLINE ((NDIS_STATUS)0x40010003L)
#define NDIS_STATUS_RESET_START ((NDIS_STATUS)0x40010004L)
#define NDIS_STATUS_RESET_END ((NDIS_STATUS)0x40010005L)
#define NDIS_STATUS_RING_STATUS ((NDIS_STATUS)0x40010006L)
#define NDIS_STATUS_CLOSED ((NDIS_STATUS)0x40010007L)
#define NDIS_STATUS_WAN_LINE_UP ((NDIS_STATUS)0x40010008L)
#define NDIS_STATUS_WAN_LINE_DOWN ((NDIS_STATUS)0x40010009L)
#define NDIS_STATUS_WAN_FRAGMENT ((NDIS_STATUS)0x4001000AL)
#define NDIS_STATUS_MEDIA_CONNECT ((NDIS_STATUS)0x4001000BL)
#define NDIS_STATUS_MEDIA_DISCONNECT ((NDIS_STATUS)0x4001000CL)
#define NDIS_STATUS_HARDWARE_LINE_UP ((NDIS_STATUS)0x4001000DL)
#define NDIS_STATUS_HARDWARE_LINE_DOWN ((NDIS_STATUS)0x4001000EL)
#define NDIS_STATUS_INTERFACE_UP ((NDIS_STATUS)0x4001000FL)
#define NDIS_STATUS_INTERFACE_DOWN ((NDIS_STATUS)0x40010010L)
#define NDIS_STATUS_MEDIA_BUSY ((NDIS_STATUS)0x40010011L)
#define NDIS_STATUS_MEDIA_SPECIFIC_INDICATION ((NDIS_STATUS)0x40010012L)
#define NDIS_STATUS_WW_INDICATION NDIS_STATUS_MEDIA_SPECIFIC_INDICATION
#define NDIS_STATUS_LINK_SPEED_CHANGE ((NDIS_STATUS)0x40010013L)
#define NDIS_STATUS_WAN_GET_STATS ((NDIS_STATUS)0x40010014L)
#define NDIS_STATUS_WAN_CO_FRAGMENT ((NDIS_STATUS)0x40010015L)
#define NDIS_STATUS_WAN_CO_LINKPARAMS ((NDIS_STATUS)0x40010016L)
#define NDIS_STATUS_WAN_CO_MTULINKPARAMS ((NDIS_STATUS)0x40010025L)
//
// new status indication codes used by NDIS 6 drivers
//
#if NDIS_SUPPORT_NDIS6
#define NDIS_STATUS_LINK_STATE ((NDIS_STATUS)0x40010017L)
#define NDIS_STATUS_NETWORK_CHANGE ((NDIS_STATUS)0x40010018L)
#define NDIS_STATUS_MEDIA_SPECIFIC_INDICATION_EX ((NDIS_STATUS)0x40010019L)
#define NDIS_STATUS_PORT_STATE ((NDIS_STATUS)0x40010022L)
#define NDIS_STATUS_OPER_STATUS ((NDIS_STATUS)0x40010023L)
#define NDIS_STATUS_PACKET_FILTER ((NDIS_STATUS)0x40010024L)
// Note that 0x40010025L is reserved for NDIS_STATUS_WAN_CO_MTULINKPARAMS
#define NDIS_STATUS_IP_OPER_STATUS ((NDIS_STATUS)0x40010026L)
//
// offload specific status indication codes
//
#define NDIS_STATUS_OFFLOAD_PAUSE ((NDIS_STATUS)0x40020001L)
#define NDIS_STATUS_UPLOAD_ALL ((NDIS_STATUS)0x40020002L)
#define NDIS_STATUS_OFFLOAD_RESUME ((NDIS_STATUS)0x40020003L)
#define NDIS_STATUS_OFFLOAD_PARTIAL_SUCCESS ((NDIS_STATUS)0x40020004L)
#define NDIS_STATUS_OFFLOAD_STATE_INVALID ((NDIS_STATUS)0x40020005L)
#define NDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG ((NDIS_STATUS)0x40020006L)
#define NDIS_STATUS_TASK_OFFLOAD_HARDWARE_CAPABILITIES ((NDIS_STATUS)0x40020007L)
#define NDIS_STATUS_OFFLOAD_ENCASPULATION_CHANGE ((NDIS_STATUS)0x40020008L)
#define NDIS_STATUS_TCP_CONNECTION_OFFLOAD_HARDWARE_CAPABILITIES ((NDIS_STATUS)0x4002000BL)
#if (NDIS_SUPPORT_NDIS61)
#define NDIS_STATUS_HD_SPLIT_CURRENT_CONFIG ((NDIS_STATUS)0x4002000CL)
#endif // (NDIS_SUPPORT_NDIS61)
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_STATUS_RECEIVE_QUEUE_STATE ((NDIS_STATUS)0x4002000DL)
#endif
#define NDIS_STATUS_OFFLOAD_IM_RESERVED1 ((NDIS_STATUS)0x40020100L)
#define NDIS_STATUS_OFFLOAD_IM_RESERVED2 ((NDIS_STATUS)0x40020101L)
#define NDIS_STATUS_OFFLOAD_IM_RESERVED3 ((NDIS_STATUS)0x40020102L)
//
// 802.11 specific status indication codes
//
#define NDIS_STATUS_DOT11_SCAN_CONFIRM ((NDIS_STATUS)0x40030000L)
#define NDIS_STATUS_DOT11_MPDU_MAX_LENGTH_CHANGED ((NDIS_STATUS)0x40030001L)
#define NDIS_STATUS_DOT11_ASSOCIATION_START ((NDIS_STATUS)0x40030002L)
#define NDIS_STATUS_DOT11_ASSOCIATION_COMPLETION ((NDIS_STATUS)0x40030003L)
#define NDIS_STATUS_DOT11_CONNECTION_START ((NDIS_STATUS)0x40030004L)
#define NDIS_STATUS_DOT11_CONNECTION_COMPLETION ((NDIS_STATUS)0x40030005L)
#define NDIS_STATUS_DOT11_ROAMING_START ((NDIS_STATUS)0x40030006L)
#define NDIS_STATUS_DOT11_ROAMING_COMPLETION ((NDIS_STATUS)0x40030007L)
#define NDIS_STATUS_DOT11_DISASSOCIATION ((NDIS_STATUS)0x40030008L)
#define NDIS_STATUS_DOT11_TKIPMIC_FAILURE ((NDIS_STATUS)0x40030009L)
#define NDIS_STATUS_DOT11_PMKID_CANDIDATE_LIST ((NDIS_STATUS)0x4003000AL)
#define NDIS_STATUS_DOT11_PHY_STATE_CHANGED ((NDIS_STATUS)0x4003000BL)
#define NDIS_STATUS_DOT11_LINK_QUALITY ((NDIS_STATUS)0x4003000CL)
#define NDIS_STATUS_DOT11_INCOMING_ASSOC_STARTED ((NDIS_STATUS)0x4003000DL)
#define NDIS_STATUS_DOT11_INCOMING_ASSOC_REQUEST_RECEIVED ((NDIS_STATUS)0x4003000EL)
#define NDIS_STATUS_DOT11_INCOMING_ASSOC_COMPLETION ((NDIS_STATUS)0x4003000FL)
#define NDIS_STATUS_DOT11_STOP_AP ((NDIS_STATUS)0x40030010L)
#define NDIS_STATUS_DOT11_PHY_FREQUENCY_ADOPTED ((NDIS_STATUS)0x40030011L)
#define NDIS_STATUS_DOT11_CAN_SUSTAIN_AP ((NDIS_STATUS)0x40030012L)
//
// Add WWAN specific status indication codes
//
#define NDIS_STATUS_WWAN_DEVICE_CAPS ((NDIS_STATUS)0x40041000)
#define NDIS_STATUS_WWAN_READY_INFO ((NDIS_STATUS)0x40041001)
#define NDIS_STATUS_WWAN_RADIO_STATE ((NDIS_STATUS)0x40041002)
#define NDIS_STATUS_WWAN_PIN_INFO ((NDIS_STATUS)0x40041003)
#define NDIS_STATUS_WWAN_PIN_LIST ((NDIS_STATUS)0x40041004)
#define NDIS_STATUS_WWAN_HOME_PROVIDER ((NDIS_STATUS)0x40041005)
#define NDIS_STATUS_WWAN_PREFERRED_PROVIDERS ((NDIS_STATUS)0x40041006)
#define NDIS_STATUS_WWAN_VISIBLE_PROVIDERS ((NDIS_STATUS)0x40041007)
#define NDIS_STATUS_WWAN_REGISTER_STATE ((NDIS_STATUS)0x40041008)
#define NDIS_STATUS_WWAN_PACKET_SERVICE ((NDIS_STATUS)0x40041009)
#define NDIS_STATUS_WWAN_SIGNAL_STATE ((NDIS_STATUS)0x4004100a)
#define NDIS_STATUS_WWAN_CONTEXT_STATE ((NDIS_STATUS)0x4004100b)
#define NDIS_STATUS_WWAN_PROVISIONED_CONTEXTS ((NDIS_STATUS)0x4004100c)
#define NDIS_STATUS_WWAN_SERVICE_ACTIVATION ((NDIS_STATUS)0x4004100d)
#define NDIS_STATUS_WWAN_SMS_CONFIGURATION ((NDIS_STATUS)0x4004100e)
#define NDIS_STATUS_WWAN_SMS_RECEIVE ((NDIS_STATUS)0x4004100f)
#define NDIS_STATUS_WWAN_SMS_SEND ((NDIS_STATUS)0x40041010)
#define NDIS_STATUS_WWAN_SMS_DELETE ((NDIS_STATUS)0x40041011)
#define NDIS_STATUS_WWAN_SMS_STATUS ((NDIS_STATUS)0x40041012)
#define NDIS_STATUS_WWAN_DNS_ADDRESS ((NDIS_STATUS)0x40041013)
#define NDIS_STATUS_WWAN_VENDOR_SPECIFIC ((NDIS_STATUS)0x40043000)
//
// End of WWAN specific status indication codes
//
//
// Add WiMAX specific status indication codes
//
#endif NDIS_SUPPORT_NDIS6
//
// Status codes for NDIS 6.20 Power Management
//
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_STATUS_PM_WOL_PATTERN_REJECTED ((NDIS_STATUS)0x40030051L)
#define NDIS_STATUS_PM_OFFLOAD_REJECTED ((NDIS_STATUS)0x40030052L)
#define NDIS_STATUS_PM_CAPABILITIES_CHANGE ((NDIS_STATUS)0x40030053L)
#endif
//
// status codes returned by drivers
//
#define NDIS_STATUS_SUCCESS ((NDIS_STATUS)STATUS_SUCCESS)
#define NDIS_STATUS_PENDING ((NDIS_STATUS)STATUS_PENDING)
#define NDIS_STATUS_NOT_RECOGNIZED ((NDIS_STATUS)0x00010001L)
#define NDIS_STATUS_NOT_COPIED ((NDIS_STATUS)0x00010002L)
#define NDIS_STATUS_NOT_ACCEPTED ((NDIS_STATUS)0x00010003L)
#define NDIS_STATUS_CALL_ACTIVE ((NDIS_STATUS)0x00010007L)
#define NDIS_STATUS_INDICATION_REQUIRED ((NDIS_STATUS)STATUS_NDIS_INDICATION_REQUIRED)
#define NDIS_STATUS_NOT_RESETTABLE ((NDIS_STATUS)0x80010001L)
#define NDIS_STATUS_SOFT_ERRORS ((NDIS_STATUS)0x80010003L)
#define NDIS_STATUS_HARD_ERRORS ((NDIS_STATUS)0x80010004L)
#define NDIS_STATUS_BUFFER_OVERFLOW ((NDIS_STATUS)STATUS_BUFFER_OVERFLOW)
#define NDIS_STATUS_FAILURE ((NDIS_STATUS)STATUS_UNSUCCESSFUL)
#define NDIS_STATUS_RESOURCES ((NDIS_STATUS)STATUS_INSUFFICIENT_RESOURCES)
#define NDIS_STATUS_CLOSING ((NDIS_STATUS)0xC0010002L)
#define NDIS_STATUS_BAD_VERSION ((NDIS_STATUS)0xC0010004L)
#define NDIS_STATUS_BAD_CHARACTERISTICS ((NDIS_STATUS)0xC0010005L)
#define NDIS_STATUS_ADAPTER_NOT_FOUND ((NDIS_STATUS)0xC0010006L)
#define NDIS_STATUS_OPEN_FAILED ((NDIS_STATUS)0xC0010007L)
#define NDIS_STATUS_DEVICE_FAILED ((NDIS_STATUS)0xC0010008L)
#define NDIS_STATUS_MULTICAST_FULL ((NDIS_STATUS)0xC0010009L)
#define NDIS_STATUS_MULTICAST_EXISTS ((NDIS_STATUS)0xC001000AL)
#define NDIS_STATUS_MULTICAST_NOT_FOUND ((NDIS_STATUS)0xC001000BL)
#define NDIS_STATUS_REQUEST_ABORTED ((NDIS_STATUS)0xC001000CL)
#define NDIS_STATUS_RESET_IN_PROGRESS ((NDIS_STATUS)0xC001000DL)
#define NDIS_STATUS_CLOSING_INDICATING ((NDIS_STATUS)0xC001000EL)
#define NDIS_STATUS_NOT_SUPPORTED ((NDIS_STATUS)STATUS_NOT_SUPPORTED)
#define NDIS_STATUS_INVALID_PACKET ((NDIS_STATUS)0xC001000FL)
#define NDIS_STATUS_OPEN_LIST_FULL ((NDIS_STATUS)0xC0010010L)
#define NDIS_STATUS_ADAPTER_NOT_READY ((NDIS_STATUS)0xC0010011L)
#define NDIS_STATUS_ADAPTER_NOT_OPEN ((NDIS_STATUS)0xC0010012L)
#define NDIS_STATUS_NOT_INDICATING ((NDIS_STATUS)0xC0010013L)
#define NDIS_STATUS_INVALID_LENGTH ((NDIS_STATUS)0xC0010014L)
#define NDIS_STATUS_INVALID_DATA ((NDIS_STATUS)0xC0010015L)
#define NDIS_STATUS_BUFFER_TOO_SHORT ((NDIS_STATUS)0xC0010016L)
#define NDIS_STATUS_INVALID_OID ((NDIS_STATUS)0xC0010017L)
#define NDIS_STATUS_ADAPTER_REMOVED ((NDIS_STATUS)0xC0010018L)
#define NDIS_STATUS_UNSUPPORTED_MEDIA ((NDIS_STATUS)0xC0010019L)
#define NDIS_STATUS_GROUP_ADDRESS_IN_USE ((NDIS_STATUS)0xC001001AL)
#define NDIS_STATUS_FILE_NOT_FOUND ((NDIS_STATUS)0xC001001BL)
#define NDIS_STATUS_ERROR_READING_FILE ((NDIS_STATUS)0xC001001CL)
#define NDIS_STATUS_ALREADY_MAPPED ((NDIS_STATUS)0xC001001DL)
#define NDIS_STATUS_RESOURCE_CONFLICT ((NDIS_STATUS)0xC001001EL)
#define NDIS_STATUS_NO_CABLE ((NDIS_STATUS)0xC001001FL)
#define NDIS_STATUS_INVALID_DEVICE_REQUEST ((NDIS_STATUS)STATUS_INVALID_DEVICE_REQUEST)
#define NDIS_STATUS_NETWORK_UNREACHABLE ((NDIS_STATUS)STATUS_NETWORK_UNREACHABLE)
//
// CO-NDIS specific
//
#define NDIS_STATUS_INVALID_SAP ((NDIS_STATUS)0xC0010020L)
#define NDIS_STATUS_SAP_IN_USE ((NDIS_STATUS)0xC0010021L)
#define NDIS_STATUS_INVALID_ADDRESS ((NDIS_STATUS)0xC0010022L)
#define NDIS_STATUS_VC_NOT_ACTIVATED ((NDIS_STATUS)0xC0010023L)
#define NDIS_STATUS_DEST_OUT_OF_ORDER ((NDIS_STATUS)0xC0010024L) // cause 27
#define NDIS_STATUS_VC_NOT_AVAILABLE ((NDIS_STATUS)0xC0010025L) // cause 35,45
#define NDIS_STATUS_CELLRATE_NOT_AVAILABLE ((NDIS_STATUS)0xC0010026L) // cause 37
#define NDIS_STATUS_INCOMPATABLE_QOS ((NDIS_STATUS)0xC0010027L) // cause 49
#define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED ((NDIS_STATUS)0xC0010028L) // cause 93
#define NDIS_STATUS_NO_ROUTE_TO_DESTINATION ((NDIS_STATUS)0xC0010029L) // cause 3
//
// 802.5 specific
//
#define NDIS_STATUS_TOKEN_RING_OPEN_ERROR ((NDIS_STATUS)0xC0011000L)
//
// new status codes used in NDIS 6
//
#if NDIS_SUPPORT_NDIS6
#define NDIS_STATUS_SEND_ABORTED ((NDIS_STATUS)STATUS_NDIS_REQUEST_ABORTED)
#define NDIS_STATUS_PAUSED ((NDIS_STATUS)STATUS_NDIS_PAUSED)
#define NDIS_STATUS_INTERFACE_NOT_FOUND ((NDIS_STATUS)STATUS_NDIS_INTERFACE_NOT_FOUND)
#define NDIS_STATUS_INVALID_PARAMETER ((NDIS_STATUS)STATUS_INVALID_PARAMETER)
#define NDIS_STATUS_UNSUPPORTED_REVISION ((NDIS_STATUS)STATUS_NDIS_UNSUPPORTED_REVISION)
#define NDIS_STATUS_INVALID_PORT ((NDIS_STATUS)STATUS_NDIS_INVALID_PORT)
#define NDIS_STATUS_INVALID_PORT_STATE ((NDIS_STATUS)STATUS_NDIS_INVALID_PORT_STATE)
#define NDIS_STATUS_INVALID_STATE ((NDIS_STATUS)STATUS_INVALID_DEVICE_STATE)
#define NDIS_STATUS_MEDIA_DISCONNECTED ((NDIS_STATUS)STATUS_NDIS_MEDIA_DISCONNECTED)
#define NDIS_STATUS_LOW_POWER_STATE ((NDIS_STATUS)STATUS_NDIS_LOW_POWER_STATE)
#define NDIS_STATUS_DOT11_AUTO_CONFIG_ENABLED ((NDIS_STATUS)STATUS_NDIS_DOT11_AUTO_CONFIG_ENABLED)
#define NDIS_STATUS_DOT11_MEDIA_IN_USE ((NDIS_STATUS)STATUS_NDIS_DOT11_MEDIA_IN_USE)
#define NDIS_STATUS_DOT11_POWER_STATE_INVALID ((NDIS_STATUS)STATUS_NDIS_DOT11_POWER_STATE_INVALID)
//
// new status codes used in NDIS 6.20
//
#if NDIS_SUPPORT_NDIS620
#define NDIS_STATUS_PM_WOL_PATTERN_LIST_FULL ((NDIS_STATUS)STATUS_NDIS_PM_WOL_PATTERN_LIST_FULL)
#define NDIS_STATUS_PM_PROTOCOL_OFFLOAD_LIST_FULL ((NDIS_STATUS)STATUS_NDIS_PM_PROTOCOL_OFFLOAD_LIST_FULL)
#endif
//
// status codes for offload operations
//
#define NDIS_STATUS_UPLOAD_IN_PROGRESS ((NDIS_STATUS)0xC0231001L)
#define NDIS_STATUS_REQUEST_UPLOAD ((NDIS_STATUS)0xC0231002L)
#define NDIS_STATUS_UPLOAD_REQUESTED ((NDIS_STATUS)0xC0231003L)
#define NDIS_STATUS_OFFLOAD_TCP_ENTRIES ((NDIS_STATUS)0xC0231004L)
#define NDIS_STATUS_OFFLOAD_PATH_ENTRIES ((NDIS_STATUS)0xC0231005L)
#define NDIS_STATUS_OFFLOAD_NEIGHBOR_ENTRIES ((NDIS_STATUS)0xC0231006L)
#define NDIS_STATUS_OFFLOAD_IP_ADDRESS_ENTRIES ((NDIS_STATUS)0xC0231007L)
#define NDIS_STATUS_OFFLOAD_HW_ADDRESS_ENTRIES ((NDIS_STATUS)0xC0231008L)
#define NDIS_STATUS_OFFLOAD_VLAN_ENTRIES ((NDIS_STATUS)0xC0231009L)
#define NDIS_STATUS_OFFLOAD_TCP_XMIT_BUFFER ((NDIS_STATUS)0xC023100AL)
#define NDIS_STATUS_OFFLOAD_TCP_RCV_BUFFER ((NDIS_STATUS)0xC023100BL)
#define NDIS_STATUS_OFFLOAD_TCP_RCV_WINDOW ((NDIS_STATUS)0xC023100CL)
#define NDIS_STATUS_OFFLOAD_VLAN_MISMATCH ((NDIS_STATUS)0xC023100DL)
#define NDIS_STATUS_OFFLOAD_DATA_NOT_ACCEPTED ((NDIS_STATUS)0xC023100EL)
#define NDIS_STATUS_OFFLOAD_POLICY ((NDIS_STATUS)0xC023100FL)
#define NDIS_STATUS_OFFLOAD_DATA_PARTIALLY_ACCEPTED ((NDIS_STATUS)0xC0231010L)
#define NDIS_STATUS_OFFLOAD_REQUEST_RESET ((NDIS_STATUS)0xC0231011L)
#endif // NDIS_SUPPORT_NDIS6
//
// Status codes for NDIS 6.20 capable Chimney offload miniports.
//
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_STATUS_OFFLOAD_CONNECTION_REJECTED ((NDIS_STATUS)STATUS_NDIS_OFFLOAD_CONNECTION_REJECTED)
#endif
//
// used in error logging
//
#define NDIS_ERROR_CODE ULONG
#define NDIS_ERROR_CODE_RESOURCE_CONFLICT EVENT_NDIS_RESOURCE_CONFLICT
#define NDIS_ERROR_CODE_OUT_OF_RESOURCES EVENT_NDIS_OUT_OF_RESOURCE
#define NDIS_ERROR_CODE_HARDWARE_FAILURE EVENT_NDIS_HARDWARE_FAILURE
#define NDIS_ERROR_CODE_ADAPTER_NOT_FOUND EVENT_NDIS_ADAPTER_NOT_FOUND
#define NDIS_ERROR_CODE_INTERRUPT_CONNECT EVENT_NDIS_INTERRUPT_CONNECT
#define NDIS_ERROR_CODE_DRIVER_FAILURE EVENT_NDIS_DRIVER_FAILURE
#define NDIS_ERROR_CODE_BAD_VERSION EVENT_NDIS_BAD_VERSION
#define NDIS_ERROR_CODE_TIMEOUT EVENT_NDIS_TIMEOUT
#define NDIS_ERROR_CODE_NETWORK_ADDRESS EVENT_NDIS_NETWORK_ADDRESS
#define NDIS_ERROR_CODE_UNSUPPORTED_CONFIGURATION EVENT_NDIS_UNSUPPORTED_CONFIGURATION
#define NDIS_ERROR_CODE_INVALID_VALUE_FROM_ADAPTER EVENT_NDIS_INVALID_VALUE_FROM_ADAPTER
#define NDIS_ERROR_CODE_MISSING_CONFIGURATION_PARAMETER EVENT_NDIS_MISSING_CONFIGURATION_PARAMETER
#define NDIS_ERROR_CODE_BAD_IO_BASE_ADDRESS EVENT_NDIS_BAD_IO_BASE_ADDRESS
#define NDIS_ERROR_CODE_RECEIVE_SPACE_SMALL EVENT_NDIS_RECEIVE_SPACE_SMALL
#define NDIS_ERROR_CODE_ADAPTER_DISABLED EVENT_NDIS_ADAPTER_DISABLED
#define NdisAllocateSpinLock(_SpinLock) KeInitializeSpinLock(&(_SpinLock)->SpinLock)
#define NdisFreeSpinLock(_SpinLock)
#define NdisAcquireSpinLock(_SpinLock) KeAcquireSpinLock(&(_SpinLock)->SpinLock, &(_SpinLock)->OldIrql)
#define NdisReleaseSpinLock(_SpinLock) KeReleaseSpinLock(&(_SpinLock)->SpinLock,(_SpinLock)->OldIrql)
#define NdisDprAcquireSpinLock(_SpinLock) \
{ \
KeAcquireSpinLockAtDpcLevel(&(_SpinLock)->SpinLock); \
}
#define NdisDprReleaseSpinLock(_SpinLock) KeReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock)
#define NdisGetCurrentSystemTime(_pSystemTime) \
{ \
KeQuerySystemTime(_pSystemTime); \
}
//
// Interlocked support functions
//
#define NdisInterlockedIncrement(Addend) InterlockedIncrement(Addend)
#define NdisInterlockedDecrement(Addend) InterlockedDecrement(Addend)
#define NdisInterlockedAddUlong(_Addend, _Increment, _SpinLock) \
ExInterlockedAddUlong(_Addend, _Increment, &(_SpinLock)->SpinLock)
#define NdisInterlockedInsertHeadList(_ListHead, _ListEntry, _SpinLock) \
ExInterlockedInsertHeadList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock)
#define NdisInterlockedInsertTailList(_ListHead, _ListEntry, _SpinLock) \
ExInterlockedInsertTailList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock)
#define NdisInterlockedRemoveHeadList(_ListHead, _SpinLock) \
ExInterlockedRemoveHeadList(_ListHead, &(_SpinLock)->SpinLock)
#define NdisInterlockedPushEntryList(ListHead, ListEntry, Lock) \
ExInterlockedPushEntryList(ListHead, ListEntry, &(Lock)->SpinLock)
#define NdisInterlockedPopEntryList(ListHead, Lock) \
ExInterlockedPopEntryList(ListHead, &(Lock)->SpinLock)
#if NDIS_SUPPORT_60_COMPATIBLE_API
typedef union _NDIS_RW_LOCK_REFCOUNT
{
ULONG RefCount;
UCHAR cacheLine[16]; // This is smaller than a cacheline on most CPUs now
} NDIS_RW_LOCK_REFCOUNT;
typedef struct _NDIS_RW_LOCK
{
union
{
struct
{
KSPIN_LOCK SpinLock;
PVOID Context;
};
UCHAR Reserved[16];
};
union
{
NDIS_RW_LOCK_REFCOUNT RefCount[MAXIMUM_PROCESSORS];
ULONG RefCountEx[sizeof(NDIS_RW_LOCK_REFCOUNT)/sizeof(ULONG)
* MAXIMUM_PROCESSORS];
struct
{
KSPIN_LOCK RefCountLock;
volatile ULONG SharedRefCount;
volatile BOOLEAN WriterWaiting;
};
};
} NDIS_RW_LOCK, *PNDIS_RW_LOCK;
typedef struct _LOCK_STATE
{
USHORT LockState;
KIRQL OldIrql;
} LOCK_STATE, *PLOCK_STATE;
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisInitializeReadWriteLock(
__out PNDIS_RW_LOCK Lock
);
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_setsIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisAcquireReadWriteLock(
__inout __drv_acquiresResource(NdisReadWriteLock) PNDIS_RW_LOCK Lock,
__in BOOLEAN fWrite,// TRUE -> Write, FALSE -> Read
__out __drv_savesIRQL
__drv_deref(__drv_acquiresExclusiveResource(NdisReadWriteLockState))
PLOCK_STATE LockState
);
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_minIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisReleaseReadWriteLock(
__inout __drv_releasesResource(NdisReadWriteLock) PNDIS_RW_LOCK Lock,
__in __drv_restoresIRQL __drv_deref(
__drv_releasesExclusiveResource(NdisReadWriteLockState))
PLOCK_STATE LockState
);
#if NDIS_SUPPORT_NDIS6
EXPORT
VOID
NdisDprAcquireReadWriteLock(
IN PNDIS_RW_LOCK Lock,
IN BOOLEAN fWrite, // TRUE -> Write, FALSE -> Read
IN PLOCK_STATE LockState
);
EXPORT
VOID
NdisDprReleaseReadWriteLock(
IN PNDIS_RW_LOCK Lock,
IN PLOCK_STATE LockState
);
#endif
#endif
#if NDIS_SUPPORT_NDIS620
struct _NDIS_RW_LOCK_EX;
typedef struct _NDIS_RW_LOCK_EX NDIS_RW_LOCK_EX;
typedef struct _NDIS_RW_LOCK_EX* PNDIS_RW_LOCK_EX;
typedef struct _LOCK_STATE_EX
{
KIRQL OldIrql;
UCHAR LockState;
UCHAR Flags;
} LOCK_STATE_EX, *PLOCK_STATE_EX;
#define NDIS_RWL_AT_DISPATCH_LEVEL 1
EXPORT
PNDIS_RW_LOCK_EX
NdisAllocateRWLock(
NDIS_HANDLE NdisHandle
);
EXPORT
VOID
NdisFreeRWLock(
__in PNDIS_RW_LOCK_EX Lock
);
EXPORT
VOID
NdisAcquireRWLockRead(
__in PNDIS_RW_LOCK_EX Lock,
__out PLOCK_STATE_EX LockState,
__in UCHAR Flags
);
EXPORT
VOID
NdisAcquireRWLockWrite(
__in PNDIS_RW_LOCK_EX Lock,
__out PLOCK_STATE_EX LockState,
__in UCHAR Flags
);
EXPORT
VOID
NdisReleaseRWLock(
__in PNDIS_RW_LOCK_EX Lock,
__in PLOCK_STATE_EX LockState
);
#endif
#define NdisInterlockedAddLargeStatistic(_Addend, _Increment) \
ExInterlockedAddLargeStatistic((PLARGE_INTEGER)_Addend, _Increment)
//
// S-List support
//
#define NdisInterlockedPushEntrySList(SListHead, SListEntry, Lock) \
ExInterlockedPushEntrySList(SListHead, SListEntry, &(Lock)->SpinLock)
#define NdisInterlockedPopEntrySList(SListHead, Lock) \
ExInterlockedPopEntrySList(SListHead, &(Lock)->SpinLock)
#define NdisInterlockedFlushSList(SListHead) ExInterlockedFlushSList(SListHead)
#define NdisInitializeSListHead(SListHead) ExInitializeSListHead(SListHead)
#define NdisQueryDepthSList(SListHead) ExQueryDepthSList(SListHead)
EXPORT
VOID
NdisGetCurrentProcessorCpuUsage(
OUT PULONG pCpuUsage
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisGetCurrentProcessorCounts(
__out PULONG pIdleCount,
__out PULONG pKernelAndUser,
__out PULONG pIndex
);
#if NDIS_LEGACY_DRIVER
/*
NdisGetSystemUpTime is deprecated, use NdisGetSystemUpTimeEx instead.
*/
DECLSPEC_DEPRECATED_DDK
EXPORT
VOID
NdisGetSystemUpTime(
OUT PULONG pSystemUpTime
);
#endif // NDIS_LEGACY_DRIVER
//
// List manipulation
//
/*++
VOID
NdisInitializeListHead(
IN PLIST_ENTRY ListHead
);
--*/
#define NdisInitializeListHead(_ListHead) InitializeListHead(_ListHead)
//
// Configuration Requests
//
#if NDIS_LEGACY_DRIVER
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisOpenConfiguration(
OUT __checkReturn PNDIS_STATUS Status,
OUT PNDIS_HANDLE ConfigurationHandle,
IN NDIS_HANDLE WrapperConfigurationContext
);
#endif // NDIS_LEGACY_DRIVER
__drv_maxIRQL(APC_LEVEL)
EXPORT
VOID
NdisOpenConfigurationKeyByName(
__out __checkReturn PNDIS_STATUS Status,
__in NDIS_HANDLE ConfigurationHandle,
__in PNDIS_STRING SubKeyName,
__out PNDIS_HANDLE SubKeyHandle
);
__drv_maxIRQL(APC_LEVEL)
EXPORT
VOID
NdisOpenConfigurationKeyByIndex(
__out __checkReturn PNDIS_STATUS Status,
__in NDIS_HANDLE ConfigurationHandle,
__in ULONG Index,
__out PNDIS_STRING KeyName,
__out PNDIS_HANDLE KeyHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisReadConfiguration(
__out __checkReturn PNDIS_STATUS Status,
__deref_out PNDIS_CONFIGURATION_PARAMETER *ParameterValue,
__in NDIS_HANDLE ConfigurationHandle,
__in PNDIS_STRING Keyword,
__in NDIS_PARAMETER_TYPE ParameterType
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisWriteConfiguration(
__out __checkReturn PNDIS_STATUS Status,
__in NDIS_HANDLE ConfigurationHandle,
__in PNDIS_STRING Keyword,
__in PNDIS_CONFIGURATION_PARAMETER ParameterValue
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisCloseConfiguration(
__in __drv_freesMem(mem) NDIS_HANDLE ConfigurationHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisReadNetworkAddress(
__out __checkReturn PNDIS_STATUS Status,
__deref_out_bcount(*NetworkAddressLength) PVOID * NetworkAddress,
__out PUINT NetworkAddressLength,
__in NDIS_HANDLE ConfigurationHandle
);
#if NDIS_LEGACY_MINIPORT
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
ULONG
NdisReadPciSlotInformation(
__in NDIS_HANDLE NdisAdapterHandle,
__in ULONG SlotNumber,
__in ULONG Offset,
__out_bcount(Length)
PVOID Buffer,
__in ULONG Length
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
ULONG
NdisWritePciSlotInformation(
__in NDIS_HANDLE NdisAdapterHandle,
__in ULONG SlotNumber,
__in ULONG Offset,
__in_bcount(Length)
PVOID Buffer,
__in ULONG Length
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
ULONG
NdisReadPcmciaAttributeMemory(
__in NDIS_HANDLE NdisAdapterHandle,
__in ULONG Offset,
__out_bcount(Length)
PVOID Buffer,
__in ULONG Length
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
ULONG
NdisWritePcmciaAttributeMemory(
__in NDIS_HANDLE NdisAdapterHandle,
__in ULONG Offset,
__in_bcount(Length)
PVOID Buffer,
__in ULONG Length
);
#endif // NDIS_LEGACY_MINIPORT
#if NDIS_LEGACY_DRIVER
//
// Buffer Pool
//
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisAllocateBufferPool(
__out PNDIS_STATUS Status,
__out PNDIS_HANDLE PoolHandle,
__in UINT NumberOfDescriptors
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFreeBufferPool(
__in NDIS_HANDLE PoolHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisAllocateBuffer(
__out PNDIS_STATUS Status,
__out PNDIS_BUFFER * Buffer,
__in_opt NDIS_HANDLE PoolHandle,
__in_bcount(Length)
PVOID VirtualAddress,
__in UINT Length
);
#define NdisFreeBuffer(Buffer) IoFreeMdl(Buffer)
#endif
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCopyBuffer(
__out PNDIS_STATUS Status,
__out PNDIS_BUFFER * Buffer,
__in NDIS_HANDLE PoolHandle,
__in PVOID MemoryDescriptor,
__in UINT Offset,
__in UINT Length
);
//
// VOID
// NdisCopyLookaheadData(
// IN PVOID Destination,
// IN PVOID Source,
// IN ULONG Length,
// IN ULONG ReceiveFlags
// );
//
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisCopyLookaheadData(_Destination, _Source, _Length, _MacOptions) \
RtlCopyMemory(_Destination, _Source, _Length)
#else
#define NdisCopyLookaheadData(_Destination, _Source, _Length, _MacOptions) \
{ \
if ((_MacOptions) & NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA) \
{ \
RtlCopyMemory(_Destination, _Source, _Length); \
} \
else \
{ \
PUCHAR _Src = (PUCHAR)(_Source); \
PUCHAR _Dest = (PUCHAR)(_Destination); \
PUCHAR _End = _Dest + (_Length); \
while (_Dest < _End) \
{ \
*_Dest++ = *_Src++; \
} \
} \
}
#endif
#if NDIS_LEGACY_DRIVER
//
// Packet Pool
//
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisAllocatePacketPool(
__out PNDIS_STATUS Status,
__out PNDIS_HANDLE PoolHandle,
__in UINT NumberOfDescriptors,
__in UINT ProtocolReservedLength
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisAllocatePacketPoolEx(
__out PNDIS_STATUS Status,
__out PNDIS_HANDLE PoolHandle,
__in UINT NumberOfDescriptors,
__in UINT NumberOfOverflowDescriptors,
__in UINT ProtocolReservedLength
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisSetPacketPoolProtocolId(
__in NDIS_HANDLE PacketPoolHandle,
__in UINT ProtocolId
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
UINT
NdisPacketPoolUsage(
__in NDIS_HANDLE PoolHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
UINT
NdisPacketSize(
__in UINT ProtocolReservedSize
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_HANDLE
NdisGetPoolFromPacket(
__in PNDIS_PACKET Packet
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
PNDIS_PACKET_STACK
NdisIMGetCurrentPacketStack(
__in PNDIS_PACKET Packet,
__out BOOLEAN * StacksRemaining
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFreePacketPool(
__in NDIS_HANDLE PoolHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFreePacket(
__in PNDIS_PACKET Packet
);
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_minIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisDprFreePacket(
__in PNDIS_PACKET Packet
);
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_minIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisDprFreePacketNonInterlocked(
__in PNDIS_PACKET Packet
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisAllocatePacket(
__out PNDIS_STATUS Status,
__out PNDIS_PACKET * Packet,
__in NDIS_HANDLE PoolHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_minIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisDprAllocatePacket(
__out PNDIS_STATUS Status,
__out PNDIS_PACKET* Packet,
__in NDIS_HANDLE PoolHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_minIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisDprAllocatePacketNonInterlocked(
__out PNDIS_STATUS Status,
__out PNDIS_PACKET * Packet,
__in NDIS_HANDLE PoolHandle
);
// VOID
// NdisReinitializePacket(
// IN OUT PNDIS_PACKET Packet
// );
#define NdisReinitializePacket(Packet) \
{ \
(Packet)->Private.Head = (PNDIS_BUFFER)NULL; \
(Packet)->Private.ValidCounts = FALSE; \
}
#endif // NDIS_LEGACY_DRIVER
#define NdisFreeBuffer(Buffer) IoFreeMdl(Buffer)
#if NDIS_LEGACY_DRIVER
#define NdisQueryBuffer(_Buffer, _VirtualAddress, _Length) \
{ \
if (ARGUMENT_PRESENT(_VirtualAddress)) \
{ \
*(PVOID *)(_VirtualAddress) = MmGetSystemAddressForMdl(_Buffer); \
} \
*(_Length) = MmGetMdlByteCount(_Buffer); \
}
#endif // NDIS_LEGACY_DRIVER
#define NdisQueryBufferSafe(_Buffer, _VirtualAddress, _Length, _Priority) \
{ \
if (ARGUMENT_PRESENT(_VirtualAddress)) \
{ \
*(PVOID *)(_VirtualAddress) = MmGetSystemAddressForMdlSafe(_Buffer, _Priority); \
} \
*(_Length) = MmGetMdlByteCount(_Buffer); \
}
#define NdisQueryBufferOffset(_Buffer, _Offset, _Length) \
{ \
*(_Offset) = MmGetMdlByteOffset(_Buffer); \
*(_Length) = MmGetMdlByteCount(_Buffer); \
}
#if NDIS_LEGACY_DRIVER
#define NdisGetFirstBufferFromPacket(_Packet, \
_FirstBuffer, \
_FirstBufferVA, \
_FirstBufferLength, \
_TotalBufferLength) \
{ \
PNDIS_BUFFER _pBuf; \
\
_pBuf = (_Packet)->Private.Head; \
*(_FirstBuffer) = _pBuf; \
if (_pBuf) \
{ \
*(_FirstBufferVA) = MmGetSystemAddressForMdl(_pBuf); \
*(_FirstBufferLength) = \
*(_TotalBufferLength) = MmGetMdlByteCount(_pBuf); \
for (_pBuf = _pBuf->Next; \
_pBuf != NULL; \
_pBuf = _pBuf->Next) \
{ \
*(_TotalBufferLength) += MmGetMdlByteCount(_pBuf); \
} \
} \
else \
{ \
*(_FirstBufferVA) = 0; \
*(_FirstBufferLength) = 0; \
*(_TotalBufferLength) = 0; \
} \
}
#define NdisGetFirstBufferFromPacketSafe(_Packet, \
_FirstBuffer, \
_FirstBufferVA, \
_FirstBufferLength, \
_TotalBufferLength, \
_Priority) \
{ \
PNDIS_BUFFER _pBuf; \
\
_pBuf = (_Packet)->Private.Head; \
*(_FirstBuffer) = _pBuf; \
if (_pBuf) \
{ \
*(_FirstBufferVA) = MmGetSystemAddressForMdlSafe(_pBuf, _Priority); \
*(_FirstBufferLength) = *(_TotalBufferLength) = MmGetMdlByteCount(_pBuf); \
for (_pBuf = _pBuf->Next; \
_pBuf != NULL; \
_pBuf = _pBuf->Next) \
{ \
*(_TotalBufferLength) += MmGetMdlByteCount(_pBuf); \
} \
} \
else \
{ \
*(_FirstBufferVA) = 0; \
*(_FirstBufferLength) = 0; \
*(_TotalBufferLength) = 0; \
} \
}
#endif // NDIS_LEGACY_DRIVER
#define NDIS_BUFFER_TO_SPAN_PAGES(_Buffer) \
(MmGetMdlByteCount(_Buffer)==0 ? \
1 : \
(ADDRESS_AND_SIZE_TO_SPAN_PAGES( \
MmGetMdlVirtualAddress(_Buffer), \
MmGetMdlByteCount(_Buffer))))
#define NdisGetBufferPhysicalArraySize(Buffer, ArraySize) \
(*(ArraySize) = NDIS_BUFFER_TO_SPAN_PAGES(Buffer))
/*++
NDIS_BUFFER_LINKAGE(
IN PNDIS_BUFFER Buffer
);
--*/
#define NDIS_BUFFER_LINKAGE(Buffer) ((Buffer)->Next)
#if NDIS_LEGACY_DRIVER
/*++
VOID
NdisRecalculatePacketCounts(
IN OUT PNDIS_PACKET Packet
);
--*/
#define NdisRecalculatePacketCounts(Packet) \
{ \
{ \
PNDIS_BUFFER TmpBuffer = (Packet)->Private.Head; \
if (TmpBuffer) \
{ \
while (TmpBuffer->Next) \
{ \
TmpBuffer = TmpBuffer->Next; \
} \
(Packet)->Private.Tail = TmpBuffer; \
} \
(Packet)->Private.ValidCounts = FALSE; \
} \
}
/*++
VOID
NdisChainBufferAtFront(
IN OUT PNDIS_PACKET Packet,
IN OUT PNDIS_BUFFER Buffer
);
--*/
#define NdisChainBufferAtFront(Packet, Buffer) \
{ \
PNDIS_BUFFER TmpBuffer = (Buffer); \
\
for (;;) \
{ \
if (TmpBuffer->Next == (PNDIS_BUFFER)NULL) \
break; \
TmpBuffer = TmpBuffer->Next; \
} \
if ((Packet)->Private.Head == NULL) \
{ \
(Packet)->Private.Tail = TmpBuffer; \
} \
TmpBuffer->Next = (Packet)->Private.Head; \
(Packet)->Private.Head = (Buffer); \
(Packet)->Private.ValidCounts = FALSE; \
}
/*++
VOID
NdisChainBufferAtBack(
IN OUT PNDIS_PACKET Packet,
IN OUT PNDIS_BUFFER Buffer
);
--*/
#define NdisChainBufferAtBack(Packet, Buffer) \
{ \
PNDIS_BUFFER TmpBuffer = (Buffer); \
\
for (;;) \
{ \
if (TmpBuffer->Next == NULL) \
break; \
TmpBuffer = TmpBuffer->Next; \
} \
if ((Packet)->Private.Head != NULL) \
{ \
(Packet)->Private.Tail->Next = (Buffer); \
} \
else \
{ \
(Packet)->Private.Head = (Buffer); \
} \
(Packet)->Private.Tail = TmpBuffer; \
(Packet)->Private.ValidCounts = FALSE; \
}
EXPORT
VOID
NdisUnchainBufferAtFront(
IN OUT PNDIS_PACKET Packet,
OUT PNDIS_BUFFER * Buffer
);
EXPORT
VOID
NdisUnchainBufferAtBack(
IN OUT PNDIS_PACKET Packet,
OUT PNDIS_BUFFER * Buffer
);
/*++
VOID
NdisQueryPacket(
IN PNDIS_PACKET _Packet,
OUT PUINT _PhysicalBufferCount OPTIONAL,
OUT PUINT _BufferCount OPTIONAL,
OUT PNDIS_BUFFER * _FirstBuffer OPTIONAL,
OUT PUINT _TotalPacketLength OPTIONAL
);
--*/
#pragma warning(push)
#pragma warning(disable:4127)
__inline
VOID
NdisQueryPacket(
IN PNDIS_PACKET _Packet,
OUT PUINT _PhysicalBufferCount OPTIONAL,
OUT PUINT _BufferCount OPTIONAL,
OUT PNDIS_BUFFER * _FirstBuffer OPTIONAL,
OUT PUINT _TotalPacketLength OPTIONAL
)
{
if ((_FirstBuffer) != NULL)
{
PNDIS_BUFFER * __FirstBuffer = (_FirstBuffer);
*(__FirstBuffer) = (_Packet)->Private.Head;
}
if ((_TotalPacketLength) || (_BufferCount) || (_PhysicalBufferCount))
{
if (!(_Packet)->Private.ValidCounts)
{
PNDIS_BUFFER TmpBuffer = (_Packet)->Private.Head;
UINT PTotalLength = 0, PPhysicalCount = 0, PAddedCount = 0;
UINT PacketLength, Offset;
while (TmpBuffer != (PNDIS_BUFFER)NULL)
{
NdisQueryBufferOffset(TmpBuffer, &Offset, &PacketLength);
PTotalLength += PacketLength;
PPhysicalCount += (UINT)NDIS_BUFFER_TO_SPAN_PAGES(TmpBuffer);
++PAddedCount;
TmpBuffer = TmpBuffer->Next;
}
(_Packet)->Private.Count = PAddedCount;
(_Packet)->Private.TotalLength = PTotalLength;
(_Packet)->Private.PhysicalCount = PPhysicalCount;
(_Packet)->Private.ValidCounts = TRUE;
}
if (_PhysicalBufferCount)
{
PUINT __PhysicalBufferCount = (_PhysicalBufferCount);
*(__PhysicalBufferCount) = (_Packet)->Private.PhysicalCount;
}
if (_BufferCount)
{
PUINT __BufferCount = (_BufferCount);
*(__BufferCount) = (_Packet)->Private.Count;
}
if (_TotalPacketLength)
{
PUINT __TotalPacketLength = (_TotalPacketLength);
*(__TotalPacketLength) = (_Packet)->Private.TotalLength;
}
}
}
#pragma warning(pop)
/*++
VOID
NdisQueryPacketLength(
IN PNDIS_PACKET _Packet,
OUT PUINT _TotalPacketLength OPTIONAL
);
--*/
#define NdisQueryPacketLength(_Packet, \
_TotalPacketLength) \
{ \
if (!(_Packet)->Private.ValidCounts) \
{ \
NdisQueryPacket(_Packet, NULL, NULL, NULL, _TotalPacketLength); \
} \
else *(_TotalPacketLength) = (_Packet)->Private.TotalLength; \
}
#endif // NDIS_LEGACY_DRIVER
/*++
VOID
NdisGetNextBuffer(
IN PNDIS_BUFFER CurrentBuffer,
OUT PNDIS_BUFFER * NextBuffer
);
--*/
#define NdisGetNextBuffer(CurrentBuffer, NextBuffer) \
{ \
*(NextBuffer) = (CurrentBuffer)->Next; \
}
#define NdisAdjustBufferLength(Buffer, Length) (((Buffer)->ByteCount) = (Length))
#if NDIS_SUPPORT_NDIS6
/*
VOID
NdisAdjustMdlLength(
IN PMDL Mdl,
IN UINT Length
);
*/
#define NdisAdjustMdlLength(_Mdl, _Length) (((_Mdl)->ByteCount) = (_Length))
#endif // NDIS_SUPPORT_NDIS6
#if NDIS_LEGACY_DRIVER
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCopyFromPacketToPacket(
__in PNDIS_PACKET Destination,
__in UINT DestinationOffset,
__in UINT BytesToCopy,
__in PNDIS_PACKET Source,
__in UINT SourceOffset,
__out PUINT BytesCopied
);
EXPORT
VOID
NdisCopyFromPacketToPacketSafe(
IN PNDIS_PACKET Destination,
IN UINT DestinationOffset,
IN UINT BytesToCopy,
IN PNDIS_PACKET Source,
IN UINT SourceOffset,
OUT PUINT BytesCopied,
IN MM_PAGE_PRIORITY Priority
);
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_preferredFunction("NdisAllocateMemoryWithTag", "Obsolete")
DECLSPEC_DEPRECATED_DDK
EXPORT
NDIS_STATUS
NdisAllocateMemory(
__deref_out_bcount_opt(Length) __drv_allocatesMem(Mem)
PVOID * VirtualAddress,
__in UINT Length,
__in UINT MemoryFlags,
__in NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress
);
#endif // NDIS_LEGACY_DRIVER
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisAllocateMemoryWithTag(
__deref_out_bcount_opt(Length) __drv_allocatesMem(Mem)
PVOID * VirtualAddress,
__in UINT Length,
__in ULONG Tag
);
__drv_when(MemoryFlags==0,
__drv_maxIRQL(DISPATCH_LEVEL))
__drv_when(MemoryFlags==NDIS_MEMORY_NONCACHED,
__drv_maxIRQL(APC_LEVEL))
__drv_when(MemoryFlags==NDIS_MEMORY_CONTIGUOUS,
__drv_requiresIRQL(PASSIVE_LEVEL))
EXPORT
VOID
NdisFreeMemory(
__in_bcount(Length) __drv_freesMem(Mem)
PVOID VirtualAddress,
__in UINT Length,
__in __drv_in(__drv_valueIs(==0;
==NDIS_MEMORY_NONCACHED;
==NDIS_MEMORY_CONTIGUOUS))
UINT MemoryFlags
);
EXPORT
VOID
NdisFreeMemoryWithTag(
IN PVOID VirtualAddress,
IN ULONG Tag
);
/*++
VOID
NdisStallExecution(
IN UINT MicrosecondsToStall
)
--*/
#define NdisStallExecution(MicroSecondsToStall) KeStallExecutionProcessor(MicroSecondsToStall)
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisInitializeEvent(
__out PNDIS_EVENT Event
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisSetEvent(
__in PNDIS_EVENT Event
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisResetEvent(
__in PNDIS_EVENT Event
);
__drv_when(MsToWait !=0, __checkReturn)
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
BOOLEAN
NdisWaitEvent(
__in PNDIS_EVENT Event,
__in UINT MsToWait
);
#if NDIS_LEGACY_DRIVER
/*++
VOID
NdisInitializeWorkItem(
IN PNDIS_WORK_ITEM WorkItem,
IN NDIS_PROC Routine,
IN PVOID Context
);
--*/
#define NdisInitializeWorkItem(_WI_, _R_, _C_) \
{ \
(_WI_)->Context = _C_; \
(_WI_)->Routine = _R_; \
}
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisScheduleWorkItem(
__in PNDIS_WORK_ITEM WorkItem
);
#endif // NDIS_LEGACY_DRIVER
//
// Simple I/O support
//
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisOpenFile(
__out PNDIS_STATUS Status,
__out PNDIS_HANDLE FileHandle,
__out PUINT FileLength,
__in PNDIS_STRING FileName,
__in NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisCloseFile(
__in NDIS_HANDLE FileHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMapFile(
__out PNDIS_STATUS Status,
__out PVOID * MappedBuffer,
__in NDIS_HANDLE FileHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisUnmapFile(
__in NDIS_HANDLE FileHandle
);
//
// Portability extensions
//
/*++
VOID
NdisFlushBuffer(
IN PNDIS_BUFFER Buffer,
IN BOOLEAN WriteToDevice
)
--*/
#define NdisFlushBuffer(Buffer,WriteToDevice) \
KeFlushIoBuffers((Buffer),!(WriteToDevice), TRUE)
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
ULONG
NdisGetSharedDataAlignment(
VOID
);
//
// Raw Routines
//
//
// Write Port Raw
//
/*++
VOID
NdisRawWritePortUchar(
IN ULONG_PTR Port,
IN UCHAR Data
)
--*/
#define NdisRawWritePortUchar(Port,Data) \
WRITE_PORT_UCHAR((PUCHAR)(Port),(UCHAR)(Data))
/*++
VOID
NdisRawWritePortUshort(
IN ULONG_PTR Port,
IN USHORT Data
)
--*/
#define NdisRawWritePortUshort(Port,Data) \
WRITE_PORT_USHORT((PUSHORT)(Port),(USHORT)(Data))
/*++
VOID
NdisRawWritePortUlong(
IN ULONG_PTR Port,
IN ULONG Data
)
--*/
#define NdisRawWritePortUlong(Port,Data) \
WRITE_PORT_ULONG((PULONG)(Port),(ULONG)(Data))
//
// Raw Write Port Buffers
//
/*++
VOID
NdisRawWritePortBufferUchar(
IN ULONG_PTR Port,
IN PUCHAR Buffer,
IN ULONG Length
)
--*/
#define NdisRawWritePortBufferUchar(Port,Buffer,Length) \
WRITE_PORT_BUFFER_UCHAR((PUCHAR)(Port),(PUCHAR)(Buffer),(Length))
/*++
VOID
NdisRawWritePortBufferUshort(
IN ULONG_PTR Port,
IN PUSHORT Buffer,
IN ULONG Length
)
--*/
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisRawWritePortBufferUshort(Port,Buffer,Length) \
WRITE_PORT_BUFFER_USHORT((PUSHORT)(Port),(PUSHORT)(Buffer),(Length))
#else
#define NdisRawWritePortBufferUshort(Port,Buffer,Length) \
{ \
ULONG_PTR _Port = (ULONG_PTR)(Port); \
PUSHORT _Current = (Buffer); \
PUSHORT _End = _Current + (Length); \
for ( ; _Current < _End; ++_Current) \
{ \
WRITE_PORT_USHORT((PUSHORT)_Port,*(UNALIGNED USHORT *)_Current);\
} \
}
#endif
/*++
VOID
NdisRawWritePortBufferUlong(
IN ULONG_PTR Port,
IN PULONG Buffer,
IN ULONG Length
)
--*/
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisRawWritePortBufferUlong(Port,Buffer,Length) \
WRITE_PORT_BUFFER_ULONG((PULONG)(Port),(PULONG)(Buffer),(Length))
#else
#define NdisRawWritePortBufferUlong(Port,Buffer,Length) \
{ \
ULONG_PTR _Port = (ULONG_PTR)(Port); \
PULONG _Current = (Buffer); \
PULONG _End = _Current + (Length); \
for ( ; _Current < _End; ++_Current) \
{ \
WRITE_PORT_ULONG((PULONG)_Port,*(UNALIGNED ULONG *)_Current); \
} \
}
#endif
//
// Raw Read Ports
//
/*++
VOID
NdisRawReadPortUchar(
IN ULONG_PTR Port,
OUT PUCHAR Data
)
--*/
#define NdisRawReadPortUchar(Port, Data) \
*(Data) = READ_PORT_UCHAR((PUCHAR)(Port))
/*++
VOID
NdisRawReadPortUshort(
IN ULONG_PTR Port,
OUT PUSHORT Data
)
--*/
#define NdisRawReadPortUshort(Port,Data) \
*(Data) = READ_PORT_USHORT((PUSHORT)(Port))
/*++
VOID
NdisRawReadPortUlong(
IN ULONG_PTR Port,
OUT PULONG Data
)
--*/
#define NdisRawReadPortUlong(Port,Data) \
*(Data) = READ_PORT_ULONG((PULONG)(Port))
//
// Raw Read Buffer Ports
//
/*++
VOID
NdisRawReadPortBufferUchar(
IN ULONG_PTR Port,
OUT PUCHAR Buffer,
IN ULONG Length
)
--*/
#define NdisRawReadPortBufferUchar(Port,Buffer,Length) \
READ_PORT_BUFFER_UCHAR((PUCHAR)(Port),(PUCHAR)(Buffer),(Length))
/*++
VOID
NdisRawReadPortBufferUshort(
IN ULONG_PTR Port,
OUT PUSHORT Buffer,
IN ULONG Length
)
--*/
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisRawReadPortBufferUshort(Port,Buffer,Length) \
READ_PORT_BUFFER_USHORT((PUSHORT)(Port),(PUSHORT)(Buffer),(Length))
#else
#define NdisRawReadPortBufferUshort(Port,Buffer,Length) \
{ \
ULONG_PTR _Port = (ULONG_PTR)(Port); \
PUSHORT _Current = (Buffer); \
PUSHORT _End = _Current + (Length); \
for ( ; _Current < _End; ++_Current) \
{ \
*(UNALIGNED USHORT *)_Current = READ_PORT_USHORT((PUSHORT)_Port); \
} \
}
#endif
/*++
VOID
NdisRawReadPortBufferUlong(
IN ULONG_PTR Port,
OUT PULONG Buffer,
IN ULONG Length
)
--*/
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisRawReadPortBufferUlong(Port,Buffer,Length) \
READ_PORT_BUFFER_ULONG((PULONG)(Port),(PULONG)(Buffer),(Length))
#else
#define NdisRawReadPortBufferUlong(Port,Buffer,Length) \
{ \
ULONG_PTR _Port = (ULONG_PTR)(Port); \
PULONG _Current = (Buffer); \
PULONG _End = _Current + (Length); \
for ( ; _Current < _End; ++_Current) \
{ \
*(UNALIGNED ULONG *)_Current = READ_PORT_ULONG((PULONG)_Port); \
} \
}
#endif
//
// Write Registers
//
/*++
VOID
NdisWriteRegisterUchar(
IN PUCHAR Register,
IN UCHAR Data
)
--*/
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisWriteRegisterUchar(Register,Data) \
WRITE_REGISTER_UCHAR((Register),(Data))
#else
#define NdisWriteRegisterUchar(Register,Data) \
{ \
WRITE_REGISTER_UCHAR((Register),(Data)); \
READ_REGISTER_UCHAR(Register); \
}
#endif
/*++
VOID
NdisWriteRegisterUshort(
IN PUCHAR Register,
IN USHORT Data
)
--*/
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisWriteRegisterUshort(Register,Data) \
WRITE_REGISTER_USHORT((Register),(Data))
#else
#define NdisWriteRegisterUshort(Register,Data) \
{ \
WRITE_REGISTER_USHORT((Register),(Data)); \
READ_REGISTER_USHORT(Register); \
}
#endif
/*++
VOID
NdisWriteRegisterUlong(
IN PUCHAR Register,
IN ULONG Data
)
--*/
#if defined(_M_IX86) || defined(_M_AMD64)
#define NdisWriteRegisterUlong(Register,Data) WRITE_REGISTER_ULONG((Register),(Data))
#else
#define NdisWriteRegisterUlong(Register,Data) \
{ \
WRITE_REGISTER_ULONG((Register),(Data)); \
READ_REGISTER_ULONG(Register); \
}
#endif
/*++
VOID
NdisReadRegisterUchar(
IN PUCHAR Register,
OUT PUCHAR Data
)
--*/
#if defined(_M_IX86)
#define NdisReadRegisterUchar(Register,Data) \
_ReadWriteBarrier(); \
*(Data) = *((volatile UCHAR * const)(Register));
#else
#define NdisReadRegisterUchar(Register,Data) *(Data) = READ_REGISTER_UCHAR((PUCHAR)(Register))
#endif
/*++
VOID
NdisReadRegisterUshort(
IN PUSHORT Register,
OUT PUSHORT Data
)
--*/
#if defined(_M_IX86)
#define NdisReadRegisterUshort(Register,Data) \
_ReadWriteBarrier(); \
*(Data) = *((volatile USHORT * const)(Register))
#else
#define NdisReadRegisterUshort(Register,Data) *(Data) = READ_REGISTER_USHORT((PUSHORT)(Register))
#endif
/*++
VOID
NdisReadRegisterUlong(
IN PULONG Register,
OUT PULONG Data
)
--*/
#if defined(_M_IX86)
#define NdisReadRegisterUlong(Register,Data) \
_ReadWriteBarrier(); \
*(Data) = *((volatile ULONG * const)(Register))
#else
#define NdisReadRegisterUlong(Register,Data) *(Data) = READ_REGISTER_ULONG((PULONG)(Register))
#endif
#define NdisEqualString(_String1, _String2, _CaseInsensitive) \
RtlEqualUnicodeString(_String1, _String2, _CaseInsensitive)
#define NdisEqualUnicodeString(_String1, _String2, _CaseInsensitive) \
RtlEqualUnicodeString(_String1, _String2, _CaseInsensitive)
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID __cdecl
NdisWriteErrorLogEntry(
__in NDIS_HANDLE NdisAdapterHandle,
__in NDIS_ERROR_CODE ErrorCode,
__in ULONG NumberOfErrorValues,
...
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisInitializeString(
__out PNDIS_STRING Destination,
__in PUCHAR Source
);
#define NdisFreeString(String) NdisFreeMemory((String).Buffer, (String).MaximumLength, 0)
#define NdisPrintString(String) DbgPrint("%ls",(String).Buffer)
/*++
VOID
NdisCreateLookaheadBufferFromSharedMemory(
IN PVOID pSharedMemory,
IN UINT LookaheadLength,
OUT PVOID * pLookaheadBuffer
);
--*/
#define NdisCreateLookaheadBufferFromSharedMemory(_S, _L, _B) ((*(_B)) = (_S))
/*++
VOID
NdisDestroyLookaheadBufferFromSharedMemory(
IN PVOID pLookaheadBuffer
);
--*/
#define NdisDestroyLookaheadBufferFromSharedMemory(_B)
//
// The following declarations are shared between ndismac.h and ndismini.h. They
// are meant to be for internal use only. They should not be used directly by
// miniport drivers.
//
//
// declare these first since they point to each other
//
typedef struct _NDIS_WRAPPER_HANDLE NDIS_WRAPPER_HANDLE, *PNDIS_WRAPPER_HANDLE;
typedef struct _NDIS_PROTOCOL_BLOCK NDIS_PROTOCOL_BLOCK, *PNDIS_PROTOCOL_BLOCK;
typedef struct _NDIS_OPEN_BLOCK NDIS_OPEN_BLOCK, *PNDIS_OPEN_BLOCK;
typedef struct _NDIS_M_DRIVER_BLOCK NDIS_M_DRIVER_BLOCK, *PNDIS_M_DRIVER_BLOCK;
typedef struct _NDIS_MINIPORT_BLOCK NDIS_MINIPORT_BLOCK,*PNDIS_MINIPORT_BLOCK;
typedef struct _CO_CALL_PARAMETERS CO_CALL_PARAMETERS, *PCO_CALL_PARAMETERS;
typedef struct _CO_MEDIA_PARAMETERS CO_MEDIA_PARAMETERS, *PCO_MEDIA_PARAMETERS;
typedef struct _NDIS_CALL_MANAGER_CHARACTERISTICS *PNDIS_CALL_MANAGER_CHARACTERISTICS;
typedef struct _NDIS_OFFLOAD NDIS_OFFLOAD, *PNDIS_OFFLOAD;
typedef struct _NDIS_AF_LIST NDIS_AF_LIST, *PNDIS_AF_LIST;
typedef struct _X_FILTER ETH_FILTER, *PETH_FILTER;
typedef struct _X_FILTER TR_FILTER, *PTR_FILTER;
typedef struct _X_FILTER NULL_FILTER, *PNULL_FILTER;
#if NDIS_SUPPORT_NDIS6
typedef USHORT NET_FRAME_TYPE, *PNET_FRAME_TYPE;
#endif NDIS_SUPPORT_NDIS6
//
// Timers.
//
typedef
VOID
(NDIS_TIMER_FUNCTION) (
__in PVOID SystemSpecific1,
__in PVOID FunctionContext,
__in PVOID SystemSpecific2,
__in PVOID SystemSpecific3
);
typedef NDIS_TIMER_FUNCTION (*PNDIS_TIMER_FUNCTION);
typedef struct _NDIS_TIMER
{
KTIMER Timer;
KDPC Dpc;
} NDIS_TIMER, *PNDIS_TIMER;
#if NDIS_SUPPORT_NDIS6
__drv_preferredFunction(NdisAllocateTimerObject, "Not supported for NDIS 6.0 drivers in Windows Vista. Use NdisAllocateTimerObject instead.")
#endif NDIS_SUPPORT_NDIS6
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisInitializeTimer(
__inout PNDIS_TIMER Timer,
__in PNDIS_TIMER_FUNCTION TimerFunction,
__in_opt __drv_isObjectPointer
PVOID FunctionContext
);
#if NDIS_SUPPORT_NDIS6
__drv_preferredFunction(NdisCancelTimerObject, "Not supported for NDIS 6.0 drivers in Windows Vista. Use NdisCancelTimerObject instead.")
#endif NDIS_SUPPORT_NDIS6
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
NdisCancelTimer(
__in PNDIS_TIMER Timer,
__out __checkReturn
PBOOLEAN TimerCancelled
);
#if NDIS_SUPPORT_NDIS6
__drv_preferredFunction(NdisSetTimerObject, "Not supported for NDIS 6.0 drivers in Windows Vista. Use NdisSetTimerObject instead.")
#endif NDIS_SUPPORT_NDIS6
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisSetTimer(
__in PNDIS_TIMER Timer,
__in UINT MillisecondsToDelay
);
#if NDIS_SUPPORT_NDIS6
__drv_preferredFunction(NdisSetTimerObject, "Not supported for NDIS 6.0 drivers in Windows Vista. Use NdisSetTimerObject instead.")
#endif NDIS_SUPPORT_NDIS6
EXPORT
VOID
NdisSetPeriodicTimer(
__in PNDIS_TIMER NdisTimer,
__in UINT MillisecondsPeriod
);
#if NDIS_SUPPORT_NDIS6
__drv_preferredFunction(NdisSetTimerObject, "Not supported for NDIS 6.0 drivers in Windows Vista. Use NdisSetTimerObject instead.")
#endif NDIS_SUPPORT_NDIS6
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisSetTimerEx(
__in PNDIS_TIMER NdisTimer,
__in UINT MillisecondsToDelay,
__in __drv_isObjectPointer
PVOID FunctionContext
);
#if NDIS_SUPPORT_60_COMPATIBLE_API
//
// System processor count
//
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
CCHAR
NdisSystemProcessorCount(
VOID
);
#endif
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
PVOID
NdisGetRoutineAddress(
__in PNDIS_STRING NdisRoutineName
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
UINT
NdisGetVersion(
VOID
);
//
// Ansi/Unicode support routines
//
#define NdisInitAnsiString(_as, s) RtlInitString(_as, s)
#define NdisInitUnicodeString(_us, s) RtlInitUnicodeString(_us, s)
#define NdisAnsiStringToUnicodeString(_us, _as) RtlAnsiStringToUnicodeString(_us, _as, FALSE)
#define NdisUnicodeStringToAnsiString(_as, _us) RtlUnicodeStringToAnsiString(_as, _us, FALSE)
#define NdisUpcaseUnicodeString(_d, _s) RtlUpcaseUnicodeString(_d, _s, FALSE)
//
// Non-paged lookaside list support routines
//
#define NdisInitializeNPagedLookasideList(_L, _AR, _FR, _Fl, _S, _T, _D) \
ExInitializeNPagedLookasideList(_L, _AR, _FR, _Fl, _S, _T, _D)
#define NdisDeleteNPagedLookasideList(_L) ExDeleteNPagedLookasideList(_L)
#define NdisAllocateFromNPagedLookasideList(_L) ExAllocateFromNPagedLookasideList(_L)
#define NdisFreeToNPagedLookasideList(_L, _E) ExFreeToNPagedLookasideList(_L, _E)
#if NDIS_LEGACY_DRIVER
/*
NdisSetPacketStatus is deprecated. use NDIS_SET_PACKET_STATUS macro
*/
__drv_maxIRQL(DISPATCH_LEVEL)
DECLSPEC_DEPRECATED_DDK
EXPORT
VOID
NdisSetPacketStatus(
__in PNDIS_PACKET Packet,
__in NDIS_STATUS Status,
__in NDIS_HANDLE Handle,
__in ULONG Code
);
#endif
#define NDIS_MAX_EVENT_LOG_DATA_SIZE ((ERROR_LOG_MAXIMUM_SIZE - sizeof(IO_ERROR_LOG_PACKET) + sizeof(ULONG)) & ~3)
#if NDIS_SUPPORT_60_COMPATIBLE_API && !defined(NDIS_WRAPPER)
#ifdef _WIN64
#define NDIS_MAX_PROCESSOR_COUNT 64
#else
#define NDIS_MAX_PROCESSOR_COUNT 32
#endif
#endif
#if NDIS_SUPPORT_NDIS6
//
// NDIS_RESTART_ATTRIBUTES is used in NDIS_FILTER_RESTART_PARAMETERS,
// NDIS_MINIPORT_RESTART_PARAMETERS and NDIS_PROTOCOL_RESTART_PARAMETERS
//
typedef struct _NDIS_RESTART_ATTRIBUTES NDIS_RESTART_ATTRIBUTES, *PNDIS_RESTART_ATTRIBUTES;
typedef struct _NDIS_RESTART_ATTRIBUTES
{
PNDIS_RESTART_ATTRIBUTES Next;
NDIS_OID Oid;
ULONG DataLength;
DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) UCHAR Data[1];
}NDIS_RESTART_ATTRIBUTES, *PNDIS_RESTART_ATTRIBUTES;
//
// used in all NDIS drivers
//
typedef
NDIS_STATUS
(SET_OPTIONS)(
__in NDIS_HANDLE NdisDriverHandle,
__in NDIS_HANDLE DriverContext
);
typedef SET_OPTIONS (*SET_OPTIONS_HANDLER);
typedef SET_OPTIONS (MINIPORT_SET_OPTIONS);
typedef SET_OPTIONS (PROTOCOL_SET_OPTIONS);
typedef SET_OPTIONS (FILTER_SET_OPTIONS);
#endif // NDIS_SUPPORT_NDIS6
#if NDIS_LEGACY_DRIVER
typedef
NDIS_STATUS
(*WAN_SEND_HANDLER)(
__in NDIS_HANDLE NdisBindingHandle,
__in NDIS_HANDLE LinkHandle,
__in PVOID Packet
);
typedef
NDIS_STATUS
(*SEND_HANDLER)(
__in NDIS_HANDLE NdisBindingHandle,
__in PNDIS_PACKET Packet
);
typedef
NDIS_STATUS
(*TRANSFER_DATA_HANDLER)(
__in NDIS_HANDLE NdisBindingHandle,
__in NDIS_HANDLE MacReceiveContext,
__in UINT ByteOffset,
__in UINT BytesToTransfer,
__out PNDIS_PACKET Packet,
__out PUINT BytesTransferred
);
typedef
NDIS_STATUS
(*RESET_HANDLER)(
__in NDIS_HANDLE NdisBindingHandle
);
typedef
NDIS_STATUS
(*REQUEST_HANDLER)(
__in NDIS_HANDLE NdisBindingHandle,
__in PNDIS_REQUEST NdisRequest
);
typedef
VOID
(*SEND_PACKETS_HANDLER)(
__in NDIS_HANDLE MiniportAdapterContext,
__in PPNDIS_PACKET PacketArray,
__in UINT NumberOfPackets
);
#endif // NDIS_LEGACY_DRIVER
//
// NDIS object types created by NDIS drivers
//
#if NDIS_SUPPORT_NDIS6
#if NDIS_SUPPORT_60_COMPATIBLE_API
#define NDIS_CURRENT_PROCESSOR_NUMBER KeGetCurrentProcessorNumber()
#endif
#define NDIS_CURRENT_IRQL() KeGetCurrentIrql()
#define NDIS_RAISE_IRQL_TO_DISPATCH(_pIrql_) KeRaiseIrql(DISPATCH_LEVEL, _pIrql_)
#define NDIS_LOWER_IRQL(_OldIrql_, _CurIrql_) \
{ \
if (_OldIrql_ != _CurIrql_) KeLowerIrql(_OldIrql_); \
}
typedef KMUTEX NDIS_MUTEX, *PNDIS_MUTEX;
#define NDIS_INIT_MUTEX(_M_) KeInitializeMutex(_M_, 0xFFFF)
#define NDIS_RELEASE_MUTEX(_M_) KeReleaseMutex(_M_, FALSE)
#define NDIS_WAIT_FOR_MUTEX(_M_) KeWaitForSingleObject(_M_, \
Executive,\
KernelMode,\
FALSE, \
NULL) \
#if NDIS_SUPPORT_60_COMPATIBLE_API
EXPORT
ULONG
NdisSystemActiveProcessorCount(
PKAFFINITY ActiveProcessors
);
#endif
#if NDIS_SUPPORT_NDIS620
EXPORT
USHORT
NdisActiveGroupCount(
VOID
);
EXPORT
USHORT
NdisMaxGroupCount(
VOID
);
EXPORT
ULONG
NdisGroupMaxProcessorCount(
USHORT Group
);
EXPORT
ULONG
NdisGroupActiveProcessorCount(
USHORT Group
);
EXPORT
KAFFINITY
NdisGroupActiveProcessorMask(
USHORT Group
);
EXPORT
PROCESSOR_NUMBER
NdisCurrentGroupAndProcessor(
VOID
);
EXPORT
ULONG
NdisCurrentProcessorIndex(
VOID
);
EXPORT
ULONG
NdisProcessorNumberToIndex(
PROCESSOR_NUMBER ProcNum
);
EXPORT
NTSTATUS
NdisProcessorIndexToNumber(
__in ULONG ProcIndex,
__out PPROCESSOR_NUMBER ProcNum
);
#endif
#define NDIS_CONFIGURATION_OBJECT_REVISION_1 1
//
// Flags for NdisOpenConfigurationEx
//
#define NDIS_CONFIG_FLAG_FILTER_INSTANCE_CONFIGURATION 0x00000001
typedef struct _NDIS_CONFIGURATION_OBJECT
{
NDIS_OBJECT_HEADER Header;
NDIS_HANDLE NdisHandle;
ULONG Flags;
} NDIS_CONFIGURATION_OBJECT, *PNDIS_CONFIGURATION_OBJECT;
#define NDIS_SIZEOF_CONFIGURATION_OBJECT_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_CONFIGURATION_OBJECT, Flags)
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisOpenConfigurationEx(
__in PNDIS_CONFIGURATION_OBJECT ConfigObject,
__out __drv_when(return==NDIS_STATUS_SUCCESS,
__drv_deref(__drv_allocatesMem(mem))) PNDIS_HANDLE ConfigurationHandle
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_allocatesMem(Mem)
EXPORT
PVOID
NdisAllocateMemoryWithTagPriority(
__in NDIS_HANDLE NdisHandle,
__in UINT Length,
__in ULONG Tag,
__in EX_POOL_PRIORITY Priority
);
typedef struct _NDIS_DRIVER_OPTIONAL_HANDLERS
{
NDIS_OBJECT_HEADER Header;
} NDIS_DRIVER_OPTIONAL_HANDLERS, *PNDIS_DRIVER_OPTIONAL_HANDLERS;
EXPORT
NDIS_STATUS
NdisSetOptionalHandlers(
NDIS_HANDLE NdisDriverHandle,
PNDIS_DRIVER_OPTIONAL_HANDLERS OptionalHandlers
);
//
// Flags used in NET_PNP_EVENT_NOTIFICATION Flags field
//
#define NET_EVENT_HALT_MINIPORT_ON_LOW_POWER 0x00000001
#define NET_PNP_EVENT_NOTIFICATION_REVISION_1 1
typedef struct _NET_PNP_EVENT_NOTIFICATION
{
//
// Caller must set Header to
// Type = NDIS_OBJECT_TYPE_DEFAULT
// Revision = NET_PNP_EVENT_NOTIFICATION_REVISION_1
// Size = sizeof(_NET_PNP_EVENT_NOTIFICATION)
//
NDIS_OBJECT_HEADER Header;
NDIS_PORT_NUMBER PortNumber;
NET_PNP_EVENT NetPnPEvent;
ULONG Flags;
} NET_PNP_EVENT_NOTIFICATION, *PNET_PNP_EVENT_NOTIFICATION;
#define NDIS_SIZEOF_NET_PNP_EVENT_NOTIFICATION_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NET_PNP_EVENT_NOTIFICATION, NetPnPEvent)
//
// new request and status structures
//
#define NDIS_OID_REQUEST_REVISION_1 1
#define NDIS_OID_REQUEST_TIMEOUT_INFINITE 0
#define NDIS_OID_REQUEST_NDIS_RESERVED_SIZE 16
typedef struct _NDIS_OID_REQUEST
{
//
// Caller must set Header to
// Header.Type = NDIS_OBJECT_TYPE_OID_REQUEST
// Header.Revision = NDIS_OID_REQUEST_REVISION_1
// Header.Size = NDIS_SIZEOF_OID_REQUEST_REVISION_1
//
NDIS_OBJECT_HEADER Header;
NDIS_REQUEST_TYPE RequestType;
NDIS_PORT_NUMBER PortNumber;
UINT Timeout; // in Seconds
PVOID RequestId;
NDIS_HANDLE RequestHandle;
//
// OID - Information
//
union _REQUEST_DATA
{
struct _QUERY
{
NDIS_OID Oid;
PVOID InformationBuffer;
UINT InformationBufferLength;
UINT BytesWritten;
UINT BytesNeeded;
} QUERY_INFORMATION;
struct _SET
{
NDIS_OID Oid;
PVOID InformationBuffer;
UINT InformationBufferLength;
UINT BytesRead;
UINT BytesNeeded;
} SET_INFORMATION;
struct _METHOD
{
NDIS_OID Oid;
PVOID InformationBuffer;
ULONG InputBufferLength;
ULONG OutputBufferLength;
ULONG MethodId;
UINT BytesWritten;
UINT BytesRead;
UINT BytesNeeded;
} METHOD_INFORMATION;
} DATA;
//
// NDIS Reserved
//
UCHAR NdisReserved[NDIS_OID_REQUEST_NDIS_RESERVED_SIZE * sizeof(PVOID)];
UCHAR MiniportReserved[2*sizeof(PVOID)];
UCHAR SourceReserved[2*sizeof(PVOID)];
UCHAR SupportedRevision;
UCHAR Reserved1;
USHORT Reserved2;
}NDIS_OID_REQUEST, *PNDIS_OID_REQUEST;
#define NDIS_SIZEOF_OID_REQUEST_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_OID_REQUEST, Reserved2)
//
// Macros to set, clear and test NDIS_STATUS_INDICATION Flags
//
#define NDIS_STATUS_INDICATION_SET_FLAG(_StatusIndication, _F) \
((_StatusIndication)->Flags |= (_F))
#define NDIS_STATUS_INDICATION_TEST_FLAG(_StatusIndication, _F) \
(((_StatusIndication)->Flags & (_F)) != 0)
#define NDIS_STATUS_INDICATION_CLEAR_FLAG(_StatusIndication, _F) \
((_StatusIndication)->Flags &= ~(_F))
#define NDIS_STATUS_INDICATION_FLAGS_NDIS_RESERVED 0xFFF
//
// Public flags for NDIS_STATUS_INDICATION
//
#define NDIS_STATUS_INDICATION_FLAGS_MEDIA_CONNECT_TO_CONNECT 0x1000
#define NDIS_STATUS_INDICATION_REVISION_1 1
typedef struct _NDIS_STATUS_INDICATION
{
NDIS_OBJECT_HEADER Header;
NDIS_HANDLE SourceHandle;
NDIS_PORT_NUMBER PortNumber;
NDIS_STATUS StatusCode;
ULONG Flags;
NDIS_HANDLE DestinationHandle;
PVOID RequestId;
PVOID StatusBuffer;
ULONG StatusBufferSize;
GUID Guid; // optional and valid only if StatusCode = NDIS_STATUS_MEDIA_SPECIFIC_INDICATION
PVOID NdisReserved[4];
}NDIS_STATUS_INDICATION, *PNDIS_STATUS_INDICATION;
#define NDIS_SIZEOF_STATUS_INDICATION_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_STATUS_INDICATION, NdisReserved)
//
// Generic Timer support
//
#define NDIS_TIMER_CHARACTERISTICS_REVISION_1 1
typedef struct _NDIS_TIMER_CHARACTERISTICS
{
NDIS_OBJECT_HEADER Header;
ULONG AllocationTag;
PNDIS_TIMER_FUNCTION TimerFunction;
PVOID FunctionContext;
} NDIS_TIMER_CHARACTERISTICS, *PNDIS_TIMER_CHARACTERISTICS;
#define NDIS_SIZEOF_TIMER_CHARACTERISTICS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_TIMER_CHARACTERISTICS, FunctionContext)
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_MAX_LOOKAHEAD_SIZE_ACCESSED_UNDEFINED -1
//
// Bits used in Flags field of NDIS_RESTART_GENERAL_ATTRIBUTES structure
//
#define NDIS_RESTART_GENERAL_ATTRIBUTES_MAX_LOOKAHEAD_ACCESSED_DEFINED 0x00000001
#endif
//
// NDIS_RESTART_GENERAL_ATTRIBUTES is used in NDIS_RESTART_ATTRIBUTES
//
#define NDIS_RESTART_GENERAL_ATTRIBUTES_REVISION_1 1
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_RESTART_GENERAL_ATTRIBUTES_REVISION_2 2
#endif
typedef struct _NDIS_RESTART_GENERAL_ATTRIBUTES
{
NDIS_OBJECT_HEADER Header;
ULONG MtuSize;
ULONG64 MaxXmitLinkSpeed;
ULONG64 MaxRcvLinkSpeed;
ULONG LookaheadSize;
ULONG MacOptions;
ULONG SupportedPacketFilters;
ULONG MaxMulticastListSize;
PNDIS_RECEIVE_SCALE_CAPABILITIES RecvScaleCapabilities;
NET_IF_ACCESS_TYPE AccessType;
ULONG Flags;
NET_IF_CONNECTION_TYPE ConnectionType;
ULONG SupportedStatistics;
ULONG DataBackFillSize;
ULONG ContextBackFillSize;
PNDIS_OID SupportedOidList;
ULONG SupportedOidListLength;
#if (NDIS_SUPPORT_NDIS620)
ULONG MaxLookaheadSizeAccessed;
#endif
}NDIS_RESTART_GENERAL_ATTRIBUTES, *PNDIS_RESTART_GENERAL_ATTRIBUTES;
#define NDIS_SIZEOF_RESTART_GENERAL_ATTRIBUTES_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_RESTART_GENERAL_ATTRIBUTES, SupportedOidListLength)
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_SIZEOF_RESTART_GENERAL_ATTRIBUTES_REVISION_2 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_RESTART_GENERAL_ATTRIBUTES, MaxLookaheadSizeAccessed)
#endif
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisAllocateTimerObject(
__in NDIS_HANDLE NdisHandle,
__in PNDIS_TIMER_CHARACTERISTICS TimerCharacteristics,
__out __drv_deref(__drv_isObjectPointer)
PNDIS_HANDLE pTimerObject
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
BOOLEAN
NdisSetTimerObject(
__in NDIS_HANDLE TimerObject,
__in LARGE_INTEGER DueTime,
__in_opt LONG MillisecondsPeriod,
__in_opt PVOID FunctionContext
);
//
// Marking this as <= DISPATCH but in reality this should actually be == PASSIVE
// (in some cases). It depends if the TimerObject was created to be a Periodic Timer
// or not. We'll rely on SDV to catch these extra cases for now.
//
__drv_maxIRQL(DISPATCH_LEVEL)
__checkReturn
EXPORT
BOOLEAN
NdisCancelTimerObject(
__in NDIS_HANDLE TimerObject
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFreeTimerObject(
__in NDIS_HANDLE TimerObject
);
EXPORT
NDIS_STATUS
NdisAllocateCloneOidRequest(
IN NDIS_HANDLE SourceHandle,
IN PNDIS_OID_REQUEST OidRequest,
IN UINT PoolTag,
OUT PNDIS_OID_REQUEST* ClonedOidRequest
);
EXPORT
VOID
NdisFreeCloneOidRequest(
IN NDIS_HANDLE SourceHandle,
IN PNDIS_OID_REQUEST Request
);
EXPORT
VOID
NdisGetSystemUpTimeEx(
OUT PLARGE_INTEGER pSystemUpTime
);
#if NDIS_SUPPORT_60_COMPATIBLE_API
typedef struct _NDIS_PROCESSOR_INFO
{
ULONG CpuNumber;
ULONG PhysicalPackageId;
ULONG CoreId;
ULONG HyperThreadID;
}NDIS_PROCESSOR_INFO, *PNDIS_PROCESSOR_INFO;
#define NDIS_SYSTEM_PROCESSOR_INFO_REVISION_1 1
typedef struct _NDIS_SYSTEM_PROCESSOR_INFO
{
NDIS_OBJECT_HEADER Header;
ULONG Flags;
NDIS_PROCESSOR_VENDOR ProcessorVendor;
ULONG NumPhysicalPackages;
ULONG NumCores;
ULONG NumCoresPerPhysicalPackage;
ULONG MaxHyperThreadingCpusPerCore;
ULONG RssBaseCpu;
ULONG RssCpuCount;
__out_ecount(MAXIMUM_PROC_PER_GROUP) PUCHAR RssProcessors;
NDIS_PROCESSOR_INFO CpuInfo[MAXIMUM_PROC_PER_GROUP];
}NDIS_SYSTEM_PROCESSOR_INFO, *PNDIS_SYSTEM_PROCESSOR_INFO;
#define NDIS_SIZEOF_SYSTEM_PROCESSOR_INFO_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_SYSTEM_PROCESSOR_INFO, CpuInfo)
EXPORT
NDIS_STATUS
NdisGetProcessorInformation(
__inout PNDIS_SYSTEM_PROCESSOR_INFO SystemProcessorInfo
);
#endif // NDIS_SUPPORT_60_COMPATIBLE_API
#if NDIS_SUPPORT_NDIS620
EXPORT
NDIS_STATUS
NdisGetRssProcessorInformation(
__in NDIS_HANDLE NdisHandle,
__out_bcount_opt(*Size) PNDIS_RSS_PROCESSOR_INFO RssProcessorInfo,
__inout PSIZE_T Size
);
EXPORT
NDIS_STATUS
NdisGetProcessorInformationEx(
__in_opt NDIS_HANDLE NdisHandle,
__out_bcount_opt(*Size) PNDIS_SYSTEM_PROCESSOR_INFO_EX SystemProcessorInfo,
__inout PSIZE_T Size
);
#endif
//
// Pause reason used in NDIS_MINIPORT_PAUSE_PARAMETERS, NDIS_FILTER_PAUSE_PARAMETERS
// and NDIS_PROTOCOL_PAUSE_PARAMETERS
//
#define NDIS_PAUSE_NDIS_INTERNAL 0x00000001
#define NDIS_PAUSE_LOW_POWER 0x00000002
#define NDIS_PAUSE_BIND_PROTOCOL 0x00000004
#define NDIS_PAUSE_UNBIND_PROTOCOL 0x00000008
#define NDIS_PAUSE_ATTACH_FILTER 0x00000010
#define NDIS_PAUSE_DETACH_FILTER 0x00000020
#define NDIS_PAUSE_FILTER_RESTART_STACK 0x00000040
#define NDIS_PAUSE_MINIPORT_DEVICE_REMOVE 0x00000080
#endif // NDIS_SUPPORT_NDIS6
#if (NTDDI_VERSION >= NTDDI_VISTA)
#if (NDIS_LEGACY_DRIVER || NDIS_SUPPORT_NDIS6)
//
// Flags used in NDIS_FILTER_INTERFACE
//
#define NDIS_FILTER_INTERFACE_IM_FILTER 0x00000001
#define NDIS_FILTER_INTERFACE_LW_FILTER 0x00000002
//
// NDIS_FILTER_INTERFACE is used in NDIS_ENUM_FILTERS
// structure that is used in NdisEnumerateFilterModules
//
#define NDIS_FILTER_INTERFACE_REVISION_1 1
typedef struct _NDIS_FILTER_INTERFACE
{
NDIS_OBJECT_HEADER Header;
ULONG Flags;
ULONG FilterType;
ULONG FilterRunType;
NET_IFINDEX IfIndex;
NET_LUID NetLuid;
NDIS_STRING FilterClass;
NDIS_STRING FilterInstanceName;
} NDIS_FILTER_INTERFACE, *PNDIS_FILTER_INTERFACE;
#define NDIS_SIZEOF_FILTER_INTERFACE_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_FILTER_INTERFACE, FilterInstanceName)
//
// NDIS_ENUM_FILTERS is used in NdisEnumerateFilterModules
//
#define NDIS_ENUM_FILTERS_REVISION_1 1
typedef struct _NDIS_ENUM_FILTERS
{
NDIS_OBJECT_HEADER Header;
ULONG Flags;
ULONG NumberOfFilters;
ULONG OffsetFirstFilter;
NDIS_FILTER_INTERFACE Filter[1];
} NDIS_ENUM_FILTERS, *PNDIS_ENUM_FILTERS;
#define NDIS_SIZEOF_ENUM_FILTERS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_ENUM_FILTERS, Filter)
EXPORT
NDIS_STATUS
NdisEnumerateFilterModules(
IN NDIS_HANDLE NdisHandle,
IN PVOID InterfaceBuffer,
IN ULONG InterfaceBufferLength,
IN OUT PULONG BytesNeeded,
IN OUT PULONG BytesWritten
);
//
// The NdisRegisterDeviceEx is used by NDIS 5 and 6 drivers on NTDDI_VISTA
// These drivers use NdisRegisterDeviceEx to use the new security features
// not available in NdisRegisterDevice or NdisMRegisterDevice
//
#define NDIS_DEVICE_OBJECT_ATTRIBUTES_REVISION_1 1
typedef struct _NDIS_DEVICE_OBJECT_ATTRIBUTES
{
NDIS_OBJECT_HEADER Header;
PNDIS_STRING DeviceName;
PNDIS_STRING SymbolicName;
PDRIVER_DISPATCH* MajorFunctions;
ULONG ExtensionSize;
PCUNICODE_STRING DefaultSDDLString;
LPCGUID DeviceClassGuid;
} NDIS_DEVICE_OBJECT_ATTRIBUTES, *PNDIS_DEVICE_OBJECT_ATTRIBUTES;
#define NDIS_SIZEOF_DEVICE_OBJECT_ATTRIBUTES_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_DEVICE_OBJECT_ATTRIBUTES, DeviceClassGuid)
EXPORT
NDIS_STATUS
NdisRegisterDeviceEx(
IN NDIS_HANDLE NdisObjectHandle,
IN PNDIS_DEVICE_OBJECT_ATTRIBUTES DeviceObjectAttributes,
OUT PDEVICE_OBJECT * pDeviceObject,
OUT PNDIS_HANDLE NdisDeviceHandle
);
EXPORT
VOID
NdisDeregisterDeviceEx(
IN NDIS_HANDLE NdisDeviceHandle
);
EXPORT
PVOID
NdisGetDeviceReservedExtension(
IN PDEVICE_OBJECT DeviceObject
);
//
// This structure is used by NDIS 5.x drivers that want to use
// NdisRegisterDeviceEx
//
#define NDIS_OBJECT_TYPE_DRIVER_WRAPPER_REVISION_1 1
typedef struct _NDIS_DRIVER_WRAPPER_HANDLE
{
//
// Caller must set Header to
// Header.Type = NDIS_OBJECT_TYPE_DRIVER_WRAPPER_OBJECT
// Header.Revision = NDIS_OBJECT_TYPE_DRIVER_WRAPPER_REVISION_1
// Header.Size = sizeof(NDIS_DRIVER_WRAPPER_HANDLE)
//
NDIS_OBJECT_HEADER Header;
NDIS_HANDLE NdisWrapperHandle;
} NDIS_DRIVER_WRAPPER_HANDLE, *PNDIS_DRIVER_WRAPPER_HANDLE;
#define NDIS_SIZEOF_DRIVER_WRAPPER_HANDLE_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_DRIVER_WRAPPER_HANDLE, NdisWrapperHandle)
#endif // NDIS_SUPPORT_NDIS6 || NDIS_LEGACY_DRIVER
#endif // NTDDI_VERSION >= NTDDI_VISTA
#if (NDIS_SUPPORT_NDIS620)
//
// shared memory usage types used in NDIS_SHARED_MEMORY_PARAMETERS
//
typedef enum _NDIS_SHARED_MEMORY_USAGE
{
NdisSharedMemoryUsageUndefined,
NdisSharedMemoryUsageXmit,
NdisSharedMemoryUsageXmitHeader,
NdisSharedMemoryUsageXmitData,
NdisSharedMemoryUsageReceive,
NdisSharedMemoryUsageReceiveLookahead,
NdisSharedMemoryUsageReceivePostLookahead,
NdisSharedMemoryUsageReceiveHeader,
NdisSharedMemoryUsageReceiveData,
NdisSharedMemoryUsageOther,
NdisSharedMemoryUsageMax
}NDIS_SHARED_MEMORY_USAGE, *PNDIS_SHARED_MEMORY_USAGE;
//
// NDIS_SHARED_MEMORY_PARAMETERS structure describes
// a shared memory allocation request for a receive queue.
// This structure is used in NdisMAllocateSharedMemoryEx API
// as well as ALLOCATE_SHARED_MEMORY_HANDLER entry point
//
//
// TODO: Temporary definition to get around VSP build break
//
typedef ULONG NODE_REQUIREMENT;
//
// flags used in Flags field of NDIS_SHARED_MEMORY_PARAMETERS structure
//
#define NDIS_SHARED_MEM_PARAMETERS_CONTIGOUS 0x00000001
//
// shared memory handle used for allocation from HAL
//
#define NDIS_SHARED_MEM_HANDLE_HAL_ALLOCATED ((NDIS_HANDLE)(NULL))
#define NDIS_SHARED_MEMORY_PARAMETERS_REVISION_1 1
typedef struct _NDIS_SHARED_MEMORY_PARAMETERS
{
__in NDIS_OBJECT_HEADER Header;
__in ULONG Flags;
__in NDIS_RECEIVE_QUEUE_ID QueueId;
__out NDIS_HANDLE SharedMemoryHandle;
__in NODE_REQUIREMENT PreferredNode;
__in NDIS_SHARED_MEMORY_USAGE Usage;
__in ULONG Length;
__out PVOID VirtualAddress;
__in ULONG SGListBufferLength;
__inout PSCATTER_GATHER_LIST SGListBuffer;
}NDIS_SHARED_MEMORY_PARAMETERS, *PNDIS_SHARED_MEMORY_PARAMETERS;
#define NDIS_SIZEOF_SHARED_MEMORY_PARAMETERS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_SHARED_MEMORY_PARAMETERS, SGListBuffer)
typedef
NDIS_STATUS
(*ALLOCATE_SHARED_MEMORY_HANDLER)(
__in NDIS_HANDLE ProviderContext,
__in PNDIS_SHARED_MEMORY_PARAMETERS SharedMemoryParameters,
__inout PNDIS_HANDLE pSharedMemoryProviderContext
);
typedef
VOID
(*FREE_SHARED_MEMORY_HANDLER)(
__in NDIS_HANDLE ProviderContext,
__in NDIS_HANDLE SharedMemoryProviderContext
);
#define NDIS_SHARED_MEMORY_PROVIDER_CHARACTERISTICS_REVISION_1 1
typedef struct _NDIS_SHARED_MEMORY_PROVIDER_CHARACTERISTICS
{
NDIS_OBJECT_HEADER Header; // Header.Type = NDIS_OBJECT_TYPE_SHARED_MEMORY_PROVIDER_CHARACTERISTICS
ULONG Flags;
NDIS_HANDLE ProviderContext;
ALLOCATE_SHARED_MEMORY_HANDLER AllocateSharedMemoryHandler;
FREE_SHARED_MEMORY_HANDLER FreeSharedMemoryHandler;
} NDIS_SHARED_MEMORY_PROVIDER_CHARACTERISTICS, *PNDIS_SHARED_MEMORY_PROVIDER_CHARACTERISTICS;
#define NDIS_SIZEOF_SHARED_MEMORY_PROVIDER_CHARACTERISTICS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_SHARED_MEMORY_PROVIDER_CHARACTERISTICS, FreeSharedMemoryHandler)
EXPORT
VOID
NdisFreeMemoryWithTagPriority(
IN NDIS_HANDLE NdisHandle,
IN PVOID VirtualAddress,
IN ULONG Tag
);
//
// the following structure is used in NDIS_STATUS_RECEIVE_QUEUE_STATE
// status indication
//
#define NDIS_RECEIVE_QUEUE_STATE_REVISION_1 1
typedef struct _NDIS_RECEIVE_QUEUE_STATE
{
NDIS_OBJECT_HEADER Header;
ULONG Flags;
NDIS_RECEIVE_QUEUE_ID QueueId;
NDIS_RECEIVE_QUEUE_OPERATIONAL_STATE QueueState;
}NDIS_RECEIVE_QUEUE_STATE, *PNDIS_RECEIVE_QUEUE_STATE;
#define NDIS_SIZEOF_NDIS_RECEIVE_QUEUE_STATE_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_RECEIVE_QUEUE_STATE, QueueState)
EXPORT
NDIS_STATUS
NdisAllocateSharedMemory(
IN NDIS_HANDLE NdisHandle,
IN PNDIS_SHARED_MEMORY_PARAMETERS SharedMemoryParameters,
IN OUT PNDIS_HANDLE pAllocationHandle
);
EXPORT
VOID
NdisFreeSharedMemory(
IN NDIS_HANDLE NdisHandle,
IN NDIS_HANDLE AllocationHandle
);
//
// NDIS_PROCESS_SG_LIST is a driver supplied callback routine used
// in NdisBuildScatterGatherList
//
typedef
VOID
(NDIS_PROCESS_SG_LIST)(
__in PDEVICE_OBJECT DeviceObject,
__in PVOID Reserved,
__in PSCATTER_GATHER_LIST ScatterGatherListBuffer,
__in PVOID Context
);
typedef NDIS_PROCESS_SG_LIST (*NDIS_PROCESS_SG_LIST_HANDLER);
//
// NDIS_SCATTER_GATHER_LIST_PARAMETERS is used in NdisBuildScatterGatherList
// API call to build a scatter gather list for a buffer
//
#define NDIS_SCATTER_GATHER_LIST_PARAMETERS_REVISION_1 1
typedef struct _NDIS_SCATTER_GATHER_LIST_PARAMETERS
{
NDIS_OBJECT_HEADER Header;
ULONG Flags;
NDIS_RECEIVE_QUEUE_ID QueueId;
NDIS_SHARED_MEMORY_USAGE SharedMemoryUsage;
PMDL Mdl;
PVOID CurrentVa;
ULONG Length;
NDIS_PROCESS_SG_LIST_HANDLER ProcessSGListHandler;
PVOID Context;
PSCATTER_GATHER_LIST ScatterGatherListBuffer;
ULONG ScatterGatherListBufferSize;
ULONG ScatterGatherListBufferSizeNeeded;
}NDIS_SCATTER_GATHER_LIST_PARAMETERS, *PNDIS_SCATTER_GATHER_LIST_PARAMETERS;
#define NDIS_SIZEOF_SCATTER_GATHER_LIST_PARAMETERS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_SCATTER_GATHER_LIST_PARAMETERS, ScatterGatherListBufferSizeNeeded)
EXPORT
NDIS_STATUS
NdisBuildScatterGatherList(
IN NDIS_HANDLE NdisHandle,
IN PNDIS_SCATTER_GATHER_LIST_PARAMETERS SGListParameters
);
EXPORT
VOID
NdisFreeScatterGatherList(
IN NDIS_HANDLE NdisHandle,
IN PSCATTER_GATHER_LIST ScatterGatherListBuffer,
IN BOOLEAN WriteToDevice
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
BOOLEAN
NdisSetCoalescableTimerObject(
__in NDIS_HANDLE TimerObject,
__in LARGE_INTEGER DueTime,
__in_opt LONG MillisecondsPeriod,
__in_opt PVOID FunctionContext,
__in_opt ULONG Tolerance
);
NDIS_STATUS
NdisGetHypervisorInfo(
__inout PNDIS_HYPERVISOR_INFO HypervisorInfo
);
#endif // #if (NDIS_SUPPORT_NDIS620)
#ifndef AFFINITY_MASK
#define AFFINITY_MASK(n) ((KAFFINITY)1 << (n))
#endif
#pragma warning(pop)
#pragma once
#pragma warning(push)
#pragma warning(disable:4201) // (nonstandard extension used : nameless struct/union)
#pragma warning(disable:4214) // (extension used : bit field types other than int)
#if (NDIS_SUPPORT_NDIS6 || NDIS60)
//
// NET_BUFFER data structures, APIs and macros
//
typedef struct _NET_BUFFER NET_BUFFER, *PNET_BUFFER;
typedef struct _NET_BUFFER_LIST_CONTEXT NET_BUFFER_LIST_CONTEXT, *PNET_BUFFER_LIST_CONTEXT;
typedef struct _NET_BUFFER_LIST NET_BUFFER_LIST, *PNET_BUFFER_LIST;
struct _SCATTER_GATHER_LIST;
typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
typedef union _NET_BUFFER_DATA_LENGTH
{
ULONG DataLength;
SIZE_T stDataLength;
} NET_BUFFER_DATA_LENGTH, *PNET_BUFFER_DATA_LENGTH;
typedef struct _NET_BUFFER_DATA
{
PNET_BUFFER Next;
PMDL CurrentMdl;
ULONG CurrentMdlOffset;
#ifdef __cplusplus
NET_BUFFER_DATA_LENGTH NbDataLength;
#else
NET_BUFFER_DATA_LENGTH;
#endif
PMDL MdlChain;
ULONG DataOffset;
} NET_BUFFER_DATA, *PNET_BUFFER_DATA;
typedef union _NET_BUFFER_HEADER
{
#ifdef __cplusplus
NET_BUFFER_DATA NetBufferData;
#else
NET_BUFFER_DATA;
#endif
SLIST_HEADER Link;
} NET_BUFFER_HEADER, *PNET_BUFFER_HEADER;
#if (NDIS_SUPPORT_NDIS620)
//
// NET_BUFFER_SHARED_MEMORY is used to describe the
// shared memory segments used in each NET_BUFFER.
// for NDIS 6.20, they are used in VM queue capable NICs
// used in virtualization environment
//
typedef struct _NET_BUFFER_SHARED_MEMORY NET_BUFFER_SHARED_MEMORY, *PNET_BUFFER_SHARED_MEMORY;
typedef struct _NET_BUFFER_SHARED_MEMORY
{
PNET_BUFFER_SHARED_MEMORY NextSharedMemorySegment;
ULONG SharedMemoryFlags;
NDIS_HANDLE SharedMemoryHandle;
ULONG SharedMemoryOffset;
ULONG SharedMemoryLength;
}NET_BUFFER_SHARED_MEMORY, *PNET_BUFFER_SHARED_MEMORY;
#endif // NDIS_SUPPORT_NDIS620
typedef struct _NET_BUFFER
{
#ifdef __cplusplus
NET_BUFFER_HEADER NetBufferHeader;
#else
NET_BUFFER_HEADER;
#endif
USHORT ChecksumBias;
USHORT Reserved;
NDIS_HANDLE NdisPoolHandle;
DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT)PVOID NdisReserved[2];
DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT)PVOID ProtocolReserved[6];
DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT)PVOID MiniportReserved[4];
NDIS_PHYSICAL_ADDRESS DataPhysicalAddress;
#if (NDIS_SUPPORT_NDIS620)
union
{
PNET_BUFFER_SHARED_MEMORY SharedMemoryInfo;
PSCATTER_GATHER_LIST ScatterGatherList;
};
#endif
}NET_BUFFER, *PNET_BUFFER;
#pragma warning(push)
#pragma warning(disable:4200) // nonstandard extension used : zero-sized array in struct/union
typedef struct _NET_BUFFER_LIST_CONTEXT
{
PNET_BUFFER_LIST_CONTEXT Next;
USHORT Size;
USHORT Offset;
DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) UCHAR ContextData[];
} NET_BUFFER_LIST_CONTEXT, *PNET_BUFFER_LIST_CONTEXT;
#pragma warning(pop)
typedef enum _NDIS_NET_BUFFER_LIST_INFO
{
TcpIpChecksumNetBufferListInfo,
TcpOffloadBytesTransferred = TcpIpChecksumNetBufferListInfo,
IPsecOffloadV1NetBufferListInfo,
#if (NDIS_SUPPORT_NDIS61)
IPsecOffloadV2NetBufferListInfo = IPsecOffloadV1NetBufferListInfo,
#endif // (NDIS_SUPPORT_NDIS61)
TcpLargeSendNetBufferListInfo,
TcpReceiveNoPush = TcpLargeSendNetBufferListInfo,
ClassificationHandleNetBufferListInfo,
Ieee8021QNetBufferListInfo,
NetBufferListCancelId,
MediaSpecificInformation,
NetBufferListFrameType,
NetBufferListProtocolId = NetBufferListFrameType,
NetBufferListHashValue,
NetBufferListHashInfo,
WfpNetBufferListInfo,
#if (NDIS_SUPPORT_NDIS61)
IPsecOffloadV2TunnelNetBufferListInfo,
IPsecOffloadV2HeaderNetBufferListInfo,
#endif // (NDIS_SUPPORT_NDIS61)
#if (NDIS_SUPPORT_NDIS620)
NetBufferListCorrelationId,
NetBufferListFilteringInfo,
MediaSpecificInformationEx,
NblOriginalInterfaceIfIndex,
NblReAuthWfpFlowContext = NblOriginalInterfaceIfIndex,
TcpReceiveBytesTransferred,
#endif // (NDIS_SUPPORT_NDIS620)
MaxNetBufferListInfo
} NDIS_NET_BUFFER_LIST_INFO, *PNDIS_NET_BUFFER_LIST_INFO;
typedef struct _NET_BUFFER_LIST_DATA
{
PNET_BUFFER_LIST Next; // Next NetBufferList in the chain
PNET_BUFFER FirstNetBuffer; // First NetBuffer on this NetBufferList
} NET_BUFFER_LIST_DATA, *PNET_BUFFER_LIST_DATA;
typedef union _NET_BUFFER_LIST_HEADER
{
#ifdef __cplusplus
NET_BUFFER_LIST_DATA NetBufferListData;
#else
NET_BUFFER_LIST_DATA;
#endif
SLIST_HEADER Link; // used in SLIST of free NetBuffers in the block
} NET_BUFFER_LIST_HEADER, *PNET_BUFFER_LIST_HEADER;
typedef struct _NET_BUFFER_LIST
{
#ifdef __cplusplus
NET_BUFFER_LIST_HEADER NetBufferListHeader;
#else
NET_BUFFER_LIST_HEADER;
#endif
PNET_BUFFER_LIST_CONTEXT Context;
PNET_BUFFER_LIST ParentNetBufferList;
NDIS_HANDLE NdisPoolHandle;
DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT)PVOID NdisReserved[2];
DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT)PVOID ProtocolReserved[4];
DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT)PVOID MiniportReserved[2];
PVOID Scratch;
NDIS_HANDLE SourceHandle;
ULONG NblFlags; // public flags
LONG ChildRefCount;
ULONG Flags; // private flags used by NDIs, protocols, miniport, etc.
NDIS_STATUS Status;
PVOID NetBufferListInfo[MaxNetBufferListInfo];
} NET_BUFFER_LIST, *PNET_BUFFER_LIST;
#ifdef __cplusplus
#define NET_BUFFER_NEXT_NB(_NB) ((_NB)->NetBufferHeader.NetBufferData.Next)
#define NET_BUFFER_FIRST_MDL(_NB) ((_NB)->NetBufferHeader.NetBufferData.MdlChain)
#define NET_BUFFER_DATA_LENGTH(_NB) ((_NB)->NetBufferHeader.NetBufferData.NbDataLength.DataLength)
#define NET_BUFFER_DATA_OFFSET(_NB) ((_NB)->NetBufferHeader.NetBufferData.DataOffset)
#define NET_BUFFER_CURRENT_MDL(_NB) ((_NB)->NetBufferHeader.NetBufferData.CurrentMdl)
#define NET_BUFFER_CURRENT_MDL_OFFSET(_NB) ((_NB)->NetBufferHeader.NetBufferData.CurrentMdlOffset)
#else
#define NET_BUFFER_NEXT_NB(_NB) ((_NB)->Next)
#define NET_BUFFER_FIRST_MDL(_NB) ((_NB)->MdlChain)
#define NET_BUFFER_DATA_LENGTH(_NB) ((_NB)->DataLength)
#define NET_BUFFER_DATA_OFFSET(_NB) ((_NB)->DataOffset)
#define NET_BUFFER_CURRENT_MDL(_NB) ((_NB)->CurrentMdl)
#define NET_BUFFER_CURRENT_MDL_OFFSET(_NB) ((_NB)->CurrentMdlOffset)
#endif
#define NET_BUFFER_PROTOCOL_RESERVED(_NB) ((_NB)->ProtocolReserved)
#define NET_BUFFER_MINIPORT_RESERVED(_NB) ((_NB)->MiniportReserved)
#define NET_BUFFER_CHECKSUM_BIAS(_NB) ((_NB)->ChecksumBias)
#if (NDIS_SUPPORT_NDIS61)
#define NET_BUFFER_DATA_PHYSICAL_ADDRESS(_NB) ((_NB)->DataPhysicalAddress)
#endif // (NDIS_SUPPORT_NDIS61)
#if (NDIS_SUPPORT_NDIS620)
#define NET_BUFFER_FIRST_SHARED_MEM_INFO(_NB) ((_NB)->SharedMemoryInfo)
#define NET_BUFFER_SHARED_MEM_NEXT_SEGMENT(_SHI) ((_SHI)->NextSharedMemorySegment)
#define NET_BUFFER_SHARED_MEM_FLAGS(_SHI) ((_SHI)->SharedMemoryFlags)
#define NET_BUFFER_SHARED_MEM_HANDLE(_SHI) ((_SHI)->SharedMemoryHandle)
#define NET_BUFFER_SHARED_MEM_OFFSET(_SHI) ((_SHI)->SharedMemoryOffset)
#define NET_BUFFER_SHARED_MEM_LENGTH(_SHI) ((_SHI)->SharedMemoryLength)
#define NET_BUFFER_SCATTER_GATHER_LIST(_NB) ((_NB)->ScatterGatherList)
#endif // (NDIS_SUPPORT_NDIS620)
#ifdef __cplusplus
#define NET_BUFFER_LIST_NEXT_NBL(_NBL) ((_NBL)->NetBufferListHeader.NetBufferListData.Next)
#define NET_BUFFER_LIST_FIRST_NB(_NBL) ((_NBL)->NetBufferListHeader.NetBufferListData.FirstNetBuffer)
#else
#define NET_BUFFER_LIST_NEXT_NBL(_NBL) ((_NBL)->Next)
#define NET_BUFFER_LIST_FIRST_NB(_NBL) ((_NBL)->FirstNetBuffer)
#endif
#define NET_BUFFER_LIST_FLAGS(_NBL) ((_NBL)->Flags)
#define NET_BUFFER_LIST_NBL_FLAGS(_NBL) ((_NBL)->NblFlags)
#define NET_BUFFER_LIST_PROTOCOL_RESERVED(_NBL) ((_NBL)->ProtocolReserved)
#define NET_BUFFER_LIST_MINIPORT_RESERVED(_NBL) ((_NBL)->MiniportReserved)
#define NET_BUFFER_LIST_CONTEXT_DATA_START(_NBL) ((PUCHAR)(((_NBL)->Context)+1)+(_NBL)->Context->Offset)
#define NET_BUFFER_LIST_CONTEXT_DATA_SIZE(_NBL) (((_NBL)->Context)->Size)
#define NET_BUFFER_LIST_INFO(_NBL, _Id) ((_NBL)->NetBufferListInfo[(_Id)])
#define NET_BUFFER_LIST_STATUS(_NBL) ((_NBL)->Status)
#define NDIS_GET_NET_BUFFER_LIST_CANCEL_ID(_NBL) (NET_BUFFER_LIST_INFO(_NBL, NetBufferListCancelId))
#define NDIS_SET_NET_BUFFER_LIST_CANCEL_ID(_NBL, _CancelId) \
NET_BUFFER_LIST_INFO(_NBL, NetBufferListCancelId) = _CancelId
//
// Per-NBL information for Ieee8021QNetBufferListInfo.
//
typedef struct _NDIS_NET_BUFFER_LIST_8021Q_INFO
{
union
{
struct
{
UINT32 UserPriority:3; // 802.1p priority
UINT32 CanonicalFormatId:1; // always 0
UINT32 VlanId:12; // VLAN Identification
UINT32 Reserved:16; // set to 0 for ethernet
}TagHeader;
struct
{
UINT32 UserPriority:3; // 802.1p priority
UINT32 CanonicalFormatId:1; // always 0
UINT32 VlanId:12; // VLAN Identification
UINT32 WMMInfo:4;
UINT32 Reserved:12; // set to 0 for wireless lan
}WLanTagHeader;
PVOID Value;
};
} NDIS_NET_BUFFER_LIST_8021Q_INFO, *PNDIS_NET_BUFFER_LIST_8021Q_INFO;
typedef struct _NDIS_NET_BUFFER_LIST_MEDIA_SPECIFIC_INFO
{
union
{
PVOID MediaSpecificInfo;
PVOID NativeWifiSpecificInfo;
PVOID Value;
};
} NDIS_NET_BUFFER_LIST_MEDIA_SPECIFIC_INFO, *PNDIS_NET_BUFFER_LIST_MEDIA_SPECIFIC_INFO;
typedef struct _NDIS_NBL_MEDIA_MEDIA_SPECIFIC_INFORMATION NDIS_NBL_MEDIA_SPECIFIC_INFORMATION, *PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION;
struct _NDIS_NBL_MEDIA_MEDIA_SPECIFIC_INFORMATION
{
PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION NextEntry;
ULONG Tag;
DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) UCHAR Data[1];
};
#define NDIS_NBL_ADD_MEDIA_SPECIFIC_INFO(_NBL, _MediaSpecificInfo) \
{ \
PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION HeadEntry = NULL; \
if (NET_BUFFER_LIST_INFO((_NBL), MediaSpecificInformation) != NULL) \
{ \
HeadEntry = (PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION)(NET_BUFFER_LIST_INFO((_NBL), MediaSpecificInformation)); \
} \
NET_BUFFER_LIST_INFO((_NBL), MediaSpecificInformation) = (_MediaSpecificInfo); \
(_MediaSpecificInfo)->NextEntry = HeadEntry; \
}
#define NDIS_NBL_REMOVE_MEDIA_SPECIFIC_INFO(_NBL, _MediaSpecificInfo) \
{ \
PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION *HeadEntry; \
HeadEntry = (PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION *)&(NET_BUFFER_LIST_INFO((_NBL), MediaSpecificInformation)); \
for (; *HeadEntry != NULL; HeadEntry = &(*HeadEntry)->NextEntry) \
{ \
if ((*HeadEntry)->Tag == (_MediaSpecificInfo)->Tag) \
{ \
*HeadEntry = (*HeadEntry)->NextEntry; \
break; \
} \
} \
}
#define NDIS_NBL_GET_MEDIA_SPECIFIC_INFO(_NBL, _Tag, _MediaSpecificInfo) \
{ \
PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION HeadEntry; \
(_MediaSpecificInfo) = NULL; \
HeadEntry = (PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION)(NET_BUFFER_LIST_INFO((_NBL), MediaSpecificInformation)); \
for (; HeadEntry != NULL; HeadEntry = HeadEntry->NextEntry) \
{ \
if (HeadEntry->Tag == (_Tag)) \
{ \
(_MediaSpecificInfo) = HeadEntry; \
break; \
} \
} \
}
#if NDIS_SUPPORT_NDIS620
typedef struct _NDIS_NBL_MEDIA_SPECIFIC_INFORMATION_EX
{
NDIS_OBJECT_HEADER Header;
struct _NDIS_NBL_MEDIA_SPECIFIC_INFORMATION_EX* NextEntry;
ULONG Tag;
PVOID Data;
} NDIS_NBL_MEDIA_SPECIFIC_INFORMATION_EX, *PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION_EX;
#define NDIS_NBL_MEDIA_SPECIFIC_INFO_REVISION_1 1
#define NDIS_SIZEOF_NBL_MEDIA_SPECIFIC_INFO_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_NBL_MEDIA_SPECIFIC_INFORMATION_EX,Data)
#define NDIS_NBL_ADD_MEDIA_SPECIFIC_INFO_EX(_NBL, _MediaSpecificInfo) \
{ \
PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION_EX HeadEntry; \
\
HeadEntry = NET_BUFFER_LIST_INFO(_NBL, MediaSpecificInformationEx); \
NET_BUFFER_LIST_INFO((_NBL), MediaSpecificInformationEx) = (_MediaSpecificInfo); \
(_MediaSpecificInfo)->NextEntry = HeadEntry; \
}
#define NDIS_NBL_REMOVE_MEDIA_SPECIFIC_INFO_EX(_NBL, _MediaSpecificInfo) \
{ \
PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION_EX *HeadEntry; \
HeadEntry = (PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION_EX *)&(NET_BUFFER_LIST_INFO((_NBL), MediaSpecificInformationEx)); \
for (; *HeadEntry != NULL; HeadEntry = &(*HeadEntry)->NextEntry) \
{ \
if ((*HeadEntry)->Tag == (_MediaSpecificInfo)->Tag) \
{ \
*HeadEntry = (*HeadEntry)->NextEntry; \
break; \
} \
} \
}
#define NDIS_NBL_GET_MEDIA_SPECIFIC_INFO_EX(_NBL, _Tag, _MediaSpecificInfo) \
{ \
PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION_EX HeadEntry; \
(_MediaSpecificInfo) = NULL; \
HeadEntry = (PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION_EX)(NET_BUFFER_LIST_INFO((_NBL), MediaSpecificInformationEx)); \
for (; HeadEntry != NULL; HeadEntry = HeadEntry->NextEntry) \
{ \
if (HeadEntry->Tag == (_Tag)) \
{ \
(_MediaSpecificInfo) = HeadEntry; \
break; \
} \
} \
}
#endif
/*
Bit 31 - 0 for MS tag
1 for Vendor tag
Bits 30-16 - Vendor ID (if Bit 31 = 1)
- Technology ID (if Bit 31 = 0)
Bits 15-0 - Tag ID
*/
//
// Microsoft Media Specific-Info tags
//
//TUNNEL - Technology ID : 1
#define NDIS_MEDIA_SPECIFIC_INFO_TUNDL 0x00010001
//
// Intel Media Specific Info tags
//
#define NDIS_MEDIA_SPECIFIC_INFO_FCOE 0x80010000
#define NDIS_MEDIA_SPECIFIC_INFO_EAPOL 0x80010001
#define NDIS_MEDIA_SPECIFIC_INFO_LLDP 0x80010002
#define NDIS_MEDIA_SPECIFIC_INFO_TIMESYNC 0x80010003
#ifndef NDIS_HASH_FUNCTION_MASK
#define NDIS_HASH_FUNCTION_MASK 0x000000FF
#define NDIS_HASH_TYPE_MASK 0x00FFFF00
#endif
//
// The following macros are used by miniport driver and protocol driver to set and get
// the hash value, hash type and hash function.
//
VOID
FORCEINLINE
NET_BUFFER_LIST_SET_HASH_TYPE(
__in PNET_BUFFER_LIST _NBL,
__in volatile ULONG _HashType
)
{
(NET_BUFFER_LIST_INFO(_NBL, NetBufferListHashInfo) =
UlongToPtr(((PtrToUlong (NET_BUFFER_LIST_INFO(_NBL, NetBufferListHashInfo)) & (~NDIS_HASH_TYPE_MASK)) | ((_HashType) & (NDIS_HASH_TYPE_MASK)))));
}
VOID
FORCEINLINE
NET_BUFFER_LIST_SET_HASH_FUNCTION(
__in PNET_BUFFER_LIST _NBL,
__in volatile ULONG _HashFunction
)
{
(NET_BUFFER_LIST_INFO(_NBL, NetBufferListHashInfo) =
UlongToPtr(((PtrToUlong(NET_BUFFER_LIST_INFO(_NBL, NetBufferListHashInfo)) & (~NDIS_HASH_FUNCTION_MASK)) | ((_HashFunction) & (NDIS_HASH_FUNCTION_MASK)))));
}
#define NET_BUFFER_LIST_SET_HASH_VALUE(_NBL, _HashValue) \
(NET_BUFFER_LIST_INFO(_NBL, NetBufferListHashValue) = UlongToPtr(_HashValue))
#define NET_BUFFER_LIST_GET_HASH_TYPE(_NBL) \
(PtrToUlong(NET_BUFFER_LIST_INFO(_NBL, NetBufferListHashInfo)) & (NDIS_HASH_TYPE_MASK))
#define NET_BUFFER_LIST_GET_HASH_FUNCTION(_NBL) \
(PtrToUlong(NET_BUFFER_LIST_INFO(_NBL, NetBufferListHashInfo)) & (NDIS_HASH_FUNCTION_MASK))
#define NET_BUFFER_LIST_GET_HASH_VALUE(_NBL) \
(PtrToUlong(NET_BUFFER_LIST_INFO(_NBL, NetBufferListHashValue)))
#define NdisSetNetBufferListProtocolId(_NBL,_ProtocolId) \
*((PUCHAR)(&NET_BUFFER_LIST_INFO(_NBL, NetBufferListProtocolId))) = _ProtocolId
#if (NDIS_SUPPORT_NDIS620)
//
// Per-NBL information for NetBufferListFilteringInfo.
//
typedef struct _NDIS_NET_BUFFER_LIST_FILTERING_INFO
{
union
{
struct
{
USHORT FilterId;
USHORT QueueId;
} FilteringInfo;
PVOID Value;
};
} NDIS_NET_BUFFER_LIST_FILTERING_INFO, *PNDIS_NET_BUFFER_LIST_FILTERING_INFO;
#define NET_BUFFER_LIST_RECEIVE_FILTER_ID(_NBL) \
(((PNDIS_NET_BUFFER_LIST_FILTERING_INFO)&NET_BUFFER_LIST_INFO(_NBL, NetBufferListFilteringInfo))->FilteringInfo.FilterId)
#define NET_BUFFER_LIST_RECEIVE_QUEUE_ID(_NBL) \
(((PNDIS_NET_BUFFER_LIST_FILTERING_INFO)&NET_BUFFER_LIST_INFO(_NBL, NetBufferListFilteringInfo))->FilteringInfo.QueueId)
#endif // (NDIS_SUPPORT_NDIS620)
#define NdisQueryMdl(_Mdl, _VirtualAddress, _Length, _Priority) \
{ \
if (ARGUMENT_PRESENT(_VirtualAddress)) \
{ \
*(PVOID *)(_VirtualAddress) = MmGetSystemAddressForMdlSafe(_Mdl, _Priority); \
} \
*(_Length) = MmGetMdlByteCount(_Mdl); \
}
#define NdisQueryMdlOffset(_Mdl, _Offset, _Length) \
{ \
*(_Offset) = MmGetMdlByteOffset(_Mdl); \
*(_Length) = MmGetMdlByteCount(_Mdl); \
}
#define NDIS_MDL_TO_SPAN_PAGES(_Mdl) \
(MmGetMdlByteCount(_Mdl)==0 ? \
1 : \
(ADDRESS_AND_SIZE_TO_SPAN_PAGES( \
MmGetMdlVirtualAddress(_Mdl), \
MmGetMdlByteCount(_Mdl))))
#define NdisGetMdlPhysicalArraySize(_Mdl, _ArraySize) \
(*(_ArraySize) = NDIS_MDL_TO_SPAN_PAGES(_Mdl))
#define NDIS_MDL_LINKAGE(_Mdl) ((_Mdl)->Next)
#define NdisGetNextMdl(_CurrentMdl, _NextMdl) \
{ \
*(_NextMdl) = (_CurrentMdl)->Next; \
}
__drv_maxIRQL(DISPATCH_LEVEL)
UCHAR
NdisGetNetBufferListProtocolId(
__in PNET_BUFFER_LIST NetBufferList
);
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
NdisAdjustNetBufferCurrentMdl(
__in PNET_BUFFER NetBuffer
);
//
// The flags that can be set at NET_BUFFER_LIST.Flags are defined below.
//
#define NBL_FLAGS_PROTOCOL_RESERVED 0xFFF00000
#define NBL_FLAGS_MINIPORT_RESERVED 0x0000F000
#define NBL_FLAGS_SCRATCH 0x000F0000
#define NBL_FLAGS_NDIS_RESERVED 0x00000FFF
#define NBL_TEST_FLAG(_NBL, _F) (((_NBL)->Flags & (_F)) != 0)
#define NBL_SET_FLAG(_NBL, _F) ((_NBL)->Flags |= (_F))
#define NBL_CLEAR_FLAG(_NBL, _F) ((_NBL)->Flags &= ~(_F))
#define NBL_SET_PROTOCOL_RSVD_FLAG(_NBL, _F) ((_NBL)->Flags |= ((_F) & NBL_FLAGS_PROTOCOL_RESERVED))
#define NBL_CLEAR_PROTOCOL_RSVD_FLAG(_NBL, _F) ((_NBL)->Flags &= ~((_F) & NBL_FLAGS_PROTOCOL_RESERVED))
#define NBL_TEST_PROTOCOL_RSVD_FLAG(_NBL, _F) (((_NBL)->Flags & ((_F) & NBL_FLAGS_PROTOCOL_RESERVED)) != 0)
//
// Define some flags for protocols' own use
//
#define NBL_PROT_RSVD_FLAGS NBL_FLAGS_PROTOCOL_RESERVED
#define NBL_SET_PROT_RSVD_FLAG(_NBL, _F) NBL_SET_PROTOCOL_RSVD_FLAG(_NBL,_F)
#define NBL_CLEAR_PROT_RSVD_FLAG(_NBL, _F) NBL_CLEAR_PROTOCOL_RSVD_FLAG(_NBL, _F)
#define NBL_TEST_PROT_RSVD_FLAG(_NBL, _F) NBL_TEST_PROTOCOL_RSVD_FLAG(_NBL, _F)
//
// Flags used in NBL->NblFlags
// 0x01 to 0xFF are reserved for use by NDIS
//
#define NDIS_NBL_FLAGS_SEND_READ_ONLY 0x00000001
#define NDIS_NBL_FLAGS_RECV_READ_ONLY 0x00000002
#if (NDIS_SUPPORT_NDIS61)
#define NDIS_NBL_FLAGS_HD_SPLIT 0x00000100 // Data and header are split
#define NDIS_NBL_FLAGS_IS_IPV4 0x00000200 // Packet is an IPv4 packet
#define NDIS_NBL_FLAGS_IS_IPV6 0x00000400 // Packet is an IPv6 packet
#define NDIS_NBL_FLAGS_IS_TCP 0x00000800 // Packet is a TCP packet
#define NDIS_NBL_FLAGS_IS_UDP 0x00001000 // Packet is a UDP packet
#define NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER 0x00002000 // Packet is split at the beginning of upper layer protocol header
#define NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD 0x00004000 // Packet is split at the beginning of upper layer protocol data (TCP or UDP)
#endif // (NDIS_SUPPORT_NDIS61)
#define NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET 0x00008000 // The NBL is loopback NBL.
#define NdisTestNblFlag(_NBL, _F) (((_NBL)->NblFlags & (_F)) != 0)
#define NdisTestNblFlags(_NBL, _F) (((_NBL)->NblFlags & (_F)) == (_F))
#define NdisSetNblFlag(_NBL, _F) ((_NBL)->NblFlags |= (_F))
#define NdisClearNblFlag(_NBL, _F) ((_NBL)->NblFlags &= ~(_F))
#define NET_BUFFER_LIST_POOL_PARAMETERS_REVISION_1 1
typedef struct _NET_BUFFER_LIST_POOL_PARAMETERS
{
//
// Set ObjectHeader.Type to NDIS_OBJECT_TYPE_DEFAULT
//
NDIS_OBJECT_HEADER Header;
UCHAR ProtocolId;
BOOLEAN fAllocateNetBuffer;
USHORT ContextSize;
ULONG PoolTag;
ULONG DataSize;
}NET_BUFFER_LIST_POOL_PARAMETERS, *PNET_BUFFER_LIST_POOL_PARAMETERS;
#define NDIS_SIZEOF_NET_BUFFER_LIST_POOL_PARAMETERS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NET_BUFFER_LIST_POOL_PARAMETERS, DataSize)
#define NET_BUFFER_POOL_PARAMETERS_REVISION_1 1
typedef struct _NET_BUFFER_POOL_PARAMETERS
{
//
// Set ObjectHeader.Type to NDIS_OBJECT_TYPE_DEFAULT
//
NDIS_OBJECT_HEADER Header;
ULONG PoolTag;
ULONG DataSize;
}NET_BUFFER_POOL_PARAMETERS,*PNET_BUFFER_POOL_PARAMETERS;
#define NDIS_SIZEOF_NET_BUFFER_POOL_PARAMETERS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NET_BUFFER_POOL_PARAMETERS, DataSize);
//
// Prototypes of the MDL allocation and free callback.
//
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
PMDL
(*NET_BUFFER_ALLOCATE_MDL_HANDLER)(
__inout PULONG BufferSize
);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(*NET_BUFFER_FREE_MDL_HANDLER)(
__in PMDL Mdl
);
__checkReturn
__drv_ret(__drv_allocatesMem(mem))
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_HANDLE
NdisAllocateNetBufferPool(
__in_opt NDIS_HANDLE NdisHandle,
__in PNET_BUFFER_POOL_PARAMETERS Parameters
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFreeNetBufferPool(
__in __drv_freesMem(mem) NDIS_HANDLE PoolHandle
);
__checkReturn
__drv_ret(__drv_allocatesMem(mem))
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
PNET_BUFFER
NdisAllocateNetBuffer(
__in NDIS_HANDLE PoolHandle,
__in_opt PMDL MdlChain,
__in ULONG DataOffset,
__in SIZE_T DataLength
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFreeNetBuffer(
__in __drv_freesMem(mem) PNET_BUFFER NetBuffer
);
__checkReturn
__drv_ret(__drv_allocatesMem(mem))
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
PNET_BUFFER
NdisAllocateNetBufferMdlAndData(
__in NDIS_HANDLE PoolHandle
);
__checkReturn
__drv_ret(__drv_allocatesMem(mem))
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_HANDLE
NdisAllocateNetBufferListPool(
__in_opt NDIS_HANDLE NdisHandle,
__in PNET_BUFFER_LIST_POOL_PARAMETERS Parameters
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFreeNetBufferListPool(
__in __drv_freesMem(mem) NDIS_HANDLE PoolHandle
);
__checkReturn
__drv_ret(__drv_allocatesMem(mem))
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
PNET_BUFFER_LIST
NdisAllocateNetBufferList(
__in NDIS_HANDLE PoolHandle,
__in USHORT ContextSize,
__in USHORT ContextBackFill
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFreeNetBufferList(
__in __drv_freesMem(mem) PNET_BUFFER_LIST NetBufferList
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisRetreatNetBufferDataStart(
__in PNET_BUFFER NetBuffer,
__in ULONG DataOffsetDelta,
__in ULONG DataBackFill,
__in_opt NET_BUFFER_ALLOCATE_MDL_HANDLER AllocateMdlHandler
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisAdvanceNetBufferDataStart(
__in PNET_BUFFER NetBuffer,
__in ULONG DataOffsetDelta,
__in BOOLEAN FreeMdl,
__in_opt NET_BUFFER_FREE_MDL_HANDLER FreeMdlHandler
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisRetreatNetBufferListDataStart(
__in PNET_BUFFER_LIST NetBufferList,
__in ULONG DataOffsetDelta,
__in ULONG DataBackFill,
__in_opt NET_BUFFER_ALLOCATE_MDL_HANDLER AllocateMdlHandler,
__in_opt NET_BUFFER_FREE_MDL_HANDLER FreeMdlHandler
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisAdvanceNetBufferListDataStart(
__in PNET_BUFFER_LIST NetBufferList,
__in ULONG DataOffsetDelta,
__in BOOLEAN FreeMdl,
__in_opt NET_BUFFER_FREE_MDL_HANDLER FreeMdlMdlHandler
);
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_when(return==0,__drv_at(NetBufferList->Context, __drv_allocatesMem(mem)))
EXPORT
NDIS_STATUS
NdisAllocateNetBufferListContext(
__in PNET_BUFFER_LIST NetBufferList,
__in USHORT ContextSize,
__in USHORT ContextBackFill,
__in ULONG PoolTag
);
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_at(NetBufferList->Context, __drv_freesMem(mem))
EXPORT
VOID
NdisFreeNetBufferListContext(
__in PNET_BUFFER_LIST NetBufferList,
__in USHORT ContextSize
);
__checkReturn
__drv_ret(__drv_allocatesMem(mem))
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
PNET_BUFFER_LIST
NdisAllocateCloneNetBufferList(
__in PNET_BUFFER_LIST OriginalNetBufferList,
__in_opt NDIS_HANDLE NetBufferListPoolHandle,
__in_opt NDIS_HANDLE NetBufferPoolHandle,
__in ULONG AllocateCloneFlags
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFreeCloneNetBufferList(
__in __drv_freesMem(mem) PNET_BUFFER_LIST CloneNetBufferList,
__in ULONG FreeCloneFlags
);
__checkReturn
__drv_ret(__drv_allocatesMem(mem))
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
PNET_BUFFER_LIST
NdisAllocateFragmentNetBufferList(
__in PNET_BUFFER_LIST OriginalNetBufferList,
__in_opt NDIS_HANDLE NetBufferListPool,
__in_opt NDIS_HANDLE NetBufferPool,
__in ULONG StartOffset,
__in ULONG MaximumLength,
__in ULONG DataOffsetDelta,
__in ULONG DataBackFill,
__in ULONG AllocateFragmentFlags
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFreeFragmentNetBufferList(
__in __drv_freesMem(mem) PNET_BUFFER_LIST FragmentNetBufferList,
__in ULONG DataOffsetDelta,
__in ULONG FreeFragmentFlags
);
__checkReturn
__drv_ret(__drv_allocatesMem(mem))
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
PNET_BUFFER_LIST
NdisAllocateReassembledNetBufferList(
__in PNET_BUFFER_LIST FagmentNetBufferList,
__in_opt NDIS_HANDLE NetBufferAndNetBufferListPoolHandle,
__in ULONG StartOffset,
__in ULONG DataOffsetDelta,
__in ULONG DataBackFill,
__in ULONG AllocateReassembleFlags
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFreeReassembledNetBufferList(
__in __drv_freesMem(mem) PNET_BUFFER_LIST ReassembledNetBufferList,
__in ULONG DataOffsetDelta,
__in ULONG FreeReassembleFlags
);
__checkReturn
__drv_ret(__drv_allocatesMem(mem))
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
PNET_BUFFER_LIST
NdisAllocateNetBufferAndNetBufferList(
__in NDIS_HANDLE PoolHandle,
__in USHORT ContextSize,
__in USHORT ContextBackFill,
__in_opt __drv_aliasesMem PMDL MdlChain,
__in ULONG DataOffset,
__in SIZE_T DataLength
);
__allocator
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
PVOID
NdisGetDataBuffer(
__in PNET_BUFFER NetBuffer,
__in ULONG BytesNeeded,
__in_opt PVOID Storage,
__in UINT AlignMultiple,
__in UINT AlignOffset
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_HANDLE
NdisGetPoolFromNetBufferList(
__in PNET_BUFFER_LIST NetBufferList
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_HANDLE
NdisGetPoolFromNetBuffer(
__in PNET_BUFFER NetBuffer
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisCopyFromNetBufferToNetBuffer(
__in PNET_BUFFER Destination,
__in ULONG DestinationOffset,
__in ULONG BytesToCopy,
__in PNET_BUFFER Source,
__in ULONG SourceOffset,
__out PULONG BytesCopied
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCopySendNetBufferListInfo(
__in PNET_BUFFER_LIST DestNetBufferList,
__in PNET_BUFFER_LIST SrcNetBufferList
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCopyReceiveNetBufferListInfo(
__in PNET_BUFFER_LIST DestNetBufferList,
__in PNET_BUFFER_LIST SrcNetBufferList
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
ULONG
NdisQueryNetBufferPhysicalCount(
__in PNET_BUFFER NetBuffer
);
__checkReturn
__drv_ret(__drv_allocatesMem(mem))
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
PMDL
NdisAllocateMdl(
__in NDIS_HANDLE NdisHandle,
__in_bcount(Length)
PVOID VirtualAddress,
__in UINT Length
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFreeMdl(
__in __drv_freesMem(mem) PMDL Mdl
);
//
// The following flags are used in the Send APIs such as Ndis(F)SendNetBufferLists
// and MINIPORT_SEND_NET_BUFFER_LISTS_HANDLER
//
#define NDIS_SEND_FLAGS_DISPATCH_LEVEL 0x00000001
#define NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK 0x00000002
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_SEND_FLAGS_SINGLE_QUEUE 0x00000004
#endif
#define NDIS_TEST_SEND_FLAG(_Flags, _Fl) (((_Flags) & (_Fl)) == (_Fl))
#define NDIS_SET_SEND_FLAG(_Flags, _Fl) ((_Flags) |= (_Fl))
#define NDIS_TEST_SEND_AT_DISPATCH_LEVEL(_Flags) \
NDIS_TEST_SEND_FLAG((_Flags), NDIS_SEND_FLAGS_DISPATCH_LEVEL)
//
// The following flags are used in the SendComplete APIs such as
// NdisMSendNetBufferListsComplete
//
#define NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL 0x00000001
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_SEND_COMPLETE_FLAGS_SINGLE_QUEUE 0x00000002
#endif
#define NDIS_TEST_SEND_COMPLETE_FLAG(_Flags, _Fl) (((_Flags) & (_Fl)) == (_Fl))
#define NDIS_SET_SEND_COMPLETE_FLAG(_Flags, _Fl) ((_Flags) |= (_Fl))
#define NDIS_TEST_SEND_COMPLETE_AT_DISPATCH_LEVEL(_Flags) \
NDIS_TEST_SEND_COMPLETE_FLAG((_Flags), NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL)
//
// The following flags are used in the IndicateReceive APIs such
// as NdisMIndicateReceiveNetBufferLists and RECEIVE_NET_BUFFER_LISTS_HANDLER
//
#define NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL 0x00000001
#define NDIS_RECEIVE_FLAGS_RESOURCES 0x00000002
#define NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE 0x00000100
#define NDIS_RECEIVE_FLAGS_SINGLE_VLAN 0x00000200
#define NDIS_RECEIVE_FLAGS_PERFECT_FILTERED 0x00000400
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_RECEIVE_FLAGS_SINGLE_QUEUE 0x00000800
#define NDIS_RECEIVE_FLAGS_SHARED_MEMORY_INFO_VALID 0x00001000
#define NDIS_RECEIVE_FLAGS_MORE_NBLS 0x00002000
#endif
#define NDIS_TEST_RECEIVE_FLAG(_Flags, _Fl) (((_Flags) & (_Fl)) == (_Fl))
#define NDIS_SET_RECEIVE_FLAG(_Flags, _Fl) ((_Flags) |= (_Fl))
#define NDIS_TEST_RECEIVE_AT_DISPATCH_LEVEL(_Flags) \
NDIS_TEST_RECEIVE_FLAG((_Flags), NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL)
#define NDIS_TEST_RECEIVE_CANNOT_PEND(_Flags) \
NDIS_TEST_RECEIVE_FLAG((_Flags), NDIS_RECEIVE_FLAGS_RESOURCES)
#define NDIS_TEST_RECEIVE_CAN_PEND(_Flags) \
(((_Flags) & NDIS_RECEIVE_FLAGS_RESOURCES) == 0)
//
// The following flags are used in the ReturnNetBufferLists APIs such
// as NdisReturnNetBufferLists and MINIPORT_RETURN_NET_BUFFER_LISTS
//
#define NDIS_RETURN_FLAGS_DISPATCH_LEVEL 0x00000001
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_RETURN_FLAGS_SINGLE_QUEUE 0x00000002
#endif
#define NDIS_TEST_RETURN_FLAG(_Flags, _Fl) (((_Flags) & (_Fl)) == (_Fl))
#define NDIS_SET_RETURN_FLAG(_Flags, _Fl) ((_Flags) |= (_Fl))
#define NDIS_TEST_RETURN_AT_DISPATCH_LEVEL(_Flags) \
NDIS_TEST_RETURN_FLAG((_Flags),NDIS_RETURN_FLAGS_DISPATCH_LEVEL)
//
// The following flags are used in the NdisAllocateCloneNetBufferList
// and NdisFreeCloneNetBufferList
//
#define NDIS_CLONE_FLAGS_RESERVED 0x00000001
#define NDIS_CLONE_FLAGS_USE_ORIGINAL_MDLS 0x00000002
#define NDIS_TEST_CLONE_FLAG(_Flags, _Fl) (((_Flags) & (_Fl)) == (_Fl))
#define NDIS_SET_CLONE_FLAG(_Flags, _Fl) ((_Flags) |= (_Fl))
#define NDIS_CLEAR_CLONE_FLAG(_Flags, _Fl) ((_Flags) &= ~(_Fl))
#endif // (NDIS_SUPPORT_NDIS6 || NDIS60)
#pragma warning(pop)
#pragma once
#pragma warning(push)
#pragma warning(disable:4201) // (nonstandard extension used : nameless struct/union)
#pragma warning(disable:4214) // (extension used : bit field types other than int)
#define NDIS_TASK_OFFLOAD_VERSION 1
#define MAX_HASHES 4
#define TRUNCATED_HASH_LEN 12
#define CRYPTO_SUCCESS 0
#define CRYPTO_GENERIC_ERROR 1
#define CRYPTO_TRANSPORT_AH_AUTH_FAILED 2
#define CRYPTO_TRANSPORT_ESP_AUTH_FAILED 3
#define CRYPTO_TUNNEL_AH_AUTH_FAILED 4
#define CRYPTO_TUNNEL_ESP_AUTH_FAILED 5
#define CRYPTO_INVALID_PACKET_SYNTAX 6
#define CRYPTO_INVALID_PROTOCOL 7
#if NDIS_LEGACY_DRIVER
typedef struct _NDIS_IPSEC_PACKET_INFO
{
union
{
struct
{
NDIS_HANDLE OffloadHandle;
NDIS_HANDLE NextOffloadHandle;
} Transmit;
struct
{
ULONG SA_DELETE_REQ:1;
ULONG CRYPTO_DONE:1;
ULONG NEXT_CRYPTO_DONE:1;
ULONG CryptoStatus;
} Receive;
};
} NDIS_IPSEC_PACKET_INFO, *PNDIS_IPSEC_PACKET_INFO;
#endif // NDIS_LEGACY_DRIVER
#if (NDIS_SUPPORT_NDIS6 || NDIS60)
typedef struct _NDIS_IPSEC_OFFLOAD_V1_NET_BUFFER_LIST_INFO
{
union
{
struct
{
NDIS_HANDLE OffloadHandle;
} Transmit;
struct
{
USHORT SaDeleteReq:1;
USHORT CryptoDone:1;
USHORT NextCryptoDone:1;
USHORT Pad:13;
USHORT CryptoStatus;
} Receive;
};
} NDIS_IPSEC_OFFLOAD_V1_NET_BUFFER_LIST_INFO, *PNDIS_IPSEC_OFFLOAD_V1_NET_BUFFER_LIST_INFO;
#endif // (NDIS_SUPPORT_NDIS6 || NDIS60)
#if NDIS_LEGACY_DRIVER
//
// The following defines are used in the Task field above to define
// the type of task offloading necessary.
//
typedef enum _NDIS_TASK
{
TcpIpChecksumNdisTask,
IpSecNdisTask,
TcpLargeSendNdisTask,
MaxNdisTask
} NDIS_TASK, *PNDIS_TASK;
typedef enum _NDIS_ENCAPSULATION
{
UNSPECIFIED_Encapsulation,
NULL_Encapsulation,
IEEE_802_3_Encapsulation,
IEEE_802_5_Encapsulation,
LLC_SNAP_ROUTED_Encapsulation,
LLC_SNAP_BRIDGED_Encapsulation
} NDIS_ENCAPSULATION;
//
// Encapsulation header format
//
typedef struct _NDIS_ENCAPSULATION_FORMAT
{
NDIS_ENCAPSULATION Encapsulation; // Encapsulation type
struct
{
ULONG FixedHeaderSize:1;
ULONG Reserved:31;
} Flags;
ULONG EncapsulationHeaderSize; // Encapsulation header size
} NDIS_ENCAPSULATION_FORMAT,*PNDIS_ENCAPSULATION_FORMAT;
//
// OFFLOAD header structure for OID_TCP_TASK_OFFLOAD
//
typedef struct _NDIS_TASK_OFFLOAD_HEADER
{
ULONG Version; // set to NDIS_TASK_OFFLOAD_VERSION
ULONG Size; // Size of this structure
ULONG Reserved; // Reserved for future use
ULONG OffsetFirstTask; // Offset to the first
NDIS_ENCAPSULATION_FORMAT EncapsulationFormat; // Encapsulation information.
// NDIS_TASK_OFFLOAD structure(s)
} NDIS_TASK_OFFLOAD_HEADER, *PNDIS_TASK_OFFLOAD_HEADER;
//
// Task offload Structure, which follows the above header in ndis query
//
typedef struct _NDIS_TASK_OFFLOAD
{
ULONG Version; // NDIS_TASK_OFFLOAD_VERSION
ULONG Size; // Size of this structure. Used for version checking.
NDIS_TASK Task; // Task.
ULONG OffsetNextTask; // Offset to the next NDIS_TASK_OFFLOAD
ULONG TaskBufferLength; // Length of the task offload information.
UCHAR TaskBuffer[1]; // The task offload information.
} NDIS_TASK_OFFLOAD, *PNDIS_TASK_OFFLOAD;
//
// Offload structure for NDIS_TASK_TCP_IP_CHECKSUM
//
typedef struct _NDIS_TASK_TCP_IP_CHECKSUM
{
struct
{
ULONG IpOptionsSupported:1;
ULONG TcpOptionsSupported:1;
ULONG TcpChecksum:1;
ULONG UdpChecksum:1;
ULONG IpChecksum:1;
} V4Transmit;
struct
{
ULONG IpOptionsSupported:1;
ULONG TcpOptionsSupported:1;
ULONG TcpChecksum:1;
ULONG UdpChecksum:1;
ULONG IpChecksum:1;
} V4Receive;
struct
{
ULONG IpOptionsSupported:1; // This field implies IpExtensionHeaders support
ULONG TcpOptionsSupported:1;
ULONG TcpChecksum:1;
ULONG UdpChecksum:1;
} V6Transmit;
struct
{
ULONG IpOptionsSupported:1; // This field implies IpExtensionHeaders support
ULONG TcpOptionsSupported:1;
ULONG TcpChecksum:1;
ULONG UdpChecksum:1;
} V6Receive;
} NDIS_TASK_TCP_IP_CHECKSUM, *PNDIS_TASK_TCP_IP_CHECKSUM;
//
// Off-load structure for NDIS_TASK_TCP_LARGE_SEND
//
#define NDIS_TASK_TCP_LARGE_SEND_V0 0
typedef struct _NDIS_TASK_TCP_LARGE_SEND
{
ULONG Version; // set to NDIS_TASK_TCP_LARGE_SEND_V0
ULONG MaxOffLoadSize;
ULONG MinSegmentCount;
BOOLEAN TcpOptions;
BOOLEAN IpOptions;
} NDIS_TASK_TCP_LARGE_SEND, *PNDIS_TASK_TCP_LARGE_SEND;
typedef struct _NDIS_TASK_IPSEC
{
struct
{
ULONG AH_ESP_COMBINED;
ULONG TRANSPORT_TUNNEL_COMBINED;
ULONG V4_OPTIONS;
ULONG RESERVED;
} Supported;
struct
{
ULONG MD5:1;
ULONG SHA_1:1;
ULONG Transport:1;
ULONG Tunnel:1;
ULONG Send:1;
ULONG Receive:1;
} V4AH;
struct
{
ULONG DES:1;
ULONG RESERVED:1;
ULONG TRIPLE_DES:1;
ULONG NULL_ESP:1;
ULONG Transport:1;
ULONG Tunnel:1;
ULONG Send:1;
ULONG Receive:1;
} V4ESP;
} NDIS_TASK_IPSEC, *PNDIS_TASK_IPSEC;
#endif // NDIS_LEGACY_DRIVER
//
// flags used in NDIS_TASK_IPSEC->Supprted.RESERVED and
// NDIS_IPSEC_OFFLOAD_V1->Supported.Flags
//
#define IPSEC_TPT_UDPESP_ENCAPTYPE_IKE 0x00000001
#define IPSEC_TUN_UDPESP_ENCAPTYPE_IKE 0x00000002
#define IPSEC_TPTOVERTUN_UDPESP_ENCAPTYPE_IKE 0x00000004
#define IPSEC_TPT_UDPESP_OVER_PURE_TUN_ENCAPTYPE_IKE 0x00000008
#define IPSEC_TPT_UDPESP_ENCAPTYPE_OTHER 0x00000010
#define IPSEC_TUN_UDPESP_ENCAPTYPE_OTHER 0x00000020
#define IPSEC_TPTOVERTUN_UDPESP_ENCAPTYPE_OTHER 0x00000040
#define IPSEC_TPT_UDPESP_OVER_PURE_TUN_ENCAPTYPE_OTHER 0x00000080
#if (NDIS_SUPPORT_NDIS6 || NDIS60)
//
// The definitions for the NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO.Transmit.Type
// A miniport will use this definition to identify what offload type to use
// on the NetBufferList
//
#define NDIS_TCP_LARGE_SEND_OFFLOAD_V1_TYPE 0
#define NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE 1
//
// IP protocol version encoded in IPVersion field of
// NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO->LsoV2Transmit.IPVersion
//
#define NDIS_TCP_LARGE_SEND_OFFLOAD_IPv4 0
#define NDIS_TCP_LARGE_SEND_OFFLOAD_IPv6 1
//
// The maximum length of the headers (MAC+IP+IP option or extension headers+TCP+TCP options)
// when stack does large send offload. If header is bigger than this value, it will not do
// LSO
//
#define NDIS_LARGE_SEND_OFFLOAD_MAX_HEADER_LENGTH 128
//
// This structure is used in the OOB TcpLargeSendNetBufferListInfo.
//
typedef struct _NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO
{
union
{
struct
{
ULONG Unused:30;
ULONG Type:1;
ULONG Reserved2:1;
} Transmit;
struct
{
ULONG MSS:20;
ULONG TcpHeaderOffset:10;
ULONG Type:1;
ULONG Reserved2:1;
} LsoV1Transmit;
struct
{
ULONG TcpPayload:30;
ULONG Type:1;
ULONG Reserved2:1;
} LsoV1TransmitComplete;
struct
{
ULONG MSS:20;
ULONG TcpHeaderOffset:10;
ULONG Type:1;
ULONG IPVersion:1;
} LsoV2Transmit;
struct
{
ULONG Reserved:30;
ULONG Type:1;
ULONG Reserved2:1;
} LsoV2TransmitComplete;
PVOID Value;
};
} NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO,*PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO;
//
// Per-NetBufferList information for TcpIpChecksumNetBufferListInfo.
//
typedef struct _NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO
{
union
{
struct
{
ULONG IsIPv4:1;
ULONG IsIPv6:1;
ULONG TcpChecksum:1;
ULONG UdpChecksum:1;
ULONG IpHeaderChecksum:1;
ULONG Reserved:11;
ULONG TcpHeaderOffset:10;
} Transmit;
struct
{
ULONG TcpChecksumFailed:1;
ULONG UdpChecksumFailed:1;
ULONG IpChecksumFailed:1;
ULONG TcpChecksumSucceeded:1;
ULONG UdpChecksumSucceeded:1;
ULONG IpChecksumSucceeded:1;
ULONG Loopback:1;
} Receive;
PVOID Value;
};
} NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO, *PNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO;
//
// used in NDIS_STATUS_OFFLOAD_ENCASPULATION_CHANGE status indication and
// and OID_OFFLOAD_ENCAPSULATION OID request
//
#define NDIS_OFFLOAD_ENCAPSULATION_REVISION_1 1
typedef struct _NDIS_OFFLOAD_ENCAPSULATION
{
//
// Header.Type = NDIS_OBJECT_TYPE_OFFLOAD_ENCAPSULATION;
// Header.Size = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
// Header.Revision = NDIS_OFFLOAD_ENCAPSULATION_REVISION_1;
//
NDIS_OBJECT_HEADER Header;
struct
{
//
// A Protocol sets Enable to NDIS_OFFLOAD_SET_ON if it is enabling IPv4 LSO,
// or XSum offloads
// otherwise it is set to NDIS_OFFLOAD_SET_NO_CHANGE
//
ULONG Enabled;
//
// If Enabled is TRUE, a Protocol must set this to
// either NDIS_ENCAPSULATION_IEEE_802_3
// or NDIS_ENCAPSULATION_IEEE_LLC_SNAP_ROUTED
//
ULONG EncapsulationType;
//
// If Enabled is TRUE, a protocol must set this field to the
// HeaderSize it uses
//
ULONG HeaderSize;
} IPv4;
struct
{
//
// A Protocol sets Enable to NDIS_OFFLOAD_SET_ON if it is enabling IPv6 LSO,
// or XSum offloads
// otherwise it is set to NDIS_OFFLOAD_SET_NO_CHANGE
//
ULONG Enabled;
//
// If Enabled is TRUE, a Protocol must set this to
// either NDIS_ENCAPSULATION_IEEE_802_3
// or NDIS_ENCAPSULATION_IEEE_LLC_SNAP_ROUTED
//
ULONG EncapsulationType;
//
// If Enabled is TRUE, a protocol must set this field to the
// HeaderSize it uses
//
ULONG HeaderSize;
} IPv6;
}NDIS_OFFLOAD_ENCAPSULATION, *PNDIS_OFFLOAD_ENCAPSULATION;
#define NDIS_SIZEOF_OFFLOAD_ENCAPSULATION_REVISION_1 RTL_SIZEOF_THROUGH_FIELD(NDIS_OFFLOAD_ENCAPSULATION, IPv6.HeaderSize)
#if (NDIS_SUPPORT_NDIS61)
//
// Per-NetBufferList information for IPsecOffloadV2NetBufferListInfo.
//
typedef struct _NDIS_IPSEC_OFFLOAD_V2_NET_BUFFER_LIST_INFO
{
union
{
struct
{
PVOID OffloadHandle;
} Transmit;
struct
{
ULONG SaDeleteReq:1;
ULONG CryptoDone:1;
ULONG NextCryptoDone:1; // Required for transport over tunnel
ULONG Reserved:13;
ULONG CryptoStatus:16;
} Receive;
};
} NDIS_IPSEC_OFFLOAD_V2_NET_BUFFER_LIST_INFO, *PNDIS_IPSEC_OFFLOAD_V2_NET_BUFFER_LIST_INFO;
//
// Per-NetBufferList information for IPsecOffloadV2TunnelNetBufferListInfo.
//
typedef struct _NDIS_IPSEC_OFFLOAD_V2_TUNNEL_NET_BUFFER_LIST_INFO
{
struct
{
NDIS_HANDLE TunnelHandle; // Tunnel SA handle in Transport over tunnel
} Transmit;
} NDIS_IPSEC_OFFLOAD_V2_TUNNEL_NET_BUFFER_LIST_INFO, *PNDIS_IPSEC_OFFLOAD_V2_TUNNEL_NET_BUFFER_LIST_INFO;
//
// Per-NetBufferList information for IPsecOffloadV2HeaderNetBufferListInfo.
//
typedef struct _NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO
{
union
{
struct
{
ULONG NextHeader:8; // Next Header value is the one carried in ESP trailer
ULONG PadLength:8;
ULONG AhHeaderOffset:8; // This is offset from beginning of IP Header and is measured in 4 byte increments
ULONG EspHeaderOffset:8; // This is offset from beginning of IP Header and is measured in 4 byte increments
} Transmit;
struct
{
ULONG NextHeader:8;
ULONG PadLength:8;
ULONG HeaderInfoSet:1;
} Receive;
};
} NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO, *PNDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO;
//
// Used in IPSEC_OFFLOAD_V2_ADD_SA.SecAssoc
//
#define IPSEC_OFFLOAD_V2_MAX_EXTENSION_HEADERS 2
//
// used in IPSEC_OFFLOAD_V2_ADD_SA.UdpEspEncapsulation and
// NDIS_IPSEC_OFFLOAD_V2.UdpEsp
//
#define IPSEC_OFFLOAD_V2_UDP_ESP_ENCAPSULATION_NONE 0x00000000
#define IPSEC_OFFLOAD_V2_UDP_ESP_ENCAPSULATION_TRANSPORT 0x00000001
#define IPSEC_OFFLOAD_V2_UDP_ESP_ENCAPSULATION_TUNNEL 0x00000002
#define IPSEC_OFFLOAD_V2_TRANSPORT_OVER_UDP_ESP_ENCAPSULATION_TUNNEL 0x00000004
#define IPSEC_OFFLOAD_V2_UDP_ESP_ENCAPSULATION_TRANSPORT_OVER_TUNNEL 0x00000008
//
// used in IPSEC_OFFLOAD_V2_SECURITY_ASSOCIATION.Flags
//
#define IPSEC_OFFLOAD_V2_ESN_SA 0x00000001
//
// used in IPSEC_OFFLOAD_V2_SECURITY_ASSOCIATION.Operation
//
typedef enum _IPSEC_OFFLOAD_V2_OPERATION
{
IPsecOffloadV2Ah = 1,
IPsecOffloadV2Esp,
IPsecOffloadV2Max
} IPSEC_OFFLOAD_V2_OPERATION, *PIPSEC_OFFLOAD_V2_OPERATION;
//
// used in IPSEC_OFFLOAD_V2_SECURITY_ASSOCIATION.Spi
//
typedef ULONG IPSEC_OFFLOAD_V2_SPI_TYPE;
//
// used in AuthenticationAlgorithm and EncryptionAlgorithm fields
// of IPSEC_OFFLOAD_V2_SECURITY_ASSOCIATION structure
//
typedef struct _IPSEC_OFFLOAD_V2_ALGORITHM_INFO
{
ULONG Identifier;
ULONG KeyLength;
ULONG KeyOffsetBytes;
ULONG AdditionalInfo;
} IPSEC_OFFLOAD_V2_ALGORITHM_INFO, *PIPSEC_OFFLOAD_V2_ALGORITHM_INFO;
//
// used in IPSEC_OFFLOAD_V2_ADD_SA.SecAssoc
//
typedef struct _IPSEC_OFFLOAD_V2_SECURITY_ASSOCIATION
{
ULONG Flags;
IPSEC_OFFLOAD_V2_OPERATION Operation; // AH - SA is used for AH, ESP - SA is used for ESP
IPSEC_OFFLOAD_V2_SPI_TYPE Spi;
IPSEC_OFFLOAD_V2_ALGORITHM_INFO AuthenticationAlgorithm;
IPSEC_OFFLOAD_V2_ALGORITHM_INFO EncryptionAlgorithm;
ULONG SequenceNumberHighOrder;
} IPSEC_OFFLOAD_V2_SECURITY_ASSOCIATION, *PIPSEC_OFFLOAD_V2_SECURITY_ASSOCIATION;
//
// used in IPSEC_OFFLOAD_V2_ADD_SA.Flags
//
#define IPSEC_OFFLOAD_V2_INBOUND 0x00000001
#define IPSEC_OFFLOAD_V2_IPv6 0x00000010
//
// used in OID_TCP_TASK_IPSEC_OFFLOAD_V2_ADD_SA
//
typedef struct _IPSEC_OFFLOAD_V2_ADD_SA IPSEC_OFFLOAD_V2_ADD_SA, *PIPSEC_OFFLOAD_V2_ADD_SA;
#define NDIS_IPSEC_OFFLOAD_V2_ADD_SA_REVISION_1 1
typedef struct _IPSEC_OFFLOAD_V2_ADD_SA
{
//
// Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
// Header.Revision = NDIS_IPSEC_OFFLOAD_V2_ADD_SA_REVISION_1;
// Header.Size = sizeof(IPSEC_OFFLOAD_V2_ADD_SA);
//
NDIS_OBJECT_HEADER Header;
PIPSEC_OFFLOAD_V2_ADD_SA Next;
ULONG NumExtHdrs;
ULONG Flags;
union
{
struct
{
IPAddr SrcAddr;
IPAddr DestAddr;
} IPv4Endpoints;
struct
{
UCHAR SrcAddr[16];
UCHAR DestAddr[16];
} IPv6Endpoints;
};
NDIS_HANDLE OffloadHandle;
ULONG UdpEspEncapsulation;
IPSEC_OFFLOAD_V2_SECURITY_ASSOCIATION SecAssoc[IPSEC_OFFLOAD_V2_MAX_EXTENSION_HEADERS];
ULONG KeyLength;
UCHAR KeyData[1];
} IPSEC_OFFLOAD_V2_ADD_SA, *PIPSEC_OFFLOAD_V2_ADD_SA;
#define NDIS_SIZEOF_IPSEC_OFFLOAD_V2_ADD_SA_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(IPSEC_OFFLOAD_V2_ADD_SA, KeyData)
//
// used in OID_TCP_TASK_IPSEC_OFFLOAD_V2_DELETE_SA
//
typedef struct _IPSEC_OFFLOAD_V2_DELETE_SA IPSEC_OFFLOAD_V2_DELETE_SA, *PIPSEC_OFFLOAD_V2_DELETE_SA;
#define NDIS_IPSEC_OFFLOAD_V2_DELETE_SA_REVISION_1 1
typedef struct _IPSEC_OFFLOAD_V2_DELETE_SA
{
//
// Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
// Header.Revision = NDIS_IPSEC_OFFLOAD_V2_DELETE_SA_REVISION_1;
// Header.Size = sizeof(IPSEC_OFFLOAD_V2_DELETE_SA);
//
NDIS_OBJECT_HEADER Header;
PIPSEC_OFFLOAD_V2_DELETE_SA Next;
NDIS_HANDLE OffloadHandle;
} IPSEC_OFFLOAD_V2_DELETE_SA, *PIPSEC_OFFLOAD_V2_DELETE_SA;
#define NDIS_SIZEOF_IPSEC_OFFLOAD_V2_DELETE_SA_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(IPSEC_OFFLOAD_V2_DELETE_SA, OffloadHandle)
//
// Structure and defines used in
// OID_TCP_TASK_IPSEC_OFFLOAD_V2_UPDATE_SA
//
#define NDIS_IPSEC_OFFLOAD_V2_UPDATE_SA_REVISION_1 1
typedef struct _IPSEC_OFFLOAD_V2_UPDATE_SA
{
//
// Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
// Header.Revision = NDIS_IPSEC_OFFLOAD_V2_UPDATE_SA_REVISION_1;
// Header.Size = sizeof(IPSEC_OFFLOAD_V2_UPDATE_SA);
//
NDIS_OBJECT_HEADER Header;
NDIS_HANDLE OffloadHandle;
IPSEC_OFFLOAD_V2_OPERATION Operation;
IPSEC_OFFLOAD_V2_SPI_TYPE Spi;
ULONG SequenceNumberHighOrder;
} IPSEC_OFFLOAD_V2_UPDATE_SA, *PIPSEC_OFFLOAD_V2_UPDATE_SA;
#define NDIS_SIZEOF_IPSEC_OFFLOAD_V2_UPDATE_SA_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(IPSEC_OFFLOAD_V2_UPDATE_SA, SequenceNumberHighOrder)
#endif // (NDIS_SUPPORT_NDIS61)
#endif // (NDIS_SUPPORT_NDIS6 || NDIS60)
#pragma warning(pop)
#pragma once
#if NDIS_LEGACY_PROTOCOL
//
// Function types for NDIS_PROTOCOL_CHARACTERISTICS
//
typedef
VOID
(*OPEN_ADAPTER_COMPLETE_HANDLER)(
__in NDIS_HANDLE ProtocolBindingContext,
__in NDIS_STATUS Status,
__in NDIS_STATUS OpenErrorStatus
);
typedef
VOID
(*CLOSE_ADAPTER_COMPLETE_HANDLER)(
__in NDIS_HANDLE ProtocolBindingContext,
__in NDIS_STATUS Status
);
typedef
VOID
(*RESET_COMPLETE_HANDLER)(
__in NDIS_HANDLE ProtocolBindingContext,
__in NDIS_STATUS Status
);
typedef
VOID
(*REQUEST_COMPLETE_HANDLER)(
__in NDIS_HANDLE ProtocolBindingContext,
__in PNDIS_REQUEST NdisRequest,
__in NDIS_STATUS Status
);
typedef
VOID
(*STATUS_HANDLER)(
__in NDIS_HANDLE ProtocolBindingContext,
__in NDIS_STATUS GeneralStatus,
__in PVOID StatusBuffer,
__in UINT StatusBufferSize
);
typedef
VOID
(*STATUS_COMPLETE_HANDLER)(
__in NDIS_HANDLE ProtocolBindingContext
);
typedef
VOID
(*SEND_COMPLETE_HANDLER)(
__in NDIS_HANDLE ProtocolBindingContext,
__in PNDIS_PACKET Packet,
__in NDIS_STATUS Status
);
typedef
VOID
(*WAN_SEND_COMPLETE_HANDLER) (
__in NDIS_HANDLE ProtocolBindingContext,
__in PNDIS_WAN_PACKET Packet,
__in NDIS_STATUS Status
);
typedef
VOID
(*TRANSFER_DATA_COMPLETE_HANDLER)(
__in NDIS_HANDLE ProtocolBindingContext,
__in PNDIS_PACKET Packet,
__in NDIS_STATUS Status,
__in UINT BytesTransferred
);
typedef
VOID
(*WAN_TRANSFER_DATA_COMPLETE_HANDLER)(
VOID
);
typedef
NDIS_STATUS
(*RECEIVE_HANDLER)(
__in NDIS_HANDLE ProtocolBindingContext,
__in NDIS_HANDLE MacReceiveContext,
__in PVOID HeaderBuffer,
__in UINT HeaderBufferSize,
__in PVOID LookAheadBuffer,
__in UINT LookaheadBufferSize,
__in UINT PacketSize
);
typedef
NDIS_STATUS
(*WAN_RECEIVE_HANDLER)(
__in NDIS_HANDLE NdisLinkHandle,
__in PUCHAR Packet,
__in ULONG PacketSize
);
typedef
VOID
(*RECEIVE_COMPLETE_HANDLER)(
__in NDIS_HANDLE ProtocolBindingContext
);
//
// Function types extensions for NDIS 4.0 Protocols
//
typedef
INT
(*RECEIVE_PACKET_HANDLER)(
__in NDIS_HANDLE ProtocolBindingContext,
__in PNDIS_PACKET Packet
);
typedef
VOID
(*BIND_HANDLER)(
__out PNDIS_STATUS Status,
__in NDIS_HANDLE BindContext,
__in PNDIS_STRING DeviceName,
__in PVOID SystemSpecific1,
__in PVOID SystemSpecific2
);
typedef
VOID
(*UNBIND_HANDLER)(
__out PNDIS_STATUS Status,
__in NDIS_HANDLE ProtocolBindingContext,
__in NDIS_HANDLE UnbindContext
);
typedef
NDIS_STATUS
(*PNP_EVENT_HANDLER)(
__in NDIS_HANDLE ProtocolBindingContext,
__in PNET_PNP_EVENT NetPnPEvent
);
typedef
VOID
(*UNLOAD_PROTOCOL_HANDLER)(
VOID
);
//
// Protocol characteristics for NDIS 4.0 protocols
//
typedef struct _NDIS40_PROTOCOL_CHARACTERISTICS
{
UCHAR MajorNdisVersion;
UCHAR MinorNdisVersion;
USHORT Filler;
union
{
UINT Reserved;
UINT Flags;
};
OPEN_ADAPTER_COMPLETE_HANDLER OpenAdapterCompleteHandler;
CLOSE_ADAPTER_COMPLETE_HANDLER CloseAdapterCompleteHandler;
union
{
SEND_COMPLETE_HANDLER SendCompleteHandler;
WAN_SEND_COMPLETE_HANDLER WanSendCompleteHandler;
};
union
{
TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler;
WAN_TRANSFER_DATA_COMPLETE_HANDLER WanTransferDataCompleteHandler;
};
RESET_COMPLETE_HANDLER ResetCompleteHandler;
REQUEST_COMPLETE_HANDLER RequestCompleteHandler;
union
{
RECEIVE_HANDLER ReceiveHandler;
WAN_RECEIVE_HANDLER WanReceiveHandler;
};
RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler;
STATUS_HANDLER StatusHandler;
STATUS_COMPLETE_HANDLER StatusCompleteHandler;
NDIS_STRING Name;
//
// Start of NDIS 4.0 extensions.
//
RECEIVE_PACKET_HANDLER ReceivePacketHandler;
//
// PnP protocol entry-points
//
BIND_HANDLER BindAdapterHandler;
UNBIND_HANDLER UnbindAdapterHandler;
PNP_EVENT_HANDLER PnPEventHandler;
UNLOAD_PROTOCOL_HANDLER UnloadHandler;
} NDIS40_PROTOCOL_CHARACTERISTICS;
#endif
#if NDIS_LEGACY_DRIVER
//
// NDIS 5.0 co-NDIS Protocol handler proto-types - used by clients as well as call manager modules
//
typedef
__drv_requiresIRQL(PASSIVE_LEVEL)
VOID
(*CO_SEND_COMPLETE_HANDLER)(
__in NDIS_STATUS Status,
__in NDIS_HANDLE ProtocolVcContext,
__in PNDIS_PACKET Packet
);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(*CO_STATUS_HANDLER)(
__in NDIS_HANDLE ProtocolBindingContext,
__in_opt NDIS_HANDLE ProtocolVcContext,
__in NDIS_STATUS GeneralStatus,
__in PVOID StatusBuffer,
__in UINT StatusBufferSize
);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
UINT
(*CO_RECEIVE_PACKET_HANDLER)(
__in NDIS_HANDLE ProtocolBindingContext,
__in NDIS_HANDLE ProtocolVcContext,
__in PNDIS_PACKET Packet
);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(*CO_REQUEST_HANDLER)(
__in NDIS_HANDLE ProtocolAfContext,
__in_opt NDIS_HANDLE ProtocolVcContext,
__in_opt NDIS_HANDLE ProtocolPartyContext,
__inout PNDIS_REQUEST NdisRequest
);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(*CO_REQUEST_COMPLETE_HANDLER)(
__in NDIS_STATUS Status,
__in_opt NDIS_HANDLE ProtocolAfContext,
__in_opt NDIS_HANDLE ProtocolVcContext,
__in_opt NDIS_HANDLE ProtocolPartyContext,
__in PNDIS_REQUEST NdisRequest
);
#endif // NDIS_LEGACY_DRIVER
#if (NDIS_SUPPORT_NDIS6 || defined(NDIS60))
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(PROTOCOL_CO_OID_REQUEST)(
__in NDIS_HANDLE ProtocolAfContext,
__in_opt NDIS_HANDLE ProtocolVcContext,
__in_opt NDIS_HANDLE ProtocolPartyContext,
__inout PNDIS_OID_REQUEST OidRequest
);
typedef PROTOCOL_CO_OID_REQUEST (*CO_OID_REQUEST_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CO_OID_REQUEST_COMPLETE)(
__in_opt NDIS_HANDLE ProtocolAfContext,
__in_opt NDIS_HANDLE ProtocolVcContext,
__in_opt NDIS_HANDLE ProtocolPartyContext,
__in PNDIS_OID_REQUEST OidRequest,
__in NDIS_STATUS Status
);
typedef PROTOCOL_CO_OID_REQUEST_COMPLETE (*CO_OID_REQUEST_COMPLETE_HANDLER);
#endif // (NDIS_SUPPORT_NDIS6 || defined(NDIS60))
//
// CO_CREATE_VC_HANDLER and CO_DELETE_VC_HANDLER are synchronous calls
// the following APIs are used by NDIS 6 protocols as well as NDIS 5 protocols
//
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(PROTOCOL_CO_CREATE_VC)(
__in NDIS_HANDLE ProtocolAfContext,
__in NDIS_HANDLE NdisVcHandle,
__out PNDIS_HANDLE ProtocolVcContext
);
typedef PROTOCOL_CO_CREATE_VC (*CO_CREATE_VC_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(PROTOCOL_CO_DELETE_VC)(
__in NDIS_HANDLE ProtocolVcContext
);
typedef PROTOCOL_CO_DELETE_VC (*CO_DELETE_VC_HANDLER);
typedef
__drv_requiresIRQL(PASSIVE_LEVEL)
VOID
(PROTCOL_CO_AF_REGISTER_NOTIFY)(
__in NDIS_HANDLE ProtocolBindingContext,
__in PCO_ADDRESS_FAMILY AddressFamily
);
typedef PROTCOL_CO_AF_REGISTER_NOTIFY (*CO_AF_REGISTER_NOTIFY_HANDLER);
#if NDIS_LEGACY_PROTOCOL
typedef struct _NDIS50_PROTOCOL_CHARACTERISTICS
{
#ifdef __cplusplus
NDIS40_PROTOCOL_CHARACTERISTICS Ndis40Chars;
#else
NDIS40_PROTOCOL_CHARACTERISTICS;
#endif
//
// Placeholders for protocol extensions for PnP/PM etc.
//
PVOID ReservedHandlers[4];
//
// Start of NDIS 5.0 extensions.
//
CO_SEND_COMPLETE_HANDLER CoSendCompleteHandler;
CO_STATUS_HANDLER CoStatusHandler;
CO_RECEIVE_PACKET_HANDLER CoReceivePacketHandler;
CO_AF_REGISTER_NOTIFY_HANDLER CoAfRegisterNotifyHandler;
} NDIS50_PROTOCOL_CHARACTERISTICS;
#endif // NDIS_LEGACY_PROTOCOL
#if (NDIS_SUPPORT_NDIS6 || defined(NDIS60))
//
// CONDIS 6.0 protocol's entry points
//
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CO_RECEIVE_NET_BUFFER_LISTS)(
__in NDIS_HANDLE ProtocolBindingContext,
__in NDIS_HANDLE ProtocolVcContext,
__in PNET_BUFFER_LIST NetBufferLists,
__in ULONG NumberOfNetBufferLists,
__in ULONG ReceiveFlags
);
typedef PROTOCOL_CO_RECEIVE_NET_BUFFER_LISTS (*CO_RECEIVE_NET_BUFFER_LISTS_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CO_SEND_NET_BUFFER_LISTS_COMPLETE)(
__in NDIS_HANDLE ProtocolVcContext,
__in PNET_BUFFER_LIST NetBufferLists,
__in ULONG SendCompleteFlags
);
typedef PROTOCOL_CO_SEND_NET_BUFFER_LISTS_COMPLETE (*CO_SEND_NET_BUFFER_LISTS_COMPLETE_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CO_STATUS_EX)(
__in NDIS_HANDLE ProtocolBindingContext,
__in NDIS_HANDLE ProtocolVcContext,
__in PNDIS_STATUS_INDICATION StatusIndication
);
typedef PROTOCOL_CO_STATUS_EX (*CO_STATUS_HANDLER_EX);
//
// CoNDIS 6 Client handler
//
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(PROTOCOL_CL_NOTIFY_CLOSE_AF)(
__in NDIS_HANDLE ClientAfContext
);
typedef PROTOCOL_CL_NOTIFY_CLOSE_AF (*CL_NOTIFY_CLOSE_AF_HANDLER);
typedef
__drv_requiresIRQL(PASSIVE_LEVEL)
VOID
(PROTOCOL_CL_OPEN_AF_COMPLETE_EX)(
__in NDIS_HANDLE ProtocolAfContext,
__in NDIS_HANDLE NdisAfHandle,
__in NDIS_STATUS Status
);
typedef PROTOCOL_CL_OPEN_AF_COMPLETE_EX (*CL_OPEN_AF_COMPLETE_HANDLER_EX);
//
// CoNDIS 6 Call manager handler
//
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CM_NOTIFY_CLOSE_AF_COMPLETE)(
__in NDIS_HANDLE CallMgrAfContext,
__in NDIS_STATUS Status
);
typedef PROTOCOL_CM_NOTIFY_CLOSE_AF_COMPLETE (*CM_NOTIFY_CLOSE_AF_COMPLETE_HANDLER);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisDeregisterProtocolDriver(
__in NDIS_HANDLE NdisProtocolHandle
);
#endif // (NDIS_SUPPORT_NDIS6 || defined(NDIS60))
#if NDIS_LEGACY_PROTOCOL
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisDeregisterProtocol(
__out PNDIS_STATUS Status,
__in NDIS_HANDLE NdisProtocolHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisOpenAdapter(
__out __checkReturn 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_opt PSTRING AddressingInformation
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisCloseAdapter(
__out PNDIS_STATUS Status,
__in NDIS_HANDLE NdisBindingHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisCompleteBindAdapter(
__in NDIS_HANDLE BindAdapterContext,
__in NDIS_STATUS Status,
__in NDIS_STATUS OpenStatus
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisCompleteUnbindAdapter(
__in NDIS_HANDLE UnbindAdapterContext,
__in NDIS_STATUS Status
);
EXPORT
VOID
NdisSetProtocolFilter(
__out __checkReturn
PNDIS_STATUS Status,
__in NDIS_HANDLE NdisBindingHandle,
__in RECEIVE_HANDLER ReceiveHandler,
__in RECEIVE_PACKET_HANDLER ReceivePacketHandler,
__in NDIS_MEDIUM Medium,
__in UINT Offset,
__in UINT Size,
__in PUCHAR Pattern
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisGetDriverHandle(
__in NDIS_HANDLE NdisBindingHandle,
__out PNDIS_HANDLE NdisDriverHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisOpenProtocolConfiguration(
__out PNDIS_STATUS Status,
__out PNDIS_HANDLE ConfigurationHandle,
__in PNDIS_STRING ProtocolSection
);
#endif // NDIS_LEGACY_PROTOCOL
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisReEnumerateProtocolBindings(
__in NDIS_HANDLE NdisProtocolHandle
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisWriteEventLogEntry(
__in __drv_isObjectPointer
PVOID LogHandle,
__in NDIS_STATUS EventCode,
__in ULONG UniqueEventValue,
__in USHORT NumStrings,
__in_opt PVOID StringsList,
__in ULONG DataSize,
__in_bcount_opt(DataSize)
PVOID Data
);
#if NDIS_LEGACY_PROTOCOL
//
// The following routine is used by transports to complete pending
// network PnP events.
//
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisCompletePnPEvent(
__in NDIS_STATUS Status,
__in NDIS_HANDLE NdisBindingHandle,
__in PNET_PNP_EVENT NetPnPEvent
);
#endif // NDIS_LEGACY_PROTOCOL
#if (NDIS_SUPPORT_NDIS6 || defined(NDIS60))
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisCompleteNetPnPEvent(
__in NDIS_HANDLE NdisBindingHandle,
__in PNET_PNP_EVENT_NOTIFICATION NetPnPEventNotification,
__in NDIS_STATUS Status
);
#endif // (NDIS_SUPPORT_NDIS6 || defined(NDIS60))
//
// The following routine is used by a transport to query the localized
// friendly instance name of the adapter that they are bound to. There
// are two variations of this, one uses the binding handle and the other
// the binding context. Some transports need this before they bind - like
// TCP/IP for instance.
//
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisQueryAdapterInstanceName(
__out PNDIS_STRING pAdapterInstanceName,
__in NDIS_HANDLE NdisBindingHandle
);
__checkReturn
EXPORT
NDIS_STATUS
NdisQueryBindInstanceName(
__out PNDIS_STRING pAdapterInstanceName,
__in NDIS_HANDLE BindingContext
);
//
// The following is used by TDI/NDIS interface as part of Network PnP.
// For use by TDI alone.
//
typedef
NTSTATUS
(*TDI_REGISTER_CALLBACK)(
__in PUNICODE_STRING DeviceName,
__out HANDLE * TdiHandle
);
typedef
NTSTATUS
(*TDI_PNP_HANDLER)(
__in PUNICODE_STRING UpperComponent,
__in PUNICODE_STRING LowerComponent,
__in PUNICODE_STRING BindList,
__in PVOID ReconfigBuffer,
__in UINT ReconfigBufferSize,
__in UINT Operation
);
EXPORT
VOID
NdisRegisterTdiCallBack(
__in TDI_REGISTER_CALLBACK RegisterCallback,
__in TDI_PNP_HANDLER PnPHandler
);
EXPORT
VOID
NdisDeregisterTdiCallBack(
VOID
);
#if NDIS_LEGACY_PROTOCOL
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
NdisReset(
__out PNDIS_STATUS Status,
__in NDIS_HANDLE NdisBindingHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
NdisRequest(
__out PNDIS_STATUS Status,
__in NDIS_HANDLE NdisBindingHandle,
__in PNDIS_REQUEST NdisRequest
);
#ifdef __cplusplus
#define NdisSend(Status, NdisBindingHandle, Packet) \
{ \
*(Status) = \
(((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->NdisCommonOpenBlock.SendHandler)( \
((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->NdisCommonOpenBlock.BindingHandle, \
(Packet)); \
}
#define NdisSendPackets(NdisBindingHandle, PacketArray, NumberOfPackets) \
{ \
(((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->NdisCommonOpenBlock.SendPacketsHandler)( \
(PNDIS_OPEN_BLOCK)(NdisBindingHandle), \
(PacketArray), \
(NumberOfPackets)); \
}
#define NdisTransferData(Status, \
NdisBindingHandle, \
MacReceiveContext, \
ByteOffset, \
BytesToTransfer, \
Packet, \
BytesTransferred) \
{ \
*(Status) = \
(((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->NdisCommonOpenBlock.TransferDataHandler)( \
((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->NdisCommonOpenBlock.BindingHandle, \
(MacReceiveContext), \
(ByteOffset), \
(BytesToTransfer), \
(Packet), \
(BytesTransferred)); \
}
#else
#define NdisSend(Status, NdisBindingHandle, Packet) \
{ \
*(Status) = \
(((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->SendHandler)( \
((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->BindingHandle, \
(Packet)); \
}
#define NdisSendPackets(NdisBindingHandle, PacketArray, NumberOfPackets) \
{ \
(((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->SendPacketsHandler)( \
(PNDIS_OPEN_BLOCK)(NdisBindingHandle), \
(PacketArray), \
(NumberOfPackets)); \
}
#define NdisTransferData(Status, \
NdisBindingHandle, \
MacReceiveContext, \
ByteOffset, \
BytesToTransfer, \
Packet, \
BytesTransferred) \
{ \
*(Status) = \
(((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->TransferDataHandler)( \
((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->BindingHandle, \
(MacReceiveContext), \
(ByteOffset), \
(BytesToTransfer), \
(Packet), \
(BytesTransferred)); \
}
#endif // ifdef __cplusplus
#endif // NDIS_LEGACY_PROTOCOL
#if NDIS_LEGACY_PROTOCOL
//
// Routines to access packet flags
//
/*++
VOID
NdisSetSendFlags(
IN PNDIS_PACKET Packet,
IN UINT Flags
);
--*/
#define NdisSetSendFlags(_Packet,_Flags) (_Packet)->Private.Flags = (_Flags)
/*++
VOID
NdisQuerySendFlags(
IN PNDIS_PACKET Packet,
OUT PUINT Flags
);
--*/
#define NdisQuerySendFlags(_Packet,_Flags) *(_Flags) = (_Packet)->Private.Flags
#endif // NDIS_LEGACY_PROTOCOL
#if NDIS_LEGACY_DRIVER
//
// The following is the minimum size of packets a miniport must allocate
// when it indicates packets via NdisMIndicatePacket or NdisMCoIndicatePacket
//
#define PROTOCOL_RESERVED_SIZE_IN_PACKET (4 * sizeof(PVOID))
#endif // NDIS_LEGACY_DRIVER
#ifdef __cplusplus
#define WanMiniportSend(Status, \
NdisBindingHandle, \
NdisLinkHandle, \
WanPacket) \
{ \
*(Status) = \
((((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->NdisCommonOpenBlock.WanSendHandler))( \
((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->NdisCommonOpenBlock.BindingHandle, \
(NdisLinkHandle), \
(PNDIS_PACKET)(WanPacket)); \
}
#else
#define WanMiniportSend(Status, \
NdisBindingHandle, \
NdisLinkHandle, \
WanPacket) \
{ \
*(Status) = \
((((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->WanSendHandler))( \
((PNDIS_OPEN_BLOCK)(NdisBindingHandle))->BindingHandle, \
(NdisLinkHandle), \
(PNDIS_PACKET)(WanPacket)); \
}
#endif
#if NDIS_LEGACY_PROTOCOL
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisReturnPackets(
__in PNDIS_PACKET * PacketsToReturn,
__in UINT NumberOfPackets
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
PNDIS_PACKET
NdisGetReceivedPacket(
__in NDIS_HANDLE NdisBindingHandle,
__in NDIS_HANDLE MacContext
);
#endif // NDIS_LEGACY_PROTOCOL
//
// Macros to portably manipulate NDIS buffers.
//
#define NdisBufferLength(Buffer) MmGetMdlByteCount(Buffer)
#define NdisBufferVirtualAddress(_Buffer) MmGetSystemAddressForMdl(_Buffer)
#define NdisBufferVirtualAddressSafe(_Buffer, _Priority) MmGetSystemAddressForMdlSafe(_Buffer, _Priority)
#if NDIS_LEGACY_PROTOCOL
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCancelSendPackets(
__in NDIS_HANDLE NdisBindingHandle,
__in __drv_isObjectPointer
PVOID CancelId
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisQueryPendingIOCount(
__in __drv_isObjectPointer
PVOID NdisBindingHandle,
__out PULONG IoCount
);
#endif // NDIS_LEGACY_PROTOCOL
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
UCHAR
NdisGeneratePartialCancelId(
VOID
);
#if (NDIS_SUPPORT_NDIS6 || defined(NDIS60))
//
// NDIS 6.0 protocol's entry points
//
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_OID_REQUEST_COMPLETE)(
__in NDIS_HANDLE ProtocolBindingContext,
__in PNDIS_OID_REQUEST OidRequest,
__in NDIS_STATUS Status
);
typedef PROTOCOL_OID_REQUEST_COMPLETE (*OID_REQUEST_COMPLETE_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_RECEIVE_NET_BUFFER_LISTS)(
__in NDIS_HANDLE ProtocolBindingContext,
__in PNET_BUFFER_LIST NetBufferLists,
__in NDIS_PORT_NUMBER PortNumber,
__in ULONG NumberOfNetBufferLists,
__in ULONG ReceiveFlags
);
typedef PROTOCOL_RECEIVE_NET_BUFFER_LISTS (*RECEIVE_NET_BUFFER_LISTS_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_SEND_NET_BUFFER_LISTS_COMPLETE)(
__in NDIS_HANDLE ProtocolBindingContext,
__in PNET_BUFFER_LIST NetBufferList,
__in ULONG SendCompleteFlags
);
typedef PROTOCOL_SEND_NET_BUFFER_LISTS_COMPLETE (*SEND_NET_BUFFER_LISTS_COMPLETE_HANDLER);
#if (NDIS_SUPPORT_NDIS61)
//
// NDIS 6.1 protocol's entry points
//
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_DIRECT_OID_REQUEST_COMPLETE)(
__in NDIS_HANDLE ProtocolBindingContext,
__in PNDIS_OID_REQUEST OidRequest,
__in NDIS_STATUS Status
);
typedef PROTOCOL_DIRECT_OID_REQUEST_COMPLETE (*DIRECT_OID_REQUEST_COMPLETE_HANDLER);
#endif // (NDIS_SUPPORT_NDIS61)
//
// structure passed to protocol's BIND_HANDLER_EX
//
#define NDIS_BIND_PARAMETERS_REVISION_1 1
#if (NDIS_SUPPORT_NDIS61)
#define NDIS_BIND_PARAMETERS_REVISION_2 2
#endif // (NDIS_SUPPORT_NDIS61)
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_BIND_PARAMETERS_REVISION_3 3
#endif // (NDIS_SUPPORT_NDIS620)
typedef struct _NDIS_BIND_PARAMETERS
{
NDIS_OBJECT_HEADER Header;
PNDIS_STRING ProtocolSection;
PNDIS_STRING AdapterName;
PDEVICE_OBJECT PhysicalDeviceObject;
NDIS_MEDIUM MediaType;
ULONG MtuSize;
ULONG64 MaxXmitLinkSpeed;
ULONG64 XmitLinkSpeed;
ULONG64 MaxRcvLinkSpeed;
ULONG64 RcvLinkSpeed;
NDIS_MEDIA_CONNECT_STATE MediaConnectState;
NDIS_MEDIA_DUPLEX_STATE MediaDuplexState;
ULONG LookaheadSize;
PNDIS_PNP_CAPABILITIES PowerManagementCapabilities; // 6.20 drivers must use PowerManagementCapabilitiesEx
ULONG SupportedPacketFilters;
ULONG MaxMulticastListSize;
USHORT MacAddressLength;
UCHAR CurrentMacAddress[NDIS_MAX_PHYS_ADDRESS_LENGTH];
NDIS_PHYSICAL_MEDIUM PhysicalMediumType;
PNDIS_RECEIVE_SCALE_CAPABILITIES RcvScaleCapabilities;
NET_LUID BoundIfNetluid;
NET_IFINDEX BoundIfIndex;
NET_LUID LowestIfNetluid;
NET_IFINDEX LowestIfIndex;
NET_IF_ACCESS_TYPE AccessType; // NET_IF_ACCESS_BROADCAST for a typical ethernet adapter
NET_IF_DIRECTION_TYPE DirectionType; // NET_IF_DIRECTION_SENDRECEIVE for a typical ethernet adapter
NET_IF_CONNECTION_TYPE ConnectionType; // NET_IF_CONNECTION_DEDICATED for a typical ethernet adapter
NET_IFTYPE IfType; // IF_TYPE_ETHERNET_CSMACD for a typical ethernet adapter (regardless of speed)
BOOLEAN IfConnectorPresent; // RFC 2665 TRUE if physical adapter
PNDIS_PORT ActivePorts;
ULONG DataBackFillSize;
ULONG ContextBackFillSize;
ULONG MacOptions;
NET_IF_COMPARTMENT_ID CompartmentId;
PNDIS_OFFLOAD DefaultOffloadConfiguration;
PNDIS_TCP_CONNECTION_OFFLOAD TcpConnectionOffloadCapabilities;
PNDIS_STRING BoundAdapterName;
#if (NDIS_SUPPORT_NDIS61)
PNDIS_HD_SPLIT_CURRENT_CONFIG HDSplitCurrentConfig;
#endif // (NDIS_SUPPORT_NDIS61)
#if (NDIS_SUPPORT_NDIS620)
PNDIS_RECEIVE_FILTER_CAPABILITIES ReceiveFilterCapabilities;
PNDIS_PM_CAPABILITIES PowerManagementCapabilitiesEx;
PNDIS_NIC_SWITCH_CAPABILITIES NicSwitchCapabilities;
#endif // (NDIS_SUPPORT_NDIS620)
}NDIS_BIND_PARAMETERS, *PNDIS_BIND_PARAMETERS;
#define NDIS_SIZEOF_BIND_PARAMETERS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_BIND_PARAMETERS, BoundAdapterName)
#if (NDIS_SUPPORT_NDIS61)
#define NDIS_SIZEOF_BIND_PARAMETERS_REVISION_2 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_BIND_PARAMETERS, HDSplitCurrentConfig)
#endif // (NDIS_SUPPORT_NDIS61)
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_SIZEOF_BIND_PARAMETERS_REVISION_3 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_BIND_PARAMETERS, NicSwitchCapabilities)
#endif // (NDIS_SUPPORT_NDIS620)
typedef
__drv_requiresIRQL(PASSIVE_LEVEL)
NDIS_STATUS
(PROTOCOL_BIND_ADAPTER_EX)(
__in NDIS_HANDLE ProtocolDriverContext,
__in NDIS_HANDLE BindContext,
__in PNDIS_BIND_PARAMETERS BindParameters
);
typedef PROTOCOL_BIND_ADAPTER_EX (*BIND_HANDLER_EX);
typedef
__drv_requiresIRQL(PASSIVE_LEVEL)
NDIS_STATUS
(PROTOCOL_UNBIND_ADAPTER_EX)(
__in NDIS_HANDLE UnbindContext,
__in NDIS_HANDLE ProtocolBindingContext
);
typedef PROTOCOL_UNBIND_ADAPTER_EX (*UNBIND_HANDLER_EX);
typedef
__drv_requiresIRQL(PASSIVE_LEVEL)
VOID
(PROTOCOL_OPEN_ADAPTER_COMPLETE_EX)(
__in NDIS_HANDLE ProtocolBindingContext,
__in NDIS_STATUS Status
);
typedef PROTOCOL_OPEN_ADAPTER_COMPLETE_EX (*OPEN_ADAPTER_COMPLETE_HANDLER_EX);
typedef
__drv_requiresIRQL(PASSIVE_LEVEL)
VOID
(PROTOCOL_CLOSE_ADAPTER_COMPLETE_EX)(
__in NDIS_HANDLE ProtocolBindingContext
);
typedef PROTOCOL_CLOSE_ADAPTER_COMPLETE_EX (*CLOSE_ADAPTER_COMPLETE_HANDLER_EX);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_STATUS_EX)(
__in NDIS_HANDLE ProtocolBindingContext,
__in PNDIS_STATUS_INDICATION StatusIndication
);
typedef PROTOCOL_STATUS_EX (*STATUS_HANDLER_EX);
typedef
__drv_requiresIRQL(PASSIVE_LEVEL)
NDIS_STATUS
(PROTOCOL_NET_PNP_EVENT)(
__in NDIS_HANDLE ProtocolBindingContext,
__in PNET_PNP_EVENT_NOTIFICATION NetPnPEventNotification
);
typedef PROTOCOL_NET_PNP_EVENT (*NET_PNP_EVENT_HANDLER);
typedef
__drv_requiresIRQL(PASSIVE_LEVEL)
VOID
(PROTOCOL_UNINSTALL)(
VOID
);
typedef PROTOCOL_UNINSTALL (*UNINSTALL_PROTOCOL_HANDLER);
#define NDIS_PROTOCOL_CO_CHARACTERISTICS_REVISION_1 1
typedef struct _NDIS_PROTOCOL_CO_CHARACTERISTICS
{
NDIS_OBJECT_HEADER Header; // Header.Type = NDIS_OBJECT_TYPE_PROTOCOL_CO_CHARACTERISTICS
ULONG Flags;
CO_STATUS_HANDLER_EX CoStatusHandlerEx;
CO_AF_REGISTER_NOTIFY_HANDLER CoAfRegisterNotifyHandler;
CO_RECEIVE_NET_BUFFER_LISTS_HANDLER CoReceiveNetBufferListsHandler;
CO_SEND_NET_BUFFER_LISTS_COMPLETE_HANDLER CoSendNetBufferListsCompleteHandler;
} NDIS_PROTOCOL_CO_CHARACTERISTICS, *PNDIS_PROTOCOL_CO_CHARACTERISTICS;
#define NDIS_SIZEOF_PROTOCOL_CO_CHARACTERISTICS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_PROTOCOL_CO_CHARACTERISTICS, CoSendNetBufferListsCompleteHandler)
#define NDIS_PROTOCOL_DRIVER_CHARACTERISTICS_REVISION_1 1
#if (NDIS_SUPPORT_NDIS61)
#define NDIS_PROTOCOL_DRIVER_CHARACTERISTICS_REVISION_2 2
#endif // (NDIS_SUPPORT_NDIS61)
typedef struct _NDIS_PROTOCOL_DRIVER_CHARACTERISTICS
{
NDIS_OBJECT_HEADER Header;
UCHAR MajorNdisVersion;
UCHAR MinorNdisVersion;
UCHAR MajorDriverVersion;
UCHAR MinorDriverVersion;
ULONG Flags;
NDIS_STRING Name;
SET_OPTIONS_HANDLER SetOptionsHandler;
BIND_HANDLER_EX BindAdapterHandlerEx;
UNBIND_HANDLER_EX UnbindAdapterHandlerEx;
OPEN_ADAPTER_COMPLETE_HANDLER_EX OpenAdapterCompleteHandlerEx;
CLOSE_ADAPTER_COMPLETE_HANDLER_EX CloseAdapterCompleteHandlerEx;
NET_PNP_EVENT_HANDLER NetPnPEventHandler;
UNINSTALL_PROTOCOL_HANDLER UninstallHandler;
OID_REQUEST_COMPLETE_HANDLER OidRequestCompleteHandler;
STATUS_HANDLER_EX StatusHandlerEx;
RECEIVE_NET_BUFFER_LISTS_HANDLER ReceiveNetBufferListsHandler;
SEND_NET_BUFFER_LISTS_COMPLETE_HANDLER SendNetBufferListsCompleteHandler;
#if (NDIS_SUPPORT_NDIS61)
DIRECT_OID_REQUEST_COMPLETE_HANDLER DirectOidRequestCompleteHandler;
#endif // (NDIS_SUPPORT_NDIS61)
} NDIS_PROTOCOL_DRIVER_CHARACTERISTICS, *PNDIS_PROTOCOL_DRIVER_CHARACTERISTICS;
#define NDIS_SIZEOF_PROTOCOL_DRIVER_CHARACTERISTICS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_PROTOCOL_DRIVER_CHARACTERISTICS, SendNetBufferListsCompleteHandler)
#if (NDIS_SUPPORT_NDIS61)
#define NDIS_SIZEOF_PROTOCOL_DRIVER_CHARACTERISTICS_REVISION_2 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_PROTOCOL_DRIVER_CHARACTERISTICS, DirectOidRequestCompleteHandler)
#endif // (NDIS_SUPPORT_NDIS61)
#endif // (NDIS_SUPPORT_NDIS6 || defined(NDIS60))
#if NDIS_LEGACY_PROTOCOL
#if (defined(NDIS50) || defined(NDIS51))
typedef NDIS50_PROTOCOL_CHARACTERISTICS NDIS_PROTOCOL_CHARACTERISTICS;
#else
typedef NDIS40_PROTOCOL_CHARACTERISTICS NDIS_PROTOCOL_CHARACTERISTICS;
#endif
typedef NDIS_PROTOCOL_CHARACTERISTICS *PNDIS_PROTOCOL_CHARACTERISTICS;
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisRegisterProtocol(
__out PNDIS_STATUS Status,
__out PNDIS_HANDLE NdisProtocolHandle,
__in PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics,
__in UINT CharacteristicsLength
);
#endif // NDIS_LEGACY_PROTOCOL
#if (NDIS_SUPPORT_NDIS6 || defined(NDIS60))
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisRegisterProtocolDriver(
__in_opt NDIS_HANDLE ProtocolDriverContext,
__in PNDIS_PROTOCOL_DRIVER_CHARACTERISTICS ProtocolCharacteristics,
__out PNDIS_HANDLE NdisProtocolHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisSendNetBufferLists(
__in NDIS_HANDLE NdisBindingHandle,
__in __drv_aliasesMem PNET_BUFFER_LIST NetBufferLists,
__in NDIS_PORT_NUMBER PortNumber,
__in ULONG SendFlags
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisReturnNetBufferLists(
__in NDIS_HANDLE NdisBindingHandle,
__in PNET_BUFFER_LIST NetBufferLists,
__in ULONG ReturnFlags
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCancelSendNetBufferLists(
__in NDIS_HANDLE NdisBindingHandle,
__in __drv_isObjectPointer
PVOID CancelId
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisOidRequest(
__in NDIS_HANDLE NdisBindingHandle,
__in PNDIS_OID_REQUEST OidRequest
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCancelOidRequest(
__in NDIS_HANDLE NdisBindingHandle,
__in __drv_isObjectPointer
PVOID RequestId
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisUnbindAdapter(
__in NDIS_HANDLE NdisBindingHandle
);
//
// structure passed to NdisOpenAdapterEx
//
#define NDIS_OPEN_PARAMETERS_REVISION_1 1
typedef struct _NDIS_OPEN_PARAMETERS
{
NDIS_OBJECT_HEADER Header;
PNDIS_STRING AdapterName;
PNDIS_MEDIUM MediumArray;
UINT MediumArraySize;
PUINT SelectedMediumIndex;
PNET_FRAME_TYPE FrameTypeArray;
UINT FrameTypeArraySize;
} NDIS_OPEN_PARAMETERS, *PNDIS_OPEN_PARAMETERS;
#define NDIS_SIZEOF_OPEN_PARAMETERS_REVSION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_OPEN_PARAMETERS, FrameTypeArraySize)
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisOpenAdapterEx(
__in NDIS_HANDLE NdisProtocolHandle,
__in NDIS_HANDLE ProtocolBindingContext,
__in PNDIS_OPEN_PARAMETERS OpenParameters,
__in NDIS_HANDLE BindContext,
__out PNDIS_HANDLE NdisBindingHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCompleteBindAdapterEx(
__in NDIS_HANDLE BindAdapterContext,
__in NDIS_STATUS Status
);
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisCloseAdapterEx(
__in NDIS_HANDLE NdisBindingHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCompleteUnbindAdapterEx(
__in NDIS_HANDLE UnbindContext
);
#define NDIS_PROTOCOL_PAUSE_PARAMETERS_REVISION_1 1
typedef struct _NDIS_PROTOCOL_PAUSE_PARAMETERS
{
NDIS_OBJECT_HEADER Header;
ULONG Flags;
ULONG PauseReason;
} NDIS_PROTOCOL_PAUSE_PARAMETERS, *PNDIS_PROTOCOL_PAUSE_PARAMETERS;
#define NDIS_SIZEOF_PROTOCOL_PAUSE_PARAMETERS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_PROTOCOL_PAUSE_PARAMETERS, PauseReason)
//
// NDIS_PROTOCOL_RESTART_PARAMETERS is used in
// NetEventRestart event indication to the protocols
//
#define NDIS_PROTOCOL_RESTART_PARAMETERS_REVISION_1 1
typedef struct _NDIS_PROTOCOL_RESTART_PARAMETERS
{
NDIS_OBJECT_HEADER Header;
PUCHAR FilterModuleNameBuffer;
ULONG FilterModuleNameBufferLength;
PNDIS_RESTART_ATTRIBUTES RestartAttributes;
NET_IFINDEX BoundIfIndex;
NET_LUID BoundIfNetluid;
ULONG Flags;
} NDIS_PROTOCOL_RESTART_PARAMETERS, *PNDIS_PROTOCOL_RESTART_PARAMETERS;
#define NDIS_SIZEOF_PROTOCOL_RESTART_PARAMETERS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_PROTOCOL_RESTART_PARAMETERS, Flags)
#if (NDIS_SUPPORT_NDIS61)
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisDirectOidRequest(
__in NDIS_HANDLE NdisBindingHandle,
__in PNDIS_OID_REQUEST OidRequest
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCancelDirectOidRequest(
__in NDIS_HANDLE NdisBindingHandle,
__in __drv_isObjectPointer
PVOID RequestId
);
#endif // (NDIS_SUPPORT_NDIS61)
#endif // (NDIS_SUPPORT_NDIS6 || defined(NDIS60))
//
// needed for macros used by legacy protocols
//
#if !defined(NDIS_WRAPPER)
#if NDIS_LEGACY_PROTOCOL
typedef struct _NDIS_COMMON_OPEN_BLOCK
{
PVOID MacHandle; // needed for backward compatibility
NDIS_HANDLE BindingHandle;
NDIS_HANDLE Reserved6;
NDIS_HANDLE Reserved7;
NDIS_HANDLE Reserved8;
PVOID Reserved9;
NDIS_HANDLE Reserved10;
NDIS_HANDLE Reserved11;
BOOLEAN Reserved12;
BOOLEAN Reserved2;
BOOLEAN Reserved3;
BOOLEAN Reserved4;
PVOID Reserved13;
KSPIN_LOCK Reserved5;
NDIS_HANDLE Reserved14;
//
// These are referenced by the macros used by protocols to call.
// All of the ones referenced by the macros are internal NDIS handlers for the miniports
//
union
{
SEND_HANDLER SendHandler;
WAN_SEND_HANDLER WanSendHandler;
};
TRANSFER_DATA_HANDLER TransferDataHandler;
//
// These are referenced internally by NDIS
//
SEND_COMPLETE_HANDLER SendCompleteHandler;
TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler;
RECEIVE_HANDLER ReceiveHandler;
RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler;
WAN_RECEIVE_HANDLER WanReceiveHandler;
REQUEST_COMPLETE_HANDLER RequestCompleteHandler;
//
// NDIS 4.0 extensions
//
RECEIVE_PACKET_HANDLER ReceivePacketHandler;
SEND_PACKETS_HANDLER SendPacketsHandler;
//
// More Cached Handlers
//
RESET_HANDLER ResetHandler;
REQUEST_HANDLER RequestHandler;
RESET_COMPLETE_HANDLER ResetCompleteHandler;
STATUS_HANDLER StatusHandler;
STATUS_COMPLETE_HANDLER StatusCompleteHandler;
}NDIS_COMMON_OPEN_BLOCK, *PNDIS_COMMON_OPEN_BLOCK;
//
// one of these per open on an adapter/protocol
//
struct _NDIS_OPEN_BLOCK
{
#ifdef __cplusplus
NDIS_COMMON_OPEN_BLOCK NdisCommonOpenBlock;
#else
NDIS_COMMON_OPEN_BLOCK;
#endif
};
#endif // NDIS_LEGACY_PROTOCOL
#endif // NDIS_WRAPPER
#pragma once
#include <xfilter.h>
#define NDIS_M_MAX_LOOKAHEAD 526
#if NDIS_LEGACY_MINIPORT
//
// Function types for NDIS_MINIPORT_CHARACTERISTICS
//
typedef
BOOLEAN
(*W_CHECK_FOR_HANG_HANDLER)(
__in NDIS_HANDLE MiniportAdapterContext
);
typedef
VOID
(*W_DISABLE_INTERRUPT_HANDLER)(
__in NDIS_HANDLE MiniportAdapterContext
);
typedef
VOID
(*W_ENABLE_INTERRUPT_HANDLER)(
__in NDIS_HANDLE MiniportAdapterContext
);
typedef
VOID
(*W_HALT_HANDLER)(
__in NDIS_HANDLE MiniportAdapterContext
);
typedef
VOID
(*W_HANDLE_INTERRUPT_HANDLER)(
__in NDIS_HANDLE MiniportAdapterContext
);
typedef
NDIS_STATUS
(*W_INITIALIZE_HANDLER)(
__out PNDIS_STATUS OpenErrorStatus,
__out PUINT SelectedMediumIndex,
__in PNDIS_MEDIUM MediumArray,
__in UINT MediumArraySize,
__in NDIS_HANDLE MiniportAdapterContext,
__in NDIS_HANDLE WrapperConfigurationContext
);
typedef
VOID
(*W_ISR_HANDLER)(
__out PBOOLEAN InterruptRecognized,
__out PBOOLEAN QueueMiniportHandleInterrupt,
__in NDIS_HANDLE MiniportAdapterContext
);
typedef
NDIS_STATUS
(*W_QUERY_INFORMATION_HANDLER)(
__in NDIS_HANDLE MiniportAdapterContext,
__in NDIS_OID Oid,
__in PVOID InformationBuffer,
__in ULONG InformationBufferLength,
__out PULONG BytesWritten,
__out PULONG BytesNeeded
);
typedef
NDIS_STATUS
(*W_RECONFIGURE_HANDLER)(
__out PNDIS_STATUS OpenErrorStatus,
__in NDIS_HANDLE MiniportAdapterContext OPTIONAL,
__in NDIS_HANDLE WrapperConfigurationContext
);
typedef
NDIS_STATUS
(*W_RESET_HANDLER)(
__out PBOOLEAN AddressingReset,
__in NDIS_HANDLE MiniportAdapterContext
);
typedef
NDIS_STATUS
(*W_SEND_HANDLER)(
__in NDIS_HANDLE MiniportAdapterContext,
__in PNDIS_PACKET Packet,
__in UINT Flags
);
typedef
NDIS_STATUS
(*WM_SEND_HANDLER)(
__in NDIS_HANDLE MiniportAdapterContext,
__in NDIS_HANDLE NdisLinkHandle,
__in PNDIS_WAN_PACKET Packet
);
typedef
NDIS_STATUS
(*W_SET_INFORMATION_HANDLER)(
__in NDIS_HANDLE MiniportAdapterContext,
__in NDIS_OID Oid,
__in PVOID InformationBuffer,
__in ULONG InformationBufferLength,
__out PULONG BytesRead,
__out PULONG BytesNeeded
);
typedef
NDIS_STATUS
(*W_TRANSFER_DATA_HANDLER)(
__out PNDIS_PACKET Packet,
__out PUINT BytesTransferred,
__in NDIS_HANDLE MiniportAdapterContext,
__in NDIS_HANDLE MiniportReceiveContext,
__in UINT ByteOffset,
__in UINT BytesToTransfer
);
typedef
NDIS_STATUS
(*WM_TRANSFER_DATA_HANDLER)(
VOID
);
//
// Definition for shutdown handler
//
typedef
VOID
(*ADAPTER_SHUTDOWN_HANDLER) (
__in PVOID ShutdownContext
);
//
// Miniport extensions for NDIS 4.0
//
typedef
VOID
(*W_RETURN_PACKET_HANDLER)(
__in NDIS_HANDLE MiniportAdapterContext,
__in PNDIS_PACKET Packet
);
//
// NDIS 4.0 extension
//
typedef
VOID
(*W_SEND_PACKETS_HANDLER)(
__in NDIS_HANDLE MiniportAdapterContext,
__in PPNDIS_PACKET PacketArray,
__in UINT NumberOfPackets
);
typedef
VOID
(*W_ALLOCATE_COMPLETE_HANDLER)(
__in NDIS_HANDLE MiniportAdapterContext,
__in PVOID VirtualAddress,
__in PNDIS_PHYSICAL_ADDRESS PhysicalAddress,
__in ULONG Length,
__in PVOID Context
);
#endif // NDIS_LEGACY_MINIPORT
//
// W_CO_CREATE_VC_HANDLER is a synchronous call
//
typedef
NDIS_STATUS
(MINIPORT_CO_CREATE_VC)(
__in NDIS_HANDLE MiniportAdapterContext,
__in NDIS_HANDLE NdisVcHandle,
__out PNDIS_HANDLE MiniportVcContext
);
typedef MINIPORT_CO_CREATE_VC (*W_CO_CREATE_VC_HANDLER);
typedef
NDIS_STATUS
(MINIPORT_CO_DELETE_VC)(
__in NDIS_HANDLE MiniportVcContext
);
typedef MINIPORT_CO_DELETE_VC (*W_CO_DELETE_VC_HANDLER);
typedef
NDIS_STATUS
(MINIPORT_CO_ACTIVATE_VC)(
__in NDIS_HANDLE MiniportVcContext,
__inout PCO_CALL_PARAMETERS CallParameters
);
typedef MINIPORT_CO_ACTIVATE_VC (*W_CO_ACTIVATE_VC_HANDLER);
typedef
NDIS_STATUS
(MINIPORT_CO_DEACTIVATE_VC)(
__in NDIS_HANDLE MiniportVcContext
);
typedef MINIPORT_CO_DEACTIVATE_VC (*W_CO_DEACTIVATE_VC_HANDLER);
#if NDIS_LEGACY_MINIPORT
typedef
VOID
(*W_CO_SEND_PACKETS_HANDLER)(
__in NDIS_HANDLE MiniportVcContext,
__in PPNDIS_PACKET PacketArray,
__in UINT NumberOfPackets
);
typedef
NDIS_STATUS
(*W_CO_REQUEST_HANDLER)(
__in NDIS_HANDLE MiniportAdapterContext,
__in NDIS_HANDLE MiniportVcContext OPTIONAL,
__inout PNDIS_REQUEST NdisRequest
);
#endif // NDIS_LEGACY_MINIPORT
#if NDIS_SUPPORT_NDIS6
//
// CONDIS 6.0 handlers
//
typedef
VOID
(MINIPORT_CO_SEND_NET_BUFFER_LISTS)(
__in NDIS_HANDLE MiniportVcContext,
__in PNET_BUFFER_LIST NetBufferLists,
__in ULONG SendFlags
);
typedef MINIPORT_CO_SEND_NET_BUFFER_LISTS (*W_CO_SEND_NET_BUFFER_LISTS_HANDLER);
typedef
NDIS_STATUS
(MINIPORT_CO_OID_REQUEST)(
__in NDIS_HANDLE MiniportAdapterContext,
__in NDIS_HANDLE MiniportVcContext OPTIONAL,
__inout PNDIS_OID_REQUEST NdisRequest
);
typedef MINIPORT_CO_OID_REQUEST (*W_CO_OID_REQUEST_HANDLER);
#endif // NDIS_SUPPORT_NDIS6
typedef enum _NDIS_DEVICE_PNP_EVENT
{
NdisDevicePnPEventQueryRemoved,
NdisDevicePnPEventRemoved,
NdisDevicePnPEventSurpriseRemoved,
NdisDevicePnPEventQueryStopped,
NdisDevicePnPEventStopped,
NdisDevicePnPEventPowerProfileChanged,
#if NDIS_SUPPORT_NDIS6
NdisDevicePnPEventFilterListChanged,
#endif // NDIS_SUPPORT_NDIS6
NdisDevicePnPEventMaximum
} NDIS_DEVICE_PNP_EVENT, *PNDIS_DEVICE_PNP_EVENT;
//
// power profiles
//
typedef enum _NDIS_POWER_PROFILE
{
NdisPowerProfileBattery,
NdisPowerProfileAcOnLine
} NDIS_POWER_PROFILE, *PNDIS_POWER_PROFILE;
#if NDIS_LEGACY_MINIPORT
typedef struct _NDIS50_MINIPORT_CHARACTERISTICS
{
UCHAR MajorNdisVersion;
UCHAR MinorNdisVersion;
USHORT Filler;
UINT Reserved;
W_CHECK_FOR_HANG_HANDLER CheckForHangHandler;
W_DISABLE_INTERRUPT_HANDLER DisableInterruptHandler;
W_ENABLE_INTERRUPT_HANDLER EnableInterruptHandler;
W_HALT_HANDLER HaltHandler;
W_HANDLE_INTERRUPT_HANDLER HandleInterruptHandler;
W_INITIALIZE_HANDLER InitializeHandler;
W_ISR_HANDLER ISRHandler;
W_QUERY_INFORMATION_HANDLER QueryInformationHandler;
W_RECONFIGURE_HANDLER ReconfigureHandler;
W_RESET_HANDLER ResetHandler;
union
{
W_SEND_HANDLER SendHandler;
WM_SEND_HANDLER WanSendHandler;
};
W_SET_INFORMATION_HANDLER SetInformationHandler;
union
{
W_TRANSFER_DATA_HANDLER TransferDataHandler;
WM_TRANSFER_DATA_HANDLER WanTransferDataHandler;
};
//
// Extensions for NDIS 4.0
//
W_RETURN_PACKET_HANDLER ReturnPacketHandler;
W_SEND_PACKETS_HANDLER SendPacketsHandler;
W_ALLOCATE_COMPLETE_HANDLER AllocateCompleteHandler;
//
// Extensions for NDIS 5.0
//
W_CO_CREATE_VC_HANDLER CoCreateVcHandler;
W_CO_DELETE_VC_HANDLER CoDeleteVcHandler;
W_CO_ACTIVATE_VC_HANDLER CoActivateVcHandler;
W_CO_DEACTIVATE_VC_HANDLER CoDeactivateVcHandler;
W_CO_SEND_PACKETS_HANDLER CoSendPacketsHandler;
W_CO_REQUEST_HANDLER CoRequestHandler;
} NDIS50_MINIPORT_CHARACTERISTICS;
#if (((NDIS_MINIPORT_MAJOR_VERSION == 5) && (NDIS_MINIPORT_MINOR_VERSION == 1)) || NDIS_WRAPPER)
//
// Miniport extensions for NDIS 5.1
//
typedef VOID
(*W_CANCEL_SEND_PACKETS_HANDLER)(
__in NDIS_HANDLE MiniportAdapterContext,
__in PVOID CancelId
);
typedef VOID
(*W_PNP_EVENT_NOTIFY_HANDLER)(
__in NDIS_HANDLE MiniportAdapterContext,
__in NDIS_DEVICE_PNP_EVENT DevicePnPEvent,
__in PVOID InformationBuffer,
__in ULONG InformationBufferLength
);
typedef VOID
(*W_MINIPORT_SHUTDOWN_HANDLER) (
__in NDIS_HANDLE MiniportAdapterContext
);
#endif // (((NDIS_MINIPORT_MAJOR_VERSION == 5) && (NDIS_MINIPORT_MINOR_VERSION == 1)) || NDIS_WRAPPER)
#endif // NDIS_LEGACY_MINIPORT
#if NDIS_SUPPORT_NDIS6
typedef
BOOLEAN
(MINIPORT_ISR)(
__in NDIS_HANDLE MiniportInterruptContext,
__out PBOOLEAN QueueDefaultInterruptDpc,
__out PULONG TargetProcessors
);
typedef MINIPORT_ISR (*MINIPORT_ISR_HANDLER);
typedef
VOID
(MINIPORT_INTERRUPT_DPC)(
__in NDIS_HANDLE MiniportInterruptContext,
__in PVOID MiniportDpcContext,
__in PVOID ReceiveThrottleParameters,
__in PVOID NdisReserved2
);
typedef MINIPORT_INTERRUPT_DPC (*MINIPORT_INTERRUPT_DPC_HANDLER);
#if NDIS_SUPPORT_NDIS620
typedef struct _NDIS_RECEIVE_THROTTLE_PARAMETERS
{
__in ULONG MaxNblsToIndicate;
__out ULONG MoreNblsPending:1;
} NDIS_RECEIVE_THROTTLE_PARAMETERS, *PNDIS_RECEIVE_THROTTLE_PARAMETERS;
#define NDIS_INDICATE_ALL_NBLS (~0ul)
#endif
typedef
VOID
(MINIPORT_DISABLE_INTERRUPT)(
__in NDIS_HANDLE MiniportInterruptContext
);
typedef MINIPORT_DISABLE_INTERRUPT (*MINIPORT_DISABLE_INTERRUPT_HANDLER);
typedef
VOID
(MINIPORT_ENABLE_INTERRUPT)(
__in NDIS_HANDLE MiniportInterruptContext
);
typedef MINIPORT_ENABLE_INTERRUPT (*MINIPORT_ENABLE_INTERRUPT_HANDLER);
//
// MSI support handlers
//
typedef
BOOLEAN
(MINIPORT_MESSAGE_INTERRUPT)(
__in NDIS_HANDLE MiniportInterruptContext,
__in ULONG MessageId,
__out PBOOLEAN QueueDefaultInterruptDpc,
__out PULONG TargetProcessors
);
typedef MINIPORT_MESSAGE_INTERRUPT (*MINIPORT_MSI_ISR_HANDLER);
typedef
VOID
(MINIPORT_MESSAGE_INTERRUPT_DPC)(
__in NDIS_HANDLE MiniportInterruptContext,
__in ULONG MessageId,
__in PVOID MiniportDpcContext,
#if NDIS_SUPPORT_NDIS620
__in PVOID ReceiveThrottleParameters,
__in PVOID NdisReserved2
#else
__in PULONG NdisReserved1,
__in PULONG NdisReserved2
#endif
);
typedef MINIPORT_MESSAGE_INTERRUPT_DPC (*MINIPORT_MSI_INTERRUPT_DPC_HANDLER);
typedef
VOID
(MINIPORT_DISABLE_MESSAGE_INTERRUPT)(
__in NDIS_HANDLE MiniportInterruptContext,
__in ULONG MessageId
);
typedef MINIPORT_DISABLE_MESSAGE_INTERRUPT (*MINIPORT_DISABLE_MSI_INTERRUPT_HANDLER);
typedef
VOID
(MINIPORT_ENABLE_MESSAGE_INTERRUPT)(
__in NDIS_HANDLE MiniportInterruptContext,
__in ULONG MessageId
);
typedef MINIPORT_ENABLE_MESSAGE_INTERRUPT (*MINIPORT_ENABLE_MSI_INTERRUPT_HANDLER);
typedef
BOOLEAN
(MINIPORT_SYNCHRONIZE_INTERRUPT)(
__in NDIS_HANDLE SynchronizeContext
);
typedef MINIPORT_SYNCHRONIZE_INTERRUPT (*MINIPORT_SYNCHRONIZE_INTERRUPT_HANDLER);
typedef MINIPORT_SYNCHRONIZE_INTERRUPT (MINIPORT_SYNCHRONIZE_MESSAGE_INTERRUPT);
typedef MINIPORT_SYNCHRONIZE_MESSAGE_INTERRUPT (*MINIPORT_SYNCHRONIZE_MSI_INTERRUPT_HANDLER);
typedef enum _NDIS_INTERRUPT_TYPE
{
NDIS_CONNECT_LINE_BASED = 1,
NDIS_CONNECT_MESSAGE_BASED
} NDIS_INTERRUPT_TYPE, *PNDIS_INTERRUPT_TYPE;
#define NDIS_MINIPORT_INTERRUPT_REVISION_1 1
typedef struct _NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS
{
__in NDIS_OBJECT_HEADER Header;
__in MINIPORT_ISR_HANDLER InterruptHandler;
__in MINIPORT_INTERRUPT_DPC_HANDLER InterruptDpcHandler;
__in MINIPORT_DISABLE_INTERRUPT_HANDLER DisableInterruptHandler;
__in MINIPORT_ENABLE_INTERRUPT_HANDLER EnableInterruptHandler;
__in BOOLEAN MsiSupported;
__in BOOLEAN MsiSyncWithAllMessages;
__in MINIPORT_MSI_ISR_HANDLER MessageInterruptHandler;
__in MINIPORT_MSI_INTERRUPT_DPC_HANDLER MessageInterruptDpcHandler;
__in MINIPORT_DISABLE_MSI_INTERRUPT_HANDLER DisableMessageInterruptHandler;
__in MINIPORT_ENABLE_MSI_INTERRUPT_HANDLER EnableMessageInterruptHandler;
__out NDIS_INTERRUPT_TYPE InterruptType;
__out PIO_INTERRUPT_MESSAGE_INFO MessageInfoTable;
} NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS, *PNDIS_MINIPORT_INTERRUPT_CHARACTERISTICS;
#define NDIS_SIZEOF_MINIPORT_INTERRUPT_CHARACTERISTICS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS, MessageInfoTable)
typedef
NDIS_STATUS
(MINIPORT_ADD_DEVICE)(
__in NDIS_HANDLE NdisMiniportHandle,
__in NDIS_HANDLE MiniportDriverContext
);
typedef MINIPORT_ADD_DEVICE (*MINIPORT_ADD_DEVICE_HANDLER);
typedef
VOID
(MINIPORT_REMOVE_DEVICE)(
__in NDIS_HANDLE MiniportAddDeviceContext
);
typedef MINIPORT_REMOVE_DEVICE (*MINIPORT_REMOVE_DEVICE_HANDLER);
typedef
NDIS_STATUS
(MINIPORT_PNP_IRP)(
__in NDIS_HANDLE MiniportAddDeviceContext,
__in PIRP Irp
);
typedef MINIPORT_PNP_IRP (*MINIPORT_PNP_IRP_HANDLER);
typedef MINIPORT_PNP_IRP (MINIPORT_START_DEVICE);
typedef MINIPORT_PNP_IRP (* MINIPORT_START_DEVICE_HANDLER);
typedef MINIPORT_PNP_IRP (MINIPORT_FILTER_RESOURCE_REQUIREMENTS);
typedef MINIPORT_PNP_IRP (*MINIPORT_FILTER_RESOURCE_REQUIREMENTS_HANDLER);
#define NDIS_MINIPORT_PNP_CHARACTERISTICS_REVISION_1 1
typedef struct _NDIS_MINIPORT_PNP_CHARACTERISTICS
{
NDIS_OBJECT_HEADER Header;
MINIPORT_ADD_DEVICE_HANDLER MiniportAddDeviceHandler;
MINIPORT_REMOVE_DEVICE_HANDLER MiniportRemoveDeviceHandler;
MINIPORT_FILTER_RESOURCE_REQUIREMENTS_HANDLER MiniportFilterResourceRequirementsHandler;
MINIPORT_START_DEVICE_HANDLER MiniportStartDeviceHandler;
ULONG Flags;
} NDIS_MINIPORT_PNP_CHARACTERISTICS, *PNDIS_MINIPORT_PNP_CHARACTERISTICS;
#define NDIS_SIZEOF_MINIPORT_PNP_CHARACTERISTICS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MINIPORT_PNP_CHARACTERISTICS, Flags)
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisMRegisterInterruptEx(
__in NDIS_HANDLE MiniportAdapterHandle,
__in NDIS_HANDLE MiniportInterruptContext,
__in PNDIS_MINIPORT_INTERRUPT_CHARACTERISTICS MiniportInterruptCharacteristics,
__out PNDIS_HANDLE NdisInterruptHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisMDeregisterInterruptEx(
__in NDIS_HANDLE NdisInterruptHandle
);
EXPORT
BOOLEAN
NdisMSynchronizeWithInterruptEx(
__in NDIS_HANDLE NdisInterruptHandle,
__in ULONG MessageId,
#if (NDIS_SUPPORT_NDIS620)
__in MINIPORT_SYNCHRONIZE_INTERRUPT_HANDLER SynchronizeFunction,
#else
__in PVOID SynchronizeFunction,
#endif
__in __drv_isObjectPointer
PVOID SynchronizeContext
);
#if NDIS_SUPPORT_60_COMPATIBLE_API
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
ULONG
NdisMQueueDpc(
__in NDIS_HANDLE NdisInterruptHandle,
__in ULONG MessageId,
__in ULONG TargetProcessors,
__in_opt __drv_isObjectPointer
PVOID MiniportDpcContext
);
#endif
#if NDIS_SUPPORT_NDIS620
EXPORT
KAFFINITY
NdisMQueueDpcEx(
IN NDIS_HANDLE NdisInterruptHandle,
IN ULONG MessageId,
IN PGROUP_AFFINITY TargetProcessors,
IN PVOID MiniportDpcContext
);
#endif
#endif // NDIS_SUPPORT_NDIS6
#if NDIS_LEGACY_MINIPORT
#if (((NDIS_MINIPORT_MAJOR_VERSION == 5) && (NDIS_MINIPORT_MINOR_VERSION == 1)) || NDIS_WRAPPER)
typedef struct _NDIS51_MINIPORT_CHARACTERISTICS
{
#ifdef __cplusplus
NDIS50_MINIPORT_CHARACTERISTICS Ndis50Chars;
#else
NDIS50_MINIPORT_CHARACTERISTICS;
#endif
//
// Extensions for NDIS 5.1
//
W_CANCEL_SEND_PACKETS_HANDLER CancelSendPacketsHandler;
W_PNP_EVENT_NOTIFY_HANDLER PnPEventNotifyHandler;
W_MINIPORT_SHUTDOWN_HANDLER AdapterShutdownHandler;
PVOID Reserved1;
PVOID Reserved2;
PVOID Reserved3;
PVOID Reserved4;
} NDIS51_MINIPORT_CHARACTERISTICS;
#endif // (((NDIS_MINIPORT_MAJOR_VERSION == 5) && (NDIS_MINIPORT_MINOR_VERSION == 1)) || NDIS_WRAPPER)
typedef struct _NDIS_MINIPORT_INTERRUPT
{
PKINTERRUPT InterruptObject;
KSPIN_LOCK DpcCountLock;
PVOID Reserved;
W_ISR_HANDLER MiniportIsr;
W_HANDLE_INTERRUPT_HANDLER MiniportDpc;
KDPC InterruptDpc;
PNDIS_MINIPORT_BLOCK Miniport;
UCHAR DpcCount;
BOOLEAN Filler1;
//
// This is used to tell when all the Dpcs for the adapter are completed.
//
KEVENT DpcsCompletedEvent;
BOOLEAN SharedInterrupt;
BOOLEAN IsrRequested;
} NDIS_MINIPORT_INTERRUPT, *PNDIS_MINIPORT_INTERRUPT;
#endif // NDIS_LEGACY_MINIPORT
typedef struct _NDIS_MINIPORT_TIMER
{
KTIMER Timer;
KDPC Dpc;
PNDIS_TIMER_FUNCTION MiniportTimerFunction;
PVOID MiniportTimerContext;
PNDIS_MINIPORT_BLOCK Miniport;
struct _NDIS_MINIPORT_TIMER *NextTimer;
} NDIS_MINIPORT_TIMER, *PNDIS_MINIPORT_TIMER;
#if NDIS_LEGACY_MINIPORT
typedef
VOID
(*ETH_RCV_INDICATE_HANDLER)(
__in PETH_FILTER Filter,
__in NDIS_HANDLE MacReceiveContext,
__in PCHAR Address,
__in PVOID HeaderBuffer,
__in UINT HeaderBufferSize,
__in PVOID LookaheadBuffer,
__in UINT LookaheadBufferSize,
__in UINT PacketSize
);
typedef
VOID
(*ETH_RCV_COMPLETE_HANDLER)(
__in PETH_FILTER Filter
);
typedef
VOID
(*TR_RCV_INDICATE_HANDLER)(
__in PTR_FILTER Filter,
__in NDIS_HANDLE MacReceiveContext,
__in PVOID HeaderBuffer,
__in UINT HeaderBufferSize,
__in PVOID LookaheadBuffer,
__in UINT LookaheadBufferSize,
__in UINT PacketSize
);
typedef
VOID
(*TR_RCV_COMPLETE_HANDLER)(
__in PTR_FILTER Filter
);
typedef
VOID
(*WAN_RCV_HANDLER)(
__out PNDIS_STATUS Status,
__in NDIS_HANDLE MiniportAdapterHandle,
__in NDIS_HANDLE NdisLinkContext,
__in PUCHAR Packet,
__in ULONG PacketSize
);
typedef
VOID
(*WAN_RCV_COMPLETE_HANDLER)(
__in NDIS_HANDLE MiniportAdapterHandle,
__in NDIS_HANDLE NdisLinkContext
);
typedef
VOID
(*NDIS_M_SEND_COMPLETE_HANDLER)(
__in NDIS_HANDLE MiniportAdapterHandle,
__in PNDIS_PACKET Packet,
__in NDIS_STATUS Status
);
typedef
VOID
(*NDIS_WM_SEND_COMPLETE_HANDLER)(
__in NDIS_HANDLE MiniportAdapterHandle,
__in PVOID Packet,
__in NDIS_STATUS Status
);
typedef
VOID
(*NDIS_M_TD_COMPLETE_HANDLER)(
__in NDIS_HANDLE MiniportAdapterHandle,
__in PNDIS_PACKET Packet,
__in NDIS_STATUS Status,
__in UINT BytesTransferred
);
typedef
VOID
(*NDIS_M_SEND_RESOURCES_HANDLER)(
__in NDIS_HANDLE MiniportAdapterHandle
);
typedef
VOID
(*NDIS_M_STATUS_HANDLER)(
__in NDIS_HANDLE MiniportHandle,
__in NDIS_STATUS GeneralStatus,
__in PVOID StatusBuffer,
__in UINT StatusBufferSize
);
typedef
VOID
(*NDIS_M_STS_COMPLETE_HANDLER)(
__in NDIS_HANDLE MiniportAdapterHandle
);
typedef
VOID
(*NDIS_M_REQ_COMPLETE_HANDLER)(
__in NDIS_HANDLE MiniportAdapterHandle,
__in NDIS_STATUS Status
);
typedef
VOID
(*NDIS_M_RESET_COMPLETE_HANDLER)(
__in NDIS_HANDLE MiniportAdapterHandle,
__in NDIS_STATUS Status,
__in BOOLEAN AddressingReset
);
typedef
BOOLEAN
(FASTCALL *NDIS_M_START_SENDS)(
__in PNDIS_MINIPORT_BLOCK Miniport
);
//
// Wrapper initialization and termination.
//
EXPORT
VOID
NdisInitializeWrapper(
OUT PNDIS_HANDLE NdisWrapperHandle,
IN PVOID SystemSpecific1,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisTerminateWrapper(
__in NDIS_HANDLE NdisWrapperHandle,
__in PVOID SystemSpecific
);
#endif // NDIS_LEGACY_MINIPORT
#if NDIS_SUPPORT_NDIS6
typedef
VOID
(MINIPORT_PROCESS_SG_LIST)(
__in PDEVICE_OBJECT pDO,
__in PVOID Reserved,
__in PSCATTER_GATHER_LIST pSGL,
__in PVOID Context
);
typedef MINIPORT_PROCESS_SG_LIST (*MINIPORT_PROCESS_SG_LIST_HANDLER);
//
// NDIS DMA description structure
//
typedef
VOID
(MINIPORT_ALLOCATE_SHARED_MEM_COMPLETE)(
__in NDIS_HANDLE MiniportAdapterContext,
__in PVOID VirtualAddress,
__in PNDIS_PHYSICAL_ADDRESS PhysicalAddress,
__in ULONG Length,
__in PVOID Context
);
typedef MINIPORT_ALLOCATE_SHARED_MEM_COMPLETE (*MINIPORT_ALLOCATE_SHARED_MEM_COMPLETE_HANDLER);
/*
NDIS_STATUS
NdisMAllocateSharedMemoryAsyncEx(
IN NDIS_HANDLE MiniportDmaHandle,
IN ULONG Length,
IN BOOLEAN Cached,
IN PVOID Context
);
*/
#define NdisMAllocateSharedMemoryAsyncEx(_H, _L, _C, _X) NdisMAllocateSharedMemoryAsync(_H, _L, _C, _X)
#endif // NDIS_SUPPORT_NDIS6
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisMAllocateSharedMemoryAsync(
__in NDIS_HANDLE MiniportAdapterHandle,
__in ULONG Length,
__in BOOLEAN Cached,
__in PVOID Context
);
//
// defintions for subordinate (as referred in Master/subordinate) DMA
//
//
// DMA Channel information
//
typedef struct _NDIS_DMA_DESCRIPTION
{
BOOLEAN DemandMode;
BOOLEAN AutoInitialize;
BOOLEAN DmaChannelSpecified;
DMA_WIDTH DmaWidth;
DMA_SPEED DmaSpeed;
ULONG DmaPort;
ULONG DmaChannel;
} NDIS_DMA_DESCRIPTION, *PNDIS_DMA_DESCRIPTION;
//
// Internal structure representing an NDIS DMA channel
//
typedef struct _NDIS_DMA_BLOCK
{
PVOID MapRegisterBase;
KEVENT AllocationEvent;
PVOID SystemAdapterObject;
PVOID Miniport;
BOOLEAN InProgress;
} NDIS_DMA_BLOCK, *PNDIS_DMA_BLOCK;
EXPORT
VOID
NdisSetupDmaTransfer(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE NdisDmaHandle,
IN PNDIS_BUFFER Buffer,
IN ULONG Offset,
IN ULONG Length,
IN BOOLEAN WriteToDevice
);
EXPORT
VOID
NdisCompleteDmaTransfer(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE NdisDmaHandle,
IN PNDIS_BUFFER Buffer,
IN ULONG Offset,
IN ULONG Length,
IN BOOLEAN WriteToDevice
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisMRegisterDmaChannel(
__out PNDIS_HANDLE MiniportDmaHandle,
__in NDIS_HANDLE MiniportAdapterHandle,
__in UINT DmaChannel,
__in BOOLEAN Dma32BitAddresses,
__in PNDIS_DMA_DESCRIPTION DmaDescription,
__in ULONG MaximumLength
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisMDeregisterDmaChannel(
__in NDIS_HANDLE MiniportDmaHandle
);
/*++
VOID
NdisMSetupDmaTransfer(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE MiniportDmaHandle,
IN PNDIS_BUFFER Buffer,
IN ULONG Offset,
IN ULONG Length,
IN BOOLEAN WriteToDevice
)
--*/
#define NdisMSetupDmaTransfer(_S, _H, _B, _O, _L, _M_) \
NdisSetupDmaTransfer(_S, _H, _B, _O, _L, _M_)
/*++
VOID
NdisMCompleteDmaTransfer(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE MiniportDmaHandle,
IN PNDIS_BUFFER Buffer,
IN ULONG Offset,
IN ULONG Length,
IN BOOLEAN WriteToDevice
)
--*/
#define NdisMCompleteDmaTransfer(_S, _H, _B, _O, _L, _M_) \
NdisCompleteDmaTransfer(_S, _H, _B, _O, _L, _M_)
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
ULONG
NdisMReadDmaCounter(
__in NDIS_HANDLE MiniportDmaHandle
);
//
// This API has been deprecated
//
DECLSPEC_DEPRECATED_DDK
EXPORT
VOID
NdisUpdateSharedMemory(
IN NDIS_HANDLE NdisAdapterHandle,
IN ULONG Length,
IN PVOID VirtualAddress,
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress
);
#if NDIS_SUPPORT_NDIS6
//
// Flags used in NDIS_SG_DMA_DESCRIPTION
//
#define NDIS_SG_DMA_64_BIT_ADDRESS 0x00000001
//
// supported revision
//
#define NDIS_SG_DMA_DESCRIPTION_REVISION_1 1
typedef struct _NDIS_SG_DMA_DESCRIPTION
{
NDIS_OBJECT_HEADER Header;
ULONG Flags;
ULONG MaximumPhysicalMapping;
MINIPORT_PROCESS_SG_LIST_HANDLER ProcessSGListHandler;
MINIPORT_ALLOCATE_SHARED_MEM_COMPLETE_HANDLER SharedMemAllocateCompleteHandler;
ULONG ScatterGatherListSize;
} NDIS_SG_DMA_DESCRIPTION, *PNDIS_SG_DMA_DESCRIPTION;
#define NDIS_SIZEOF_SG_DMA_DESCRIPTION_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_SG_DMA_DESCRIPTION, ScatterGatherListSize)
#define NDIS_MINIPORT_INIT_PARAMETERS_REVISION_1 1
typedef struct _NDIS_MINIPORT_INIT_PARAMETERS
{
__in NDIS_OBJECT_HEADER Header;
__in ULONG Flags;
__in PNDIS_RESOURCE_LIST AllocatedResources;
__in NDIS_HANDLE IMDeviceInstanceContext;
__in NDIS_HANDLE MiniportAddDeviceContext;
__in NET_IFINDEX IfIndex;
__in NET_LUID NetLuid;
__in PNDIS_PORT_AUTHENTICATION_PARAMETERS DefaultPortAuthStates;
__in PNDIS_PCI_DEVICE_CUSTOM_PROPERTIES PciDeviceCustomProperties;
} NDIS_MINIPORT_INIT_PARAMETERS, *PNDIS_MINIPORT_INIT_PARAMETERS;
#define NDIS_SIZEOF_MINIPORT_INIT_PARAMETER_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MINIPORT_INIT_PARAMETERS, PciDeviceCustomProperties)
//
// NDIS_MINIPORT_RESTART_PARAMETERS is used in MINIPORT_RESTART handler
//
#define NDIS_MINIPORT_RESTART_PARAMETERS_REVISION_1 1
typedef struct _NDIS_MINIPORT_RESTART_PARAMETERS
{
NDIS_OBJECT_HEADER Header;
PNDIS_RESTART_ATTRIBUTES RestartAttributes;
ULONG Flags;
} NDIS_MINIPORT_RESTART_PARAMETERS, *PNDIS_MINIPORT_RESTART_PARAMETERS;
#define NDIS_SIZEOF_MINIPORT_RESTART_PARAMETERS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MINIPORT_RESTART_PARAMETERS, Flags)
#define NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1 1
typedef struct _NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES
{
NDIS_OBJECT_HEADER Header;
NDIS_HANDLE MiniportAdapterContext;
ULONG AttributeFlags;
UINT CheckForHangTimeInSeconds;
NDIS_INTERFACE_TYPE InterfaceType;
} NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES, *PNDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES;
#define NDIS_SIZEOF_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES, InterfaceType)
//
// flags used in NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES->SupportedStatistics
//
#define NDIS_STATISTICS_XMIT_OK_SUPPORTED 0x00000001
#define NDIS_STATISTICS_RCV_OK_SUPPORTED 0x00000002
#define NDIS_STATISTICS_XMIT_ERROR_SUPPORTED 0x00000004
#define NDIS_STATISTICS_RCV_ERROR_SUPPORTED 0x00000008
#define NDIS_STATISTICS_RCV_NO_BUFFER_SUPPORTED 0x00000010
#define NDIS_STATISTICS_DIRECTED_BYTES_XMIT_SUPPORTED 0x00000020
#define NDIS_STATISTICS_DIRECTED_FRAMES_XMIT_SUPPORTED 0x00000040
#define NDIS_STATISTICS_MULTICAST_BYTES_XMIT_SUPPORTED 0x00000080
#define NDIS_STATISTICS_MULTICAST_FRAMES_XMIT_SUPPORTED 0x00000100
#define NDIS_STATISTICS_BROADCAST_BYTES_XMIT_SUPPORTED 0x00000200
#define NDIS_STATISTICS_BROADCAST_FRAMES_XMIT_SUPPORTED 0x00000400
#define NDIS_STATISTICS_DIRECTED_BYTES_RCV_SUPPORTED 0x00000800
#define NDIS_STATISTICS_DIRECTED_FRAMES_RCV_SUPPORTED 0x00001000
#define NDIS_STATISTICS_MULTICAST_BYTES_RCV_SUPPORTED 0x00002000
#define NDIS_STATISTICS_MULTICAST_FRAMES_RCV_SUPPORTED 0x00004000
#define NDIS_STATISTICS_BROADCAST_BYTES_RCV_SUPPORTED 0x00008000
#define NDIS_STATISTICS_BROADCAST_FRAMES_RCV_SUPPORTED 0x00010000
#define NDIS_STATISTICS_RCV_CRC_ERROR_SUPPORTED 0x00020000
#define NDIS_STATISTICS_TRANSMIT_QUEUE_LENGTH_SUPPORTED 0x00040000
#define NDIS_STATISTICS_BYTES_RCV_SUPPORTED 0x00080000
#define NDIS_STATISTICS_BYTES_XMIT_SUPPORTED 0x00100000
#define NDIS_STATISTICS_RCV_DISCARDS_SUPPORTED 0x00200000
#define NDIS_STATISTICS_GEN_STATISTICS_SUPPORTED 0x00400000
#define NDIS_STATISTICS_XMIT_DISCARDS_SUPPORTED 0x08000000
#define NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES_REVISION_1 1
typedef struct _NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES
{
NDIS_OBJECT_HEADER Header;
NDIS_HANDLE MiniportAddDeviceContext;
ULONG Flags;
} NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES,
*PNDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES;
#define NDIS_SIZEOF_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES, Flags)
#define NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1 1
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_2 2
#endif
typedef struct _NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES
{
NDIS_OBJECT_HEADER Header;
ULONG Flags;
NDIS_MEDIUM MediaType;
NDIS_PHYSICAL_MEDIUM PhysicalMediumType;
ULONG MtuSize;
ULONG64 MaxXmitLinkSpeed;
ULONG64 XmitLinkSpeed;
ULONG64 MaxRcvLinkSpeed;
ULONG64 RcvLinkSpeed;
NDIS_MEDIA_CONNECT_STATE MediaConnectState;
NDIS_MEDIA_DUPLEX_STATE MediaDuplexState;
ULONG LookaheadSize;
PNDIS_PNP_CAPABILITIES PowerManagementCapabilities; // 6.20 drivers must use PowerManagementCapabilitiesEx
ULONG MacOptions;
ULONG SupportedPacketFilters;
ULONG MaxMulticastListSize;
USHORT MacAddressLength;
UCHAR PermanentMacAddress[NDIS_MAX_PHYS_ADDRESS_LENGTH];
UCHAR CurrentMacAddress[NDIS_MAX_PHYS_ADDRESS_LENGTH];
PNDIS_RECEIVE_SCALE_CAPABILITIES RecvScaleCapabilities;
NET_IF_ACCESS_TYPE AccessType; // NET_IF_ACCESS_BROADCAST for a typical ethernet adapter
NET_IF_DIRECTION_TYPE DirectionType; // NET_IF_DIRECTION_SENDRECEIVE for a typical ethernet adapter
NET_IF_CONNECTION_TYPE ConnectionType; // IF_CONNECTION_DEDICATED for a typical ethernet adapter
NET_IFTYPE IfType; // IF_TYPE_ETHERNET_CSMACD for a typical ethernet adapter (regardless of speed)
BOOLEAN IfConnectorPresent; // RFC 2665 TRUE if physical adapter
ULONG SupportedStatistics; // use NDIS_STATISTICS_XXXX_SUPPORTED
ULONG SupportedPauseFunctions; // IEEE 802.3 37.2.1
ULONG DataBackFillSize;
ULONG ContextBackFillSize;
PNDIS_OID SupportedOidList;
ULONG SupportedOidListLength;
ULONG AutoNegotiationFlags;
#if (NDIS_SUPPORT_NDIS620)
PNDIS_PM_CAPABILITIES PowerManagementCapabilitiesEx;
#endif
} NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES, *PNDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES;
#define NDIS_SIZEOF_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES, AutoNegotiationFlags)
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_SIZEOF_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_2 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES, PowerManagementCapabilitiesEx)
#endif
#if (NDIS_SUPPORT_NDIS61)
//
// Flags and structure for Header/Data split
//
#define NDIS_HD_SPLIT_ATTRIBUTES_REVISION_1 1
typedef struct _NDIS_HD_SPLIT_ATTRIBUTES
{
__in NDIS_OBJECT_HEADER Header;
__in ULONG HardwareCapabilities;
__in ULONG CurrentCapabilities;
__out ULONG HDSplitFlags;
__out ULONG BackfillSize;
__out ULONG MaxHeaderSize;
} NDIS_HD_SPLIT_ATTRIBUTES, *PNDIS_HD_SPLIT_ATTRIBUTES;
#define NDIS_SIZEOF_HD_SPLIT_ATTRIBUTES_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_HD_SPLIT_ATTRIBUTES, MaxHeaderSize)
//
// The miniport registers its hardware assist capabilities through this
// structure
//
#define NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1 1
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_2 2
#endif
typedef struct _NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES
{
NDIS_OBJECT_HEADER Header;
PNDIS_HD_SPLIT_ATTRIBUTES HDSplitAttributes;
#if (NDIS_SUPPORT_NDIS620)
PNDIS_RECEIVE_FILTER_CAPABILITIES HardwareReceiveFilterCapabilities;
PNDIS_RECEIVE_FILTER_CAPABILITIES CurrentReceiveFilterCapabilities;
PNDIS_NIC_SWITCH_CAPABILITIES HardwareNicSwitchCapabilities;
PNDIS_NIC_SWITCH_CAPABILITIES CurrentNicSwitchCapabilities;
#endif
} NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES, *PNDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES;
#define NDIS_SIZEOF_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES, HDSplitAttributes)
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_SIZEOF_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_2 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES, CurrentNicSwitchCapabilities)
#endif
#endif // (NDIS_SUPPORT_NDIS61)
//
// The miniport registers its offload capabilities through this
// structure
//
#define NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES_REVISION_1 1
typedef struct _NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES
{
NDIS_OBJECT_HEADER Header;
PNDIS_OFFLOAD DefaultOffloadConfiguration;
PNDIS_OFFLOAD HardwareOffloadCapabilities;
PNDIS_TCP_CONNECTION_OFFLOAD DefaultTcpConnectionOffloadConfiguration;
PNDIS_TCP_CONNECTION_OFFLOAD TcpConnectionOffloadHardwareCapabilities;
} NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES, *PNDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES;
#define NDIS_SIZEOF_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES, TcpConnectionOffloadHardwareCapabilities)
#include <windot11.h>
#define NDIS_MINIPORT_ADAPTER_802_11_ATTRIBUTES_REVISION_1 1
#define NDIS_MINIPORT_ADAPTER_802_11_ATTRIBUTES_REVISION_2 2
typedef struct _NDIS_MINIPORT_ADAPTER_NATIVE_802_11_ATTRIBUTES
{
NDIS_OBJECT_HEADER Header;
ULONG OpModeCapability;
ULONG NumOfTXBuffers;
ULONG NumOfRXBuffers;
BOOLEAN MultiDomainCapabilityImplemented;
ULONG NumSupportedPhys;
#ifdef __midl
[size_is(NumSupportedPhys)]
#endif
PDOT11_PHY_ATTRIBUTES SupportedPhyAttributes;
// Attributes specific to the operation modes
PDOT11_EXTSTA_ATTRIBUTES ExtSTAAttributes;
#if (NDIS_SUPPORT_NDIS620)
// virtual wifi specific attributes
PDOT11_VWIFI_ATTRIBUTES VWiFiAttributes;
// Ext AP specific attributes
PDOT11_EXTAP_ATTRIBUTES ExtAPAttributes;
#endif // (NDIS_SUPPORT_NDIS620)
}NDIS_MINIPORT_ADAPTER_NATIVE_802_11_ATTRIBUTES,
*PNDIS_MINIPORT_ADAPTER_NATIVE_802_11_ATTRIBUTES;
#define NDIS_SIZEOF_MINIPORT_ADAPTER_NATIVE_802_11_ATTRIBUTES_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MINIPORT_ADAPTER_NATIVE_802_11_ATTRIBUTES, ExtSTAAttributes)
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_SIZEOF_MINIPORT_ADAPTER_NATIVE_802_11_ATTRIBUTES_REVISION_2 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MINIPORT_ADAPTER_NATIVE_802_11_ATTRIBUTES, ExtAPAttributes)
#endif // (NDIS_SUPPORT_NDIS620)
typedef union _NDIS_MINIPORT_ADAPTER_ATTRIBUTES
{
NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES AddDeviceRegistrationAttributes;
NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES RegistrationAttributes;
NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES GeneralAttributes;
NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES OffloadAttributes;
NDIS_MINIPORT_ADAPTER_NATIVE_802_11_ATTRIBUTES Native_802_11_Attributes;
#if (NDIS_SUPPORT_NDIS61)
NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES HardwareAssistAttributes;
#endif // (NDIS_SUPPORT_NDIS61)
} NDIS_MINIPORT_ADAPTER_ATTRIBUTES, *PNDIS_MINIPORT_ADAPTER_ATTRIBUTES;
//
// flags used in NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES
//
#define NDIS_MINIPORT_ATTRIBUTES_HARDWARE_DEVICE 0x00000001
#define NDIS_MINIPORT_ATTRIBUTES_NDIS_WDM 0x00000002
#define NDIS_MINIPORT_ATTRIBUTES_SURPRISE_REMOVE_OK 0x00000004
#define NDIS_MINIPORT_ATTRIBUTES_NOT_CO_NDIS 0x00000008
#define NDIS_MINIPORT_ATTRIBUTES_DO_NOT_BIND_TO_ALL_CO 0x00000010
#define NDIS_MINIPORT_ATTRIBUTES_NO_HALT_ON_SUSPEND 0x00000020
#define NDIS_MINIPORT_ATTRIBUTES_BUS_MASTER 0x00000040
#define NDIS_MINIPORT_ATTRIBUTES_CONTROLS_DEFAULT_PORT 0x00000080
//
// NDIS 6.0 miniport's entry points
//
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisMSetMiniportAttributes(
__in NDIS_HANDLE NdisMiniportHandle,
__in_bcount(((NDIS_OBJECT_HEADER)MiniportAttributes).Size)
PNDIS_MINIPORT_ADAPTER_ATTRIBUTES MiniportAttributes
);
typedef
NDIS_STATUS
(MINIPORT_INITIALIZE)(
__in NDIS_HANDLE NdisMiniportHandle,
__in NDIS_HANDLE MiniportDriverContext,
__in PNDIS_MINIPORT_INIT_PARAMETERS MiniportInitParameters
);
typedef MINIPORT_INITIALIZE (*MINIPORT_INITIALIZE_HANDLER);
typedef enum _NDIS_HALT_ACTION
{
NdisHaltDeviceDisabled,
NdisHaltDeviceInstanceDeInitialized,
NdisHaltDevicePoweredDown,
NdisHaltDeviceSurpriseRemoved,
NdisHaltDeviceFailed,
NdisHaltDeviceInitializationFailed,
NdisHaltDeviceStopped
} NDIS_HALT_ACTION, *PNDIS_HALT_ACTION;
typedef
VOID
(MINIPORT_HALT)(
__in NDIS_HANDLE MiniportAdapterContext,
__in NDIS_HALT_ACTION HaltAction
);
typedef MINIPORT_HALT (*MINIPORT_HALT_HANDLER);
#define NDIS_MINIPORT_PAUSE_PARAMETERS_REVISION_1 1
typedef struct _NDIS_MINIPORT_PAUSE_PARAMETERS
{
NDIS_OBJECT_HEADER Header;
ULONG Flags;
ULONG PauseReason;
} NDIS_MINIPORT_PAUSE_PARAMETERS, *PNDIS_MINIPORT_PAUSE_PARAMETERS;
#define NDIS_SIZEOF_MINIPORT_PAUSE_PARAMETERS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MINIPORT_PAUSE_PARAMETERS, PauseReason)
typedef
NDIS_STATUS
(MINIPORT_PAUSE)(
__in NDIS_HANDLE MiniportAdapterContext,
__in PNDIS_MINIPORT_PAUSE_PARAMETERS PauseParameters
);
typedef MINIPORT_PAUSE (*MINIPORT_PAUSE_HANDLER);
typedef
NDIS_STATUS
(MINIPORT_RESTART)(
__in NDIS_HANDLE MiniportAdapterContext,
__in PNDIS_MINIPORT_RESTART_PARAMETERS RestartParameters
);
typedef MINIPORT_RESTART (*MINIPORT_RESTART_HANDLER);
typedef
NDIS_STATUS
(MINIPORT_OID_REQUEST) (
__in NDIS_HANDLE MiniportAdapterContext,
__in PNDIS_OID_REQUEST OidRequest
);
typedef MINIPORT_OID_REQUEST (*MINIPORT_OID_REQUEST_HANDLER);
typedef
VOID
(MINIPORT_UNLOAD) (
__in PDRIVER_OBJECT DriverObject
);
typedef MINIPORT_UNLOAD (*MINIPORT_DRIVER_UNLOAD);
//
// reasons for calling shutdown handler
//
typedef enum _NDIS_SHUTDOWN_ACTION {
NdisShutdownPowerOff,
NdisShutdownBugCheck
} NDIS_SHUTDOWN_ACTION, PNDIS_SHUTDOWN_ACTION;
typedef
VOID
(MINIPORT_SHUTDOWN) (
__in NDIS_HANDLE MiniportAdapterContext,
__in NDIS_SHUTDOWN_ACTION ShutdownAction
);
typedef MINIPORT_SHUTDOWN (*MINIPORT_SHUTDOWN_HANDLER);
#define NET_DEVICE_PNP_EVENT_REVISION_1 1
typedef struct _NET_DEVICE_PNP_EVENT
{
NDIS_OBJECT_HEADER Header;
NDIS_PORT_NUMBER PortNumber;
NDIS_DEVICE_PNP_EVENT DevicePnPEvent;
PVOID InformationBuffer;
ULONG InformationBufferLength;
UCHAR NdisReserved[2 * sizeof(PVOID)];
} NET_DEVICE_PNP_EVENT, *PNET_DEVICE_PNP_EVENT;
#define NDIS_SIZEOF_NET_DEVICE_PNP_EVENT_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NET_DEVICE_PNP_EVENT, NdisReserved)
typedef
VOID
(MINIPORT_DEVICE_PNP_EVENT_NOTIFY)(
__in NDIS_HANDLE MiniportAdapterContext,
__in PNET_DEVICE_PNP_EVENT NetDevicePnPEvent
);
typedef MINIPORT_DEVICE_PNP_EVENT_NOTIFY (*MINIPORT_DEVICE_PNP_EVENT_NOTIFY_HANDLER);
typedef
VOID
(MINIPORT_CANCEL_SEND)(
__in NDIS_HANDLE MiniportAdapterContext,
__in PVOID CancelId
);
typedef MINIPORT_CANCEL_SEND (*MINIPORT_CANCEL_SEND_HANDLER);
typedef
BOOLEAN
(MINIPORT_CHECK_FOR_HANG)(
__in NDIS_HANDLE MiniportAdapterContext
);
typedef MINIPORT_CHECK_FOR_HANG (*MINIPORT_CHECK_FOR_HANG_HANDLER);
typedef
NDIS_STATUS
(MINIPORT_RESET)(
__in NDIS_HANDLE MiniportAdapterContext,
__out PBOOLEAN AddressingReset
);
typedef MINIPORT_RESET (*MINIPORT_RESET_HANDLER);
typedef
VOID
(MINIPORT_CANCEL_OID_REQUEST)(
__in NDIS_HANDLE MiniportAdapterContext,
__in PVOID RequestId
);
typedef MINIPORT_CANCEL_OID_REQUEST (*MINIPORT_CANCEL_OID_REQUEST_HANDLER);
typedef
VOID
(MINIPORT_SEND_NET_BUFFER_LISTS)(
__in NDIS_HANDLE MiniportAdapterContext,
__in PNET_BUFFER_LIST NetBufferList,
__in NDIS_PORT_NUMBER PortNumber,
__in ULONG SendFlags
);
typedef MINIPORT_SEND_NET_BUFFER_LISTS (*MINIPORT_SEND_NET_BUFFER_LISTS_HANDLER);
typedef
VOID
(MINIPORT_RETURN_NET_BUFFER_LISTS)(
__in NDIS_HANDLE MiniportAdapterContext,
__in PNET_BUFFER_LIST NetBufferLists,
__in ULONG ReturnFlags
);
typedef MINIPORT_RETURN_NET_BUFFER_LISTS (*MINIPORT_RETURN_NET_BUFFER_LISTS_HANDLER);
#if (NDIS_SUPPORT_NDIS61)
//
// NDIS 6.1 miniport's entry points
//
typedef
NDIS_STATUS
(MINIPORT_DIRECT_OID_REQUEST) (
__in NDIS_HANDLE MiniportAdapterContext,
__in PNDIS_OID_REQUEST OidRequest
);
typedef MINIPORT_DIRECT_OID_REQUEST (*MINIPORT_DIRECT_OID_REQUEST_HANDLER);
typedef
VOID
(MINIPORT_CANCEL_DIRECT_OID_REQUEST)(
__in NDIS_HANDLE MiniportAdapterContext,
__in PVOID RequestId
);
typedef MINIPORT_CANCEL_DIRECT_OID_REQUEST (*MINIPORT_CANCEL_DIRECT_OID_REQUEST_HANDLER);
#endif // (NDIS_SUPPORT_NDIS61)
//
// flags used in Flags field of NDIS60_MINIPORT_CHARACTERISTICS
//
#define NDIS_INTERMEDIATE_DRIVER 0x00000001
#define NDIS_WDM_DRIVER 0x00000002
#define NDIS_MINIPORT_DRIVER_CHARACTERISTICS_REVISION_1 1
#if (NDIS_SUPPORT_NDIS61)
#define NDIS_MINIPORT_DRIVER_CHARACTERISTICS_REVISION_2 2
#endif // (NDIS_SUPPORT_NDIS61)
typedef struct _NDIS_MINIPORT_DRIVER_CHARACTERISTICS
{
NDIS_OBJECT_HEADER Header;
UCHAR MajorNdisVersion;
UCHAR MinorNdisVersion;
UCHAR MajorDriverVersion;
UCHAR MinorDriverVersion;
ULONG Flags;
SET_OPTIONS_HANDLER SetOptionsHandler;
MINIPORT_INITIALIZE_HANDLER InitializeHandlerEx;
MINIPORT_HALT_HANDLER HaltHandlerEx;
MINIPORT_DRIVER_UNLOAD UnloadHandler;
MINIPORT_PAUSE_HANDLER PauseHandler;
MINIPORT_RESTART_HANDLER RestartHandler;
MINIPORT_OID_REQUEST_HANDLER OidRequestHandler;
MINIPORT_SEND_NET_BUFFER_LISTS_HANDLER SendNetBufferListsHandler;
MINIPORT_RETURN_NET_BUFFER_LISTS_HANDLER ReturnNetBufferListsHandler;
MINIPORT_CANCEL_SEND_HANDLER CancelSendHandler;
MINIPORT_CHECK_FOR_HANG_HANDLER CheckForHangHandlerEx;
MINIPORT_RESET_HANDLER ResetHandlerEx;
MINIPORT_DEVICE_PNP_EVENT_NOTIFY_HANDLER DevicePnPEventNotifyHandler;
MINIPORT_SHUTDOWN_HANDLER ShutdownHandlerEx;
MINIPORT_CANCEL_OID_REQUEST_HANDLER CancelOidRequestHandler;
#if (NDIS_SUPPORT_NDIS61)
MINIPORT_DIRECT_OID_REQUEST_HANDLER DirectOidRequestHandler;
MINIPORT_CANCEL_DIRECT_OID_REQUEST_HANDLER CancelDirectOidRequestHandler;
#endif // (NDIS_SUPPORT_NDIS61)
} NDIS_MINIPORT_DRIVER_CHARACTERISTICS, *PNDIS_MINIPORT_DRIVER_CHARACTERISTICS;
#define NDIS_SIZEOF_MINIPORT_DRIVER_CHARACTERISTICS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MINIPORT_DRIVER_CHARACTERISTICS, CancelOidRequestHandler)
#if (NDIS_SUPPORT_NDIS61)
#define NDIS_SIZEOF_MINIPORT_DRIVER_CHARACTERISTICS_REVISION_2 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MINIPORT_DRIVER_CHARACTERISTICS, CancelDirectOidRequestHandler)
#endif // (NDIS_SUPPORT_NDIS61)
//
// CO NDIS 6.0 handlers
//
#define NDIS_MINIPORT_CO_CHARACTERISTICS_REVISION_1 1
typedef struct _NDIS_MINIPORT_CO_CHARACTERISTICS
{
NDIS_OBJECT_HEADER Header; // Header.Type = NDIS_OBJECT_TYPE_PROTOCOL_CO_CHARACTERISTICS
ULONG Flags;
W_CO_CREATE_VC_HANDLER CoCreateVcHandler;
W_CO_DELETE_VC_HANDLER CoDeleteVcHandler;
W_CO_ACTIVATE_VC_HANDLER CoActivateVcHandler;
W_CO_DEACTIVATE_VC_HANDLER CoDeactivateVcHandler;
W_CO_SEND_NET_BUFFER_LISTS_HANDLER CoSendNetBufferListsHandler;
W_CO_OID_REQUEST_HANDLER CoOidRequestHandler;
} NDIS_MINIPORT_CO_CHARACTERISTICS, *PNDIS_MINIPORT_CO_CHARACTERISTICS;
#define NDIS_SIZEOF_MINIPORT_CO_CHARACTERISTICS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MINIPORT_CO_CHARACTERISTICS, CoOidRequestHandler)
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMIndicateStatusEx(
__in NDIS_HANDLE MiniportAdapterHandle,
__in PNDIS_STATUS_INDICATION StatusIndication
);
EXPORT
VOID
NdisMCoOidRequestComplete(
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_HANDLE NdisMiniportVcHandle,
IN PNDIS_OID_REQUEST Request,
IN NDIS_STATUS Status
);
EXPORT
NDIS_STATUS
NdisMCmOidRequest(
IN NDIS_HANDLE NdisAfHandle,
IN NDIS_HANDLE NdisVcHandle OPTIONAL,
IN NDIS_HANDLE NdisPartyHandle OPTIONAL,
IN OUT PNDIS_OID_REQUEST NdisRequest
);
EXPORT
VOID
NdisMCoIndicateStatusEx(
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_HANDLE NdisVcHandle OPTIONAL,
IN PNDIS_STATUS_INDICATION StatusIndication
);
#endif // NDIS_SUPPORT_NDIS6
//
// Do not change the structure below !!!
//
typedef struct
{
union
{
PETH_FILTER EthDB;
PNULL_FILTER NullDB; // Default Filter
};
PTR_FILTER TrDB;
PVOID YYYDB;
PVOID XXXDB;
} FILTERDBS, *PFILTERDBS;
#if NDIS_LEGACY_MINIPORT
typedef
VOID
(*FILTER_PACKET_INDICATION_HANDLER)(
__in NDIS_HANDLE Miniport,
__in PPNDIS_PACKET PacketArray,
__in UINT NumberOfPackets
);
#endif // NDIS_LEGACY_MINIPORT
#if !NDIS_WRAPPER
//
// one of these per mini-port registered on a Driver
//
#if NDIS_LEGACY_MINIPORT
#pragma warning(push)
#pragma warning(disable:4201) // (nonstandard extension used : nameless struct/union)
struct _NDIS_MINIPORT_BLOCK
{
NDIS_OBJECT_HEADER Header;
PNDIS_MINIPORT_BLOCK NextMiniport; // used by driver's MiniportQueue
PNDIS_MINIPORT_BLOCK BaseMiniport;
NDIS_HANDLE MiniportAdapterContext; // context when calling mini-port functions
UNICODE_STRING Reserved4;
PVOID Reserved10;
NDIS_HANDLE OpenQueue; // queue of opens for this mini-port
REFERENCE ShortRef; // contains spinlock for OpenQueue
NDIS_HANDLE Reserved12;
UCHAR Padding1; // DO NOT REMOVE OR NDIS WILL BREAK!!!
//
// Synchronization stuff.
//
// The boolean is used to lock out several DPCs from running at the same time.
//
UCHAR LockAcquired; // EXPOSED via macros. Do not move
UCHAR PmodeOpens; // Count of opens which turned on pmode/all_local
//
// This is the processor number that the miniport's
// interrupt DPC and timers are running on.
//
// Note: This field is no longer used
//
UCHAR Reserved23;
KSPIN_LOCK Lock;
PNDIS_REQUEST MediaRequest;
PVOID Interrupt;
ULONG Flags; // Flags to keep track of the miniport's state.
ULONG PnPFlags;
//
// Send information
//
LIST_ENTRY PacketList;
PNDIS_PACKET FirstPendingPacket; // This is head of the queue of packets
// waiting to be sent to miniport.
PNDIS_PACKET ReturnPacketsQueue;
//
// Space used for temp. use during request processing
//
ULONG RequestBuffer;
PVOID SetMCastBuffer;
PNDIS_MINIPORT_BLOCK PrimaryMiniport;
PVOID Reserved11;
//
// context to pass to bus driver when reading or writing config space
//
PVOID BusDataContext;
ULONG Reserved3;
//
// Resource information
//
PCM_RESOURCE_LIST Resources;
//
// Watch-dog timer
//
NDIS_TIMER WakeUpDpcTimer;
//
// Needed for PnP. Upcased version. The buffer is allocated as part of the
// NDIS_MINIPORT_BLOCK itself.
//
// Note:
// the following two fields should be explicitly UNICODE_STRING because
// under Win9x the NDIS_STRING is an ANSI_STRING
//
UNICODE_STRING Reserved20;
UNICODE_STRING SymbolicLinkName;
//
// Check for hang stuff
//
ULONG CheckForHangSeconds;
USHORT CFHangTicks;
USHORT CFHangCurrentTick;
//
// Reset information
//
NDIS_STATUS ResetStatus;
NDIS_HANDLE ResetOpen;
//
// Holds media specific information.
//
#ifdef __cplusplus
FILTERDBS FilterDbs; // EXPOSED via macros. Do not move
#else
FILTERDBS; // EXPOSED via macros. Do not move
#endif
FILTER_PACKET_INDICATION_HANDLER PacketIndicateHandler;
NDIS_M_SEND_COMPLETE_HANDLER SendCompleteHandler;
NDIS_M_SEND_RESOURCES_HANDLER SendResourcesHandler;
NDIS_M_RESET_COMPLETE_HANDLER ResetCompleteHandler;
NDIS_MEDIUM MediaType;
//
// contains mini-port information
//
ULONG BusNumber;
NDIS_INTERFACE_TYPE BusType;
NDIS_INTERFACE_TYPE AdapterType;
PDEVICE_OBJECT Reserved6;
PDEVICE_OBJECT Reserved7;
PDEVICE_OBJECT Reserved8;
PVOID MiniportSGDmaBlock;
//
// List of registered address families. Valid for the call-manager, Null for the client
//
PNDIS_AF_LIST CallMgrAfList;
PVOID MiniportThread;
PVOID SetInfoBuf;
USHORT SetInfoBufLen;
USHORT MaxSendPackets;
//
// Status code that is returned from the fake handlers.
//
NDIS_STATUS FakeStatus;
PVOID Reserved24; // For the filter lock
PUNICODE_STRING Reserved9;
PVOID Reserved21;
UINT MacOptions;
//
// RequestInformation
//
PNDIS_REQUEST PendingRequest;
UINT MaximumLongAddresses;
UINT MaximumShortAddresses;
UINT CurrentLookahead;
UINT MaximumLookahead;
//
// For efficiency
//
ULONG_PTR Reserved1;
W_DISABLE_INTERRUPT_HANDLER DisableInterruptHandler;
W_ENABLE_INTERRUPT_HANDLER EnableInterruptHandler;
W_SEND_PACKETS_HANDLER SendPacketsHandler;
NDIS_M_START_SENDS DeferredSendHandler;
//
// The following cannot be unionized.
//
ETH_RCV_INDICATE_HANDLER EthRxIndicateHandler; // EXPOSED via macros. Do not move
TR_RCV_INDICATE_HANDLER TrRxIndicateHandler; // EXPOSED via macros. Do not move
PVOID Reserved2;
ETH_RCV_COMPLETE_HANDLER EthRxCompleteHandler; // EXPOSED via macros. Do not move
TR_RCV_COMPLETE_HANDLER TrRxCompleteHandler; // EXPOSED via macros. Do not move
PVOID Reserved22;
NDIS_M_STATUS_HANDLER StatusHandler; // EXPOSED via macros. Do not move
NDIS_M_STS_COMPLETE_HANDLER StatusCompleteHandler; // EXPOSED via macros. Do not move
NDIS_M_TD_COMPLETE_HANDLER TDCompleteHandler; // EXPOSED via macros. Do not move
NDIS_M_REQ_COMPLETE_HANDLER QueryCompleteHandler; // EXPOSED via macros. Do not move
NDIS_M_REQ_COMPLETE_HANDLER SetCompleteHandler; // EXPOSED via macros. Do not move
NDIS_WM_SEND_COMPLETE_HANDLER WanSendCompleteHandler;// EXPOSED via macros. Do not move
WAN_RCV_HANDLER WanRcvHandler; // EXPOSED via macros. Do not move
WAN_RCV_COMPLETE_HANDLER WanRcvCompleteHandler; // EXPOSED via macros. Do not move
/********************************************************************************************/
/**************** **********/
/**************** STUFF ABOVE IS POTENTIALLY ACCESSED BY MACROS. ADD STUFF BELOW **********/
/**************** SEVERE POSSIBILITY OF BREAKING SOMETHING IF STUFF ABOVE IS MOVED **********/
/**************** **********/
/********************************************************************************************/
};
#pragma warning(pop)
#endif // NDIS_LEGACY_MINIPORT
#endif // NDIS_WRAPPER not defined
#if NDIS_LEGACY_MINIPORT
#ifdef NDIS51_MINIPORT
typedef struct _NDIS51_MINIPORT_CHARACTERISTICS NDIS_MINIPORT_CHARACTERISTICS;
#else
#ifdef NDIS50_MINIPORT
typedef struct _NDIS50_MINIPORT_CHARACTERISTICS NDIS_MINIPORT_CHARACTERISTICS;
#else
#ifdef NDIS40_MINIPORT
typedef struct _NDIS40_MINIPORT_CHARACTERISTICS NDIS_MINIPORT_CHARACTERISTICS;
#else
typedef struct _NDIS30_MINIPORT_CHARACTERISTICS NDIS_MINIPORT_CHARACTERISTICS;
#endif
#endif
#endif
typedef NDIS_MINIPORT_CHARACTERISTICS * PNDIS_MINIPORT_CHARACTERISTICS;
typedef NDIS_MINIPORT_CHARACTERISTICS NDIS_WAN_MINIPORT_CHARACTERISTICS;
typedef NDIS_WAN_MINIPORT_CHARACTERISTICS * PNDIS_MINIPORT_CHARACTERISTICS;
//
// Routines for intermediate miniport drivers. NDIS 6 IM drivers
// use the same registration deregistration APIs as regular miniports
//
EXPORT
NDIS_STATUS
NdisIMRegisterLayeredMiniport(
IN NDIS_HANDLE NdisWrapperHandle,
IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics,
IN UINT CharacteristicsLength,
OUT PNDIS_HANDLE DriverHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisIMDeregisterLayeredMiniport(
__in NDIS_HANDLE DriverHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisMRegisterDevice(
__in NDIS_HANDLE NdisWrapperHandle,
__in PNDIS_STRING DeviceName,
__in PNDIS_STRING SymbolicName,
__in PDRIVER_DISPATCH MajorFunctions[],
__out PDEVICE_OBJECT * pDeviceObject,
__out NDIS_HANDLE * NdisDeviceHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisMDeregisterDevice(
__in NDIS_HANDLE NdisDeviceHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisMRegisterUnloadHandler(
__in NDIS_HANDLE NdisWrapperHandle,
__in PDRIVER_UNLOAD UnloadHandler
);
#endif // NDIS_LEGACY_MINIPORT
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisIMAssociateMiniport(
__in NDIS_HANDLE DriverHandle,
__in NDIS_HANDLE ProtocolHandle
);
//
// Operating System Requests
//
typedef UCHAR NDIS_DMA_SIZE;
#define NDIS_DMA_24BITS ((NDIS_DMA_SIZE)0)
#define NDIS_DMA_32BITS ((NDIS_DMA_SIZE)1)
#define NDIS_DMA_64BITS ((NDIS_DMA_SIZE)2)
#if NDIS_LEGACY_MINIPORT
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
__drv_preferredFunction("NdisMInitializeScatterGatherDma", "See details in NdisMAllocateMapRegisters documentation")
EXPORT
NDIS_STATUS
NdisMAllocateMapRegisters(
__in NDIS_HANDLE MiniportAdapterHandle,
__in UINT DmaChannel,
__in NDIS_DMA_SIZE DmaSize,
__in ULONG BaseMapRegistersNeeded,
__in ULONG MaximumPhysicalMapping
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisMFreeMapRegisters(
__in NDIS_HANDLE MiniportAdapterHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisMInitializeScatterGatherDma(
__in NDIS_HANDLE MiniportAdapterHandle,
__in BOOLEAN Dma64BitAddresses,
__in ULONG MaximumPhysicalMapping
);
#endif // NDIS_LEGACY_MINIPORT
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisMRegisterIoPortRange(
__out PVOID * PortOffset,
__in NDIS_HANDLE MiniportAdapterHandle,
__in UINT InitialPort,
__in UINT NumberOfPorts
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisMDeregisterIoPortRange(
__in NDIS_HANDLE MiniportAdapterHandle,
__in UINT InitialPort,
__in UINT NumberOfPorts,
__in PVOID PortOffset
);
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisMMapIoSpace(
__deref_out_bcount(Length) PVOID * VirtualAddress,
__in NDIS_HANDLE MiniportAdapterHandle,
__in NDIS_PHYSICAL_ADDRESS PhysicalAddress,
__in UINT Length
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisMUnmapIoSpace(
__in NDIS_HANDLE MiniportAdapterHandle,
__in_bcount(Length) PVOID VirtualAddress,
__in UINT Length
);
#if NDIS_LEGACY_MINIPORT
EXPORT
NDIS_STATUS
NdisMRegisterInterrupt(
OUT PNDIS_MINIPORT_INTERRUPT Interrupt,
IN NDIS_HANDLE MiniportAdapterHandle,
IN UINT InterruptVector,
IN UINT InterruptLevel,
IN BOOLEAN RequestIsr,
IN BOOLEAN SharedInterrupt,
IN NDIS_INTERRUPT_MODE InterruptMode
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisMDeregisterInterrupt(
__in PNDIS_MINIPORT_INTERRUPT Interrupt
);
EXPORT
BOOLEAN
NdisMSynchronizeWithInterrupt(
IN PNDIS_MINIPORT_INTERRUPT Interrupt,
#if (NDIS_SUPPORT_NDIS620)
IN MINIPORT_SYNCHRONIZE_INTERRUPT_HANDLER SynchronizeFunction,
#else
IN PVOID SynchronizeFunction,
#endif
IN PVOID SynchronizeContext
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisMQueryAdapterResources(
__out PNDIS_STATUS Status,
__in NDIS_HANDLE WrapperConfigurationContext,
__out PNDIS_RESOURCE_LIST ResourceList,
__deref_inout PUINT BufferSize
);
//
// Physical Mapping
//
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMStartBufferPhysicalMapping(
__in NDIS_HANDLE MiniportAdapterHandle,
__in PNDIS_BUFFER Buffer,
__in ULONG PhysicalMapRegister,
__in BOOLEAN WriteToDevice,
__out PNDIS_PHYSICAL_ADDRESS_UNIT PhysicalAddressArray,
__out PUINT ArraySize
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMCompleteBufferPhysicalMapping(
__in NDIS_HANDLE MiniportAdapterHandle,
__in PNDIS_BUFFER Buffer,
__in ULONG PhysicalMapRegister
);
/*++
//
// This API has been deprecated
//
VOID
NdisMUpdateSharedMemory(
IN NDIS_HANDLE MiniportAdapterHandle,
IN ULONG Length,
IN PVOID VirtualAddress,
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress
);
*/
#define NdisMUpdateSharedMemory(_H, _L, _V, _P)
#pragma deprecated(NdisMUpdateSharedMemory)
#endif // NDIS_LEGACY_MINIPORT
//
// Timers
//
// VOID
// NdisMSetTimer(
// IN PNDIS_MINIPORT_TIMER Timer,
// IN UINT MillisecondsToDelay
// );
#define NdisMSetTimer(_Timer, _Delay) NdisSetTimer((PNDIS_TIMER)_Timer, _Delay)
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMSetPeriodicTimer(
__in PNDIS_MINIPORT_TIMER Timer,
__in UINT MillisecondPeriod
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMInitializeTimer(
__in OUT PNDIS_MINIPORT_TIMER Timer,
__in NDIS_HANDLE MiniportAdapterHandle,
__in PNDIS_TIMER_FUNCTION TimerFunction,
__in PVOID FunctionContext
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMCancelTimer(
__in PNDIS_MINIPORT_TIMER Timer,
__out __checkReturn
PBOOLEAN TimerCancelled
);
__drv_maxIRQL(APC_LEVEL)
EXPORT
VOID
NdisMSleep(
__in ULONG MicrosecondsToSleep
);
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
ULONG
NdisMGetDmaAlignment(
__in NDIS_HANDLE MiniportAdapterHandle
);
//
// Shared memory
//
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisMAllocateSharedMemory(
__in NDIS_HANDLE MiniportAdapterHandle,
__in ULONG Length,
__in BOOLEAN Cached,
__deref_out __checkReturn
PVOID * VirtualAddress,
__out __checkReturn
PNDIS_PHYSICAL_ADDRESS PhysicalAddress
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMFreeSharedMemory(
__in NDIS_HANDLE MiniportAdapterHandle,
__in ULONG Length,
__in BOOLEAN Cached,
__in_bcount(Length) PVOID VirtualAddress,
__in NDIS_PHYSICAL_ADDRESS PhysicalAddress
);
#if NDIS_LEGACY_MINIPORT
//
// Requests Used by Miniport Drivers
//
#define NdisMInitializeWrapper(_a,_b,_c,_d) NdisInitializeWrapper((_a),(_b),(_c),(_d))
EXPORT
NDIS_STATUS
NdisMRegisterMiniport(
IN NDIS_HANDLE NdisWrapperHandle,
IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics,
IN UINT CharacteristicsLength
);
// EXPORT
// NDIS_STATUS
// NdisIMInitializeDeviceInstance(
// IN NDIS_HANDLE DriverHandle,
// IN PNDIS_STRING DriverInstance
// );
#define NdisIMInitializeDeviceInstance(_H_, _I_) \
NdisIMInitializeDeviceInstanceEx(_H_, _I_, NULL)
#endif // NDIS_LEGACY_MINIPORT
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisIMInitializeDeviceInstanceEx(
__in NDIS_HANDLE DriverHandle,
__in PNDIS_STRING DriverInstance,
__in_opt NDIS_HANDLE DeviceContext
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisIMCancelInitializeDeviceInstance(
__in NDIS_HANDLE DriverHandle,
__in PNDIS_STRING DeviceInstance
);
#if NDIS_LEGACY_MINIPORT
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_HANDLE
NdisIMGetDeviceContext(
__in NDIS_HANDLE MiniportAdapterHandle
);
#endif // NDIS_LEGACY_MINIPORT
__drv_maxIRQL(APC_LEVEL)
EXPORT
NDIS_HANDLE
NdisIMGetBindingContext(
__in NDIS_HANDLE NdisBindingHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisIMDeInitializeDeviceInstance(
__in NDIS_HANDLE NdisMiniportHandle
);
#if NDIS_LEGACY_MINIPORT
EXPORT
VOID
NdisIMCopySendPerPacketInfo(
OUT PNDIS_PACKET DstPacket,
IN PNDIS_PACKET SrcPacket
);
EXPORT
VOID
NdisIMCopySendCompletePerPacketInfo(
OUT PNDIS_PACKET DstPacket,
IN PNDIS_PACKET SrcPacket
);
// EXPORT
// VOID
// NdisMSetAttributes(
// IN NDIS_HANDLE MiniportAdapterHandle,
// IN NDIS_HANDLE MiniportAdapterContext,
// IN BOOLEAN BusMaster,
// IN NDIS_INTERFACE_TYPE AdapterType
// );
#define NdisMSetAttributes(_H_, _C_, _M_, _T_) \
NdisMSetAttributesEx(_H_, \
_C_, \
0, \
(_M_) ? NDIS_ATTRIBUTE_BUS_MASTER : 0, \
_T_) \
EXPORT
VOID
NdisMSetAttributesEx(
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_HANDLE MiniportAdapterContext,
IN UINT CheckForHangTimeInSeconds OPTIONAL,
IN ULONG AttributeFlags,
IN NDIS_INTERFACE_TYPE AdapterType OPTIONAL
);
#define NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT 0x00000001
#define NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT 0x00000002
#define NDIS_ATTRIBUTE_IGNORE_TOKEN_RING_ERRORS 0x00000004
#define NDIS_ATTRIBUTE_BUS_MASTER 0x00000008
#define NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER 0x00000010
#define NDIS_ATTRIBUTE_DESERIALIZE 0x00000020
#define NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND 0x00000040
#define NDIS_ATTRIBUTE_SURPRISE_REMOVE_OK 0x00000080
#define NDIS_ATTRIBUTE_NOT_CO_NDIS 0x00000100
#define NDIS_ATTRIBUTE_USES_SAFE_BUFFER_APIS 0x00000200
#define NDIS_ATTRIBUTE_DO_NOT_BIND_TO_ALL_CO 0x00000400
#define NDIS_ATTRIBUTE_MINIPORT_PADS_SHORT_PACKETS 0x00000800
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisMSetMiniportSecondary(
__in NDIS_HANDLE MiniportHandle,
__in NDIS_HANDLE PrimaryMiniportHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisMPromoteMiniport(
__in NDIS_HANDLE MiniportHandle
);
#endif // NDIS_LEGACY_MINIPORT
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisMRemoveMiniport(
__in NDIS_HANDLE MiniportHandle
);
#if NDIS_LEGACY_MINIPORT
#define NdisMSendComplete(_M, _P, _S) (*((PNDIS_MINIPORT_BLOCK)(_M))->SendCompleteHandler)(_M, _P, _S)
#define NdisMSendResourcesAvailable(_M) (*((PNDIS_MINIPORT_BLOCK)(_M))->SendResourcesHandler)(_M)
#if (!NDIS_WRAPPER)
#if (!NDIS_SUPPORT_NDIS6)
#define NdisMResetComplete(_M, _S, _A) (*((PNDIS_MINIPORT_BLOCK)(_M))->ResetCompleteHandler)(_M, _S, _A)
#endif // NDIS_SUPPORT_NDIS6
#endif // !NDIS_WRAPPER
#define NdisMTransferDataComplete(_M, _P, _S, _B) \
(*((PNDIS_MINIPORT_BLOCK)(_M))->TDCompleteHandler)(_M, _P, _S, _B)
/*++
VOID
NdisMWanSendComplete(
IN NDIS_HANDLE MiniportAdapterHandle,
IN PVOID Packet,
IN NDIS_STATUS Status
);
--*/
#define NdisMWanSendComplete(_M_, _P_, _S_) \
(*((PNDIS_MINIPORT_BLOCK)(_M_))->WanSendCompleteHandler)(_M_, _P_, _S_)
#define NdisMQueryInformationComplete(_M, _S) \
(*((PNDIS_MINIPORT_BLOCK)(_M))->QueryCompleteHandler)(_M, _S)
#define NdisMSetInformationComplete(_M, _S) \
(*((PNDIS_MINIPORT_BLOCK)(_M))->SetCompleteHandler)(_M, _S)
/*++
VOID
NdisMIndicateReceivePacket(
IN NDIS_HANDLE MiniportAdapterHandle,
IN PPNDIS_PACKET ReceivedPackets,
IN UINT NumberOfPackets
);
--*/
#define NdisMIndicateReceivePacket(_H, _P, _N) \
{ \
(*((PNDIS_MINIPORT_BLOCK)(_H))->PacketIndicateHandler)( \
_H, \
_P, \
_N); \
}
/*++
VOID
NdisMWanIndicateReceive(
OUT PNDIS_STATUS Status,
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_HANDLE NdisLinkContext,
IN PUCHAR Packet,
IN ULONG PacketSize
);
--*/
#define NdisMWanIndicateReceive(_S_, _M_, _C_, _P_, _Z_) \
(*((PNDIS_MINIPORT_BLOCK)(_M_))->WanRcvHandler)(_S_, _M_, _C_, _P_, _Z_)
/*++
VOID
NdisMWanIndicateReceiveComplete(
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_HANDLE NdisLinkContext
);
--*/
#define NdisMWanIndicateReceiveComplete(_M_, _C_) \
(*((PNDIS_MINIPORT_BLOCK)(_M_))->WanRcvCompleteHandler)(_M_, _C_)
/*++
VOID
NdisMEthIndicateReceive(
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_HANDLE MiniportReceiveContext,
IN PVOID HeaderBuffer,
IN UINT HeaderBufferSize,
IN PVOID LookaheadBuffer,
IN UINT LookaheadBufferSize,
IN UINT PacketSize
)
--*/
#ifdef __cplusplus
#define NdisMEthIndicateReceive( _H, _C, _B, _SZ, _L, _LSZ, _PSZ) \
{ \
(*((PNDIS_MINIPORT_BLOCK)(_H))->EthRxIndicateHandler)( \
((PNDIS_MINIPORT_BLOCK)(_H))->FilterDbs.EthDB, \
_C, \
_B, \
_B, \
_SZ, \
_L, \
_LSZ, \
_PSZ \
); \
}
#else
#define NdisMEthIndicateReceive( _H, _C, _B, _SZ, _L, _LSZ, _PSZ) \
{ \
(*((PNDIS_MINIPORT_BLOCK)(_H))->EthRxIndicateHandler)( \
((PNDIS_MINIPORT_BLOCK)(_H))->EthDB, \
_C, \
_B, \
_B, \
_SZ, \
_L, \
_LSZ, \
_PSZ \
); \
}
#endif
/*++
VOID
NdisMTrIndicateReceive(
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_HANDLE MiniportReceiveContext,
IN PVOID HeaderBuffer,
IN UINT HeaderBufferSize,
IN PVOID LookaheadBuffer,
IN UINT LookaheadBufferSize,
IN UINT PacketSize
)
--*/
#ifdef __cplusplus
#define NdisMTrIndicateReceive( _H, _C, _B, _SZ, _L, _LSZ, _PSZ) \
{ \
(*((PNDIS_MINIPORT_BLOCK)(_H))->TrRxIndicateHandler)( \
((PNDIS_MINIPORT_BLOCK)(_H))->FilterDbs.TrDB, \
_C, \
_B, \
_SZ, \
_L, \
_LSZ, \
_PSZ \
); \
}
#else
#define NdisMTrIndicateReceive( _H, _C, _B, _SZ, _L, _LSZ, _PSZ) \
{ \
(*((PNDIS_MINIPORT_BLOCK)(_H))->TrRxIndicateHandler)( \
((PNDIS_MINIPORT_BLOCK)(_H))->TrDB, \
_C, \
_B, \
_SZ, \
_L, \
_LSZ, \
_PSZ \
); \
}
#endif
/*++
VOID
NdisMEthIndicateReceiveComplete(
IN NDIS_HANDLE MiniportHandle
);
--*/
#ifdef __cplusplus
#define NdisMEthIndicateReceiveComplete( _H ) \
{ \
(*((PNDIS_MINIPORT_BLOCK)(_H))->EthRxCompleteHandler)( \
((PNDIS_MINIPORT_BLOCK)_H)->FilterDbs.EthDB); \
}
#else
#define NdisMEthIndicateReceiveComplete( _H ) \
{ \
(*((PNDIS_MINIPORT_BLOCK)(_H))->EthRxCompleteHandler)( \
((PNDIS_MINIPORT_BLOCK)_H)->EthDB); \
}
#endif
/*++
VOID
NdisMTrIndicateReceiveComplete(
IN NDIS_HANDLE MiniportHandle
);
--*/
#ifdef __cplusplus
#define NdisMTrIndicateReceiveComplete( _H ) \
{ \
(*((PNDIS_MINIPORT_BLOCK)(_H))->TrRxCompleteHandler)( \
((PNDIS_MINIPORT_BLOCK)_H)->FilterDbs.TrDB); \
}
#else
#define NdisMTrIndicateReceiveComplete( _H ) \
{ \
(*((PNDIS_MINIPORT_BLOCK)(_H))->TrRxCompleteHandler)( \
((PNDIS_MINIPORT_BLOCK)_H)->TrDB); \
}
#endif
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMIndicateStatus(
__in NDIS_HANDLE MiniportHandle,
__in NDIS_STATUS GeneralStatus,
__in_bcount(StatusBufferSize)
PVOID StatusBuffer,
__in UINT StatusBufferSize
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMIndicateStatusComplete(
__in NDIS_HANDLE MiniportHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisMRegisterAdapterShutdownHandler(
__in NDIS_HANDLE MiniportHandle,
__in PVOID ShutdownContext,
__in ADAPTER_SHUTDOWN_HANDLER ShutdownHandler
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisMDeregisterAdapterShutdownHandler(
__in NDIS_HANDLE MiniportHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
__drv_preferredFunction("NdisMQueryAdapterResources", "Obsolete")
EXPORT
NDIS_STATUS
NdisMPciAssignResources(
__in NDIS_HANDLE MiniportHandle,
__in ULONG SlotNumber,
__out PNDIS_RESOURCE_LIST * AssignedResources
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisIMNotifyPnPEvent(
__in NDIS_HANDLE MiniportHandle,
__in PNET_PNP_EVENT NetPnPEvent
);
#endif // NDIS_LEGACY_MINIPORT
//
// Logging support for miniports
//
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisMCreateLog(
__in NDIS_HANDLE MiniportAdapterHandle,
__in UINT Size,
__out PNDIS_HANDLE LogHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisMCloseLog(
__in NDIS_HANDLE LogHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisMWriteLogData(
__in NDIS_HANDLE LogHandle,
__in_bcount(LogBufferSize)
PVOID LogBuffer,
__in UINT LogBufferSize
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMFlushLog(
__in NDIS_HANDLE LogHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisMGetDeviceProperty(
__in NDIS_HANDLE MiniportAdapterHandle,
__inout_opt PDEVICE_OBJECT * PhysicalDeviceObject,
__inout_opt PDEVICE_OBJECT * FunctionalDeviceObject,
__inout_opt PDEVICE_OBJECT * NextDeviceObject,
__inout_opt PCM_RESOURCE_LIST * AllocatedResources,
__inout_opt PCM_RESOURCE_LIST * AllocatedResourcesTranslated
);
//
// Get a pointer to the adapter's localized instance name.
//
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisMQueryAdapterInstanceName(
__out PNDIS_STRING pAdapterInstanceName,
__in NDIS_HANDLE MiniportHandle
);
#if NDIS_LEGACY_MINIPORT
//
// NDIS 5.0 extensions for miniports
//
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_minIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMCoIndicateReceivePacket(
__in NDIS_HANDLE NdisVcHandle,
__in PPNDIS_PACKET PacketArray,
__in UINT NumberOfPackets
);
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
NdisMCoIndicateStatus(
__in NDIS_HANDLE MiniportAdapterHandle,
__in_opt NDIS_HANDLE NdisVcHandle,
__in NDIS_STATUS GeneralStatus,
__in_bcount_opt(StatusBufferSize)
PVOID StatusBuffer,
__in ULONG StatusBufferSize
);
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_minIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMCoReceiveComplete(
__in NDIS_HANDLE MiniportAdapterHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_minIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMCoSendComplete(
__in NDIS_STATUS Status,
__in NDIS_HANDLE NdisVcHandle,
__in PNDIS_PACKET Packet
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMCoRequestComplete(
__in NDIS_STATUS Status,
__in NDIS_HANDLE MiniportAdapterHandle,
__in PNDIS_REQUEST Request
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisMCmRequest(
__in NDIS_HANDLE NdisAfHandle,
__in_opt NDIS_HANDLE NdisVcHandle,
__in_opt NDIS_HANDLE NdisPartyHandle,
__inout PNDIS_REQUEST NdisRequest
);
#endif // NDIS_LEGACY_MINIPORT
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMCoActivateVcComplete(
__in NDIS_STATUS Status,
__in NDIS_HANDLE NdisVcHandle,
__in PCO_CALL_PARAMETERS CallParameters
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMCoDeactivateVcComplete(
__in NDIS_STATUS Status,
__in NDIS_HANDLE NdisVcHandle
);
EXPORT
NDIS_STATUS
NdisMCmRegisterAddressFamily(
IN NDIS_HANDLE MiniportAdapterHandle,
IN PCO_ADDRESS_FAMILY AddressFamily,
IN PNDIS_CALL_MANAGER_CHARACTERISTICS CmCharacteristics,
IN UINT SizeOfCmCharacteristics
);
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
NdisMCmCreateVc(
__in NDIS_HANDLE MiniportAdapterHandle,
__in NDIS_HANDLE NdisAfHandle,
__in NDIS_HANDLE MiniportVcContext,
__out PNDIS_HANDLE NdisVcHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisMCmDeleteVc(
__in NDIS_HANDLE NdisVcHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisMCmActivateVc(
__in NDIS_HANDLE NdisVcHandle,
__in PCO_CALL_PARAMETERS CallParameters
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisMCmDeactivateVc(
__in NDIS_HANDLE NdisVcHandle
);
#if NDIS_LEGACY_MINIPORT
// EXPORT
// VOID
// NdisMCmRequestComplete(
// IN NDIS_STATUS Status,
// IN NDIS_HANDLE NdisAfHandle,
// IN NDIS_HANDLE NdisVcHandle OPTIONAL,
// IN NDIS_HANDLE NdisPartyHandle OPTIONAL,
// IN PNDIS_REQUEST NdisRequest
// );
#define NdisMCmRequestComplete(_S_, _AH_, _VH_, _PH_, _R_) \
NdisCoRequestComplete(_S_, _AH_, _VH_, _PH_, _R_)
#endif // NDIS_LEGACY_MINIPORT
#if (NDIS_SUPPORT_NDIS6 || NDIS60)
// EXPORT
// VOID
// NdisMCmOidRequestComplete(
// IN NDIS_HANDLE NdisAfHandle,
// IN NDIS_HANDLE NdisVcHandle OPTIONAL,
// IN NDIS_HANDLE NdisPartyHandle OPTIONAL,
// IN PNDIS_OID_REQUEST OidRequest,
// IN NDIS_STATUS Status
// );
#define NdisMCmOidRequestComplete(_AH_, _VH_, _PH_, _R_, _S_) \
NdisCoOidRequestComplete(_AH_, _VH_, _PH_, _R_, _S_)
#endif // NDIS_SUPPORT_NDIS6 || NDIS60
// EXPORT
// VOID
// NdisMCmOpenAddressFamilyComplete(
// IN NDIS_STATUS Status,
// IN NDIS_HANDLE NdisAfHandle,
// IN NDIS_HANDLE CallMgrAfContext
// );
#define NdisMCmOpenAddressFamilyComplete(_S_, _H_, _C_) \
NdisCmOpenAddressFamilyComplete(_S_, _H_, _C_)
// EXPORT
// NDIS_STATUS
// NdisMCmNotifyCloseAddressFamily(
// IN NDIS_HANDLE NdisAfHandle
// );
#define NdisMCmNotifyCloseAddressFamily(_AH_) \
NdisCmNotifyCloseAddressFamily(_AH_)
// EXPORT
// VOID
// NdisMCmCloseAddressFamilyComplete(
// IN NDIS_STATUS Status,
// IN NDIS_HANDLE NdisAfHandle
// );
#define NdisMCmCloseAddressFamilyComplete(_S_, _H_) \
NdisCmCloseAddressFamilyComplete(_S_, _H_)
// EXPORT
// VOID
// NdisMCmRegisterSapComplete(
// IN NDIS_STATUS Status,
// IN NDIS_HANDLE NdisSapHandle,
// IN NDIS_HANDLE CallMgrSapContext
// );
#define NdisMCmRegisterSapComplete(_S_, _H_, _C_) \
NdisCmRegisterSapComplete(_S_, _H_, _C_)
// EXPORT
// VOID
// NdisMCmDeregisterSapComplete(
// IN NDIS_STATUS Status,
// IN NDIS_HANDLE NdisSapHandle
// );
#define NdisMCmDeregisterSapComplete(_S_, _H_) \
NdisCmDeregisterSapComplete(_S_, _H_)
// EXPORT
// VOID
// NdisMCmMakeCallComplete(
// IN NDIS_STATUS Status,
// IN NDIS_HANDLE NdisVcHandle,
// IN NDIS_HANDLE NdisPartyHandle OPTIONAL,
// IN NDIS_HANDLE CallMgrPartyContext OPTIONAL,
// IN PCO_CALL_PARAMETERS CallParameters
// );
#define NdisMCmMakeCallComplete(_S_, _VH_, _PH_, _CC_, _CP_) \
NdisCmMakeCallComplete(_S_, _VH_, _PH_, _CC_, _CP_)
// EXPORT
// VOID
// NdisMCmCloseCallComplete(
// IN NDIS_STATUS Status,
// IN NDIS_HANDLE NdisVcHandle,
// IN NDIS_HANDLE NdisPartyHandle OPTIONAL
// );
#define NdisMCmCloseCallComplete(_S_, _VH_, _PH_) \
NdisCmCloseCallComplete(_S_, _VH_, _PH_)
// EXPORT
// VOID
// NdisMCmAddPartyComplete(
// IN NDIS_STATUS Status,
// IN NDIS_HANDLE NdisPartyHandle,
// IN NDIS_HANDLE CallMgrPartyContext OPTIONAL,
// IN PCO_CALL_PARAMETERS CallParameters
// );
#define NdisMCmAddPartyComplete(_S_, _H_, _C_, _P_) \
NdisCmAddPartyComplete(_S_, _H_, _C_, _P_)
// EXPORT
// VOID
// NdisMCmDropPartyComplete(
// IN NDIS_STATUS Status,
// IN NDIS_HANDLE NdisPartyHandle
// );
#define NdisMCmDropPartyComplete(_S_, _H_) \
NdisCmDropPartyComplete(_S_, _H_)
// EXPORT
// NDIS_STATUS
// NdisMCmDispatchIncomingCall(
// IN NDIS_HANDLE NdisSapHandle,
// IN NDIS_HANDLE NdisVcHandle,
// IN PCO_CALL_PARAMETERS CallParameters
// );
#define NdisMCmDispatchIncomingCall(_SH_, _VH_, _CP_) \
NdisCmDispatchIncomingCall(_SH_, _VH_, _CP_)
// EXPORT
// VOID
// NdisMCmDispatchCallConnected(
// IN NDIS_HANDLE NdisVcHandle
// );
#define NdisMCmDispatchCallConnected(_H_) \
NdisCmDispatchCallConnected(_H_)
// EXPORT
// NdisMCmModifyCallQoSComplete(
// IN NDIS_STATUS Status,
// IN NDIS_HANDLE NdisVcHandle,
// IN PCO_CALL_PARAMETERS CallParameters
// );
#define NdisMCmModifyCallQoSComplete(_S_, _H_, _P_) \
NdisCmModifyCallQoSComplete(_S_, _H_, _P_)
// EXPORT
// VOID
// VOID
// NdisMCmDispatchIncomingCallQoSChange(
// IN NDIS_HANDLE NdisVcHandle,
// IN PCO_CALL_PARAMETERS CallParameters
// );
#define NdisMCmDispatchIncomingCallQoSChange(_H_, _P_) \
NdisCmDispatchIncomingCallQoSChange(_H_, _P_)
// EXPORT
// VOID
// NdisMCmDispatchIncomingCloseCall(
// IN NDIS_STATUS CloseStatus,
// IN NDIS_HANDLE NdisVcHandle,
// IN PVOID Buffer OPTIONAL,
// IN UINT Size
// );
#define NdisMCmDispatchIncomingCloseCall(_S_, _H_, _B_, _Z_) \
NdisCmDispatchIncomingCloseCall(_S_, _H_, _B_, _Z_)
// EXPORT
// VOID
// NdisMCmDispatchIncomingDropParty(
// IN NDIS_STATUS DropStatus,
// IN NDIS_HANDLE NdisPartyHandle,
// IN PVOID Buffer OPTIONAL,
// IN UINT Size
// );
#define NdisMCmDispatchIncomingDropParty(_S_, _H_, _B_, _Z_) \
NdisCmDispatchIncomingDropParty(_S_, _H_, _B_, _Z_)
#if NDIS_SUPPORT_NDIS6
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisMRegisterScatterGatherDma(
__in NDIS_HANDLE MiniportAdapterHandle,
__in PNDIS_SG_DMA_DESCRIPTION DmaDescription,
__out PNDIS_HANDLE NdisMiniportDmaHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisMDeregisterScatterGatherDma(
__in NDIS_HANDLE NdisMiniportDmaHandle
);
//
// flags used in the call to NdisMAllocateNetBufferSGList
//
#define NDIS_SG_LIST_WRITE_TO_DEVICE 0x000000001
__checkReturn
__drv_requiresIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisMAllocateNetBufferSGList(
__in NDIS_HANDLE NdisMiniportDmaHandle,
__in PNET_BUFFER NetBuffer,
__in __drv_isObjectPointer
PVOID Context,
__in ULONG Flags,
__in_bcount_opt(ScatterGatherListBufferSize) __drv_isObjectPointer
PVOID ScatterGatherListBuffer,
__in ULONG ScatterGatherListBufferSize
);
__drv_requiresIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMFreeNetBufferSGList(
__in NDIS_HANDLE NdisMiniportDmaHandle,
__in PSCATTER_GATHER_LIST pSGL,
__in PNET_BUFFER NetBuffer
);
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisMRegisterMiniportDriver(
__in PDRIVER_OBJECT DriverObject,
__in PUNICODE_STRING RegistryPath,
__in_opt NDIS_HANDLE MiniportDriverContext,
__in PNDIS_MINIPORT_DRIVER_CHARACTERISTICS MiniportDriverCharacteristics,
__out PNDIS_HANDLE NdisMiniportDriverHandle
);
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisMDeregisterMiniportDriver(
__in NDIS_HANDLE NdisMiniportDriverHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMPauseComplete(
__in NDIS_HANDLE MiniportAdapterHandle
);
EXPORT
VOID
NdisMRestartComplete(
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_STATUS Status
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMOidRequestComplete(
__in NDIS_HANDLE MiniportAdapterHandle,
__in PNDIS_OID_REQUEST OidRequest,
__in NDIS_STATUS Status
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMSendNetBufferListsComplete(
__in NDIS_HANDLE MiniportAdapterHandle,
__in PNET_BUFFER_LIST NetBufferList,
__in ULONG SendCompleteFlags
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMIndicateReceiveNetBufferLists(
__in NDIS_HANDLE MiniportAdapterHandle,
__in PNET_BUFFER_LIST NetBufferList,
__in NDIS_PORT_NUMBER PortNumber,
__in ULONG NumberOfNetBufferLists,
__in ULONG ReceiveFlags
);
//
// IO workitem routines
//
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_HANDLE
NdisAllocateIoWorkItem(
__in NDIS_HANDLE NdisObjectHandle
);
typedef
VOID
(NDIS_IO_WORKITEM_FUNCTION)(
IN PVOID WorkItemContext,
IN NDIS_HANDLE NdisIoWorkItemHandle
);
typedef NDIS_IO_WORKITEM_FUNCTION (*NDIS_IO_WORKITEM_ROUTINE);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisQueueIoWorkItem(
__in NDIS_HANDLE NdisIoWorkItemHandle,
__in NDIS_IO_WORKITEM_ROUTINE Routine,
__in __drv_isObjectPointer PVOID WorkItemContext
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFreeIoWorkItem(
__in NDIS_HANDLE NdisIoWorkItemHandle
);
//
// CONDIS 6.0 extensions
//
EXPORT
VOID
NdisMCoSendNetBufferListsComplete(
IN NDIS_HANDLE NdisVcHandle,
IN PNET_BUFFER_LIST NetBufferLists,
IN ULONG SendCompleteFlags
);
EXPORT
VOID
NdisMCoIndicateReceiveNetBufferLists(
IN NDIS_HANDLE NdisVcHandle,
IN PNET_BUFFER_LIST NetBufferLists,
IN ULONG NumberOfNetBufferLists,
IN ULONG CoReceiveFlags
);
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisMNetPnPEvent(
__in NDIS_HANDLE MiniportAdapterHandle,
__in PNET_PNP_EVENT_NOTIFICATION NetPnPEventNotification
);
#if NDIS_SUPPORT_NDIS6
__drv_maxIRQL(DISPATCH_LEVEL)
#endif NDIS_SUPPORT_NDIS6
EXPORT
VOID
NdisMResetComplete(
__in NDIS_HANDLE MiniportAdapterHandle,
__in NDIS_STATUS Status,
__in BOOLEAN AddressingReset
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
ULONG
NdisMGetBusData(
__in NDIS_HANDLE NdisMiniportHandle,
__in ULONG WhichSpace,
__in ULONG Offset,
__out_bcount_full(Length) PVOID Buffer,
__in ULONG Length
);
EXPORT
ULONG
NdisMSetBusData(
IN NDIS_HANDLE NdisMiniportHandle,
IN ULONG WhichSpace,
IN ULONG Offset,
IN PVOID Buffer,
IN ULONG Length
);
//
// NDIS port APIs
//
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisMAllocatePort(
__in NDIS_HANDLE NdisMiniportHandle,
__inout PNDIS_PORT_CHARACTERISTICS PortCharacteristics
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisMFreePort(
__in NDIS_HANDLE NdisMiniportHandle,
__in NDIS_PORT_NUMBER PortNumber
);
#if (NDIS_SUPPORT_NDIS61)
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisMDirectOidRequestComplete(
__in NDIS_HANDLE MiniportAdapterHandle,
__in PNDIS_OID_REQUEST OidRequest,
__in NDIS_STATUS Status
);
typedef enum _NDIS_MSIX_TABLE_CONFIG
{
NdisMSIXTableConfigSetTableEntry,
NdisMSIXTableConfigMaskTableEntry,
NdisMSIXTableConfigUnmaskTableEntry,
NdisMSIXTableConfigMax
}NDIS_MSIX_TABLE_OPERATION, *PNDIS_MSIX_TABLE_OPERATION;
#define NDIS_MSIX_CONFIG_PARAMETERS_REVISION_1 1
typedef struct _NDIS_MSIX_CONFIG_PARAMETERS
{
NDIS_OBJECT_HEADER Header;
NDIS_MSIX_TABLE_OPERATION ConfigOperation;
ULONG TableEntry;
ULONG MessageNumber;
}NDIS_MSIX_CONFIG_PARAMETERS, *PNDIS_MSIX_CONFIG_PARAMETERS;
#define NDIS_SIZEOF_MSIX_CONFIG_PARAMETERS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_MSIX_CONFIG_PARAMETERS, MessageNumber)
EXPORT
NDIS_STATUS
NdisMConfigMSIXTableEntry(
__in NDIS_HANDLE NdisMiniportHandle,
__in PNDIS_MSIX_CONFIG_PARAMETERS MSIXConfigParameters
);
#endif // (NDIS_SUPPORT_NDIS61)
#endif // NDIS_SUPPORT_NDIS6
#pragma once
typedef struct _CO_CALL_PARAMETERS CO_CALL_PARAMETERS, *PCO_CALL_PARAMETERS;
typedef struct _CO_MEDIA_PARAMETERS CO_MEDIA_PARAMETERS, *PCO_MEDIA_PARAMETERS;
//
// CoNdis client only handler proto-types - used by clients of call managers
//
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CL_OPEN_AF_COMPLETE)(
__in NDIS_STATUS Status,
__in NDIS_HANDLE ProtocolAfContext,
__in NDIS_HANDLE NdisAfHandle
);
typedef PROTOCOL_CL_OPEN_AF_COMPLETE (*CL_OPEN_AF_COMPLETE_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CL_CLOSE_AF_COMPLETE)(
__in NDIS_STATUS Status,
__in NDIS_HANDLE ProtocolAfContext
);
typedef PROTOCOL_CL_CLOSE_AF_COMPLETE (*CL_CLOSE_AF_COMPLETE_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CL_REGISTER_SAP_COMPLETE)(
__in NDIS_STATUS Status,
__in NDIS_HANDLE ProtocolSapContext,
__in PCO_SAP Sap,
__in NDIS_HANDLE NdisSapHandle
);
typedef PROTOCOL_CL_REGISTER_SAP_COMPLETE (*CL_REG_SAP_COMPLETE_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CL_DEREGISTER_SAP_COMPLETE)(
__in NDIS_STATUS Status,
__in NDIS_HANDLE ProtocolSapContext
);
typedef PROTOCOL_CL_DEREGISTER_SAP_COMPLETE (*CL_DEREG_SAP_COMPLETE_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CL_MAKE_CALL_COMPLETE)(
__in NDIS_STATUS Status,
__in NDIS_HANDLE ProtocolVcContext,
__in_opt NDIS_HANDLE NdisPartyHandle,
__in PCO_CALL_PARAMETERS CallParameters
);
typedef PROTOCOL_CL_MAKE_CALL_COMPLETE (*CL_MAKE_CALL_COMPLETE_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CL_CLOSE_CALL_COMPLETE)(
__in NDIS_STATUS Status,
__in NDIS_HANDLE ProtocolVcContext,
__in_opt NDIS_HANDLE ProtocolPartyContext
);
typedef PROTOCOL_CL_CLOSE_CALL_COMPLETE (*CL_CLOSE_CALL_COMPLETE_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CL_ADD_PARTY_COMPLETE)(
__in NDIS_STATUS Status,
__in NDIS_HANDLE ProtocolPartyContext,
__in NDIS_HANDLE NdisPartyHandle,
__in PCO_CALL_PARAMETERS CallParameters
);
typedef PROTOCOL_CL_ADD_PARTY_COMPLETE (*CL_ADD_PARTY_COMPLETE_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CL_DROP_PARTY_COMPLETE)(
__in NDIS_STATUS Status,
__in NDIS_HANDLE ProtocolPartyContext
);
typedef PROTOCOL_CL_DROP_PARTY_COMPLETE (*CL_DROP_PARTY_COMPLETE_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(PROTOCOL_CL_INCOMING_CALL)(
__in NDIS_HANDLE ProtocolSapContext,
__in NDIS_HANDLE ProtocolVcContext,
__inout PCO_CALL_PARAMETERS CallParameters
);
typedef PROTOCOL_CL_INCOMING_CALL (*CL_INCOMING_CALL_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CL_CALL_CONNECTED)(
__in NDIS_HANDLE ProtocolVcContext
);
typedef PROTOCOL_CL_CALL_CONNECTED (*CL_CALL_CONNECTED_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CL_INCOMING_CLOSE_CALL)(
__in NDIS_STATUS CloseStatus,
__in NDIS_HANDLE ProtocolVcContext,
__in_opt PVOID CloseData,
__in_opt UINT Size
);
typedef PROTOCOL_CL_INCOMING_CLOSE_CALL (*CL_INCOMING_CLOSE_CALL_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CL_INCOMING_DROP_PARTY)(
__in NDIS_STATUS DropStatus,
__in NDIS_HANDLE ProtocolPartyContext,
__in_opt PVOID CloseData,
__in_opt UINT Size
);
typedef PROTOCOL_CL_INCOMING_DROP_PARTY (*CL_INCOMING_DROP_PARTY_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CL_MODIFY_CALL_QOS_COMPLETE)(
__in NDIS_STATUS Status,
__in NDIS_HANDLE ProtocolVcContext,
__in PCO_CALL_PARAMETERS CallParameters
);
typedef PROTOCOL_CL_MODIFY_CALL_QOS_COMPLETE (*CL_MODIFY_CALL_QOS_COMPLETE_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CL_INCOMING_CALL_QOS_CHANGE)(
__in NDIS_HANDLE ProtocolVcContext,
__in PCO_CALL_PARAMETERS CallParameters
);
typedef PROTOCOL_CL_INCOMING_CALL_QOS_CHANGE (*CL_INCOMING_CALL_QOS_CHANGE_HANDLER);
#if NDIS_LEGACY_PROTOCOL
typedef struct _NDIS_CLIENT_CHARACTERISTICS
{
UCHAR MajorVersion;
UCHAR MinorVersion;
USHORT Filler;
UINT Reserved;
CO_CREATE_VC_HANDLER ClCreateVcHandler;
CO_DELETE_VC_HANDLER ClDeleteVcHandler;
CO_REQUEST_HANDLER ClRequestHandler;
CO_REQUEST_COMPLETE_HANDLER ClRequestCompleteHandler;
CL_OPEN_AF_COMPLETE_HANDLER ClOpenAfCompleteHandler;
CL_CLOSE_AF_COMPLETE_HANDLER ClCloseAfCompleteHandler;
CL_REG_SAP_COMPLETE_HANDLER ClRegisterSapCompleteHandler;
CL_DEREG_SAP_COMPLETE_HANDLER ClDeregisterSapCompleteHandler;
CL_MAKE_CALL_COMPLETE_HANDLER ClMakeCallCompleteHandler;
CL_MODIFY_CALL_QOS_COMPLETE_HANDLER ClModifyCallQoSCompleteHandler;
CL_CLOSE_CALL_COMPLETE_HANDLER ClCloseCallCompleteHandler;
CL_ADD_PARTY_COMPLETE_HANDLER ClAddPartyCompleteHandler;
CL_DROP_PARTY_COMPLETE_HANDLER ClDropPartyCompleteHandler;
CL_INCOMING_CALL_HANDLER ClIncomingCallHandler;
CL_INCOMING_CALL_QOS_CHANGE_HANDLER ClIncomingCallQoSChangeHandler;
CL_INCOMING_CLOSE_CALL_HANDLER ClIncomingCloseCallHandler;
CL_INCOMING_DROP_PARTY_HANDLER ClIncomingDropPartyHandler;
CL_CALL_CONNECTED_HANDLER ClCallConnectedHandler;
} NDIS_CLIENT_CHARACTERISTICS, *PNDIS_CLIENT_CHARACTERISTICS;
#endif // NDIS_LEGACY_PROTOCOL
//
// CoNdis call-manager only handler proto-types - used by call managers only
//
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(PROTOCOL_CM_OPEN_AF)(
__in NDIS_HANDLE CallMgrBindingContext,
__in PCO_ADDRESS_FAMILY AddressFamily,
__in NDIS_HANDLE NdisAfHandle,
__out PNDIS_HANDLE CallMgrAfContext
);
typedef PROTOCOL_CM_OPEN_AF (*CM_OPEN_AF_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(PROTOCOL_CM_CLOSE_AF)(
__in NDIS_HANDLE CallMgrAfContext
);
typedef PROTOCOL_CM_CLOSE_AF (*CM_CLOSE_AF_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(PROTOCOL_CM_REG_SAP)(
__in NDIS_HANDLE CallMgrAfContext,
__in PCO_SAP Sap,
__in NDIS_HANDLE NdisSapHandle,
__out PNDIS_HANDLE CallMgrSapContext
);
typedef PROTOCOL_CM_REG_SAP (*CM_REG_SAP_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(PROTOCOL_CM_DEREGISTER_SAP)(
__in NDIS_HANDLE CallMgrSapContext
);
typedef PROTOCOL_CM_DEREGISTER_SAP (*CM_DEREG_SAP_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(PROTOCOL_CM_MAKE_CALL)(
__in NDIS_HANDLE CallMgrVcContext,
__inout PCO_CALL_PARAMETERS CallParameters,
__in_opt NDIS_HANDLE NdisPartyHandle,
__out_opt PNDIS_HANDLE CallMgrPartyContext
);
typedef PROTOCOL_CM_MAKE_CALL (*CM_MAKE_CALL_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(PROTOCOL_CM_CLOSE_CALL)(
__in NDIS_HANDLE CallMgrVcContext,
__in_opt NDIS_HANDLE CallMgrPartyContext,
__in_opt PVOID CloseData,
__in_opt UINT Size
);
typedef PROTOCOL_CM_CLOSE_CALL (*CM_CLOSE_CALL_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(PROTOCOL_CM_MODIFY_QOS_CALL)(
__in NDIS_HANDLE CallMgrVcContext,
__in PCO_CALL_PARAMETERS CallParameters
);
typedef PROTOCOL_CM_MODIFY_QOS_CALL (*CM_MODIFY_CALL_QOS_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CM_INCOMING_CALL_COMPLETE)(
__in NDIS_STATUS Status,
__in NDIS_HANDLE CallMgrVcContext,
__in PCO_CALL_PARAMETERS CallParameters
);
typedef PROTOCOL_CM_INCOMING_CALL_COMPLETE (*CM_INCOMING_CALL_COMPLETE_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CM_ACTIVATE_VC_COMPLETE)(
__in NDIS_STATUS Status,
__in NDIS_HANDLE CallMgrVcContext,
__in PCO_CALL_PARAMETERS CallParameters
);
typedef PROTOCOL_CM_ACTIVATE_VC_COMPLETE (*CM_ACTIVATE_VC_COMPLETE_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(PROTOCOL_CM_DEACTIVATE_VC_COMPLETE)(
__in NDIS_STATUS Status,
__in NDIS_HANDLE CallMgrVcContext
);
typedef PROTOCOL_CM_DEACTIVATE_VC_COMPLETE (*CM_DEACTIVATE_VC_COMPLETE_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(PROTOCOL_CM_ADD_PARTY)(
__in NDIS_HANDLE CallMgrVcContext,
__inout PCO_CALL_PARAMETERS CallParameters,
__in NDIS_HANDLE NdisPartyHandle,
__out PNDIS_HANDLE CallMgrPartyContext
);
typedef PROTOCOL_CM_ADD_PARTY (*CM_ADD_PARTY_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(PROTOCOL_CM_DROP_PARTY)(
__in NDIS_HANDLE CallMgrPartyContext,
__in_opt PVOID CloseData,
__in_opt UINT Size
);
typedef PROTOCOL_CM_DROP_PARTY (*CM_DROP_PARTY_HANDLER);
#if NDIS_LEGACY_DRIVER
typedef struct _NDIS_CALL_MANAGER_CHARACTERISTICS
{
UCHAR MajorVersion;
UCHAR MinorVersion;
USHORT Filler;
UINT Reserved;
CO_CREATE_VC_HANDLER CmCreateVcHandler;
CO_DELETE_VC_HANDLER CmDeleteVcHandler;
CM_OPEN_AF_HANDLER CmOpenAfHandler;
CM_CLOSE_AF_HANDLER CmCloseAfHandler;
CM_REG_SAP_HANDLER CmRegisterSapHandler;
CM_DEREG_SAP_HANDLER CmDeregisterSapHandler;
CM_MAKE_CALL_HANDLER CmMakeCallHandler;
CM_CLOSE_CALL_HANDLER CmCloseCallHandler;
CM_INCOMING_CALL_COMPLETE_HANDLER CmIncomingCallCompleteHandler;
CM_ADD_PARTY_HANDLER CmAddPartyHandler;
CM_DROP_PARTY_HANDLER CmDropPartyHandler;
CM_ACTIVATE_VC_COMPLETE_HANDLER CmActivateVcCompleteHandler;
CM_DEACTIVATE_VC_COMPLETE_HANDLER CmDeactivateVcCompleteHandler;
CM_MODIFY_CALL_QOS_HANDLER CmModifyCallQoSHandler;
CO_REQUEST_HANDLER CmRequestHandler;
CO_REQUEST_COMPLETE_HANDLER CmRequestCompleteHandler;
} NDIS_CALL_MANAGER_CHARACTERISTICS, *PNDIS_CALL_MANAGER_CHARACTERISTICS;
#endif // NDIS_LEGACY_DRIVER
//
// this send flag is used on ATM net cards to set ( turn on ) the CLP bit
// (Cell Loss Priority) bit
//
#define CO_SEND_FLAG_SET_DISCARD_ELIBILITY 0x00000001
//
// the Address structure used on NDIS_CO_ADD_ADDRESS or NDIS_CO_DELETE_ADDRESS
//
typedef struct _CO_ADDRESS
{
ULONG AddressSize;
UCHAR Address[1];
} CO_ADDRESS, *PCO_ADDRESS;
//
// the list of addresses returned from the CallMgr on a NDIS_CO_GET_ADDRESSES
//
typedef struct _CO_ADDRESS_LIST
{
ULONG NumberOfAddressesAvailable;
ULONG NumberOfAddresses;
CO_ADDRESS AddressList;
} CO_ADDRESS_LIST, *PCO_ADDRESS_LIST;
#ifndef FAR
#define FAR
#endif
#include <qos.h>
typedef struct _CO_SPECIFIC_PARAMETERS
{
ULONG ParamType;
ULONG Length;
UCHAR Parameters[1];
} CO_SPECIFIC_PARAMETERS, *PCO_SPECIFIC_PARAMETERS;
typedef struct _CO_CALL_MANAGER_PARAMETERS
{
FLOWSPEC Transmit;
FLOWSPEC Receive;
CO_SPECIFIC_PARAMETERS CallMgrSpecific;
} CO_CALL_MANAGER_PARAMETERS, *PCO_CALL_MANAGER_PARAMETERS;
//
// this is the generic portion of the media parameters, including the media
// specific component too.
//
typedef struct _CO_MEDIA_PARAMETERS
{
ULONG Flags;
ULONG ReceivePriority;
ULONG ReceiveSizeHint;
CO_SPECIFIC_PARAMETERS POINTER_ALIGNMENT MediaSpecific;
} CO_MEDIA_PARAMETERS, *PCO_MEDIA_PARAMETERS;
//
// definitions for the flags in CO_MEDIA_PARAMETERS
//
#define RECEIVE_TIME_INDICATION 0x00000001
#define USE_TIME_STAMPS 0x00000002
#define TRANSMIT_VC 0x00000004
#define RECEIVE_VC 0x00000008
#define INDICATE_ERRED_PACKETS 0x00000010
#define INDICATE_END_OF_TX 0x00000020
#define RESERVE_RESOURCES_VC 0x00000040
#define ROUND_DOWN_FLOW 0x00000080
#define ROUND_UP_FLOW 0x00000100
//
// define a flag to set in the flags of an Ndis packet when the miniport
// indicates a receive with an error in it
//
#define ERRED_PACKET_INDICATION 0x00000001
//
// this is the structure passed during call-setup
//
typedef struct _CO_CALL_PARAMETERS
{
ULONG Flags;
PCO_CALL_MANAGER_PARAMETERS CallMgrParameters;
PCO_MEDIA_PARAMETERS MediaParameters;
} CO_CALL_PARAMETERS, *PCO_CALL_PARAMETERS;
//
// Definitions for the Flags in CO_CALL_PARAMETERS
//
#define PERMANENT_VC 0x00000001
#define CALL_PARAMETERS_CHANGED 0x00000002
#define QUERY_CALL_PARAMETERS 0x00000004
#define BROADCAST_VC 0x00000008
#define MULTIPOINT_VC 0x00000010
//
// The format of the Request for adding/deleting a PVC
//
typedef struct _CO_PVC
{
NDIS_HANDLE NdisAfHandle;
CO_SPECIFIC_PARAMETERS PvcParameters;
} CO_PVC,*PCO_PVC;
//
// NDIS 5.0 Extensions for protocols
//
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_minIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisCoAssignInstanceName(
__in NDIS_HANDLE NdisVcHandle,
__in PNDIS_STRING BaseInstanceName,
__out_opt PNDIS_STRING VcInstanceName
);
#if NDIS_LEGACY_PROTOCOL
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCoSendPackets(
__in NDIS_HANDLE NdisVcHandle,
__in PPNDIS_PACKET PacketArray,
__in UINT NumberOfPackets
);
#endif // NDIS_LEGACY_PROTOCOL
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisCoCreateVc(
__in NDIS_HANDLE NdisBindingHandle,
__in_opt NDIS_HANDLE NdisAfHandle, // For CM signalling VCs
__in NDIS_HANDLE ProtocolVcContext,
__inout PNDIS_HANDLE NdisVcHandle
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisCoDeleteVc(
__in NDIS_HANDLE NdisVcHandle
);
#if NDIS_LEGACY_PROTOCOL
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisCoRequest(
__in NDIS_HANDLE NdisBindingHandle,
__in_opt NDIS_HANDLE NdisAfHandle,
__in_opt NDIS_HANDLE NdisVcHandle,
__in_opt NDIS_HANDLE NdisPartyHandle,
__inout PNDIS_REQUEST NdisRequest
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCoRequestComplete(
__in NDIS_STATUS Status,
__in NDIS_HANDLE NdisAfHandle,
__in_opt NDIS_HANDLE NdisVcHandle,
__in_opt NDIS_HANDLE NdisPartyHandle,
__in PNDIS_REQUEST NdisRequest
);
#endif // NDIS_LEGACY_PROTOCOL
#ifndef __NDISTAPI_VAR_STRING_DECLARED
#define __NDISTAPI_VAR_STRING_DECLARED
typedef struct _VAR_STRING
{
ULONG ulTotalSize;
ULONG ulNeededSize;
ULONG ulUsedSize;
ULONG ulStringFormat;
ULONG ulStringSize;
ULONG ulStringOffset;
} VAR_STRING, *PVAR_STRING;
#endif // __NDISTAPI_VAR_STRING_DECLARED
#ifndef __NDISTAPI_STRINGFORMATS_DEFINED
#define __NDISTAPI_STRINGFORMATS_DEFINED
#define STRINGFORMAT_ASCII 0x00000001
#define STRINGFORMAT_DBCS 0x00000002
#define STRINGFORMAT_UNICODE 0x00000003
#define STRINGFORMAT_BINARY 0x00000004
#endif // __NDISTAPI_STRINGFORMATS_DEFINED
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_minIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisCoGetTapiCallId(
__in NDIS_HANDLE NdisVcHandle,
__inout PVAR_STRING TapiCallId
);
#if NDIS_LEGACY_PROTOCOL
//
// Client Apis
//
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisClOpenAddressFamily(
__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
);
#endif // NDIS_LEGACY_PROTOCOL
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisClCloseAddressFamily(
__in NDIS_HANDLE NdisAfHandle
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisClRegisterSap(
__in NDIS_HANDLE NdisAfHandle,
__in NDIS_HANDLE ProtocolSapContext,
__in PCO_SAP Sap,
__out PNDIS_HANDLE NdisSapHandle
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisClDeregisterSap(
__in NDIS_HANDLE NdisSapHandle
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisClMakeCall(
__in NDIS_HANDLE NdisVcHandle,
__inout PCO_CALL_PARAMETERS CallParameters,
__in_opt NDIS_HANDLE ProtocolPartyContext,
__out_opt PNDIS_HANDLE NdisPartyHandle
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisClCloseCall(
__in NDIS_HANDLE NdisVcHandle,
__in_opt NDIS_HANDLE NdisPartyHandle,
__in_bcount_opt(Size) PVOID Buffer,
__in UINT Size
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisClModifyCallQoS(
__in NDIS_HANDLE NdisVcHandle,
__in PCO_CALL_PARAMETERS CallParameters
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisClIncomingCallComplete(
__in NDIS_STATUS Status,
__in NDIS_HANDLE NdisVcHandle,
__in PCO_CALL_PARAMETERS CallParameters
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisClAddParty(
__in NDIS_HANDLE NdisVcHandle,
__in NDIS_HANDLE ProtocolPartyContext,
__inout PCO_CALL_PARAMETERS CallParameters,
__out PNDIS_HANDLE NdisPartyHandle
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisClDropParty(
__in NDIS_HANDLE NdisPartyHandle,
__in_bcount_opt(Size) PVOID Buffer,
__in_opt UINT Size
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
__drv_minIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisClGetProtocolVcContextFromTapiCallId(
__in UNICODE_STRING TapiCallId,
__out PNDIS_HANDLE ProtocolVcContext
);
//
// Call Manager Apis
//
#if NDIS_LEGACY_DRIVER
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisCmRegisterAddressFamily(
__in NDIS_HANDLE NdisBindingHandle,
__in PCO_ADDRESS_FAMILY AddressFamily,
__in PNDIS_CALL_MANAGER_CHARACTERISTICS CmCharacteristics,
__in UINT SizeOfCmCharacteristics
);
#endif
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCmOpenAddressFamilyComplete(
__in NDIS_STATUS Status,
__in NDIS_HANDLE NdisAfHandle,
__in NDIS_HANDLE CallMgrAfContext
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCmCloseAddressFamilyComplete(
__in NDIS_STATUS Status,
__in NDIS_HANDLE NdisAfHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCmRegisterSapComplete(
__in NDIS_STATUS Status,
__in NDIS_HANDLE NdisSapHandle,
__in NDIS_HANDLE CallMgrSapContext
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCmDeregisterSapComplete(
__in NDIS_STATUS Status,
__in NDIS_HANDLE NdisSapHandle
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisCmActivateVc(
__in NDIS_HANDLE NdisVcHandle,
__inout PCO_CALL_PARAMETERS CallParameters
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisCmDeactivateVc(
__in NDIS_HANDLE NdisVcHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCmMakeCallComplete(
__in NDIS_STATUS Status,
__in NDIS_HANDLE NdisVcHandle,
__in_opt NDIS_HANDLE NdisPartyHandle,
__in_opt NDIS_HANDLE CallMgrPartyContext,
__in PCO_CALL_PARAMETERS CallParameters
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCmCloseCallComplete(
__in NDIS_STATUS Status,
__in NDIS_HANDLE NdisVcHandle,
__in_opt NDIS_HANDLE NdisPartyHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCmAddPartyComplete(
__in NDIS_STATUS Status,
__in NDIS_HANDLE NdisPartyHandle,
__in_opt NDIS_HANDLE CallMgrPartyContext,
__in PCO_CALL_PARAMETERS CallParameters
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCmDropPartyComplete(
__in NDIS_STATUS Status,
__in NDIS_HANDLE NdisPartyHandle
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisCmDispatchIncomingCall(
__in NDIS_HANDLE NdisSapHandle,
__in NDIS_HANDLE NdisVcHandle,
__in PCO_CALL_PARAMETERS CallParameters
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCmDispatchCallConnected(
__in NDIS_HANDLE NdisVcHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCmModifyCallQoSComplete(
__in NDIS_STATUS Status,
__in NDIS_HANDLE NdisVcHandle,
__in PCO_CALL_PARAMETERS CallParameters
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCmDispatchIncomingCallQoSChange(
__in NDIS_HANDLE NdisVcHandle,
__in PCO_CALL_PARAMETERS CallParameters
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCmDispatchIncomingCloseCall(
__in NDIS_STATUS CloseStatus,
__in NDIS_HANDLE NdisVcHandle,
__in_bcount_opt(Size) PVOID Buffer,
__in UINT Size
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCmDispatchIncomingDropParty(
__in NDIS_STATUS DropStatus,
__in NDIS_HANDLE NdisPartyHandle,
__in_bcount_opt(Size) PVOID Buffer,
__in UINT Size
);
#if (NDIS_SUPPORT_NDIS6)
//
// CONDIS 6.0 extensions
//
#define NDIS_CO_CLIENT_OPTIONAL_HANDLERS_REVISION_1 1
typedef struct _NDIS_CO_CLIENT_OPTIONAL_HANDLERS
{
NDIS_OBJECT_HEADER Header;
ULONG Reserved;
CO_CREATE_VC_HANDLER ClCreateVcHandler;
CO_DELETE_VC_HANDLER ClDeleteVcHandler;
CO_OID_REQUEST_HANDLER ClOidRequestHandler;
CO_OID_REQUEST_COMPLETE_HANDLER ClOidRequestCompleteHandler;
CL_OPEN_AF_COMPLETE_HANDLER_EX ClOpenAfCompleteHandlerEx;
CL_CLOSE_AF_COMPLETE_HANDLER ClCloseAfCompleteHandler;
CL_REG_SAP_COMPLETE_HANDLER ClRegisterSapCompleteHandler;
CL_DEREG_SAP_COMPLETE_HANDLER ClDeregisterSapCompleteHandler;
CL_MAKE_CALL_COMPLETE_HANDLER ClMakeCallCompleteHandler;
CL_MODIFY_CALL_QOS_COMPLETE_HANDLER ClModifyCallQoSCompleteHandler;
CL_CLOSE_CALL_COMPLETE_HANDLER ClCloseCallCompleteHandler;
CL_ADD_PARTY_COMPLETE_HANDLER ClAddPartyCompleteHandler;
CL_DROP_PARTY_COMPLETE_HANDLER ClDropPartyCompleteHandler;
CL_INCOMING_CALL_HANDLER ClIncomingCallHandler;
CL_INCOMING_CALL_QOS_CHANGE_HANDLER ClIncomingCallQoSChangeHandler;
CL_INCOMING_CLOSE_CALL_HANDLER ClIncomingCloseCallHandler;
CL_INCOMING_DROP_PARTY_HANDLER ClIncomingDropPartyHandler;
CL_CALL_CONNECTED_HANDLER ClCallConnectedHandler;
CL_NOTIFY_CLOSE_AF_HANDLER ClNotifyCloseAfHandler;
}NDIS_CO_CLIENT_OPTIONAL_HANDLERS, *PNDIS_CO_CLIENT_OPTIONAL_HANDLERS;
#define NDIS_SIZEOF_CO_CLIENT_OPTIONAL_HANDLERS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_CO_CLIENT_OPTIONAL_HANDLERS, ClNotifyCloseAfHandler)
#define NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS_REVISION_1 1
typedef struct _NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS
{
NDIS_OBJECT_HEADER Header;
ULONG Reserved;
CO_CREATE_VC_HANDLER CmCreateVcHandler;
CO_DELETE_VC_HANDLER CmDeleteVcHandler;
CM_OPEN_AF_HANDLER CmOpenAfHandler;
CM_CLOSE_AF_HANDLER CmCloseAfHandler;
CM_REG_SAP_HANDLER CmRegisterSapHandler;
CM_DEREG_SAP_HANDLER CmDeregisterSapHandler;
CM_MAKE_CALL_HANDLER CmMakeCallHandler;
CM_CLOSE_CALL_HANDLER CmCloseCallHandler;
CM_INCOMING_CALL_COMPLETE_HANDLER CmIncomingCallCompleteHandler;
CM_ADD_PARTY_HANDLER CmAddPartyHandler;
CM_DROP_PARTY_HANDLER CmDropPartyHandler;
CM_ACTIVATE_VC_COMPLETE_HANDLER CmActivateVcCompleteHandler;
CM_DEACTIVATE_VC_COMPLETE_HANDLER CmDeactivateVcCompleteHandler;
CM_MODIFY_CALL_QOS_HANDLER CmModifyCallQoSHandler;
CO_OID_REQUEST_HANDLER CmOidRequestHandler;
CO_OID_REQUEST_COMPLETE_HANDLER CmOidRequestCompleteHandler;
CM_NOTIFY_CLOSE_AF_COMPLETE_HANDLER CmNotifyCloseAfCompleteHandler;
} NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS, *PNDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS;
#define NDIS_SIZEOF_CO_CALL_MANAGER_OPTIONAL_HANDLERS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS, CmOidRequestCompleteHandler)
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCoSendNetBufferLists(
__in NDIS_HANDLE NdisVcHandle,
__in PNET_BUFFER_LIST NetBufferLists,
__in ULONG SendFlags
);
__checkReturn
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisCoOidRequest(
__in NDIS_HANDLE NdisBindingHandle,
__in_opt NDIS_HANDLE NdisAfHandle,
__in_opt NDIS_HANDLE NdisVcHandle,
__in_opt NDIS_HANDLE NdisPartyHandle,
__inout PNDIS_OID_REQUEST OidRequest
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisCoOidRequestComplete(
__in NDIS_HANDLE NdisAfHandle,
__in_opt NDIS_HANDLE NdisVcHandle,
__in_opt NDIS_HANDLE NdisPartyHandle,
__in PNDIS_OID_REQUEST OidRequest,
__in NDIS_STATUS Status
);
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisClOpenAddressFamilyEx (
__in NDIS_HANDLE NdisBindingHandle,
__in PCO_ADDRESS_FAMILY AddressFamily,
__in NDIS_HANDLE ClientAfContext,
__out PNDIS_HANDLE NdisAfHandle
);
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisCmRegisterAddressFamilyEx(
__in NDIS_HANDLE NdisBindingHandle,
__in PCO_ADDRESS_FAMILY AddressFamily
);
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisMCmRegisterAddressFamilyEx(
__in NDIS_HANDLE MiniportAdapterHandle,
__in PCO_ADDRESS_FAMILY AddressFamily
);
__checkReturn
__drv_requiresIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisCmNotifyCloseAddressFamily (
__in NDIS_HANDLE NdisAfHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisClNotifyCloseAddressFamilyComplete (
__in NDIS_HANDLE NdisAfHandle,
__in NDIS_STATUS Status
);
#endif // NDIS_SUPPORT_NDIS6
#pragma once
#if NDIS_SUPPORT_NDIS6
//
// Ndis Light Weight filters
//
//
// init / de-init
//
//
// Flags used in NDIS_FILTER_ATTACH_PARAMETERS
//
#define NDIS_FILTER_ATTACH_FLAGS_IGNORE_MANDATORY 0x00000001 // If a mandatory filter fails to attach, it can set the flag
// to ask NDIS to ignore it is a mandatory filter
#define NDIS_FILTER_ATTACH_PARAMETERS_REVISION_1 1
#if (NDIS_SUPPORT_NDIS61)
#define NDIS_FILTER_ATTACH_PARAMETERS_REVISION_2 2
#endif // (NDIS_SUPPORT_NDIS61)
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_FILTER_ATTACH_PARAMETERS_REVISION_3 3
#endif // (NDIS_SUPPORT_NDIS61)
typedef struct _NDIS_FILTER_ATTACH_PARAMETERS
{
__in NDIS_OBJECT_HEADER Header;
__in NET_IFINDEX IfIndex;
__in NET_LUID NetLuid;
__in PNDIS_STRING FilterModuleGuidName;
__in NET_IFINDEX BaseMiniportIfIndex;
__in PNDIS_STRING BaseMiniportInstanceName;
__in PNDIS_STRING BaseMiniportName;
__in NDIS_MEDIA_CONNECT_STATE MediaConnectState;
__in NET_IF_MEDIA_DUPLEX_STATE MediaDuplexState;
__in ULONG64 XmitLinkSpeed;
__in ULONG64 RcvLinkSpeed;
__inout NDIS_MEDIUM MiniportMediaType;
__inout NDIS_PHYSICAL_MEDIUM MiniportPhysicalMediaType;
__in NDIS_HANDLE MiniportMediaSpecificAttributes;
__in PNDIS_OFFLOAD DefaultOffloadConfiguration;
__in USHORT MacAddressLength;
__in UCHAR CurrentMacAddress[NDIS_MAX_PHYS_ADDRESS_LENGTH];
__in NET_LUID BaseMiniportNetLuid;
__in NET_IFINDEX LowerIfIndex;
__in NET_LUID LowerIfNetLuid;
__inout ULONG Flags;
#if (NDIS_SUPPORT_NDIS61)
__in PNDIS_HD_SPLIT_CURRENT_CONFIG HDSplitCurrentConfig;
#endif // (NDIS_SUPPORT_NDIS61)
#if (NDIS_SUPPORT_NDIS620)
__in PNDIS_RECEIVE_FILTER_CAPABILITIES ReceiveFilterCapabilities;
__in PDEVICE_OBJECT MiniportPhysicalDeviceObject;
__in PNDIS_NIC_SWITCH_CAPABILITIES NicSwitchCapabilities;
#endif
} NDIS_FILTER_ATTACH_PARAMETERS, *PNDIS_FILTER_ATTACH_PARAMETERS;
#define NDIS_SIZEOF_FILTER_ATTACH_PARAMETERS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_FILTER_ATTACH_PARAMETERS, Flags)
#if (NDIS_SUPPORT_NDIS61)
#define NDIS_SIZEOF_FILTER_ATTACH_PARAMETERS_REVISION_2 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_FILTER_ATTACH_PARAMETERS, HDSplitCurrentConfig)
#endif // (NDIS_SUPPORT_NDIS61)
#if (NDIS_SUPPORT_NDIS620)
#define NDIS_SIZEOF_FILTER_ATTACH_PARAMETERS_REVISION_3 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_FILTER_ATTACH_PARAMETERS, NicSwitchCapabilities)
#endif // (NDIS_SUPPORT_NDIS620)
typedef
__drv_maxIRQL(PASSIVE_LEVEL)
NDIS_STATUS
(FILTER_ATTACH)(
__in NDIS_HANDLE NdisFilterHandle,
__in NDIS_HANDLE FilterDriverContext,
__in PNDIS_FILTER_ATTACH_PARAMETERS AttachParameters
);
typedef FILTER_ATTACH (*FILTER_ATTACH_HANDLER);
typedef
__drv_maxIRQL(PASSIVE_LEVEL)
VOID
(FILTER_DETACH)(
__in NDIS_HANDLE FilterModuleContext
);
typedef FILTER_DETACH (*FILTER_DETACH_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(FILTER_SET_MODULE_OPTIONS)(
__in NDIS_HANDLE FilterModuleContext
);
typedef FILTER_SET_MODULE_OPTIONS (*FILTER_SET_FILTER_MODULE_OPTIONS_HANDLER);
//
// NDIS_FILTER_RESTART_PARAMETERS is used in FILTER_RESTART handler
//
#define NDIS_FILTER_RESTART_PARAMETERS_REVISION_1 1
typedef struct _NDIS_FILTER_RESTART_PARAMETERS
{
NDIS_OBJECT_HEADER Header;
NDIS_MEDIUM MiniportMediaType;
NDIS_PHYSICAL_MEDIUM MiniportPhysicalMediaType;
PNDIS_RESTART_ATTRIBUTES RestartAttributes;
NET_IFINDEX LowerIfIndex;
NET_LUID LowerIfNetLuid;
ULONG Flags;
} NDIS_FILTER_RESTART_PARAMETERS, *PNDIS_FILTER_RESTART_PARAMETERS;
#define NDIS_SIZEOF__FILTER_RESTART_PARAMETERS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_FILTER_RESTART_PARAMETERS, Flags)
typedef
__drv_maxIRQL(PASSIVE_LEVEL)
NDIS_STATUS
(FILTER_RESTART)(
__in NDIS_HANDLE FilterModuleContext,
__in PNDIS_FILTER_RESTART_PARAMETERS RestartParameters
);
typedef FILTER_RESTART (*FILTER_RESTART_HANDLER);
#define NDIS_FILTER_PAUSE_PARAMETERS_REVISION_1 1
typedef struct _NDIS_FILTER_PAUSE_PARAMETERS
{
NDIS_OBJECT_HEADER Header;
ULONG Flags;
ULONG PauseReason;
} NDIS_FILTER_PAUSE_PARAMETERS, *PNDIS_FILTER_PAUSE_PARAMETERS;
#define NDIS_SIZEOF_FILTER_PAUSE_PARAMETERS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_FILTER_PAUSE_PARAMETERS, PauseReason)
typedef
__drv_maxIRQL(PASSIVE_LEVEL)
NDIS_STATUS
(FILTER_PAUSE)(
__in NDIS_HANDLE FilterModuleContext,
__in PNDIS_FILTER_PAUSE_PARAMETERS PauseParameters
);
typedef FILTER_PAUSE (*FILTER_PAUSE_HANDLER);
//
// inbound requests/data
//
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(FILTER_OID_REQUEST)(
__in NDIS_HANDLE FilterModuleContext,
__in PNDIS_OID_REQUEST OidRequest
);
typedef FILTER_OID_REQUEST (*FILTER_OID_REQUEST_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(FILTER_CANCEL_OID_REQUEST)(
__in NDIS_HANDLE FilterModuleContext,
__in PVOID RequestId
);
typedef FILTER_CANCEL_OID_REQUEST (*FILTER_CANCEL_OID_REQUEST_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(FILTER_SEND_NET_BUFFER_LISTS)(
__in NDIS_HANDLE FilterModuleContext,
__in PNET_BUFFER_LIST NetBufferList,
__in NDIS_PORT_NUMBER PortNumber,
__in ULONG SendFlags
);
typedef FILTER_SEND_NET_BUFFER_LISTS (*FILTER_SEND_NET_BUFFER_LISTS_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(FILTER_CANCEL_SEND_NET_BUFFER_LISTS)(
__in NDIS_HANDLE FilterModuleContext,
__in PVOID CancelId
);
typedef FILTER_CANCEL_SEND_NET_BUFFER_LISTS (*FILTER_CANCEL_SEND_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(FILTER_RETURN_NET_BUFFER_LISTS)(
__in NDIS_HANDLE FilterModuleContext,
__in PNET_BUFFER_LIST NetBufferLists,
__in ULONG ReturnFlags
);
typedef FILTER_RETURN_NET_BUFFER_LISTS (*FILTER_RETURN_NET_BUFFER_LISTS_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(FILTER_SEND_NET_BUFFER_LISTS_COMPLETE)(
__in NDIS_HANDLE FilterModuleContext,
__in PNET_BUFFER_LIST NetBufferList,
__in ULONG SendCompleteFlags
);
typedef FILTER_SEND_NET_BUFFER_LISTS_COMPLETE (*FILTER_SEND_NET_BUFFER_LISTS_COMPLETE_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(FILTER_RECEIVE_NET_BUFFER_LISTS)(
__in NDIS_HANDLE FilterModuleContext,
__in PNET_BUFFER_LIST NetBufferLists,
__in NDIS_PORT_NUMBER PortNumber,
__in ULONG NumberOfNetBufferLists,
__in ULONG ReceiveFlags
);
typedef FILTER_RECEIVE_NET_BUFFER_LISTS (*FILTER_RECEIVE_NET_BUFFER_LISTS_HANDLER);
typedef
__drv_maxIRQL(PASSIVE_LEVEL)
VOID
(FILTER_DEVICE_PNP_EVENT_NOTIFY)(
__in NDIS_HANDLE FilterModuleContext,
__in PNET_DEVICE_PNP_EVENT NetDevicePnPEvent
);
typedef FILTER_DEVICE_PNP_EVENT_NOTIFY (*FILTER_DEVICE_PNP_EVENT_NOTIFY_HANDLER);
typedef
__drv_maxIRQL(PASSIVE_LEVEL)
NDIS_STATUS
(FILTER_NET_PNP_EVENT)(
__in NDIS_HANDLE FilterModuleContext,
__in PNET_PNP_EVENT_NOTIFICATION NetPnPEventNotification
);
typedef FILTER_NET_PNP_EVENT (*FILTER_NET_PNP_EVENT_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(FILTER_STATUS)(
__in NDIS_HANDLE FilterModuleContext,
__in PNDIS_STATUS_INDICATION StatusIndication
);
typedef FILTER_STATUS (*FILTER_STATUS_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(FILTER_OID_REQUEST_COMPLETE)(
__in NDIS_HANDLE FilterModuleContext,
__in PNDIS_OID_REQUEST OidRequest,
__in NDIS_STATUS Status
);
typedef FILTER_OID_REQUEST_COMPLETE (*FILTER_OID_REQUEST_COMPLETE_HANDLER);
#if (NDIS_SUPPORT_NDIS61)
//
// NDIS 6.1 filter's entry points
//
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
NDIS_STATUS
(FILTER_DIRECT_OID_REQUEST)(
__in NDIS_HANDLE FilterModuleContext,
__in PNDIS_OID_REQUEST OidRequest
);
typedef FILTER_DIRECT_OID_REQUEST (*FILTER_DIRECT_OID_REQUEST_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(FILTER_DIRECT_OID_REQUEST_COMPLETE)(
__in NDIS_HANDLE FilterModuleContext,
__in PNDIS_OID_REQUEST OidRequest,
__in NDIS_STATUS Status
);
typedef FILTER_DIRECT_OID_REQUEST_COMPLETE (*FILTER_DIRECT_OID_REQUEST_COMPLETE_HANDLER);
typedef
__drv_maxIRQL(DISPATCH_LEVEL)
VOID
(FILTER_CANCEL_DIRECT_OID_REQUEST)(
__in NDIS_HANDLE FilterModuleContext,
__in PVOID RequestId
);
typedef FILTER_CANCEL_DIRECT_OID_REQUEST (*FILTER_CANCEL_DIRECT_OID_REQUEST_HANDLER);
#endif (NDIS_SUPPORT_NDIS61)
#define NDIS_FILTER_PARTIAL_CHARACTERISTICS_REVISION_1 1
typedef struct _NDIS_FILTER_PARTIAL_CHARACTERISTICS
{
NDIS_OBJECT_HEADER Header; // Header.Type = NDIS_OBJECT_TYPE_FILTER_PARTIAL_CHARACTERISTICS
ULONG Flags;
FILTER_SEND_NET_BUFFER_LISTS_HANDLER SendNetBufferListsHandler;
FILTER_SEND_NET_BUFFER_LISTS_COMPLETE_HANDLER SendNetBufferListsCompleteHandler;
FILTER_CANCEL_SEND_HANDLER CancelSendNetBufferListsHandler;
FILTER_RECEIVE_NET_BUFFER_LISTS_HANDLER ReceiveNetBufferListsHandler;
FILTER_RETURN_NET_BUFFER_LISTS_HANDLER ReturnNetBufferListsHandler;
} NDIS_FILTER_PARTIAL_CHARACTERISTICS, *PNDIS_FILTER_PARTIAL_CHARACTERISTICS;
#define NDIS_SIZEOF_FILTER_PARTIAL_CHARACTERISTICS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_FILTER_PARTIAL_CHARACTERISTICS, ReturnNetBufferListsHandler)
//
// Filter driver flags
//
#define NDIS_FILTER_DRIVER_MANDATORY 0x00000001
#define NDIS_FILTER_CHARACTERISTICS_REVISION_1 1
#if (NDIS_SUPPORT_NDIS61)
#define NDIS_FILTER_CHARACTERISTICS_REVISION_2 2
#endif // (NDIS_SUPPORT_NDIS61)
typedef struct _NDIS_FILTER_DRIVER_CHARACTERISTICS
{
NDIS_OBJECT_HEADER Header;
UCHAR MajorNdisVersion;
UCHAR MinorNdisVersion;
UCHAR MajorDriverVersion;
UCHAR MinorDriverVersion;
ULONG Flags;
NDIS_STRING FriendlyName;
NDIS_STRING UniqueName;
NDIS_STRING ServiceName;
SET_OPTIONS_HANDLER SetOptionsHandler;
FILTER_SET_FILTER_MODULE_OPTIONS_HANDLER SetFilterModuleOptionsHandler;
FILTER_ATTACH_HANDLER AttachHandler;
FILTER_DETACH_HANDLER DetachHandler;
FILTER_RESTART_HANDLER RestartHandler;
FILTER_PAUSE_HANDLER PauseHandler;
FILTER_SEND_NET_BUFFER_LISTS_HANDLER SendNetBufferListsHandler;
FILTER_SEND_NET_BUFFER_LISTS_COMPLETE_HANDLER SendNetBufferListsCompleteHandler;
FILTER_CANCEL_SEND_HANDLER CancelSendNetBufferListsHandler;
FILTER_RECEIVE_NET_BUFFER_LISTS_HANDLER ReceiveNetBufferListsHandler;
FILTER_RETURN_NET_BUFFER_LISTS_HANDLER ReturnNetBufferListsHandler;
FILTER_OID_REQUEST_HANDLER OidRequestHandler;
FILTER_OID_REQUEST_COMPLETE_HANDLER OidRequestCompleteHandler;
FILTER_CANCEL_OID_REQUEST_HANDLER CancelOidRequestHandler;
FILTER_DEVICE_PNP_EVENT_NOTIFY_HANDLER DevicePnPEventNotifyHandler;
FILTER_NET_PNP_EVENT_HANDLER NetPnPEventHandler;
FILTER_STATUS_HANDLER StatusHandler;
#if (NDIS_SUPPORT_NDIS61)
FILTER_DIRECT_OID_REQUEST_HANDLER DirectOidRequestHandler;
FILTER_DIRECT_OID_REQUEST_COMPLETE_HANDLER DirectOidRequestCompleteHandler;
FILTER_CANCEL_DIRECT_OID_REQUEST_HANDLER CancelDirectOidRequestHandler;
#endif // (NDIS_SUPPORT_NDIS61)
} NDIS_FILTER_DRIVER_CHARACTERISTICS, *PNDIS_FILTER_DRIVER_CHARACTERISTICS;
#define NDIS_SIZEOF_FILTER_DRIVER_CHARACTERISTICS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_FILTER_DRIVER_CHARACTERISTICS, StatusHandler)
#if (NDIS_SUPPORT_NDIS61)
#define NDIS_SIZEOF_FILTER_DRIVER_CHARACTERISTICS_REVISION_2 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_FILTER_DRIVER_CHARACTERISTICS, CancelDirectOidRequestHandler)
#endif //(NDIS_SUPPORT_NDIS61)
#define NDIS_FILTER_ATTRIBUTES_REVISION_1 1
typedef struct _NDIS_FILTER_ATTRIBUTES
{
NDIS_OBJECT_HEADER Header;
ULONG Flags;
} NDIS_FILTER_ATTRIBUTES, *PNDIS_FILTER_ATTRIBUTES;
#define NDIS_SIZEOF_FILTER_ATTRIBUTES_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_FILTER_ATTRIBUTES, Flags)
__drv_maxIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisFRegisterFilterDriver(
__in PDRIVER_OBJECT DriverObject,
__in NDIS_HANDLE FilterDriverContext,
__in PNDIS_FILTER_DRIVER_CHARACTERISTICS FilterDriverCharacteristics,
__out PNDIS_HANDLE NdisFilterDriverHandle
);
__drv_maxIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisFDeregisterFilterDriver(
__in NDIS_HANDLE NdisFilterDriverHandle
);
__drv_maxIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisFSetAttributes(
__in NDIS_HANDLE NdisFilterHandle,
__in NDIS_HANDLE FilterModuleContext,
__in PNDIS_FILTER_ATTRIBUTES FilterAttributes
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisFRestartFilter(
__in NDIS_HANDLE NdisFilterHandle
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFSendNetBufferLists(
__in NDIS_HANDLE NdisFilterHandle,
__in PNET_BUFFER_LIST NetBufferList,
__in NDIS_PORT_NUMBER PortNumber,
__in ULONG SendFlags
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFReturnNetBufferLists(
__in NDIS_HANDLE NdisFilterHandle,
__in PNET_BUFFER_LIST NetBufferLists,
__in ULONG ReturnFlags
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFSendNetBufferListsComplete(
__in NDIS_HANDLE NdisFilterHandle,
__in PNET_BUFFER_LIST NetBufferList,
__in ULONG SendCompleteFlags
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFIndicateReceiveNetBufferLists(
__in NDIS_HANDLE NdisFilterHandle,
__in PNET_BUFFER_LIST NetBufferLists,
__in NDIS_PORT_NUMBER PortNumber,
__in ULONG NumberOfNetBufferLists,
__in ULONG ReceiveFlags
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisFOidRequest(
__in NDIS_HANDLE NdisFilterHandle,
__in PNDIS_OID_REQUEST OidRequest
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFOidRequestComplete(
__in NDIS_HANDLE NdisFilterHandle,
__in PNDIS_OID_REQUEST OidRequest,
__in NDIS_STATUS Status
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFIndicateStatus(
__in NDIS_HANDLE NdisFilterHandle,
__in PNDIS_STATUS_INDICATION StatusIndication
);
__drv_maxIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisFRestartComplete(
__in NDIS_HANDLE NdisFilterHandle,
__in NDIS_STATUS Status
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFPauseComplete(
__in NDIS_HANDLE NdisFilterHandle
);
__drv_maxIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisFDevicePnPEventNotify(
__in NDIS_HANDLE NdisFilterHandle,
__in PNET_DEVICE_PNP_EVENT NetDevicePnPEvent
);
__drv_maxIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisFNetPnPEvent(
__in NDIS_HANDLE NdisFilterHandle,
__in PNET_PNP_EVENT_NOTIFICATION NetPnPEventNotification
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFCancelSendNetBufferLists(
__in NDIS_HANDLE NdisFilterHandle,
__in PVOID CancelId
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFCancelOidRequest(
__in NDIS_HANDLE NdisFilterHandle,
__in PVOID RequestId
);
#if (NDIS_SUPPORT_NDIS61)
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
NDIS_STATUS
NdisFDirectOidRequest(
__in NDIS_HANDLE NdisFilterHandle,
__in PNDIS_OID_REQUEST OidRequest
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFDirectOidRequestComplete(
__in NDIS_HANDLE NdisFilterHandle,
__in PNDIS_OID_REQUEST OidRequest,
__in NDIS_STATUS Status
);
__drv_maxIRQL(DISPATCH_LEVEL)
EXPORT
VOID
NdisFCancelDirectOidRequest(
__in NDIS_HANDLE NdisFilterHandle,
__in PVOID RequestId
);
#endif // (NDIS_SUPPORT_NDIS61)
#endif // NDIS_SUPPORT_NDIS6
#pragma once
#if (NDIS_SUPPORT_NDIS6 || defined(NDIS60))
//
// NDIS IF data structures, function prototypes and macros
//
typedef
__drv_maxIRQL(PASSIVE_LEVEL)
NDIS_STATUS
(*IFP_QUERY_OBJECT)(
__in NDIS_HANDLE ProviderIfContext,
__in NET_IF_OBJECT_ID ObjectId,
__inout PULONG pOutputBufferLength,
__out PVOID pOutputBuffer
);
typedef
__drv_maxIRQL(PASSIVE_LEVEL)
NDIS_STATUS
(*IFP_SET_OBJECT)(
__in NDIS_HANDLE ProviderIfContext,
__in NET_IF_OBJECT_ID ObjectId,
__in ULONG InputBufferLength,
__in PVOID pInputBuffer
);
typedef struct _NDIS_IF_PROVIDER_CHARACTERISTICS
{
NDIS_OBJECT_HEADER Header;
//
// Generic query and set handlers:
//
IFP_QUERY_OBJECT QueryObjectHandler;
IFP_SET_OBJECT SetObjectHandler;
PVOID Reserved1;
PVOID Reserved2;
} NDIS_IF_PROVIDER_CHARACTERISTICS, *PNDIS_IF_PROVIDER_CHARACTERISTICS;
#define NDIS_SIZEOF_IF_PROVIDER_CHARACTERISTICS_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NDIS_IF_PROVIDER_CHARACTERISTICS, Reserved2)
//
// NET_IF_INFORMATION is passed to NdisIfRegisterInterface
//
typedef struct _NET_IF_INFORMATION
{
NDIS_OBJECT_HEADER Header;
ULONG Flags; // Misc. information
NET_PHYSICAL_LOCATION PhysicalLocation; // physical location on machine
ULONG WanTunnelType; // tunnelIfEncapsMethod (RFC 2667)
ULONG PortNumber; // for WAN devices.
NET_IF_ACCESS_TYPE AccessType;
NET_IF_DIRECTION_TYPE DirectionType;
NET_IF_CONNECTION_TYPE ConnectionType;
BOOLEAN ifConnectorPresent;
USHORT PhysAddressLength; // in bytes (ifPhysAddress). this is -current- mac address
USHORT PhysAddressOffset; // from beginning of this struct
USHORT PermanentPhysAddressOffset; // from beginning of this struct
//
// The "friendly name" represents ifDescr:
//
USHORT FriendlyNameLength; // in bytes
USHORT FriendlyNameOffset; // from beginning of this struct
GUID InterfaceGuid;
NET_IF_NETWORK_GUID NetworkGuid;
ULONG SupportedStatistics;
NDIS_MEDIUM MediaType;
NDIS_PHYSICAL_MEDIUM PhysicalMediumType;
} NET_IF_INFORMATION, *PNET_IF_INFORMATION;
#define NDIS_SIZEOF_NET_IF_INFORMATION_REVISION_1 \
RTL_SIZEOF_THROUGH_FIELD(NET_IF_INFORMATION, PhysicalMediumType)
__drv_maxIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisIfRegisterProvider(
__in PNDIS_IF_PROVIDER_CHARACTERISTICS ProviderCharacteristics,
__in NDIS_HANDLE IfProviderContext,
__out PNDIS_HANDLE pNdisIfProviderHandle
);
__drv_maxIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisIfDeregisterProvider(
__in NDIS_HANDLE NdisProviderHandle
);
__drv_maxIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisIfAllocateNetLuidIndex(
__in NET_IFTYPE ifType,
__out PUINT32 pNetLuidIndex
);
__drv_maxIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisIfFreeNetLuidIndex(
__in NET_IFTYPE ifType,
__in UINT32 NetLuidIndex
);
__drv_maxIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisIfRegisterInterface(
__in NDIS_HANDLE NdisProviderHandle,
__in NET_LUID NetLuid,
__in NDIS_HANDLE ProviderIfContext,
__in PNET_IF_INFORMATION pIfInfo,
__out PNET_IFINDEX pfIndex
);
__drv_maxIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisIfDeregisterInterface(
__in NET_IFINDEX ifIndex
);
__drv_maxIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisIfGetInterfaceIndexFromNetLuid(
__in NET_LUID NetLuid,
__out PNET_IFINDEX pIfIndex
);
__drv_maxIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisIfGetNetLuidFromInterfaceIndex(
__in NET_IFINDEX ifIndex,
__out PNET_LUID pNetLuid
);
__drv_maxIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisIfQueryBindingIfIndex(
__in NDIS_HANDLE NdisBindingHandle,
__out PNET_IFINDEX pBoundIfIndex,
__out PNET_LUID pBoundIfNetLuid,
__out PNET_IFINDEX pLowestIfIndex,
__out PNET_LUID pLowestIfNetLuid
);
__drv_maxIRQL(PASSIVE_LEVEL)
EXPORT
NDIS_STATUS
NdisIfAddIfStackEntry(
__in NET_IFINDEX HigherLayerIfIndex,
__in NET_IFINDEX LowerLayerIfIndex
);
__drv_maxIRQL(PASSIVE_LEVEL)
EXPORT
VOID
NdisIfDeleteIfStackEntry(
__in NET_IFINDEX HigherLayerIfIndex,
__in NET_IFINDEX LowerLayerIfIndex
);
#endif // (NDIS_SUPPORT_NDIS6 || defined(NDIS60))
#endif // _NDIS_