/*
 *  ndis.h      Network Driver Interface Specification (NDIS) functions
 *
 * =========================================================================
 *
 *                          Open Watcom Project
 *
 * Copyright (c) 2004-2026 The Open Watcom Contributors. All Rights Reserved.
 *
 *    This file is automatically generated. Do not edit directly.
 *
 * =========================================================================
 */

#ifndef _NDIS_
#define _NDIS_

#ifndef _ENABLE_AUTODEPEND
 #pragma read_only_file
#endif

#include <ntddk.h>
#include <ntstatus.h>
#include <netevent.h>
#include <xfilter.h>
#include <qos.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef NDIS_WRAPPER
    #ifdef NDIS_MINIPORT_DRIVER
        #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
        #endif
    #endif
    #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
    #else
        #define NDIS40
        #define NDIS_PROTOCOL_MAJOR_VERSION     4
        #define NDIS_PROTOCOL_MINOR_VERSION     0
    #endif
#endif
#ifndef 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
#endif
#ifndef 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
#endif
#ifndef NDIS_LEGACY_DRIVER
    #if NDIS_LEGACY_MINIPORT || NDIS_LEGACY_PROTOCOL || NDIS_WRAPPER
        #define NDIS_LEGACY_DRIVER              1
    #else
        #define NDIS_LEGACY_DRIVER              0
    #endif
#endif
#ifndef 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
#ifndef 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
#ifndef 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
#if NDIS_SUPPORT_NDIS620
    #undef NDIS_SUPPORT_NDIS61
    #define NDIS_SUPPORT_NDIS61                 1
#endif
#if NDIS_SUPPORT_NDIS61
    #undef NDIS_SUPPORT_NDIS6
    #define NDIS_SUPPORT_NDIS6                  1
#endif
#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

/* Macro to specify NDIS functions */
#ifdef NDIS_WRAPPER
    #define EXPORT
#else
    #define EXPORT  DECLSPEC_IMPORT
#endif

/* Primitive data types */
typedef signed int                      INT;
typedef signed int                      *PINT;
typedef unsigned int                    UINT;
typedef unsigned int                    *PUINT;
typedef UNICODE_STRING                  NDIS_STRING;
typedef UNICODE_STRING                  *PNDIS_STRING;
typedef PVOID                           NDIS_HANDLE;
typedef PVOID                           *PNDIS_HANDLE;
typedef int                             NDIS_STATUS;
typedef int                             *PNDIS_STATUS;
typedef CM_MCA_POS_DATA                 NDIS_MCA_POS_DATA;
typedef CM_MCA_POS_DATA                 *PNDIS_MCA_POS_DATA;
typedef CM_EISA_SLOT_INFORMATION        NDIS_EISA_SLOT_INFORMATION;
typedef CM_EISA_SLOT_INFORMATION        *PNDIS_EISA_SLOT_INFORMATION;
typedef CM_EISA_FUNCTION_INFORMATION    NDIS_EISA_FUNCTION_INFORMATION;
typedef CM_EISA_FUNCTION_INFORMATION    *PNDIS_EISA_FUNCTION_INFORMATION;
typedef KINTERRUPT_MODE                 NDIS_INTERRUPT_MODE;
typedef KINTERRUPT_MODE                 *PNDIS_INTERRUPT_MODE;
typedef CM_PARTIAL_RESOURCE_LIST        NDIS_RESOURCE_LIST;
typedef CM_PARTIAL_RESOURCE_LIST        *PNDIS_RESOURCE_LIST;
typedef MDL                             NDIS_BUFFER;
typedef MDL                             *PNDIS_BUFFER;
typedef ULONG                           NDIS_AF;
typedef ULONG                           *PNDIS_AF;
typedef PHYSICAL_ADDRESS                NDIS_PHYSICAL_ADDRESS;
typedef PHYSICAL_ADDRESS                *PNDIS_PHYSICAL_ADDRESS;
typedef UCHAR                           NDIS_DMA_SIZE;
#if NDIS_LEGACY_DRIVER
typedef NDIS_HANDLE                     PNDIS_PACKET_POOL;
typedef UINT                            IEEE8021PPRIORITY;
#endif
#if !NDIS_LEGACY_DRIVER
typedef struct _NDIS_CALL_MANAGER_CHARACTERISTICS   *PNDIS_CALL_MANAGER_CHARACTERISTICS;
#endif
#if NDIS_SUPPORT_NDIS6
typedef USHORT                          NET_FRAME_TYPE;
typedef USHORT                          *PNET_FRAME_TYPE;
typedef KMUTEX                          NDIS_MUTEX;
typedef KMUTEX                          *PNDIS_MUTEX;
#endif
#if NDIS_SUPPORT_NDIS61
typedef ULONG                           IPSEC_OFFLOAD_V2_SPI_TYPE;
#endif

/* NDIS error code data type */
#define NDIS_ERROR_CODE ULONG

#include <ntddndis.h>
#if NDIS_SUPPORT_NDIS6
    #include <windot11.h>
#endif

/* Macro to make NDIS string constants */
#define NDIS_STRING_CONST( x )  { sizeof( L##x ) - 2, sizeof( L##x ), L##x }

/* Macro to make NDIS physical addresses */
#define NDIS_PHYSICAL_ADDRESS_CONST( p1, p2 )   { (ULONG)(p1), (LONG)(p2) }

/* NDIS interrupt modes */
#define NdisInterruptLatched        Latched
#define NdisInterruptLevelSensitive LevelSensitive

/* NDIS packet flags */
#if NDIS_LEGACY_DRIVER
    #define NDIS_FLAGS_PROTOCOL_ID_MASK         0x0000000FL
    #define NDIS_FLAGS_MULTICAST_PACKET         0x00000010L
    #define NDIS_FLAGS_DONT_LOOPBACK            0x00000080L
    #define NDIS_FLAGS_IS_LOOPBACK_PACKET       0x00000100L
    #define NDIS_FLAGS_LOOPBACK_ONLY            0x00000200L
    #define NDIS_FLAGS_DOUBLE_BUFFERED          0x00000800L
    #define NDIS_FLAGS_SENT_AT_DPC              0x00001000L
    #define NDIS_FLAGS_USES_SG_BUFFER_LIST      0x00002000L
    #define NDIS_FLAGS_USES_ORIGINAL_PACKET     0x00004000L
    #define NDIS_FLAGS_PADDED                   0x00010000L
    #define NDIS_FLAGS_XLATE_AT_TOP             0x00020000L
#endif

/* NDIS reserved packet flags */
#if NDIS_LEGACY_DRIVER
    #define fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO    0x40
    #define fPACKET_ALLOCATED_BY_NDIS               0x80
#endif

/* NDIS address families */
#define CO_ADDRESS_FAMILY_Q2931         0x00000001L
#define CO_ADDRESS_FAMILY_PSCHED        0x00000002L
#define CO_ADDRESS_FAMILY_L2TP          0x00000003L
#define CO_ADDRESS_FAMILY_IRDA          0x00000004L
#define CO_ADDRESS_FAMILY_1394          0x00000005L
#define CO_ADDRESS_FAMILY_PPP           0x00000006L
#define CO_ADDRESS_FAMILY_INFINIBAND    0x00000007L
#define CO_ADDRESS_FAMILY_TAPI          0x00000800L
#define CO_ADDRESS_FAMILY_TAPI_PROXY    0x00000801L
#define CO_ADDRESS_FAMILY_PROXY         0x80000000L

/* NDIS memory types */
#define NDIS_MEMORY_CONTIGUOUS  0x00000001L
#define NDIS_MEMORY_NONCACHED   0x00000002L

/* NDIS open flags */
#define NDIS_OPEN_RECEIVE_NOT_REENTRANT 0x00000001L

/* NDIS status codes */
#define NDIS_STATUS_ONLINE                              0x40010003L
#define NDIS_STATUS_RESET_START                         0x40010004L
#define NDIS_STATUS_RESET_END                           0x40010005L
#define NDIS_STATUS_RING_STATUS                         0x40010006L
#define NDIS_STATUS_CLOSED                              0x40010007L
#define NDIS_STATUS_WAN_LINE_UP                         0x40010008L
#define NDIS_STATUS_WAN_LINE_DOWN                       0x40010009L
#define NDIS_STATUS_WAN_FRAGMENT                        0x4001000AL
#define NDIS_STATUS_MEDIA_CONNECT                       0x4001000BL
#define NDIS_STATUS_MEDIA_DISCONNECT                    0x4001000CL
#define NDIS_STATUS_HARDWARE_LINE_UP                    0x4001000DL
#define NDIS_STATUS_HARDWARE_LINE_DOWN                  0x4001000EL
#define NDIS_STATUS_INTERFACE_UP                        0x4001000FL
#define NDIS_STATUS_INTERFACE_DOWN                      0x40010010L
#define NDIS_STATUS_MEDIA_BUSY                          0x40010011L
#define NDIS_STATUS_MEDIA_SPECIFIC_INDICATION           0x40010012L
#define NDIS_STATUS_WW_INDICATION \
    NDIS_STATUS_MEDIA_SPECIFIC_INDICATION
#define NDIS_STATUS_LINK_SPEED_CHANGE                   0x40010013L
#define NDIS_STATUS_WAN_GET_STATS                       0x40010014L
#define NDIS_STATUS_WAN_CO_FRAGMENT                     0x40010015L
#define NDIS_STATUS_WAN_CO_LINKPARAMS                   0x40010016L
#define NDIS_STATUS_WAN_CO_MTULINKPARAMS                0x40010025L
#if NDIS_SUPPORT_NDIS6
    #define NDIS_STATUS_LINK_STATE                      0x40010017L
    #define NDIS_STATUS_NETWORK_CHANGE                  0x40010018L
    #define NDIS_STATUS_MEDIA_SPECIFIC_INDICATION_EX    0x40010019L
    #define NDIS_STATUS_PORT_STATE                      0x40010022L
    #define NDIS_STATUS_OPER_STATUS                     0x40010023L
    #define NDIS_STATUS_PACKET_FILTER                   0x40010024L
    #define NDIS_STATUS_IP_OPER_STATUS                  0x40010026L
    #define NDIS_STATUS_OFFLOAD_PAUSE                   0x40020001L
    #define NDIS_STATUS_UPLOAD_ALL                      0x40020002L
    #define NDIS_STATUS_OFFLOAD_RESUME                  0x40020003L
    #define NDIS_STATUS_OFFLOAD_PARTIAL_SUCCESS         0x40020004L
    #define NDIS_STATUS_OFFLOAD_STATE_INVALID           0x40020005L
    #define NDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG     0x40020006L
    #define NDIS_STATUS_TASK_OFFLOAD_HARDWARE_CAPABILITIES  0x40020007L
    #define NDIS_STATUS_OFFLOAD_ENCAPSULATION_CHANGE    0x40020008L
    #define NDIS_STATUS_TCP_CONNECTION_OFFLOAD_HARDWARE_CAPABILITIES    0x4002000BL
    #define NDIS_STATUS_DOT11_SCAN_CONFIRM              0x40030000L
    #define NDIS_STATUS_DOT11_MPDU_MAX_LENGTH_CHANGED   0x40030001L
    #define NDIS_STATUS_DOT11_ASSOCIATION_START         0x40030002L
    #define NDIS_STATUS_DOT11_ASSOCIATION_COMPLETION    0x40030003L
    #define NDIS_STATUS_DOT11_CONNECTION_START          0x40030004L
    #define NDIS_STATUS_DOT11_CONNECTION_COMPLETION     0x40030005L
    #define NDIS_STATUS_DOT11_ROAMING_START             0x40030006L
    #define NDIS_STATUS_DOT11_ROAMING_COMPLETION        0x40030007L
    #define NDIS_STATUS_DOT11_DISASSOCIATION            0x40030008L
    #define NDIS_STATUS_DOT11_TKIPMIC_FAILURE           0x40030009L
    #define NDIS_STATUS_DOT11_PMKID_CANDIDATE_LIST      0x4003000AL
    #define NDIS_STATUS_DOT11_PHY_STATE_CHANGED         0x4003000BL
    #define NDIS_STATUS_DOT11_LINK_QUALITY              0x4003000CL
    #define NDIS_STATUS_DOT11_INCOMING_ASSOC_STARTED    0x4003000DL
    #define NDIS_STATUS_DOT11_INCOMING_ASSOC_REQUEST_RECEIVED   0x4003000EL
    #define NDIS_STATUS_DOT11_INCOMING_ASSOC_COMPLETION 0x4003000FL
    #define NDIS_STATUS_DOT11_STOP_AP                   0x40030010L
    #define NDIS_STATUS_DOT11_PHY_FREQUENCY_ADOPTED     0x40030011L
    #define NDIS_STATUS_DOT11_CAN_SUSTAIN_AP            0x40030012L
    #define NDIS_STATUS_WWAN_DEVICE_CAPS                0x40041000L
    #define NDIS_STATUS_WWAN_READY_INFO                 0x40041001L
    #define NDIS_STATUS_WWAN_RADIO_STATE                0x40041002L
    #define NDIS_STATUS_WWAN_PIN_INFO                   0x40041003L
    #define NDIS_STATUS_WWAN_PIN_LIST                   0x40041004L
    #define NDIS_STATUS_WWAN_HOME_PROVIDER              0x40041005L
    #define NDIS_STATUS_WWAN_PREFERRED_PROVIDERS        0x40041006L
    #define NDIS_STATUS_WWAN_VISIBLE_PROVIDERS          0x40041007L
    #define NDIS_STATUS_WWAN_REGISTER_STATE             0x40041008L
    #define NDIS_STATUS_WWAN_PACKET_SERVICE             0x40041009L
    #define NDIS_STATUS_WWAN_SIGNAL_STATE               0x4004100AL
    #define NDIS_STATUS_WWAN_CONTEXT_STATE              0x4004100BL
    #define NDIS_STATUS_WWAN_PROVISIONED_CONTEXTS       0x4004100CL
    #define NDIS_STATUS_WWAN_SERVICE_ACTIVATION         0x4004100DL
    #define NDIS_STATUS_WWAN_SMS_CONFIGURATION          0x4004100EL
    #define NDIS_STATUS_WWAN_SMS_RECEIVE                0x4004100FL
    #define NDIS_STATUS_WWAN_SMS_SEND                   0x40041010L
    #define NDIS_STATUS_WWAN_SMS_DELETE                 0x40041011L
    #define NDIS_STATUS_WWAN_SMS_STATUS                 0x40041012L
    #define NDIS_STATUS_WWAN_DNS_ADDRESS                0x40041013L
    #define NDIS_STATUS_WWAN_VENDOR_SPECIFIC            0x40043000L
#endif
#if NDIS_SUPPORT_NDIS61
    #define NDIS_STATUS_HD_SPLIT_CURRENT_CONFIG         0x4002000CL
#endif
#if NDIS_SUPPORT_NDIS620
    #define NDIS_STATUS_RECEIVE_QUEUE_STATE             0x4002000DL
    #define NDIS_STATUS_PM_WOL_PATTERN_REJECTED         0x40030051L
    #define NDIS_STATUS_PM_OFFLOAD_REJECTED             0x40030052L
    #define NDIS_STATUS_PM_CAPABILITIES_CHANGE          0x40030053L
#endif
#define NDIS_STATUS_SUCCESS                             STATUS_SUCCESS
#define NDIS_STATUS_PENDING                             STATUS_PENDING
#define NDIS_STATUS_NOT_RECOGNIZED                      0x00010001L
#define NDIS_STATUS_NOT_COPIED                          0x00010002L
#define NDIS_STATUS_NOT_ACCEPTED                        0x00010003L
#define NDIS_STATUS_CALL_ACTIVE                         0x00010007L
#define NDIS_STATUS_INDICATION_REQUIRED                 STATUS_NDIS_INDICATION_REQUIRED
#define NDIS_STATUS_NOT_RESETTABLE                      0x80010001L
#define NDIS_STATUS_SOFT_ERRORS                         0x80010003L
#define NDIS_STATUS_HARD_ERRORS                         0x80010004L
#define NDIS_STATUS_BUFFER_OVERFLOW                     STATUS_BUFFER_OVERFLOW
#define NDIS_STATUS_FAILURE                             STATUS_UNSUCCESSFUL
#define NDIS_STATUS_RESOURCES                           STATUS_INSUFFICIENT_RESOURCES
#define NDIS_STATUS_CLOSING                             0xC0010002L
#define NDIS_STATUS_BAD_VERSION                         0xC0010004L
#define NDIS_STATUS_BAD_CHARACTERISTICS                 0xC0010005L
#define NDIS_STATUS_ADAPTER_NOT_FOUND                   0xC0010006L
#define NDIS_STATUS_OPEN_FAILED                         0xC0010007L
#define NDIS_STATUS_DEVICE_FAILED                       0xC0010008L
#define NDIS_STATUS_MULTICAST_FULL                      0xC0010009L
#define NDIS_STATUS_MULTICAST_EXISTS                    0xC001000AL
#define NDIS_STATUS_MULTICAST_NOT_FOUND                 0xC001000BL
#define NDIS_STATUS_REQUEST_ABORTED                     0xC001000CL
#define NDIS_STATUS_RESET_IN_PROGRESS                   0xC001000DL
#define NDIS_STATUS_CLOSING_INDICATING                  0xC001000EL
#define NDIS_STATUS_NOT_SUPPORTED                       STATUS_NOT_SUPPORTED
#define NDIS_STATUS_INVALID_PACKET                      0xC001000FL
#define NDIS_STATUS_OPEN_LIST_FULL                      0xC0010010L
#define NDIS_STATUS_ADAPTER_NOT_READY                   0xC0010011L
#define NDIS_STATUS_ADAPTER_NOT_OPEN                    0xC0010012L
#define NDIS_STATUS_NOT_INDICATING                      0xC0010013L
#define NDIS_STATUS_INVALID_LENGTH                      0xC0010014L
#define NDIS_STATUS_INVALID_DATA                        0xC0010015L
#define NDIS_STATUS_BUFFER_TOO_SHORT                    0xC0010016L
#define NDIS_STATUS_INVALID_OID                         0xC0010017L
#define NDIS_STATUS_ADAPTER_REMOVED                     0xC0010018L
#define NDIS_STATUS_UNSUPPORTED_MEDIA                   0xC0010019L
#define NDIS_STATUS_GROUP_ADDRESS_IN_USE                0xC001001AL
#define NDIS_STATUS_FILE_NOT_FOUND                      0xC001001BL
#define NDIS_STATUS_ERROR_READING_FILE                  0xC001001CL
#define NDIS_STATUS_ALREADY_MAPPED                      0xC001001DL
#define NDIS_STATUS_RESOURCE_CONFLICT                   0xC001001EL
#define NDIS_STATUS_NO_CABLE                            0xC001001FL
#define NDIS_STATUS_INVALID_DEVICE_REQUEST              STATUS_INVALID_DEVICE_REQUEST
#define NDIS_STATUS_NETWORK_UNREACHABLE                 STATUS_NETWORK_UNREACHABLE
#define NDIS_STATUS_INVALID_SAP                         0xC0010020L
#define NDIS_STATUS_SAP_IN_USE                          0xC0010021L
#define NDIS_STATUS_INVALID_ADDRESS                     0xC0010022L
#define NDIS_STATUS_VC_NOT_ACTIVATED                    0xC0010023L
#define NDIS_STATUS_DEST_OUT_OF_ORDER                   0xC0010024L
#define NDIS_STATUS_VC_NOT_AVAILABLE                    0xC0010025L
#define NDIS_STATUS_CELLRATE_NOT_AVAILABLE              0xC0010026L
#define NDIS_STATUS_INCOMPATABLE_QOS                    0xC0010027L
#define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED              0xC0010028L
#define NDIS_STATUS_NO_ROUTE_TO_DESTINATION             0xC0010029L
#define NDIS_STATUS_TOKEN_RING_OPEN_ERROR               0xC0011000L
#if NDIS_SUPPORT_NDIS6
    #define NDIS_STATUS_SEND_ABORTED                    STATUS_NDIS_REQUEST_ABORTED
    #define NDIS_STATUS_PAUSED                          STATUS_NDIS_PAUSED
    #define NDIS_STATUS_INTERFACE_NOT_FOUND             STATUS_NDIS_INTERFACE_NOT_FOUND
    #define NDIS_STATUS_INVALID_PARAMETER               STATUS_INVALID_PARAMETER
    #define NDIS_STATUS_UNSUPPORTED_REVISION            STATUS_NDIS_UNSUPPORTED_REVISION
    #define NDIS_STATUS_INVALID_PORT                    STATUS_NDIS_INVALID_PORT
    #define NDIS_STATUS_INVALID_PORT_STATE              STATUS_NDIS_INVALID_PORT_STATE
    #define NDIS_STATUS_INVALID_STATE                   STATUS_INVALID_DEVICE_STATE
    #define NDIS_STATUS_MEDIA_DISCONNECTED              STATUS_NDIS_MEDIA_DISCONNECTED
    #define NDIS_STATUS_LOW_POWER_STATE                 STATUS_NDIS_LOW_POWER_STATE
    #define NDIS_STATUS_DOT11_AUTO_CONFIG_ENABLED \
        STATUS_NDIS_DOT11_AUTO_CONFIG_ENABLED
    #define NDIS_STATUS_DOT11_MEDIA_IN_USE              STATUS_NDIS_DOT11_MEDIA_IN_USE
    #define NDIS_STATUS_DOT11_POWER_STATE_INVALID \
        STATUS_NDIS_DOT11_POWER_STATE_INVALID
    #define NDIS_STATUS_UPLOAD_IN_PROGRESS              0xC0231001L
    #define NDIS_STATUS_REQUEST_UPLOAD                  0xC0231002L
    #define NDIS_STATUS_UPLOAD_REQUESTED                0xC0231003L
    #define NDIS_STATUS_OFFLOAD_TCP_ENTRIES             0xC0231004L
    #define NDIS_STATUS_OFFLOAD_PATH_ENTRIES            0xC0231005L
    #define NDIS_STATUS_OFFLOAD_NEIGHBOR_ENTRIES        0xC0231006L
    #define NDIS_STATUS_OFFLOAD_IP_ADDRESS_ENTRIES      0xC0231007L
    #define NDIS_STATUS_OFFLOAD_HW_ADDRESS_ENTRIES      0xC0231008L
    #define NDIS_STATUS_OFFLOAD_VLAN_ENTRIES            0xC0231009L
    #define NDIS_STATUS_OFFLOAD_TCP_XMIT_BUFFER         0xC023100AL
    #define NDIS_STATUS_OFFLOAD_TCP_RCV_BUFFER          0xC023100BL
    #define NDIS_STATUS_OFFLOAD_TCP_RCV_WINDOW          0xC023100CL
    #define NDIS_STATUS_OFFLOAD_VLAN_MISMATCH           0xC023100DL
    #define NDIS_STATUS_OFFLOAD_DATA_NOT_ACCEPTED       0xC023100EL
    #define NDIS_STATUS_OFFLOAD_POLICY                  0xC023100FL
    #define NDIS_STATUS_OFFLOAD_DATA_PARTIALLY_ACCEPTED 0xC0231010L
    #define NDIS_STATUS_OFFLOAD_REQUEST_RESET           0xC0231011L
#endif
#if NDIS_SUPPORT_NDIS620
    #define NDIS_STATUS_PM_WOL_PATTERN_LIST_FULL \
        STATUS_NDIS_PM_WOL_PATTERN_LIST_FULL
    #define NDIS_STATUS_PM_PROTOCOL_OFFLOAD_LIST_FULL \
        STATUS_NDIS_PM_PROTOCOL_OFFLOAD_LIST_FULL
    #define NDIS_STATUS_OFFLOAD_CONNECTION_REJECTED \
        STATUS_NDIS_OFFLOAD_CONNECTION_REJECTED
#endif

/* NDIS error codes */
#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

/* NDIS read/write lock flags */
#if NDIS_SUPPORT_NDIS620
    #define NDIS_RWL_AT_DISPATCH_LEVEL  1
#endif

/* NDIS buffer macros */
#define NDIS_BUFFER_TO_SPAN_PAGES( x ) \
    (MmGetMdlByteCount( x ) == 0 ? 1 : (ADDRESS_AND_SIZE_TO_SPAN_PAGES( \
    MmGetMdlVirtualAddress( x ), MmGetMdlByteCount( x ) )))
#define NDIS_BUFFER_LINKAGE( x )    ((x)->Next)

/* NDIS maximum processor count */
#if NDIS_SUPPORT_60_COMPATIBLE_API && !defined( NDIS_WRAPPER )
    #define NDIS_MAX_PROCESSOR_COUNT    32
#endif

/* Macros that alias kernel functions */
#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( x )    KeRaiseIrql( DISPATCH_LEVEL, x )
    #define NDIS_LOWER_IRQL( p1, p2 ) \
        { \
            if( (p1) != (p2) ) { \
                KeLowerIrql( p1 ); \
            } \
        }
    #define NDIS_INIT_MUTEX( x )                KeInitializeMutex( x, 0xFFFF )
    #define NDIS_RELEASE_MUTEX( x )             KeReleaseMutex( x, FALSE )
    #define NDIS_WAIT_FOR_MUTEX( x ) \
        KeWaitForSingleObject( x, Executive, KernelMode, FALSE, NULL );
#endif

/* NDIS configuration object revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_CONFIGURATION_OBJECT_REVISION_1    1
#endif

/* NDIS configuration flags */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_CONFIG_FLAG_FILTER_INSTANCE_CONFIGURATION  0x00000001L
#endif

/* Network Plug and Play event flags */
#if NDIS_SUPPORT_NDIS6
    #define NET_EVENT_HALT_MINIPORT_ON_LOW_POWER    0x00000001L
#endif

/* Network Plug and Play event notification revision number */
#if NDIS_SUPPORT_NDIS6
    #define NET_PNP_EVENT_NOTIFICATION_REVISION_1   1
#endif

/* NDIS object identifier request constants */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_OID_REQUEST_REVISION_1         1
    #define NDIS_OID_REQUEST_TIMEOUT_INFINITE   0
    #define NDIS_OID_REQUEST_NDIS_RESERVED_SIZE 16
#endif

/* NDIS status indication flags */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_STATUS_INDICATION_FLAGS_MEDIA_CONNECT_TO_CONNECT   0x1000
#endif

/* NDIS status indication revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_STATUS_INDICATION_REVISION_1   1
#endif

/* NDIS timer characteristics revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_TIMER_CHARACTERISTICS_REVISION_1   1
#endif

/* NDIS lookahead size special value */
#if NDIS_SUPPORT_NDIS620
    #define NDIS_MAX_LOOKAHEAD_SIZE_ACCESSED_UNDEFINED  (-1)
#endif

/* NDIS restart general attributes flags */
#if NDIS_SUPPORT_NDIS620
    #define NDIS_RESTART_GENERAL_ATTRIBUTES_MAX_LOOKAHEAD_ACCESSED_DEFINED  0x00000001L
#endif

/* NDIS restart general attributes revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_RESTART_GENERAL_ATTRIBUTES_REVISION_1  1
#endif
#if NDIS_SUPPORT_NDIS620
    #define NDIS_RESTART_GENERAL_ATTRIBUTES_REVISION_2  2
#endif

/* NDIS system processor information revision number */
#if NDIS_SUPPORT_NDIS6 && NDIS_SUPPORT_60_COMPATIBLE_API
    #define NDIS_SYSTEM_PROCESSOR_INFO_REVISION_1   1
#endif

/* NDIS pause parameters */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_PAUSE_NDIS_INTERNAL            0x00000001L
    #define NDIS_PAUSE_LOW_POWER                0x00000002L
    #define NDIS_PAUSE_BIND_PROTOCOL            0x00000004L
    #define NDIS_PAUSE_UNBIND_PROTOCOL          0x00000008L
    #define NDIS_PAUSE_ATTACH_FILTER            0x00000010L
    #define NDIS_PAUSE_DETACH_FILTER            0x00000020L
    #define NDIS_PAUSE_FILTER_RESTART_STACK     0x00000040L
    #define NDIS_PAUSE_MINIPORT_DEVICE_REMOVE   0x00000080L
#endif

/* NDIS filter interface flags */
#if (NTDDI_VERSION == 0x06000000) && (NDIS_LEGACY_DRIVER || NDIS_SUPPORT_NDIS6)
    #define NDIS_FILTER_INTERFACE_IM_FILTER 0x00000001L
    #define NDIS_FILTER_INTERFACE_LW_FILTER 0x00000002L
#endif

/* NDIS filter interface revision number */
#if (NTDDI_VERSION == 0x06000000) && (NDIS_LEGACY_DRIVER || NDIS_SUPPORT_NDIS6)
    #define NDIS_FILTER_INTERFACE_REVISION_1    1
#endif

/* NDIS enumerate filters revision number */
#if (NTDDI_VERSION == 0x06000000) && (NDIS_LEGACY_DRIVER || NDIS_SUPPORT_NDIS6)
    #define NDIS_ENUM_FILTERS_REVISION_1    1
#endif

/* NDIS device object attributes revision number */
#if (NTDDI_VERSION == 0x06000000) && (NDIS_LEGACY_DRIVER || NDIS_SUPPORT_NDIS6)
    #define NDIS_DEVICE_OBJECT_ATTRIBUTES_REVISION_1    1
#endif

/* NDIS object type device wrapper revision number */
#if (NTDDI_VERSION == 0x06000000) && (NDIS_LEGACY_DRIVER || NDIS_SUPPORT_NDIS6)
    #define NDIS_OBJECT_TYPE_DRIVER_WRAPPER_REVISION_1  1
#endif

/* NDIS shared memory parameters flags */
#if NDIS_SUPPORT_NDIS620
    #define NDIS_SHARED_MEM_PARAMETERS_CONTIGUOUS   0x00000001L
#endif

/* NDIS shared memory handle special value */
#if NDIS_SUPPORT_NDIS620
    #define NDIS_SHARED_MEM_HANDLE_HAL_ALLOCATED    NULL
#endif

/* NDIS shared memory parameters revision number */
#if NDIS_SUPPORT_NDIS620
    #define NDIS_SHARED_MEMORY_PARAMETERS_REVISION_1    1
#endif

/* NDIS shared memory provider characteristics revision number */
#if NDIS_SUPPORT_NDIS620
    #define NDIS_SHARED_MEMORY_PROVIDER_CHARACTERISTICS_REVISION_1  1
#endif

/* NDIS receive queue state revision number */
#if NDIS_SUPPORT_NDIS620
    #define NDIS_RECEIVE_QUEUE_STATE_REVISION_1 1
#endif

/* NDIS scatter/gather list parameters revision number */
#if NDIS_SUPPORT_NDIS620
    #define NDIS_SCATTER_GATHER_LIST_PARAMETERS_REVISION_1  1
#endif

/* NDIS NBL media-specific information revision number */
#if NDIS_SUPPORT_NDIS620
    #define NDIS_NBL_MEDIA_SPECIFIC_INFO_REVISION_1 1
#endif

/* NDIS media-specific information tags */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_MEDIA_SPECIFIC_INFO_TUNDL      0x00010001L
    #define NDIS_MEDIA_SPECIFIC_INFO_FCOE       0x80010000L
    #define NDIS_MEDIA_SPECIFIC_INFO_EAPOL      0x80010001L
    #define NDIS_MEDIA_SPECIFIC_INFO_LLDP       0x80010002L
    #define NDIS_MEDIA_SPECIFIC_INFO_TIMESYNC   0x80010003L
#endif

/* Network buffer list flags */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NBL_FLAGS_PROTOCOL_RESERVED         0xFFF00000L
    #define NBL_FLAGS_MINIPORT_RESERVED         0x0000F000L
    #define NBL_FLAGS_SCRATCH                   0x000F0000L
    #define NBL_FLAGS_NDIS_RESERVED             0x00000FFFL
    #define NDIS_PROT_RSVD_FLAGS                NBL_FLAGS_PROTOCOL_RESERVED
    #define NDIS_NBL_FLAGS_SEND_READ_ONLY       0x00000001L
    #define NDIS_NBL_FLAGS_RECV_READ_ONLY       0x00000002L
    #define NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET   0x00008000L
#endif
#if NDIS_SUPPORT_NDIS61
    #define NDIS_NBL_FLAGS_HD_SPLIT             0x00000100L
    #define NDIS_NBL_FLAGS_IS_IPV4              0x00000200L
    #define NDIS_NBL_FLAGS_IS_IPV6              0x00000400L
    #define NDIS_NBL_FLAGS_IS_TCP               0x00000800L
    #define NDIS_NBL_FLAGS_IS_UDP               0x00001000L
    #define NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_HEADER     0x00002000L
    #define NDIS_NBL_FLAGS_SPLIT_AT_UPPER_LAYER_PROTOCOL_PAYLOAD    0x00004000L
#endif

/* Macros to manipulate network buffer list flags */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NBL_TEST_FLAG( x, p )               (((x)->Flags & (p)) != 0)
    #define NBL_SET_FLAG( x, p )                ((x)->Flags |= (p))
    #define NBL_CLEAR_FLAG( x, p )              ((x)->Flags &= ~(p))
    #define NBL_SET_PROTOCOL_RSVD_FLAG( x, p ) \
        ((x)->Flags |= ((p) & NBL_FLAGS_PROTOCOL_RESERVED))
    #define NBL_CLEAR_PROTOCOL_RSVD_FLAG( x, p ) \
        ((x)->Flags &= ~((p) & NBL_FLAGS_PROTOCOL_RESERVED))
    #define NBL_TEST_PROTOCOL_RSVD_FLAG( x , p ) \
        (((x)->Flags & ((p) & NBL_FLAGS_PROTOCOL_RESERVED)) != 0)
    #define NBL_SET_PROT_RSVD_FLAG( x, p )      NBL_SET_PROTOCOL_RSVD_FLAG( x, p )
    #define NBL_CLEAR_PROT_RSVD_FLAG( x, p )    NBL_CLEAR_PROTOCOL_RSVD_FLAG( x, p )
    #define NBL_TEST_PROT_RSVD_FLAG( x, p )     NBL_TEST_PROTOCOL_RSVD_FLAG( x, p )
#endif

/* Network buffer list pool parameters revision number */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NET_BUFFER_LIST_POOL_PARAMETERS_REVISION_1  1
#endif

/* Network buffer pool parameters revision number */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NET_BUFFER_POOL_PARAMETERS_REVISION_1   1
#endif

/* NDIS send flags */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_SEND_FLAGS_DISPATCH_LEVEL      0x00000001L
    #define NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK  0x00000002L
#endif
#if NDIS_SUPPORT_NDIS620
    #define NDIS_SEND_FLAGS_SINGLE_QUEUE        0x00000004L
#endif

/* Macros to manipulate send flags */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_TEST_SEND_FLAG( x, p ) (((x) & (p)) == (p))
    #define NDIS_SET_SEND_FLAG( x, p )  ((x) |= (p))
    #define NDIS_TEST_SEND_AT_DISPATCH_LEVEL( x ) \
        NDIS_TEST_SEND_FLAG( x, NDIS_SEND_FLAGS_DISPATCH_LEVEL )
#endif

/* NDIS send complete flags */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL 0x00000001L
#endif
#if NDIS_SUPPORT_NDIS620
    #define NDIS_SEND_COMPLETE_FLAGS_SINGLE_QUEUE   0x00000002L
#endif

/* Macros to manipulate send complete flags */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_TEST_SEND_COMPLETE_FLAG( x, p )    (((x) & (p)) == (p))
    #define NDIS_SET_SEND_COMPLETE_FLAG( x, p )     ((x) |= (p))
    #define NDIS_TEST_SEND_COMPLETE_AT_DISPATCH_LEVEL( x ) \
        NDIS_TEST_SEND_COMPLETE_FLAG( x, NDIS_SEND_COMPLETE_FLAGS_DISPATCH_LEVEL )
#endif

/* NDIS receive flags */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL           0x00000001L
    #define NDIS_RECEIVE_FLAGS_RESOURCES                0x00000002L
    #define NDIS_RECEIVE_FLAGS_SINGLE_ETHER_TYPE        0x00000100L
    #define NDIS_RECEIVE_FLAGS_SINGLE_VLAN              0x00000200L
    #define NDIS_RECEIVE_FLAGS_PERFECT_FILTERED         0x00000400L
#endif
#if NDIS_SUPPORT_NDIS620
    #define NDIS_RECEIVE_FLAGS_SINGLE_QUEUE             0x00000800L
    #define NDIS_RECEIVE_FLAGS_SHARED_MEMORY_INFO_VALID 0x00001000L
    #define NDIS_RECEIVE_FLAGS_MORE_NBLS                0x00002000L
#endif

/* Macros to manipulate receive flags */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_TEST_RECEIVE_FLAG( x, p )  (((x) & (p)) == (p))
    #define NDIS_SET_RECEIVE_FLAG( x, p )   ((x) |= (p))
    #define NDIS_TEST_RECEIVE_AT_DISPATCH_LEVEL( x ) \
        NDIS_TEST_RECEIVE_FLAG( x, NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL )
    #define NDIS_TEST_RECEIVE_CANNOT_PEND( x ) \
        NDIS_TEST_RECEIVE_FLAG( x, NDIS_RECEIVE_FLAGS_RESOURCES )
    #define NDIS_TEST_RECEIVE_CAN_PEND( x ) (((x) & NDIS_RECEIVE_FLAGS_RESOURCES) == 0)
#endif

/* NDIS return flags */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_RETURN_FLAGS_DISPATCH_LEVEL    0x00000001L
#endif
#if NDIS_SUPPORT_NDIS620
    #define NDIS_RETURN_FLAGS_SINGLE_QUEUE      0x00000002L
#endif

/* Macros to manipulate return flags */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_TEST_RETURN_FLAG( x, p )   (((x) & (p)) == (p))
    #define NDIS_SET_RETURN_FLAG( x, p )    ((x) |= (p))
    #define NDIS_TEST_RETURN_AT_DISPATCH_LEVEL( x ) \
        NDIS_TEST_RETURN_FLAG( x, NDIS_RETURN_FLAGS_DISPATCH_LEVEL )
#endif

/* NDIS clone flags */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_CLONE_FLAGS_USE_ORIGINAL_MDLS  0x00000002L
#endif

/* Macro to manipulate clone flags */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_TEST_CLONE_FLAG( x, p )    (((x) & (p)) == (p))
    #define NDIS_SET_CLONE_FLAG( x, p )     ((x) |= (p))
    #define NDIS_CLEAR_CLONE_FLAG( x, p )   ((x) &= ~(p))
#endif

/* NDIS task offload version number */
#define NDIS_TASK_OFFLOAD_VERSION   1

/* Hash constants */
#define MAX_HASHES          4
#define TRUNCATED_HASH_LEN  12

/* Cryptographic status codes */
#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

/* NDIS task TCP large send version number */
#if NDIS_LEGACY_DRIVER
    #define NDIS_TASK_TCP_LARGE_SEND_V0 0
#endif

/* IPsec flags */
#define IPSEC_TPT_UDPESP_ENCAPTYPE_IKE                  0x00000001L
#define IPSEC_TUN_UDPESP_ENCAPTYPE_IKE                  0x00000002L
#define IPSEC_TPTOVERTUN_UDPESP_ENCAPTYPE_IKE           0x00000004L
#define IPSEC_TPT_UDPESP_OVER_PURE_TUN_ENCAPTYPE_IKE    0x00000008L
#define IPSEC_TPT_UDPESP_ENCAPTYPE_OTHER                0x00000010L
#define IPSEC_TUN_UDPESP_ENCAPTYPE_OTHER                0x00000020L
#define IPSEC_TPTOVERTUN_UDPESP_ENCAPTYPE_OTHER         0x00000040L
#define IPSEC_TPT_UDPESP_OVER_PURE_TUN_ENCAPTYPE_OTHER  0x00000080L

/* NDIS large send offload constants */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_TCP_LARGE_SEND_OFFLOAD_V1_TYPE         0
    #define NDIS_TCP_LARGE_SEND_OFFLOAD_V2_TYPE         1
    #define NDIS_TCP_LARGE_SEND_OFFLOAD_IPv4            0
    #define NDIS_TCP_LARGE_SEND_OFFLOAD_IPv6            1
    #define NDIS_LARGE_SEND_OFFLOAD_MAX_HEADER_LENGTH   128
#endif

/* NDIS offload encapsulation revision number */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_OFFLOAD_ENCAPSULATION_REVISION_1   1
#endif

/* Maximum number of extension headers */
#if NDIS_SUPPORT_NDIS61
    #define IPSEC_OFFLOAD_V2_MAX_EXTENSION_HEADERS  2
#endif

/* IPsec offload (version 2) flags */
#if NDIS_SUPPORT_NDIS61
    #define IPSEC_OFFLOAD_V2_UDP_ESP_ENCAPSULATION_NONE                     0x00000000L
    #define IPSEC_OFFLOAD_V2_UDP_ESP_ENCAPSULATION_TRANSPORT                0x00000001L
    #define IPSEC_OFFLOAD_V2_UDP_ESP_ENCAPSULATION_TUNNEL                   0x00000002L
    #define IPSEC_OFFLOAD_V2_TRANSPORT_OVER_UDP_ESP_ENCAPSULATION_TUNNEL    0x00000004L
    #define IPSEC_OFFLOAD_V2_UDP_ESP_ENCAPSULATION_TRANSPORT_OVER_TUNNEL    0x00000008L
#endif

/* IPsec offload (version 2) security association flags */
#if NDIS_SUPPORT_NDIS61
    #define IPSEC_OFFLOAD_V2_ESN_SA 0x00000001L
#endif

/* IPsec offload (version 2) add security association flags */
#if NDIS_SUPPORT_NDIS61
    #define IPSEC_OFFLOAD_V2_INBOUND    0x00000001L
    #define IPSEC_OFFLOAD_V2_IPv6       0x00000010L
#endif

/* IPsec offload (version 2) add security association revision number */
#if NDIS_SUPPORT_NDIS61
    #define NDIS_IPSEC_OFFLOAD_V2_ADD_SA_REVISION_1 1
#endif

/* IPsec offload (version 2) delete security association revision number */
#if NDIS_SUPPORT_NDIS61
    #define NDIS_IPSEC_OFFLOAD_V2_DELETE_SA_REVISION_1  1
#endif

/* IPsec offload (version 2) update security association revision number */
#if NDIS_SUPPORT_NDIS61
    #define NDIS_IPSEC_OFFLOAD_V2_UPDATE_SA_REVISION_1  1
#endif

/* Protocol reserved size in packet */
#if NDIS_LEGACY_DRIVER
    #define PROTOCOL_RESERVED_SIZE_IN_PACKET    (4 * sizeof( PVOID ))
#endif

/* NDIS bind parameters revision numbers */
#if NDIS_SUPORT_NDIS6 || NDIS60
    #define NDIS_BIND_PARAMETERS_REVISION_1 1
#endif
#if NDIS_SUPPORT_NDIS61
    #define NDIS_BIND_PARAMETERS_REVISION_2 2
#endif
#if NDIS_SUPPORT_NDIS620
    #define NDIS_BIND_PARAMETERS_REVISION_3 3
#endif

/* NDIS protocol CO characteristics revision number */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_PROTOCOL_CO_CHARACTERISTICS_REVISION_1 1
#endif

/* NDIS protocol driver characteristics revision number */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_PROTOCOL_DRIVER_CHARACTERISTICS_REVISION_1 1
#endif
#if NDIS_SUPPORT_NDIS61
    #define NDIS_PROTOCOL_DRIVER_CHARACTERISTICS_REVISION_2 2
#endif

/* NDIS open parameters revision number */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_OPEN_PARAMETERS_REVISION_1 1
#endif

/* NDIS protocol pause parameters revision number */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_PROTOCOL_PAUSE_PARAMETERS_REVISION_1   1
#endif

/* NDIS protocol restart parameters revision number */
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NDIS_PROTOCOL_RESTART_PARAMETERS_REVISION_1 1
#endif

/* NDIS maximum lookahead */
#define NDIS_M_MAX_LOOKAHEAD    526

/* NDIS miniport interrupt revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_MINIPORT_INTERRUPT_REVISION_1  1
#endif

/* NDIS miniport Plug and Play characteristics revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_MINIPORT_PNP_CHARACTERISTICS_REVISION_1    1
#endif

/* NDIS scatter/gather DMA description flags */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_SG_DMA_64_BIT_ADDRESS  0x00000001L
#endif

/* NDIS scatter/gather DMA description revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_SG_DMA_DESCRIPTION_REVISION_1  1
#endif

/* NDIS miniport initialization parameters revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_MINIPORT_INIT_PARAMETERS_REVISION_1    1
#endif

/* NDIS miniport restart parameters revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_MINIPORT_RESTART_PARAMETERS_REVISION_1 1
#endif

/* NDIS miniport adapter registration attributes revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1    1
#endif

/* NDIS supported statistics flags */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_STATISTICS_XMIT_OK_SUPPORTED               0x00000001L
    #define NDIS_STATISTICS_RCV_OK_SUPPORTED                0x00000002L
    #define NDIS_STATISTICS_XMIT_ERROR_SUPPORTED            0x00000004L
    #define NDIS_STATISTICS_RCV_ERROR_SUPPORTED             0x00000008L
    #define NDIS_STATISTICS_RCV_NO_BUFFER_SUPPORTED         0x00000010L
    #define NDIS_STATISTICS_DIRECTED_BYTES_XMIT_SUPPORTED   0x00000020L
    #define NDIS_STATISTICS_DIRECTED_FRAMES_XMIT_SUPPORTED  0x00000040L
    #define NDIS_STATISTICS_MULTICAST_BYTES_XMIT_SUPPORTED  0x00000080L
    #define NDIS_STATISTICS_MULTICAST_FRAMES_XMIT_SUPPORTED 0x00000100L
    #define NDIS_STATISTICS_BROADCAST_BYTES_XMIT_SUPPORTED  0x00000200L
    #define NDIS_STATISTICS_BROADCAST_FRAMES_XMIT_SUPPORTED 0x00000400L
    #define NDIS_STATISTICS_DIRECTED_BYTES_RCV_SUPPORTED    0x00000800L
    #define NDIS_STATISTICS_DIRECTED_FRAMES_RCV_SUPPORTED   0x00001000L
    #define NDIS_STATISTICS_MULTICAST_BYTES_RCV_SUPPORTED   0x00002000L
    #define NDIS_STATISTICS_MULTICAST_FRAMES_RCV_SUPPORTED  0x00004000L
    #define NDIS_STATISTICS_BROADCAST_BYTES_RCV_SUPPORTED   0x00008000L
    #define NDIS_STATISTICS_BROADCAST_FRAMES_RCV_SUPPORTED  0x00010000L
    #define NDIS_STATISTICS_RCV_CRC_ERROR_SUPPORTED         0x00020000L
    #define NDIS_STATISTICS_TRANSMIT_QUEUE_LENGTH_SUPPORTED 0x00040000L
    #define NDIS_STATISTICS_BYTES_RCV_SUPPORTED             0x00080000L
    #define NDIS_STATISTICS_BYTES_XMIT_SUPPORTED            0x00100000L
    #define NDIS_STATISTICS_RCV_DISCARDS_SUPPORTED          0x00200000L
    #define NDIS_STATISTICS_GEN_STATISTICS_SUPPORTED        0x00400000L
    #define NDIS_STATISTICS_XMIT_DISCARDS_SUPPORTED         0x08000000L
#endif

/* NDIS miniport add device registration attributes revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES_REVISION_1 1
#endif

/* NDIS miniport adapter general attributes revision numbers */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1 1
#endif
#if NDIS_SUPPORT_NDIS620
    #define NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_2 2
#endif

/* NDIS header/data split attributes revision number */
#if NDIS_SUPPORT_NDIS61
    #define NDIS_HD_SPLIT_ATTRIBUTES_REVISION_1 1
#endif

/* NDIS miniport adapter hardware assist attributes revision number */
#if NDIS_SUPPORT_NDIS61
    #define NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1 1
#endif
#if NDIS_SUPPORT_NDIS620
    #define NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_2 2
#endif

/* NDIS miniport adapter offload attributes revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES_REVISION_1 1
#endif

/* NDIS miniport adapter 802.11 attributes revision numbers */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_MINIPORT_ADAPTER_802_11_ATTRIBUTES_REVISION_1  1
    #define NDIS_MINIPORT_ADAPTER_802_11_ATTRIBUTES_REVISION_2  2
#endif

/* NDIS miniport attributes */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_MINIPORT_ATTRIBUTES_HARDWARE_DEVICE        0x00000001L
    #define NDIS_MINIPORT_ATTRIBUTES_NDIS_WDM               0x00000002L
    #define NDIS_MINIPORT_ATTRIBUTES_SURPRISE_REMOVE_OK     0x00000004L
    #define NDIS_MINIPORT_ATTRIBUTES_NOT_CO_NDIS            0x00000008L
    #define NDIS_MINIPORT_ATTRIBUTES_DO_NOT_BIND_TO_ALL_CO  0x00000010L
    #define NDIS_MINIPORT_ATTRIBUTES_NO_HALT_ON_SUSPEND     0x00000020L
    #define NDIS_MINIPORT_ATTRIBUTES_BUS_MASTER             0x00000040L
    #define NDIS_MINIPORT_ATTRIBUTES_CONTROLS_DEFAULT_PORT  0x00000080L
#endif

/* NDIS miniport pause parameters revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_MINIPORT_PAUSE_PARAMETERS_REVISION_1   1
#endif

/* Network device Plug and Play event revision number */
#if NDIS_SUPPORT_NDIS6
    #define NET_DEVICE_PNP_EVENT_REVISION_1 1
#endif

/* NDIS 6.0 miniport characteristic flags */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_INTERMEDIATE_DRIVER    0x00000001L
    #define NDIS_WDM_DRIVER             0x00000002L
#endif

/* NDIS miniport driver characteristics revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_MINIPORT_DRIVER_CHARACTERISTICS_REVISION_1 1
#endif
#if NDIS_SUPPORT_NDIS61
    #define NDIS_MINIPORT_DRIVER_CHARACTERISTICS_REVISION_2 2
#endif

/* NDIS miniport CO characteristics revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_MINIPORT_CO_CHARACTERISTICS_REVISION_1 1
#endif

/* NDIS DMA sizes */
#define NDIS_DMA_24BITS 0
#define NDIS_DMA_32BITS 1
#define NDIS_DMA_64BITS 2

/* NDIS attributes */
#if NDIS_LEGACY_MINIPORT
    #define NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT        0x00000001L
    #define NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT       0x00000002L
    #define NDIS_ATTRIBUTE_IGNORE_TOKEN_RING_ERRORS     0x00000004L
    #define NDIS_ATTRIBUTE_BUS_MASTER                   0x00000008L
    #define NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER          0x00000010L
    #define NDIS_ATTRIBUTE_DESERIALIZE                  0x00000020L
    #define NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND           0x00000040L
    #define NDIS_ATTRIBUTE_SURPRISE_REMOVE_OK           0x00000080L
    #define NDIS_ATTRIBUTE_NOT_CO_NDIS                  0x00000100L
    #define NDIS_ATTRIBUTE_USES_SAFE_BUFFER_APIS        0x00000200L
    #define NDIS_ATTRIBUTE_DO_NOT_BIND_TO_ALL_CO        0x00000400L
    #define NDIS_ATTRIBUTE_MINIPORT_PADS_SHORT_PACKETS  0x00000800L
#endif

/* NDIS MSIX configuration parameters revision number */
#if NDIS_SUPPORT_NDIS61
    #define NDIS_MSIX_CONFIG_PARAMETERS_REVISION_1  1
#endif

/* NdisMAllocateNetBufferSGList() flags */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_SG_LIST_WRITE_TO_DEVICE    0x00000001L
#endif

/* CO send flags */
#define CO_SEND_FLAG_SET_DISCARD_ELIBILITY  0x00000001L

/* CO media parameter flags */
#define RECEIVE_TIME_INDICATION 0x00000001L
#define USE_TIME_STAMPS         0x00000002L
#define TRANSMIT_VC             0x00000004L
#define RECEIVE_VC              0x00000008L
#define INDICATE_ERRED_PACKETS  0x00000010L
#define INDICATE_END_OF_TX      0x00000020L
#define RESERVE_RESOURCES_VC    0x00000040L
#define ROUND_DOWN_FLOW         0x00000080L
#define ROUND_UP_FLOW           0x00000100L

/* Erred packet indication */
#define ERRED_PACKET_INDICATION 0x00000001L

/* CO call parameter flags */
#define PERMANENT_VC            0x00000001L
#define CALL_PARAMETERS_CHANGED 0x00000002L
#define QUERY_CALL_PARAMETERS   0x00000004L
#define BROADCAST_VC            0x00000008L
#define MULTIPOINT_VC           0x00000010L

/* String formats */
#ifndef __NDISTAPI_STRINGFORMATS_DEFINED
    #define __NDISTAPI_STRINGFORMATS_DEFINED
    #define STRINGFORMAT_ASCII      0x00000001L
    #define STRINGFORMAT_DBCS       0x00000002L
    #define STRINGFORMAT_UNICODE    0x00000003L
    #define STRINGFORMAT_BINARY     0x00000004L
#endif

/* NDIS CO client optional handlers revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_CO_CLIENT_OPTIONAL_HANDLERS_REVISION_1 1
#endif

/* NDIS CO call manager optional handlers revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS_REVISION_1   1
#endif

/* NDIS filter attach flags */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_FILTER_ATTACH_FLAGS_IGNORE_MANDATORY   0x00000001L
#endif

/* NDIS filter attach parameters revision numbers */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_FILTER_ATTACH_PARAMETERS_REVISION_1    1
#endif
#if NDIS_SUPPORT_NDIS61
    #define NDIS_FILTER_ATTACH_PARAMETERS_REVISION_2    2
#endif
#if NDIS_SUPPORT_NDIS620
    #define NDIS_FILTER_ATTACH_PARAMETERS_REVISION_3    3
#endif

/* NDIS filter restart parameters revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_FILTER_RESTART_PARAMETERS_REVISION_1   1
#endif

/* NDIS filter pause parameters revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_FILTER_PAUSE_PARAMETERS_REVISION_1 1
#endif

/* NDIS filter partial characteristics revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_FILTER_PARTIAL_CHARACTERISTICS_REVISION_1  1
#endif

/* NDIS filter driver mandatory */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_FILTER_DRIVER_MANDATORY    0x00000001L
#endif

/* NDIS filter characteristics revision numbers */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_FILTER_CHARACTERISTICS_REVISION_1  1
#endif
#if NDIS_SUPPORT_NDIS61
    #define NDIS_FILTER_CHARACTERISTICS_REVISION_2  2
#endif

/* NDIS filter attributes revision number */
#if NDIS_SUPPORT_NDIS6
    #define NDIS_FILTER_ATTRIBUTES_REVISION_1   1
#endif

/* Opaque data types */
#if NDIS_SUPPORT_NDIS620
typedef struct _NDIS_RW_LOCK_EX                     NDIS_RW_LOCK_EX;
typedef struct _NDIS_RW_LOCK_EX                     *PNDIS_RW_LOCK_EX;
#endif
typedef struct _NDIS_WRAPPER_HANDLE                 NDIS_WRAPPER_HANDLE;
typedef struct _NDIS_WRAPPER_HANDLE                 *PNDIS_WRAPPER_HANDLE;
typedef struct _NDIS_PROTOCOL_BLOCK                 NDIS_PROTOCOL_BLOCK;
typedef struct _NDIS_PROTOCOL_BLOCK                 *PNDIS_PROTOCOL_BLOCK;
typedef struct _NDIS_M_DRIVER_BLOCK                 NDIS_M_DRIVER_BLOCK;
typedef struct _NDIS_M_DRIVER_BLOCK                 *PNDIS_M_DRIVER_BLOCK;
typedef struct _CO_CALL_PARAMETERS                  CO_CALL_PARAMETERS;
typedef struct _CO_CALL_PARAMETERS                  *PCO_CALL_PARAMETERS;
typedef struct _CO_MEDIA_PARAMETERS                 CO_MEDIA_PARAMETERS;
typedef struct _CO_MEDIA_PARAMETERS                 *PCO_MEDIA_PARAMETERS;
#if (NTDDI_VERSION < 0x06000000) && !NDIS_SUPPORT_NDIS6
typedef struct _NDIS_OFFLOAD                        NDIS_OFFLOAD;
typedef struct _NDIS_OFFLOAD                        *PNDIS_OFFLOAD;
#endif
typedef struct _NDIS_AF_LIST                        NDIS_AF_LIST;
typedef struct _NDIS_AF_LIST                        *PNDIS_AF_LIST;
typedef struct _X_FILTER                            ETH_FILTER;
typedef struct _X_FILTER                            *PETH_FILTER;
typedef struct _X_FILTER                            TR_FILTER;
typedef struct _X_FILTER                            *PTR_FILTER;
typedef struct _X_FILTER                            NULL_FILTER;
typedef struct _X_FILTER                            *PNULL_FILTER;

/* Network Plug and Play event codes */
typedef enum _NET_PNP_EVENT_CODE {
    NetEventSetPower            = 0,
    NetEventQueryPower          = 1,
    NetEventQueryRemoveDevice   = 2,
    NetEventCancelRemoveDevice  = 3,
    NetEventReconfigure         = 4,
    NetEventBindList            = 5,
    NetEventBindsComplete       = 6,
    NetEventPnPCapabilities     = 7,
    NetEventPause               = 8,
    NetEventRestart             = 9,
    NetEventPortActivation      = 10,
    NetEventPortDeactivation    = 11,
    NetEventIMReEnableDevice    = 12,
    NetEventMaximum             = 13
} NET_PNP_EVENT_CODE;
typedef NET_PNP_EVENT_CODE  *PNET_PNP_EVENT_CODE;

/* Network Plug and Play event */
typedef struct _NET_PNP_EVENT {
    NET_PNP_EVENT_CODE  NetEvent;
    PVOID               Buffer;
    ULONG               BufferLength;
    ULONG_PTR           NdisReserved[4];
    ULONG_PTR           TransportReserved[4];
    ULONG_PTR           TdiReserved[4];
    ULONG_PTR           TdiClientReserved[4];
} NET_PNP_EVENT;
typedef NET_PNP_EVENT   *PNET_PNP_EVENT;

/* Network device power states */
typedef enum _NET_DEVICE_POWER_STATE {
    NetDeviceStateUnspecified   = 0,
    NetDeviceStateD0            = 1,
    NetDeviceStateD1            = 2,
    NetDeviceStateD2            = 3,
    NetDeviceStateD3            = 4,
    NetDeviceStateMaximum       = 5
} NET_DEVICE_POWER_STATE;
typedef NET_DEVICE_POWER_STATE  *PNET_DEVICE_POWER_STATE;

/* NDIS generic object */
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_GENERIC_OBJECT {
    NDIS_OBJECT_HEADER  Header;
    PVOID               Caller;
    PVOID               CallersCaller;
    PDRIVER_OBJECT      DriverObject;
} NDIS_GENERIC_OBJECT;
typedef NDIS_GENERIC_OBJECT *PNDIS_GENERIC_OBJECT;
#endif

/* NDIS spin lock */
typedef struct _NDIS_SPIN_LOCK {
    KSPIN_LOCK  SpinLock;
    KIRQL       OldIrql;
} NDIS_SPIN_LOCK;
typedef NDIS_SPIN_LOCK  *PNDIS_SPIN_LOCK;

/* NDIS event */
typedef struct _NDIS_EVENT {
    KEVENT  Event;
} NDIS_EVENT;
typedef NDIS_EVENT  *PNDIS_EVENT;

/* NDIS procedure */
typedef VOID        (NTAPI *NDIS_PROC)( struct _NDIS_WORK_ITEM *, PVOID );

/* NDIS work item */
typedef struct _NDIS_WORK_ITEM {
    PVOID       Context;
    NDIS_PROC   Routine;
    UCHAR       WrapperReserved[8 * sizeof( PVOID )];
} NDIS_WORK_ITEM;
typedef NDIS_WORK_ITEM  *PNDIS_WORK_ITEM;

/* NDIS parameter types */
typedef enum _NDIS_PARAMETER_TYPE {
    NdisParameterInteger        = 0,
    NdisParameterHexInteger     = 1,
    NdisParameterString         = 2,
    NdisParameterMultiString    = 3,
    NdisParameterBinary         = 4
} NDIS_PARAMETER_TYPE;
typedef NDIS_PARAMETER_TYPE *PNDIS_PARAMETER_TYPE;

/* Binary data */
typedef struct {
    USHORT  Length;
    PVOID   Buffer;
} BINARY_DATA;

/* NDIS configuration parameter */
typedef struct _NDIS_CONFIGURATION_PARAMETER {
    NDIS_PARAMETER_TYPE ParameterType;
    union {
        ULONG       IntegerData;
        NDIS_STRING StringData;
        BINARY_DATA BinaryData;
    } ParameterData;
} NDIS_CONFIGURATION_PARAMETER;
typedef NDIS_CONFIGURATION_PARAMETER    *PNDIS_CONFIGURATION_PARAMETER;

/* NDIS processor types */
typedef enum _NDIS_PROCESSOR_TYPE {
    NdisProcessorX86    = 0,
    NdisProcessorMips   = 1,
    NdisProcessorAlpha  = 2,
    NdisProcessorPpc    = 3,
    NdisProcessorAmd64  = 4,
    NdisProcessorIA64   = 5
} NDIS_PROCESSOR_TYPE;
typedef NDIS_PROCESSOR_TYPE *PNDIS_PROCESSOR_TYPE;

/* NDIS environment types */
typedef enum _NDIS_ENVIRONMENT_TYPE {
    NdisEnvironmentWindows      = 0,
    NdisEnvironmentWindowsNt    = 1
} NDIS_ENVIRONMENT_TYPE;
typedef NDIS_ENVIRONMENT_TYPE   *PNDIS_ENVIRONMENT_TYPE;

/* NDIS interface types */
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                = 16,
    NdisInterfaceIrda               = 17,
    NdisInterface1394               = 18,
    NdisMaximumInterfaceType        = 19
} NDIS_INTERFACE_TYPE;
typedef NDIS_INTERFACE_TYPE *PNDIS_INTERFACE_TYPE;

/* NDIS WAN line up */
typedef struct _NDIS_WAN_LINE_UP {
    ULONG               LinkSpeed;
    ULONG               MaximumTotalSize;
    NDIS_WAN_QUALITY    Quality;
    USHORT              SendWindow;
    UCHAR               RemoteAddress[6];
    UCHAR               LocalAddress[6];
    ULONG               ProtocolBufferLength;
    PUCHAR              ProtocolBuffer;
    USHORT              ProtocolType;
    NDIS_STRING         DeviceName;
} NDIS_WAN_LINE_UP;
typedef NDIS_WAN_LINE_UP    *PNDIS_WAN_LINE_UP;

/* NDIS WAN line down */
typedef struct _NDIS_WAN_LINE_DOWN {
    UCHAR   RemoteAddress[6];
    UCHAR   LocalAddress[6];
} NDIS_WAN_LINE_DOWN;
typedef NDIS_WAN_LINE_DOWN  *PNDIS_WAN_LINE_DOWN;

/* NDIS WAN fragment */
typedef struct _NDIS_WAN_FRAGMENT {
    UCHAR   RemoteAddress[6];
    UCHAR   LocalAddress[6];
} NDIS_WAN_FRAGMENT;
typedef NDIS_WAN_FRAGMENT   *PNDIS_WAN_FRAGMENT;

/* NDIS WAN get statistics */
typedef struct _NDIS_WAN_GET_STATS {
    UCHAR   LocalAddress[6];
    ULONG   BytesSent;
    ULONG   BytesRcvd;
    ULONG   FramesSent;
    ULONG   FramesRcvd;
    ULONG   CRCErrors;
    ULONG   TimeoutErrors;
    ULONG   AlignmentErrors;
    ULONG   SerialOverrunErrors;
    ULONG   FramingErrors;
    ULONG   BufferOverrunErrors;
    ULONG   BytesTransmittedUncompressed;
    ULONG   BytesReceivedUncompressed;
    ULONG   BytesTransmittedCompressed;
    ULONG   BytesReceivedCompressed;
} NDIS_WAN_GET_STATS;
typedef NDIS_WAN_GET_STATS  *PNDIS_WAN_GET_STATS;

/* NDIS private packet */
#if NDIS_LEGACY_DRIVER
typedef struct _NDIS_PACKET_PRIVATE {
    UINT                PhysicalCount;
    UINT                TotalLength;
    PNDIS_BUFFER        Head;
    PNDIS_BUFFER        Tail;
    PNDIS_PACKET_POOL   Pool;
    UINT                Count;
    ULONG               Flags;
    BOOLEAN             ValidCounts;
    UCHAR               NdisPacketFlags;
    USHORT              NdisPacketOobOffset;
} NDIS_PACKET_PRIVATE;
typedef NDIS_PACKET_PRIVATE *PNDIS_PACKET_PRIVATE;
#endif

/* NDIS class identifiers */
typedef enum _NDIS_CLASS_ID {
    NdisClass802_3Priority          = 0,
    NdisClassWirelessWanMbxMailbox  = 1,
    NdisClassIrdaPacketInfo         = 2,
    NdisClassAtmAALInfo             = 3
} NDIS_CLASS_ID;

/* Media specific information */
typedef struct _MEDIA_SPECIFIC_INFORMATION {
    UINT            NextEntryOffset;
    NDIS_CLASS_ID   ClassId;
    UINT            Size;
    UCHAR           ClassInformation[1];
} MEDIA_SPECIFIC_INFORMATION;
typedef MEDIA_SPECIFIC_INFORMATION  *PMEDIA_SPECIFIC_INFORMATION;

/* NDIS packet OOB data */
#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;
typedef NDIS_PACKET_OOB_DATA    *PNDIS_PACKET_OOB_DATA;
#endif

/* NDIS packet */
#if NDIS_LEGACY_DRIVER
typedef struct _NDIS_PACKET {
    NDIS_PACKET_PRIVATE Private;
    union {
        struct {
            UCHAR   MiniportReserved[2 * sizeof( PVOID )];
            UCHAR   WrapperReserved[2 * sizeof( PVOID )];
        };
        struct {
            UCHAR   MiniportReservedEx[3 * sizeof( PVOID )];
            UCHAR   WrapperReservedEx[sizeof( PVOID )];
        };
        struct {
            UCHAR   MacReserved[4 * sizeof( PVOID )];
        };
    };
    ULONG_PTR           Reserved[2];
    UCHAR               ProtocolReserved[1];
} NDIS_PACKET;
typedef NDIS_PACKET *PNDIS_PACKET;
typedef NDIS_PACKET **PPNDIS_PACKET;
#endif

/* NDIS per packet information */
typedef enum _NDIS_PER_PACKET_INFO {
    TcpIpChecksumPacketInfo         = 0,
    IpSecPacketInfo                 = 1,
    TcpLargeSendPacketInfo          = 2,
    ClassificationHandlePacketInfo  = 3,
    ScatterGatherListPacketInfo     = 5,
    Ieee8021QInfo                   = 6,
    OriginalPacketInfo              = 7,
    PacketCancelId                  = 8,
    OriginalNetBufferList           = 9,
    CachedNetBufferList             = 10,
    ShortPacketPaddingInfo          = 11,
    MaxPerPacketInfo                = 12
} NDIS_PER_PACKET_INFO;
typedef NDIS_PER_PACKET_INFO    *PNDIS_PER_PACKET_INFO;
#if NDIS_LEGACY_DRIVER
    #define Ieee8021pPriority   Ieee8021QInfo
#endif

/* NDIS packet extension */
#if NDIS_LEGACY_DRIVER
typedef struct _NDIS_PACKET_EXTENSION {
    PVOID   NdisPacketInfo[MaxPerPacketInfo];
} NDIS_PACKET_EXTENSION;
typedef NDIS_PACKET_EXTENSION *PNDIS_PACKET_EXTENSION;
#endif

/* NDIS packet stack */
#if NDIS_LEGACY_DRIVER
typedef struct _NDIS_PACKET_STACK {
    ULONG_PTR   IMReserved[2];
    ULONG_PTR   NdisReserved[4];
} NDIS_PACKET_STACK;
typedef NDIS_PACKET_STACK   *PNDIS_PACKET_STACK;
#endif

/* NDIS TCP/IP checksum packet information */
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;
typedef NDIS_TCP_IP_CHECKSUM_PACKET_INFO    *PNDIS_TCP_IP_CHECKSUM_PACKET_INFO;

/* NDIS packet 8021Q information */
typedef struct _NDIS_PACKET_8021Q_INFO {
    union {
        struct {
            UINT32  UserPriority        : 3;
            UINT32  CanonicalFormatId   : 1;
            UINT32  VlanId              : 12;
            UINT32  Reserved            : 16;
        } TagHeader;
        PVOID   Value;
    };
} NDIS_PACKET_8021Q_INFO;
typedef NDIS_PACKET_8021Q_INFO  *PNDIS_PACKET_8021Q_INFO;

/* NDIS WAN packet */
#if NDIS_LEGACY_DRIVER
typedef struct _NDIS_WAN_PACKET {
    LIST_ENTRY  WanPocketQueue;
    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;
typedef NDIS_WAN_PACKET *PNDIS_WAN_PACKET;
#endif

/* NDIS request types */
typedef enum _NDIS_REQUEST_TYPE {
    NdisRequestQueryInformation = 0,
    NdisRequestSetInformation   = 1,
    NdisRequestQueryStatistics  = 2,
    NdisRequestOpen             = 3,
    NdisRequestClose            = 4,
    NdisRequestSend             = 5,
    NdisRequestTransferData     = 6,
    NdisRequestReset            = 7,
    NdisRequestGeneric1         = 8,
    NdisRequestGeneric2         = 9,
    NdisRequestGeneric3         = 10,
#if NDIS_SUPPORT_NDIS6
    NdisRequestGeneric4         = 11,
    NdisRequestMethod           = 12
#else
    NdisRequestGeneric4         = 11
#endif
} NDIS_REQUEST_TYPE;
typedef NDIS_REQUEST_TYPE   *PNDIS_REQUEST_TYPE;

/* NDIS request */
#if NDIS_LEGACY_DRIVER
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;
typedef NDIS_REQUEST    *PNDIS_REQUEST;
#endif

/* CO address family */
typedef struct {
    NDIS_AF AddressFamily;
    ULONG   MajorVersion;
    ULONG   MinorVersion;
} CO_ADDRESS_FAMILY;
typedef CO_ADDRESS_FAMILY   *PCO_ADDRESS_FAMILY;

/* CO sap */
typedef struct {
    ULONG   SapType;
    ULONG   SapLength;
    UCHAR   Sap[1];
} CO_SAP;
typedef CO_SAP  *PCO_SAP;

/* NDIS physical address unit */
typedef struct _NDIS_PHYSICAL_ADDRESS_UNIT {
    NDIS_PHYSICAL_ADDRESS   PhysicalAddress;
    UINT                    Length;
} NDIS_PHYSICAL_ADDRESS_UNIT;
typedef NDIS_PHYSICAL_ADDRESS_UNIT  *PNDIS_PHYSICAL_ADDRESS_UNIT;

/* Reference */
typedef struct _REFERENCE {
    KSPIN_LOCK  SpinLock;
    USHORT      ReferenceCount;
    BOOLEAN     Closing;
} REFERENCE;
typedef REFERENCE   *PREFERENCE;

/* NDIS read/write lock reference count */
#if NDIS_SUPPORT_60_COMPATIBLE_API
typedef struct _NDIS_RW_LOCK_REFCOUNT {
    ULONG   RefCount;
    UCHAR   cacheLine[16];
} NDIS_RW_LOCK_REFCOUNT;
typedef NDIS_RW_LOCK_REFCOUNT   *PNDIS_RW_LOCK_REFCOUNT;
#endif

/* NDIS read/write lock */
#if NDIS_SUPPORT_60_COMPATIBLE_API
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;
typedef NDIS_RW_LOCK    *PNDIS_RW_LOCK;
#endif

/* Lock state */
#if NDIS_SUPPORT_60_COMPATIBLE_API
typedef struct _LOCK_STATE {
    USHORT  LockState;
    KIRQL   OldIrql;
} LOCK_STATE;
typedef LOCK_STATE  *PLOCK_STATE;
#endif

/* Lock state (extended version) */
#if NDIS_SUPPORT_NDIS620
typedef struct _LOCK_STATE_EX {
    KIRQL   OldIrql;
    UCHAR   LockState;
    UCHAR   Flags;
} LOCK_STATE_EX;
typedef LOCK_STATE_EX   *PLOCK_STATE_EX;
#endif

/* NDIS timer callback */
typedef VOID        (NTAPI NDIS_TIMER_FUNCTION)( PVOID, PVOID, PVOID, PVOID );
typedef NDIS_TIMER_FUNCTION *PNDIS_TIMER_FUNCTION;

/* NDIS timer */
typedef struct _NDIS_TIMER {
    KTIMER  Timer;
    KDPC    Dpc;
} NDIS_TIMER;
typedef NDIS_TIMER  *PNDIS_TIMER;

/* NDIS restart attributes */
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_RESTART_ATTRIBUTES {
    struct _NDIS_RESTART_ATTRIBUTES *Next;
    NDIS_OID                        Oid;
    ULONG                           DataLength;
    UCHAR                           Data[1];
} NDIS_RESTART_ATTRIBUTES;
typedef NDIS_RESTART_ATTRIBUTES *PNDIS_RESTART_ATTRIBUTES;
#endif

/* NDIS handlers */
#if NDIS_SUPPORT_NDIS6
typedef NDIS_STATUS (NTAPI SET_OPTIONS)( NDIS_HANDLE, NDIS_HANDLE );
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
#if NDIS_LEGACY_DRIVER
typedef NDIS_STATUS (NTAPI *WAN_SEND_HANDLER)( NDIS_HANDLE, NDIS_HANDLE, PVOID );
typedef NDIS_STATUS (NTAPI *SEND_HANDLER)( NDIS_HANDLE, PNDIS_PACKET );
typedef NDIS_STATUS (NTAPI *TRANSFER_DATA_HANDLER)( NDIS_HANDLE, NDIS_HANDLE, UINT, UINT, PNDIS_PACKET, PUINT );
typedef NDIS_STATUS (NTAPI *RESET_HANDLER)( NDIS_HANDLE );
typedef NDIS_STATUS (NTAPI *REQUEST_HANDLER)( NDIS_HANDLE, PNDIS_REQUEST );
typedef VOID        (NTAPI *SEND_PACKETS_HANDLER)( NDIS_HANDLE, PPNDIS_PACKET, UINT );
#endif

/* NDIS configuration object */
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_CONFIGURATION_OBJECT {
    NDIS_OBJECT_HEADER  Header;
    NDIS_HANDLE         NdisHandle;
    ULONG               Flags;
} NDIS_CONFIGURATION_OBJECT;
typedef NDIS_CONFIGURATION_OBJECT   *PNDIS_CONFIGURATION_OBJECT;
#endif

/* NDIS driver optional handlers */
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_DRIVER_OPTIONAL_HANDLERS {
    NDIS_OBJECT_HEADER  Header;
} NDIS_DRIVER_OPTIONAL_HANDLERS;
typedef NDIS_DRIVER_OPTIONAL_HANDLERS   *PNDIS_DRIVER_OPTIONAL_HANDLERS;
#endif

/* Network Plug and Play event notification */
#if NDIS_SUPPORT_NDIS6
typedef struct _NET_PNP_EVENT_NOTIFICATION {
    NDIS_OBJECT_HEADER  Header;
    NDIS_PORT_NUMBER    PortNumber;
    NET_PNP_EVENT       NetPnPEvent;
    ULONG               Flags;
} NET_PNP_EVENT_NOTIFICATION;
typedef NET_PNP_EVENT_NOTIFICATION  *PNET_PNP_EVENT_NOTIFICATION;
#endif

/* NDIS object identifier request */
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_OID_REQUEST {
    NDIS_OBJECT_HEADER  Header;
    NDIS_REQUEST_TYPE   RequestType;
    NDIS_PORT_NUMBER    PortNumber;
    UINT                Timeout;
    PVOID               RequestId;
    NDIS_HANDLE         RequestHandle;
    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;
    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;
typedef NDIS_OID_REQUEST    *PNDIS_OID_REQUEST;
#endif

/* NDIS status indication */
#if NDIS_SUPPORT_NDIS6
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;
    PVOID               NdisReserved[4];
} NDIS_STATUS_INDICATION;
typedef NDIS_STATUS_INDICATION  *PNDIS_STATUS_INDICATION;
#endif

/* NDIS timer characteristics */
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_TIMER_CHARACTERISTICS {
    NDIS_OBJECT_HEADER      Header;
    ULONG                   AllocationTag;
    PNDIS_TIMER_FUNCTION    TimerFunction;
    PVOID                   FunctionContext;
} NDIS_TIMER_CHARACTERISTICS;
typedef NDIS_TIMER_CHARACTERISTICS  *PNDIS_TIMER_CHARACTERISTICS;
#endif

/* NDIS restart general attributes */
#if NDIS_SUPPORT_NDIS6
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;
typedef NDIS_RESTART_GENERAL_ATTRIBUTES *PNDIS_RESTART_GENERAL_ATTRIBUTES;
#endif

/* NDIS processor information */
#if NDIS_SUPPORT_NDIS6 && NDIS_SUPPORT_60_COMPATIBLE_API
typedef struct _NDIS_PROCESSOR_INFO {
    ULONG   CpuNumber;
    ULONG   PhysicalPackageId;
    ULONG   CoreId;
    ULONG   HyperThreadID;
} NDIS_PROCESSOR_INFO;
typedef NDIS_PROCESSOR_INFO *PNDIS_PROCESSOR_INFO;
#endif

/* NDIS system processor information */
#if NDIS_SUPPORT_NDIS6 && NDIS_SUPPORT_60_COMPATIBLE_API
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;
    PUCHAR                  RssProcessors;
    NDIS_PROCESSOR_INFO     CpuInfo[MAXIMUM_PROC_PER_GROUP];
} NDIS_SYSTEM_PROCESSOR_INFO;
typedef NDIS_SYSTEM_PROCESSOR_INFO  *PNDIS_SYSTEM_PROCESSOR_INFO;
#endif

/* NDIS filter interface */
#if (NTDDI_VERSION == 0x06000000) && (NDIS_LEGACY_DRIVER || NDIS_SUPPORT_NDIS6)
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;
typedef NDIS_FILTER_INTERFACE   *PNDIS_FILTER_INTERFACE;
#endif

/* NDIS enumerate filters */
#if (NTDDI_VERSION == 0x06000000) && (NDIS_LEGACY_DRIVER || NDIS_SUPPORT_NDIS6)
typedef struct _NDIS_ENUM_FILTERS {
    NDIS_OBJECT_HEADER      Header;
    ULONG                   Flags;
    ULONG                   NumberOfFilters;
    ULONG                   OffsetFirstFilter;
    NDIS_FILTER_INTERFACE   Filter[1];
} NDIS_ENUM_FILTERS;
typedef NDIS_ENUM_FILTERS   *PNDIS_ENUM_FILTERS;
#endif

/* NDIS device object attributes */
#if (NTDDI_VERSION == 0x06000000) && (NDIS_LEGACY_DRIVER || NDIS_SUPPORT_NDIS6)
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;
typedef NDIS_DEVICE_OBJECT_ATTRIBUTES   *PNDIS_DEVICE_OBJECT_ATTRIBUTES;
#endif

/* NDIS driver wrapper handle */
#if (NTDDI_VERSION == 0x06000000) && (NDIS_LEGACY_DRIVER || NDIS_SUPPORT_NDIS6)
typedef struct _NDIS_DRIVER_WRAPPER_HANDLE {
    NDIS_OBJECT_HEADER  Header;
    NDIS_HANDLE         NdisWrapperHandle;
} NDIS_DRIVER_WRAPPER_HANDLE;
typedef NDIS_DRIVER_WRAPPER_HANDLE  *PNDIS_DRIVER_WRAPPER_HANDLE;
#endif

/* NDIS shared memory usage values */
#if NDIS_SUPPORT_NDIS620
typedef enum _NDIS_SHARED_MEMORY_USAGE {
    NdisSharedMemoryUsageUndefined              = 0,
    NdisSharedMemoryUsageXmit                   = 1,
    NdisSharedMemoryUsageXmitHeader             = 2,
    NdisSharedMemoryUsageXmitData               = 3,
    NdisSharedMemoryUsageReceive                = 4,
    NdisSharedMemoryUsageReceiveLookahead       = 5,
    NdisSharedMemoryUsageReceivePostLookahead   = 6,
    NdisSharedMemoryUsageReceiveHeader          = 7,
    NdisSharedMemoryUsageReceiveData            = 8,
    NdisSharedMemoryUsageOther                  = 9,
    NdisSharedMemoryUsageMax                    = 10
} NDIS_SHARED_MEMORY_USAGE;
typedef NDIS_SHARED_MEMORY_USAGE    *PNDIS_SHARED_MEMORY_USAGE;
#endif

/* NDIS shared memory parameters */
#if NDIS_SUPPORT_NDIS620
typedef struct _NDIS_SHARED_MEMORY_PARAMETERS {
    NDIS_OBJECT_HEADER          Header;
    ULONG                       Flags;
    NDIS_RECEIVE_QUEUE_ID       QueueId;
    NDIS_HANDLE                 SharedMemoryHandle;
    NODE_REQUIREMENT            PreferredNode;
    NDIS_SHARED_MEMORY_USAGE    Usage;
    ULONG                       Length;
    PVOID                       VirtualAddress;
    ULONG                       SGListBufferLength;
    PSCATTER_GATHER_LIST        SGListBuffer;
} NDIS_SHARED_MEMORY_PARAMETERS;
typedef NDIS_SHARED_MEMORY_PARAMETERS   *PNDIS_SHARED_MEMORY_PARAMETERS;
#endif

/* Shared memory callbacks */
#if NDIS_SUPPORT_NDIS620
typedef NDIS_STATUS (NTAPI *ALLOCATE_SHARED_MEMORY_HANDLER)( NDIS_HANDLE, PNDIS_SHARED_MEMORY_PARAMETERS );
typedef VOID        (NTAPI *FREE_SHARED_MEMORY_HANDLER)( NDIS_HANDLE, NDIS_HANDLE );
#endif

/* NDIS shared memory provider characteristics */
#if NDIS_SUPPORT_NDIS620
typedef struct _NDIS_SHARED_MEMORY_PROVIDER_CHARACTERISTICS {
    NDIS_OBJECT_HEADER              Header;
    ULONG                           Flags;
    NDIS_HANDLE                     ProviderContext;
    ALLOCATE_SHARED_MEMORY_HANDLER  AllocateSharedMemoryHandler;
    FREE_SHARED_MEMORY_HANDLER      FreeSharedMemoryHandler;
} NDIS_SHARED_MEMORY_PROVIDER_CHARACTERISTICS;
typedef NDIS_SHARED_MEMORY_PROVIDER_CHARACTERISTICS *PNDIS_SHARED_MEMORY_PROVIDER_CHARACTERISTICS;
#endif

/* NDIS receive queue state */
#if NDIS_SUPPORT_NDIS620
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;
typedef NDIS_RECEIVE_QUEUE_STATE    *PNDIS_RECEIVE_QUEUE_STATE;
#endif

/* NDIS process scatter/gather list handler */
#if NDIS_SUPPORT_NDIS620
typedef VOID        (NTAPI NDIS_PROCESS_SG_LIST)( PDEVICE_OBJECT, PVOID, PSCATTER_GATHER_LIST, PVOID );
typedef NDIS_PROCESS_SG_LIST    *NDIS_PROCESS_SG_LIST_HANDLER;
#endif

/* NDIS scatter/gather list parameters */
#if NDIS_SUPPORT_NDIS620
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;
typedef NDIS_SCATTER_GATHER_LIST_PARAMETERS *PNDIS_SCATTER_GATHER_LIST_PARAMETERS;
#endif

/* Network buffer data length */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef union _NET_BUFFER_DATA_LENGTH {
    ULONG   DataLength;
    SIZE_T  stDataLength;
} NET_BUFFER_DATA_LENGTH;
typedef NET_BUFFER_DATA_LENGTH  *PNET_BUFFER_DATA_LENGTH;
#endif

/* Network buffer data */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef struct _NET_BUFFER_DATA {
    struct _NET_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;
typedef NET_BUFFER_DATA *PNET_BUFFER_DATA;
#endif

/* Network buffer header */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef union _NET_BUFFER_HEADER {
#ifdef __cplusplus
    NET_BUFFER_DATA NetBufferData;
#else
    NET_BUFFER_DATA;
#endif
    SLIST_HEADER    Link;
} NET_BUFFER_HEADER;
typedef NET_BUFFER_HEADER   *PNET_BUFFER_HEADER;
#endif

/* Network buffer shared memory */
#if NDIS_SUPPORT_NDIS620
typedef struct _NET_BUFFER_SHARED_MEMORY {
    struct _NET_BUFFER_SHARED_MEMORY    *NextSharedMemorySegment;
    ULONG                               SharedMemoryFlags;
    NDIS_HANDLE                         SharedMemoryHandle;
    ULONG                               SharedMemoryOffset;
    ULONG                               SharedMemoryLength;
} NET_BUFFER_SHARED_MEMORY;
typedef NET_BUFFER_SHARED_MEMORY    *PNET_BUFFER_SHARED_MEMORY;
#endif

/* Network buffer */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef struct _NET_BUFFER {
#ifdef __cplusplus
    NET_BUFFER_HEADER       NetBufferHeader;
#else
    NET_BUFFER_HEADER;
#endif
    USHORT                  ChecksumBias;
    USHORT                  Reserved;
    NDIS_HANDLE             NdisPoolHandle;
    PVOID                   NdisReserved[2];
    PVOID                   ProtocolReserved[6];
    PVOID                   MiniportReserved[4];
    NDIS_PHYSICAL_ADDRESS   DataPhysicalAddress;
#if NDIS_SUPPORT_NDIS620
    union {
        PNET_BUFFER_SHARED_MEMORY   SharedMemoryInfo;
        PSCATTER_GATHER_LIST        ScatterGatherList;
    };
#endif
} NET_BUFFER;
typedef NET_BUFFER  *PNET_BUFFER;
#endif

/* Network buffer list context */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef struct _NET_BUFFER_LIST_CONTEXT {
    struct _NET_BUFFER_LIST_CONTEXT *Next;
    USHORT                          Size;
    USHORT                          Offset;
    UCHAR                           ContextData[];
} NET_BUFFER_LIST_CONTEXT;
typedef NET_BUFFER_LIST_CONTEXT *PNET_BUFFER_LIST_CONTEXT;
#endif

/* NDIS network buffer list information */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef enum _NDIS_NET_BUFFER_LIST_INFO {
    TcpIpChecksumNetBufferListInfo          = 0,
    TcpOffloadBytesTransferred              = TcpIpChecksumNetBufferListInfo,
    IPsecOffloadV1NetBufferListInfo         = 1,
#if NDIS_SUPPORT_NDIS61
    IPsecOffloadV2NetBufferListInfo         = IPsecOffloadV1NetBufferListInfo,
#endif
    TcpLargeSendNetBufferListInfo           = 2,
    TcpReceiveNoPush                        = TcpLargeSendNetBufferListInfo,
    ClassificationHandleNetBufferListInfo   = 3,
    Ieee8021QNetBufferListInfo              = 4,
    NetBufferListCancelId                   = 5,
    MediaSpecificInformation                = 6,
    NetBufferListFrameType                  = 7,
    NetBufferListProtocolId                 = NetBufferListFrameType,
    NetBufferListHashValue                  = 8,
    NetBufferListHashInfo                   = 9,
    WfpNetBufferListInfo                    = 10,
#if NDIS_SUPPORT_NDIS61
    IPsecOffloadV2TunnelNetBufferListInfo   = 11,
    IPsecOffloadV2HeaderNetBufferListInfo   = 12,
#endif
#if NDIS_SUPPORT_NDIS620
    NetBufferListCorrelationId              = 13,
    NetBufferListFilteringInfo              = 14,
    MediaSpecificInformationEx              = 15,
    NblOriginalInterfaceIfIndex             = 16,
    NblReAuthWfpFlowContext                 = NblOriginalInterfaceIfIndex,
    TcpReceiveBytesTransferred              = 17,
#endif
    MaxNetBufferListInfo                    = 18
} NDIS_NET_BUFFER_LIST_INFO;
typedef NDIS_NET_BUFFER_LIST_INFO   *PNDIS_NET_BUFFER_LIST_INFO;
#endif

/* Network buffer list data */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef struct _NET_BUFFER_LIST_DATA {
    struct _NET_BUFFER_LIST *Next;
    PNET_BUFFER             FirstNetBuffer;
} NET_BUFFER_LIST_DATA;
typedef NET_BUFFER_LIST_DATA    *PNET_BUFFER_LIST_DATA;
#endif

/* Network buffer list header */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef union _NET_BUFFER_LIST_HEADER {
#ifdef __cplusplus
    NET_BUFFER_LIST_DATA    NetBufferListData;
#else
    NET_BUFFER_LIST_DATA;
#endif
    SLIST_HEADER            Link;
} NET_BUFFER_LIST_HEADER;
typedef NET_BUFFER_LIST_HEADER  *PNET_BUFFER_LIST_HEADER;
#endif

/* Network buffer list */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef struct _NET_BUFFER_LIST {
#ifdef __cplusplus
    NET_BUFFER_LIST_HEADER      NetBufferListHeader;
#else
    NET_BUFFER_LIST_HEADER;
#endif
    PNET_BUFFER_LIST_CONTEXT    Context;
    struct _NET_BUFFER_LIST     *ParentNetBufferList;
    NDIS_HANDLE                 NdisPoolHandle;
    PVOID                       NdisReserved[2];
    PVOID                       ProtocolReserved[4];
    PVOID                       MiniportReserved[2];
    PVOID                       Scratch;
    NDIS_HANDLE                 SourceHandle;
    ULONG                       NblFlags;
    LONG                        ChildRefCount;
    ULONG                       Flags;
    NDIS_STATUS                 Status;
    PVOID                       NetBufferListInfo[MaxNetBufferListInfo];
} NET_BUFFER_LIST;
typedef NET_BUFFER_LIST *PNET_BUFFER_LIST;
#endif

/* NDIS network buffer list 8021Q information */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef struct _NDIS_NET_BUFFER_LIST_8021Q_INFO {
    union {
        struct {
            UINT32  UserPriority        : 3;
            UINT32  CanonicalFormatId   : 1;
            UINT32  VlanId              : 12;
            UINT32  Reserved            : 16;
        } TagHeader;
        struct {
            UINT32  UserPriority        : 3;
            UINT32  CanonicalFormatId   : 1;
            UINT32  VlanId              : 12;
            UINT32  WMMInfo             : 4;
            UINT32  Reserved            : 12;
        } WLanTagHeader;
        PVOID   Value;
    };
} NDIS_NET_BUFFER_LIST_8021Q_INFO;
typedef NDIS_NET_BUFFER_LIST_8021Q_INFO *PNDIS_NET_BUFFER_LIST_8021Q_INFO;
#endif

/* NDIS network buffer list media-specific information */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef struct _NDIS_NET_BUFFER_LIST_MEDIA_SPECIFIC_INFO {
    union {
        PVOID   MediaSpecificInfo;
        PVOID   NativeWifiSpecificInfo;
        PVOID   Value;
    };
} NDIS_NET_BUFFER_LIST_MEDIA_SPECIFIC_INFO;
typedef NDIS_NET_BUFFER_LIST_MEDIA_SPECIFIC_INFO    *PNDIS_NET_BUFFER_LIST_MEDIA_SPECIFIC_INFO;
#endif

/* NDIS NBL media-specific information */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef struct _NDIS_NBL_MEDIA_SPECIFIC_INFORMATION {
    struct _NDIS_NBL_MEDIA_SPECIFIC_INFORMATION *NextEntry;
    ULONG                                       Tag;
    UCHAR                                       Data[1];
} NDIS_NBL_MEDIA_SPECIFIC_INFORMATION;
typedef NDIS_NBL_MEDIA_SPECIFIC_INFORMATION *PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION;
#endif

/* NDIS NBL media-specific information (extended version) */
#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;
typedef NDIS_NBL_MEDIA_SPECIFIC_INFORMATION_EX  *PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION_EX;
#endif

/* NDIS network buffer list filtering information */
#if NDIS_SUPPORT_NDIS620
typedef struct _NDIS_NET_BUFFER_LIST_FILTERING_INFO {
    union {
        struct {
            USHORT  FilterId;
            USHORT  QueueId;
        } FilteringInfo;
        PVOID   Value;
    };
} NDIS_NET_BUFFER_LIST_FILTERING_INFO;
typedef NDIS_NET_BUFFER_LIST_FILTERING_INFO *PNDIS_NET_BUFFER_LIST_FILTERING_INFO;
#endif

/* Network buffer list pool parameters */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef struct _NET_BUFFER_LIST_POOL_PARAMETERS {
    NDIS_OBJECT_HEADER  Header;
    UCHAR               ProtocolId;
    BOOLEAN             fAllocateNetBuffer;
    USHORT              ContextSize;
    ULONG               PoolTag;
    ULONG               DataSize;
} NET_BUFFER_LIST_POOL_PARAMETERS;
typedef NET_BUFFER_LIST_POOL_PARAMETERS *PNET_BUFFER_LIST_POOL_PARAMETERS;
#endif

/* Network buffer pool parameters */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef struct _NET_BUFFER_POOL_PARAMETERS {
    NDIS_OBJECT_HEADER  Header;
    ULONG               PoolTag;
    ULONG               DataSize;
} NET_BUFFER_POOL_PARAMETERS;
typedef NET_BUFFER_POOL_PARAMETERS  *PNET_BUFFER_POOL_PARAMETERS;
#endif

/* Network buffer callbacks */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef PMDL        (NTAPI *NET_BUFFER_ALLOCATE_MDL_HANDLER)( PULONG );
typedef VOID        (NTAPI *NET_BUFFER_FREE_MDL_HANDLER)( PMDL );
#endif

/* NDIS IPsec packet information */
#if NDIS_SUPPORT_NDIS6 || NDIS60
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;
typedef NDIS_IPSEC_PACKET_INFO  *PNDIS_IPSEC_PACKET_INFO;
#endif

/* NDIS IPsec offload network buffer list information (version 1) */
#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;
typedef NDIS_IPSEC_OFFLOAD_V1_NET_BUFFER_LIST_INFO  *PNDIS_IPSEC_OFFLOAD_V1_NET_BUFFER_LIST_INFO;
#endif

/* NDIS tasks */
#if NDIS_LEGACY_DRIVER
typedef enum _NDIS_TASK {
    TcpIpChecksumNdisTask   = 0,
    IpSecNdisTask           = 1,
    TcpLargeSendNdisTask    = 2,
    MaxNdisTask             = 3
} NDIS_TASK;
typedef NDIS_TASK   *PNDIS_TASK;
#endif

/* NDIS encapsulation values */
#if NDIS_LEGACY_DRIVER
typedef enum _NDIS_ENCAPSULATION {
    UNSPECIFIED_Encapsulation       = 0,
    NULL_Encapsulation              = 1,
    IEEE_802_3_Encapsulation        = 2,
    IEEE_802_5_Encapsulation        = 3,
    LLC_SNAP_ROUTED_Encapsulation   = 4,
    LLC_SNAP_BRIDGED_Encapsulation  = 5
} NDIS_ENCAPSULATION;
#endif

/* NDIS encapsulation format */
#if NDIS_LEGACY_DRIVER
typedef struct _NDIS_ENCAPSULATION_FORMAT {
    NDIS_ENCAPSULATION  Encapsulation;
    struct {
        ULONG   FixedHeaderSize : 1;
        ULONG   Reserved        : 31;
    } Flags;
    ULONG               EncapsulationHeaderSize;
} NDIS_ENCAPSULATION_FORMAT;
typedef NDIS_ENCAPSULATION_FORMAT   *PNDIS_ENCAPSULATION_FORMAT;
#endif

/* NDIS task offload header */
#if NDIS_LEGACY_DRIVER
typedef struct _NDIS_TASK_OFFLOAD_HEADER {
    ULONG                       Version;
    ULONG                       Size;
    ULONG                       Reserved;
    ULONG                       OffsetFirstTask;
    NDIS_ENCAPSULATION_FORMAT   EncapsulationFormat;
} NDIS_TASK_OFFLOAD_HEADER;
typedef NDIS_TASK_OFFLOAD_HEADER    *PNDIS_TASK_OFFLOAD_HEADER;
#endif

/* NDIS task offload */
#if NDIS_LEGACY_DRIVER
typedef struct _NDIS_TASK_OFFLOAD {
    ULONG       Version;
    ULONG       Size;
    NDIS_TASK   Task;
    ULONG       OffsetNextTask;
    ULONG       TaskBufferLength;
    UCHAR       TaskBuffer[1];
} NDIS_TASK_OFFLOAD;
typedef NDIS_TASK_OFFLOAD   *PNDIS_TASK_OFFLOAD;
#endif

/* NDIS task TCP/IP checksum */
#if NDIS_LEGACY_DRIVER
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;
        ULONG   TcpOptionsSupported : 1;
        ULONG   TcpChecksum         : 1;
        ULONG   UdpChecksum         : 1;
    } V6Transmit;
    struct {
        ULONG   IpOptionsSupported  : 1;
        ULONG   TcpOptionsSupported : 1;
        ULONG   TcpChecksum         : 1;
        ULONG   UdpChecksum         : 1;
    } V6Receive;
} NDIS_TASK_TCP_IP_CHECKSUM;
typedef NDIS_TASK_TCP_IP_CHECKSUM   *PNDIS_TASK_TCP_IP_CHECKSUM;
#endif

/* NDIS task TCP large send */
#if NDIS_LEGACY_DRIVER
typedef struct _NDIS_TASK_TCP_LARGE_SEND {
    ULONG   Version;
    ULONG   MaxOffLoadSize;
    ULONG   MinSegmentCount;
    BOOLEAN TcpOptions;
    BOOLEAN IpOptions;
} NDIS_TASK_TCP_LARGE_SEND;
typedef NDIS_TASK_TCP_LARGE_SEND    *PNDIS_TASK_TCP_LARGE_SEND;
#endif

/* NDIS task IPsec */
#if NDIS_LEGACY_DRIVER
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;
typedef NDIS_TASK_IPSEC *PNDIS_TASK_IPSEC;
#endif

/* NDIS TCP large send offload network buffer list information */
#if NDIS_SUPPORT_NDIS6 || NDIS60
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;
typedef NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO    *PNDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_INFO;
#endif

/* NDIS TCP/IP checksum network buffer list information */
#if NDIS_SUPPORT_NDIS6 || NDIS60
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   TcpHeaderChecksum   : 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;
typedef NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO   *PNDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO;
#endif

/* NDIS offload encapsulation */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef struct _NDIS_OFFLOAD_ENCAPSULATION {
    NDIS_OBJECT_HEADER  Header;
    struct {
        ULONG   Enabled;
        ULONG   EncapsulationType;
        ULONG   HeaderSize;
    } IPv4;
    struct {
        ULONG   Enabled;
        ULONG   EncapsulationType;
        ULONG   HeaderSize;
    } IPv6;
} NDIS_OFFLOAD_ENCAPSULATION;
typedef NDIS_OFFLOAD_ENCAPSULATION  *PNDIS_OFFLOAD_ENCAPSULATION;
#endif

/* NDIS IPsec offload (version 2) network buffer list information */
#if NDIS_SUPPORT_NDIS61
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;
            ULONG   Reserved        : 13;
            ULONG   CryptoStatus    : 16;
        } Receive;
    };
} NDIS_IPSEC_OFFLOAD_V2_NET_BUFFER_LIST_INFO;
typedef NDIS_IPSEC_OFFLOAD_V2_NET_BUFFER_LIST_INFO  *PNDIS_IPSEC_OFFLOAD_V2_NET_BUFFER_LIST_INFO;
#endif

/* NDIS IPsec offload (version 2) tunnel network buffer list information */
#if NDIS_SUPPORT_NDIS61
typedef struct _NDIS_IPSEC_OFFLOAD_V2_TUNNEL_NET_BUFFER_LIST_INFO {
    struct {
        NDIS_HANDLE TunnelHandle;
    } Transmit;
} NDIS_IPSEC_OFFLOAD_V2_TUNNEL_NET_BUFFER_LIST_INFO;
typedef NDIS_IPSEC_OFFLOAD_V2_TUNNEL_NET_BUFFER_LIST_INFO   *PNDIS_IPSEC_OFFLOAD_V2_TUNNEL_NET_BUFFER_LIST_INFO;
#endif

/* NDIS IPsec offload (version 2) header network buffer list information */
#if NDIS_SUPPORT_NDIS61
typedef struct _NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO {
    union {
        struct {
            ULONG   NextHeader      : 8;
            ULONG   PadLength       : 8;
            ULONG   AhHeaderOffset  : 8;
            ULONG   EspHeaderOffset : 8;
        } Transmit;
        struct {
            ULONG   NextHeader      : 8;
            ULONG   PadLength       : 8;
            ULONG   HeaderInfoSet   : 1;
        } Receive;
    };
} NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO;
typedef NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO   *PNDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_INFO;
#endif

/* IPsec offload (version 2) operations */
#if NDIS_SUPPORT_NDIS61
typedef enum _IPSEC_OFFLOAD_V2_OPERATION {
    IPsecOffloadV2Ah    = 1,
    IPsecOffloadV2Esp   = 2,
    IPsecOffloadV2Max   = 3
} IPSEC_OFFLOAD_V2_OPERATION;
typedef IPSEC_OFFLOAD_V2_OPERATION  *PIPSEC_OFFLOAD_V2_OPERATION;
#endif

/* IPsec offload (version 2) algorithm information */
#if NDIS_SUPPORT_NDIS61
typedef struct _IPSEC_OFFLOAD_V2_ALGORITHM_INFO {
    ULONG   Identifier;
    ULONG   KeyLength;
    ULONG   KeyOffsetBytes;
    ULONG   AdditionalInfo;
} IPSEC_OFFLOAD_V2_ALGORITHM_INFO;
typedef IPSEC_OFFLOAD_V2_ALGORITHM_INFO *PIPSEC_OFFLOAD_V2_ALGORITHM_INFO;
#endif

/* IPsec offload (version 2) security association */
#if NDIS_SUPPORT_NDIS61
typedef struct _IPSEC_OFFLOAD_V2_SECURITY_ASSOCIATION {
    ULONG                           Flags;
    IPSEC_OFFLOAD_V2_OPERATION      Operation;
    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;
typedef IPSEC_OFFLOAD_V2_SECURITY_ASSOCIATION   *PIPSEC_OFFLOAD_V2_SECURITY_ASSOCIATION;
#endif

/* IPsec offload (version 2) add security association */
#if NDIS_SUPPORT_NDIS61
typedef struct _IPSEC_OFFLOAD_V2_ADD_SA {
    NDIS_OBJECT_HEADER                      Header;
    struct _IPSEC_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;
typedef IPSEC_OFFLOAD_V2_ADD_SA *PIPSEC_OFFLOAD_V2_ADD_SA;
#endif

/* IPsec offload (version 2) delete security association */
#if NDIS_SUPPORT_NDIS61
typedef struct _IPSEC_OFFLOAD_V2_DELETE_SA {
    NDIS_OBJECT_HEADER                  Header;
    struct _IPSEC_OFFLOAD_V2_DELETE_SA  *Next;
    NDIS_HANDLE                         OffloadHandle;
} IPSEC_OFFLOAD_V2_DELETE_SA;
typedef IPSEC_OFFLOAD_V2_DELETE_SA  *PIPSEC_OFFLOAD_V2_DELETE_SA;
#endif

/* IPsec offload (version 2) update security association */
#if NDIS_SUPPORT_NDIS61
typedef struct _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;
typedef IPSEC_OFFLOAD_V2_UPDATE_SA  *PIPSEC_OFFLOAD_V2_UPDATE_SA;
#endif

/* NDIS 4.0 protocol characteristics callbacks */
#if NDIS_LEGACY_PROTOCOL
typedef VOID        (NTAPI *OPEN_ADAPTER_COMPLETE_HANDLER)( NDIS_HANDLE, NDIS_STATUS, NDIS_STATUS );
typedef VOID        (NTAPI *CLOSE_ADAPTER_COMPLETE_HANDLER)( NDIS_HANDLE, NDIS_STATUS );
typedef VOID        (NTAPI *RESET_COMPLETE_HANDLER)( NDIS_HANDLE, NDIS_STATUS );
typedef VOID        (NTAPI *REQUEST_COMPLETE_HANDLER)( NDIS_HANDLE, PNDIS_REQUEST, NDIS_STATUS );
typedef VOID        (NTAPI *STATUS_HANDLER)( NDIS_HANDLE, NDIS_STATUS, PVOID, UINT );
typedef VOID        (NTAPI *STATUS_COMPLETE_HANDLER)( NDIS_HANDLE );
typedef VOID        (NTAPI *SEND_COMPLETE_HANDLER)( NDIS_HANDLE, PNDIS_PACKET, NDIS_STATUS );
typedef VOID        (NTAPI *WAN_SEND_COMPLETE_HANDLER)( NDIS_HANDLE, PNDIS_WAN_PACKET, NDIS_STATUS );
typedef VOID        (NTAPI *TRANSFER_DATA_COMPLETE_HANDLER)( NDIS_HANDLE, PNDIS_PACKET, NDIS_STATUS, UINT );
typedef VOID        (NTAPI *WAN_TRANSFER_DATA_COMPLETE_HANDLER)( VOID );
typedef NDIS_STATUS (NTAPI *RECEIVE_HANDLER)( NDIS_HANDLE, NDIS_HANDLE, PVOID, UINT, PVOID, UINT, UINT );
typedef NDIS_STATUS (NTAPI *WAN_RECEIVE_HANDLER)( NDIS_HANDLE, PUCHAR, ULONG );
typedef VOID        (NTAPI *RECEIVE_COMPLETE_HANDLER)( NDIS_HANDLE );
typedef INT         (NTAPI *RECEIVE_PACKET_HANDLER)( NDIS_HANDLE, PNDIS_PACKET );
typedef VOID        (NTAPI *BIND_HANDLER)( PNDIS_STATUS, NDIS_HANDLE, PNDIS_STRING, PVOID, PVOID );
typedef VOID        (NTAPI *UNBIND_HANDLER)( PNDIS_STATUS, NDIS_HANDLE, NDIS_HANDLE );
typedef NDIS_STATUS (NTAPI *PNP_EVENT_HANDLER)( NDIS_HANDLE, PNET_PNP_EVENT );
typedef VOID        (NTAPI *UNLOAD_PROTOCOL_HANDLER)( VOID );
#endif

/* NDIS 4.0 protocol characteristics */
#if NDIS_LEGACY_PROTOCOL
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;
    RECEIVE_PACKET_HANDLER          ReceivePacketHandler;
    BIND_HANDLER                    BindAdapterHandler;
    UNBIND_HANDLER                  UnbindAdapterHandler;
    PNP_EVENT_HANDLER               PnPEventHandler;
    UNLOAD_PROTOCOL_HANDLER         UnloadHandler;
} NDIS40_PROTOCOL_CHARACTERISTICS;
#endif

/* NDIS 5.0 protocol characteristics callbacks */
#if NDIS_LEGACY_DRIVER
typedef VOID        (NTAPI *CO_SEND_COMPLETE_HANDLER)( NDIS_STATUS, NDIS_HANDLE, PNDIS_PACKET );
typedef VOID        (NTAPI *CO_STATUS_HANDLER)( NDIS_HANDLE, NDIS_HANDLE, NDIS_STATUS, PVOID, UINT );
typedef UINT        (NTAPI *CO_RECEIVE_PACKET_HANDLER)( NDIS_HANDLE, NDIS_HANDLE, PNDIS_PACKET );
typedef NDIS_STATUS (NTAPI *CO_REQUEST_HANDLER)( NDIS_HANDLE, NDIS_HANDLE, NDIS_HANDLE, PNDIS_REQUEST );
typedef VOID        (NTAPI *CO_REQUEST_COMPLETE_HANDLER)( NDIS_STATUS, NDIS_HANDLE, NDIS_HANDLE, NDIS_HANDLE, PNDIS_REQUEST );
#endif
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef NDIS_STATUS (NTAPI PROTOCOL_CO_OID_REQUEST)( NDIS_HANDLE, NDIS_HANDLE, NDIS_HANDLE, PNDIS_OID_REQUEST );
typedef VOID        (NTAPI PROTOCOL_CO_OID_REQUEST_COMPLETE)( NDIS_HANDLE, NDIS_HANDLE, NDIS_HANDLE, PNDIS_OID_REQUEST, NDIS_STATUS );
typedef PROTOCOL_CO_OID_REQUEST             *CO_OID_REQUEST_HANDLER;
typedef PROTOCOL_CO_OID_REQUEST_COMPLETE    *CO_OID_REQUEST_COMPLETE_HANDLER;
#endif
typedef NDIS_STATUS (NTAPI PROTOCOL_CO_CREATE_VC)( NDIS_HANDLE, NDIS_HANDLE, PNDIS_HANDLE );
typedef NDIS_STATUS (NTAPI PROTOCOL_CO_DELETE_VC)( NDIS_HANDLE );
typedef VOID        (NTAPI PROTOCOL_CO_AF_REGISTER_NOTIFY)( NDIS_HANDLE, PCO_ADDRESS_FAMILY );
typedef PROTOCOL_CO_CREATE_VC               *CO_CREATE_VC_HANDLER;
typedef PROTOCOL_CO_DELETE_VC               *CO_DELETE_VC_HANDLER;
typedef PROTOCOL_CO_AF_REGISTER_NOTIFY      *CO_AF_REGISTER_NOTIFY_HANDLER;

/* NDIS 5.0 protocol characteristics */
#if NDIS_LEGACY_PROTOCOL
typedef struct _NDIS50_PROTOCOL_CHARACTERISTICS {
#ifdef __cplusplus
    NDIS40_PROTOCOL_CHARACTERISTICS Ndis40Chars;
#else
    NDIS40_PROTOCOL_CHARACTERISTICS;
#endif
    PVOID                           ReservedHandlers[4];
    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 6.0 protocol characteristics callbacks */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef VOID        (NTAPI PROTOCOL_CO_RECEIVE_NET_BUFFER_LISTS)( NDIS_HANDLE, NDIS_HANDLE, PNET_BUFFER_LIST, ULONG, ULONG );
typedef VOID        (NTAPI PROTOCOL_CO_SEND_NET_BUFFER_LISTS_COMPLETE)( NDIS_HANDLE, PNET_BUFFER_LIST, ULONG );
typedef VOID        (NTAPI PROTOCOL_CO_STATUS_EX)( NDIS_HANDLE, NDIS_HANDLE, PNDIS_STATUS_INDICATION );
typedef NDIS_STATUS (NTAPI PROTOCOL_CL_NOTIFY_CLOSE_AF)( NDIS_HANDLE );
typedef VOID        (NTAPI PROTOCOL_CL_OPEN_AF_COMPLETE_EX)( NDIS_HANDLE, NDIS_HANDLE, NDIS_STATUS );
typedef VOID        (NTAPI PROTOCOL_CM_NOTIFY_CLOSE_AF_COMPLETE)( NDIS_HANDLE, NDIS_STATUS );
typedef PROTOCOL_CO_RECEIVE_NET_BUFFER_LISTS    *CO_RECEIVE_NET_BUFFER_LISTS_HANDLER;
typedef PROTOCOL_CO_SEND_NET_BUFFER_LISTS_COMPLETE  *CO_SEND_NET_BUFFER_LISTS_COMPLETE_HANDLER;
typedef PROTOCOL_CO_STATUS_EX                   *CO_STATUS_HANDLER_EX;
typedef PROTOCOL_CL_NOTIFY_CLOSE_AF             *CL_NOTIFY_CLOSE_AF_HANDLER;
typedef PROTOCOL_CL_OPEN_AF_COMPLETE_EX         *CL_OPEN_AF_COMPLETE_HANDLER_EX;
typedef PROTOCOL_CM_NOTIFY_CLOSE_AF_COMPLETE    *CM_NOTIFY_CLOSE_AF_COMPLETE_HANDLER;
#endif

/* TDI callbacks */
typedef NTSTATUS    (NTAPI *TDI_REGISTER_CALLBACK)( PUNICODE_STRING, HANDLE * );
typedef NTSTATUS    (NTAPI *TDI_PNP_HANDLER)( PUNICODE_STRING, PUNICODE_STRING, PUNICODE_STRING, PVOID, UINT, UINT );

/* NDIS bind parameters */
#if NDIS_SUPPORT_NDIS6 || NDIS60
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;
    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_DIRECTION_TYPE           DirectionType;
    NET_IF_CONNECTION_TYPE          ConnectionType;
    NET_IFTYPE                      IfType;
    BOOLEAN                         IfConnectorPresent;
    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
#if NDIS_SUPPORT_NDIS620
    PNDIS_RECEIVE_FILTER_CAPABILITIES   ReceiveFilterCapabilities;
    PNDIS_PM_CAPABILITIES           PowerManagementCapabilitiesEx;
    PNDIS_NIC_SWITCH_CAPABILITIES   NicSwitchCapabilities;
#endif
} NDIS_BIND_PARAMETERS;
typedef NDIS_BIND_PARAMETERS    *PNDIS_BIND_PARAMETERS;
#endif

/* NDIS 6.0 protocol entry points */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef VOID        (NTAPI PROTOCOL_OID_REQUEST_COMPLETE)( NDIS_HANDLE, PNDIS_OID_REQUEST, NDIS_STATUS );
typedef VOID        (NTAPI PROTOCOL_RECEIVE_NET_BUFFER_LISTS)( NDIS_HANDLE, PNET_BUFFER_LIST, NDIS_PORT_NUMBER, ULONG, ULONG );
typedef VOID        (NTAPI PROTOCOL_SEND_NET_BUFFER_LISTS_COMPLETE)( NDIS_HANDLE, PNET_BUFFER_LIST, ULONG );
typedef NDIS_STATUS (NTAPI PROTOCOL_BIND_ADAPTER_EX)( NDIS_HANDLE, NDIS_HANDLE, PNDIS_BIND_PARAMETERS );
typedef NDIS_STATUS (NTAPI PROTOCOL_UNBIND_ADAPTER_EX)( NDIS_HANDLE, NDIS_HANDLE );
typedef VOID        (NTAPI PROTOCOL_OPEN_ADAPTER_COMPLETE_EX)( NDIS_HANDLE, NDIS_STATUS );
typedef VOID        (NTAPI PROTOCOL_CLOSE_ADAPTER_COMPLETE_EX)( NDIS_HANDLE );
typedef VOID        (NTAPI PROTOCOL_STATUS_EX)( NDIS_HANDLE, PNDIS_STATUS_INDICATION );
typedef NDIS_STATUS (NTAPI PROTOCOL_NET_PNP_EVENT)( NDIS_HANDLE, PNET_PNP_EVENT_NOTIFICATION );
typedef VOID        (NTAPI PROTOCOL_UNINSTALL)( VOID );
typedef PROTOCOL_OID_REQUEST_COMPLETE           *OID_REQUEST_COMPLETE_HANDLER;
typedef PROTOCOL_RECEIVE_NET_BUFFER_LISTS       *RECEIVE_NET_BUFFER_LISTS_HANDLER;
typedef PROTOCOL_SEND_NET_BUFFER_LISTS_COMPLETE *SEND_NET_BUFFER_LISTS_COMPLETE_HANDLER;
typedef PROTOCOL_BIND_ADAPTER_EX                *BIND_HANDLER_EX;
typedef PROTOCOL_UNBIND_ADAPTER_EX              *UNBIND_HANDLER_EX;
typedef PROTOCOL_OPEN_ADAPTER_COMPLETE_EX       *OPEN_ADAPTER_COMPLETE_HANDLER_EX;
typedef PROTOCOL_CLOSE_ADAPTER_COMPLETE_EX      *CLOSE_ADAPTER_COMPLETE_HANDLER_EX;
typedef PROTOCOL_STATUS_EX                      *STATUS_HANDLER_EX;
typedef PROTOCOL_NET_PNP_EVENT                  *NET_PNP_EVENT_HANDLER;
typedef PROTOCOL_UNINSTALL                      *UNINSTALL_PROTOCOL_HANDLER;
#endif
#if NDIS_SUPPORT_NDIS61
typedef VOID        (NTAPI PROTOCOL_DIRECT_OID_REQUEST_COMPLETE)( NDIS_HANDLE, PNDIS_OID_REQUEST, NDIS_STATUS );
typedef PROTOCOL_DIRECT_OID_REQUEST_COMPLETE    *DIRECT_OID_REQUEST_COMPLETE_HANDLER;
#endif

/* NDIS protocol CO characteristics */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef struct _NDIS_PROTOCOL_CO_CHARACTERISTICS {
    NDIS_OBJECT_HEADER                          Header;
    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;
typedef NDIS_PROTOCOL_CO_CHARACTERISTICS    *PNDIS_PROTOCOL_CO_CHARACTERISTICS;
#endif

/* NDIS protocol driver characteristics */
#if NDIS_SUPPORT_NDIS6 || NDIS60
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_PROTOCOL_DRIVER_CHARACTERISTICS;
typedef NDIS_PROTOCOL_DRIVER_CHARACTERISTICS    *PNDIS_PROTOCOL_DRIVER_CHARACTERISTICS;
#endif

/* NDIS protocol characteristics */
#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;
#endif

/* NDIS open parameters */
#if NDIS_SUPPORT_NDIS6 || NDIS60
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;
typedef NDIS_OPEN_PARAMETERS    *PNDIS_OPEN_PARAMETERS;
#endif

/* NDIS protocol pause parameters */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef struct _NDIS_PROTOCOL_PAUSE_PARAMETERS {
    NDIS_OBJECT_HEADER  Header;
    ULONG               Flags;
    ULONG               PauseReason;
} NDIS_PROTOCOL_PAUSE_PARAMETERS;
typedef NDIS_PROTOCOL_PAUSE_PARAMETERS  *PNDIS_PROTOCOL_PAUSE_PARAMETERS;
#endif

/* NDIS protocol restart parameters */
#if NDIS_SUPPORT_NDIS6 || NDIS60
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;
typedef NDIS_PROTOCOL_RESTART_PARAMETERS    *PNDIS_PROTOCOL_RESTART_PARAMETERS;
#endif

/* NDIS common open block */
#if !defined( NDIS_WRAPPER ) && NDIS_LEGACY_PROTOCOL
typedef struct _NDIS_COMMON_OPEN_BLOCK {
    PVOID                           MacHandle;
    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;
    union {
        SEND_HANDLER        SendHandler;
        WAN_SEND_HANDLER    WanSendHandler;
    };
    TRANSFER_DATA_HANDLER           TransferDataHandler;
    SEND_COMPLETE_HANDLER           SendCompleteHandler;
    TRANSFER_DATA_COMPLETE_HANDLER  TransferDataCompleteHandler;
    RECEIVE_HANDLER                 ReceiveHandler;
    RECEIVE_COMPLETE_HANDLER        ReceiveCompleteHandler;
    WAN_RECEIVE_HANDLER             WanReceiveHandler;
    REQUEST_COMPLETE_HANDLER        RequestCompleteHandler;
    RECEIVE_PACKET_HANDLER          ReceivePacketHandler;
    SEND_PACKETS_HANDLER            SendPacketsHandler;
    RESET_HANDLER                   ResetHandler;
    REQUEST_HANDLER                 RequestHandler;
    RESET_COMPLETE_HANDLER          ResetCompleteHandler;
    STATUS_HANDLER                  StatusHandler;
    STATUS_COMPLETE_HANDLER         StatusCompleteHandler;
} NDIS_COMMON_OPEN_BLOCK;
typedef NDIS_COMMON_OPEN_BLOCK  *PNDIS_COMMON_OPEN_BLOCK;
#endif

/* NDIS open block */
#if !defined( NDIS_WRAPPER ) && NDIS_LEGACY_PROTOCOL
typedef struct _NDIS_OPEN_BLOCK {
#ifdef __cplusplus
    NDIS_COMMON_OPEN_BLOCK  NdisCommonOpenBlock;
#else
    NDIS_COMMON_OPEN_BLOCK;
#endif
} NDIS_OPEN_BLOCK;
typedef NDIS_OPEN_BLOCK *PNDIS_OPEN_BLOCK;
#endif

/* NDIS miniport characteristics callbacks */
#if NDIS_LEGACY_MINIPORT
typedef BOOLEAN     (NTAPI *W_CHECK_FOR_HANG_HANDLER)( NDIS_HANDLE );
typedef VOID        (NTAPI *W_DISABLE_INTERRUPT_HANDLER)( NDIS_HANDLE );
typedef VOID        (NTAPI *W_ENABLE_INTERRUPT_HANDLER)( NDIS_HANDLE );
typedef VOID        (NTAPI *W_HALT_HANDLER)( NDIS_HANDLE );
typedef VOID        (NTAPI *W_HANDLE_INTERRUPT_HANDLER)( NDIS_HANDLE );
typedef NDIS_STATUS (NTAPI *W_INITIALIZE_HANDLER)( PNDIS_STATUS, PUINT, PNDIS_MEDIUM, UINT, NDIS_HANDLE, NDIS_HANDLE );
typedef VOID        (NTAPI *W_ISR_HANDLER)( PBOOLEAN, PBOOLEAN, NDIS_HANDLE );
typedef NDIS_STATUS (NTAPI *W_QUERY_INFORMATION_HANDLER)( NDIS_HANDLE, NDIS_OID, PVOID, ULONG, PULONG, PULONG );
typedef NDIS_STATUS (NTAPI *W_RECONFIGURE_HANDLER)( PNDIS_STATUS, NDIS_HANDLE, NDIS_HANDLE );
typedef NDIS_STATUS (NTAPI *W_RESET_HANDLER)( PBOOLEAN, NDIS_HANDLE );
typedef NDIS_STATUS (NTAPI *W_SEND_HANDLER)( NDIS_HANDLE, PNDIS_PACKET, UINT );
typedef NDIS_STATUS (NTAPI *WM_SEND_HANDLER)( NDIS_HANDLE, NDIS_HANDLE, PNDIS_WAN_PACKET );
typedef NDIS_STATUS (NTAPI *W_SET_INFORMATION_HANDLER)( NDIS_HANDLE, NDIS_OID, PVOID, ULONG, PULONG, PULONG );
typedef NDIS_STATUS (NTAPI *W_TRANSFER_DATA_HANDLER)( PNDIS_PACKET, PUINT, NDIS_HANDLE, NDIS_HANDLE, UINT, UINT );
typedef NDIS_STATUS (NTAPI *WM_TRANSFER_DATA_HANDLER)( VOID );
typedef VOID        (NTAPI *ADAPTER_SHUTDOWN_HANDLER)( PVOID );
typedef VOID        (NTAPI *W_RETURN_PACKET_HANDLER)( NDIS_HANDLE, PNDIS_PACKET );
typedef VOID        (NTAPI *W_SEND_PACKETS_HANDLER)( NDIS_HANDLE, PPNDIS_PACKET, UINT );
typedef VOID        (NTAPI *W_ALLOCATE_COMPLETE_HANDLER)( NDIS_HANDLE, PVOID, PNDIS_PHYSICAL_ADDRESS, ULONG, PVOID );
#endif
typedef NDIS_STATUS (NTAPI MINIPORT_CO_CREATE_VC)( NDIS_HANDLE, NDIS_HANDLE, PNDIS_HANDLE );
typedef NDIS_STATUS (NTAPI MINIPORT_CO_DELETE_VC)( NDIS_HANDLE );
typedef NDIS_STATUS (NTAPI MINIPORT_CO_ACTIVATE_VC)( NDIS_HANDLE, PCO_CALL_PARAMETERS );
typedef NDIS_STATUS (NTAPI MINIPORT_CO_DEACTIVATE_VC)( NDIS_HANDLE );
typedef MINIPORT_CO_CREATE_VC       *W_CO_CREATE_VC_HANDLER;
typedef MINIPORT_CO_DELETE_VC       *W_CO_DELETE_VC_HANDLER;
typedef MINIPORT_CO_ACTIVATE_VC     *W_CO_ACTIVATE_VC_HANDLER;
typedef MINIPORT_CO_DEACTIVATE_VC   *W_CO_DEACTIVATE_VC_HANDLER;
#if NDIS_LEGACY_MINIPORT
typedef VOID        (NTAPI *W_CO_SEND_PACKETS_HANDLER)( NDIS_HANDLE, PPNDIS_PACKET, UINT );
typedef NDIS_STATUS (NTAPI *W_CO_REQUEST_HANDLER)( NDIS_HANDLE, NDIS_HANDLE, PNDIS_REQUEST );
#endif
#if NDIS_SUPPORT_NDIS6
typedef VOID        (NTAPI MINIPORT_CO_SEND_NET_BUFFER_LISTS)( NDIS_HANDLE, PNET_BUFFER_LIST, ULONG );
typedef NDIS_STATUS (NTAPI MINIPORT_CO_OID_REQUEST)( NDIS_HANDLE, NDIS_HANDLE, PNDIS_OID_REQUEST );
typedef MINIPORT_CO_SEND_NET_BUFFER_LISTS   *W_CO_SEND_NET_BUFFER_LISTS_HANDLER;
typedef MINIPORT_CO_OID_REQUEST             *W_CO_OID_REQUEST_HANDLER;
#endif

/* NDIS device Plug and Play events */
typedef enum _NDIS_DEVICE_PNP_EVENT {
    NdisDevicePnPEventQueryRemoved          = 0,
    NdisDevicePnPEventRemoved               = 1,
    NdisDevicePnPEventSurpriseRemoved       = 2,
    NdisDevicePnPEventQueryStopped          = 3,
    NdisDevicePnPEventStopped               = 4,
    NdisDevicePnPEventPowerProfileChanged   = 5,
#if NDIS_SUPPORT_NDIS6
    NdisDevicePnPEventFilterListChanged     = 6,
    NdisDevicePnPEventMaximum               = 7
#else
    NdisDevicePnPEventMaximum               = 6
#endif
} NDIS_DEVICE_PNP_EVENT;
typedef NDIS_DEVICE_PNP_EVENT   *PNDIS_DEVICE_PNP_EVENT;

/* NDIS power profiles */
typedef enum _NDIS_POWER_PROFILE {
    NdisPowerProfileBattery     = 0,
    NdisPowerProfileAcOnLine    = 1
} NDIS_POWER_PROFILE;
typedef NDIS_POWER_PROFILE  *PNDIS_POWER_PROFILE;

/* NDIS 5.0 miniport characteristics */
#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;
    };
    W_RETURN_PACKET_HANDLER     ReturnPacketHandler;
    W_SEND_PACKETS_HANDLER      SendPacketsHandler;
    W_ALLOCATE_COMPLETE_HANDLER AllocateCompleteHandler;
    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;
#endif

/* NDIS 5.1 miniport characteristics callbacks */
#if NDIS_LEGACY_MINIPORT
#if ((NDIS_MINIPORT_MAJOR_VERSION == 5) && (NDIS_MINIPORT_MINOR_VERSION == 1)) || \
    NDIS_WRAPPER
typedef VOID        (NTAPI *W_CANCEL_SEND_PACKETS_HANDLER)( NDIS_HANDLE, PVOID );
typedef VOID        (NTAPI *W_PNP_EVENT_NOTIFY_HANDLER)( NDIS_HANDLE, NDIS_DEVICE_PNP_EVENT, PVOID, ULONG );
typedef VOID        (NTAPI *W_MINIPORT_SHUTDOWN_HANDLER)( NDIS_HANDLE );
#endif
#endif

/* NDIS receive throttle parameters */
#if NDIS_SUPPORT_NDIS620
typedef struct _NDIS_RECEIVE_THROTTLE_PARAMETERS {
    ULONG   MaxNblsToIndicate;
    ULONG   MoreNblsPending : 1;
} NDIS_RECEIVE_THROTTLE_PARAMETERS;
typedef NDIS_RECEIVE_THROTTLE_PARAMETERS    *PNDIS_RECEIVE_THROTTLE_PARAMETERS;
#endif

/* NDIS 6.0 miniport interrupt characteristics callbacks */
#if NDIS_SUPPORT_NDIS6
typedef BOOLEAN     (NTAPI MINIPORT_ISR)( NDIS_HANDLE, PBOOLEAN, PULONG );
typedef VOID        (NTAPI MINIPORT_INTERRUPT_DPC)( NDIS_HANDLE, PVOID, PVOID, PVOID );
typedef VOID        (NTAPI MINIPORT_DISABLE_INTERRUPT)( NDIS_HANDLE );
typedef VOID        (NTAPI MINIPORT_ENABLE_INTERRUPT)( NDIS_HANDLE );
typedef BOOLEAN     (NTAPI MINIPORT_MESSAGE_INTERRUPT)( NDIS_HANDLE, ULONG, PBOOLEAN, PULONG );
#if NDIS_SUPPORT_NDIS620
typedef VOID        (NTAPI MINIPORT_MESSAGE_INTERRUPT_DPC)( NDIS_HANDLE, ULONG, PVOID, PVOID, PVOID );
#else
typedef VOID        (NTAPI MINIPORT_MESSAGE_INTERRUPT_DPC)( NDIS_HANDLE, ULONG, PVOID, PULONG, PULONG );
#endif
typedef VOID        (NTAPI MINIPORT_DISABLE_MESSAGE_INTERRUPT)( NDIS_HANDLE, ULONG );
typedef VOID        (NTAPI MINIPORT_ENABLE_MESSAGE_INTERRUPT)( NDIS_HANDLE, ULONG );
typedef BOOLEAN     (NTAPI MINIPORT_SYNCHRONIZE_INTERRUPT)( NDIS_HANDLE );
typedef MINIPORT_ISR                        *MINIPORT_ISR_HANDLER;
typedef MINIPORT_INTERRUPT_DPC              *MINIPORT_INTERRUPT_DPC_HANDLER;
typedef MINIPORT_DISABLE_INTERRUPT          *MINIPORT_DISABLE_INTERRUPT_HANDLER;
typedef MINIPORT_ENABLE_INTERRUPT           *MINIPORT_ENABLE_INTERRUPT_HANDLER;
typedef MINIPORT_MESSAGE_INTERRUPT          *MINIPORT_MSI_ISR_HANDLER;
typedef MINIPORT_MESSAGE_INTERRUPT_DPC      *MINIPORT_MSI_INTERRUPT_DPC_HANDLER;
typedef MINIPORT_DISABLE_MESSAGE_INTERRUPT  *MINIPORT_DISABLE_MSI_INTERRUPT_HANDLER;
typedef MINIPORT_ENABLE_MESSAGE_INTERRUPT   *MINIPORT_ENABLE_MSI_INTERRUPT_HANDLER;
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;
#endif

/* NDIS interrupt types */
#if NDIS_SUPPORT_NDIS6
typedef enum _NDIS_INTERRUPT_TYPE {
    NDIS_CONNECT_LINE_BASED     = 1,
    NDIS_CONNECT_MESSAGE_BASED  = 2
} NDIS_INTERRUPT_TYPE;
typedef NDIS_INTERRUPT_TYPE *PNDIS_INTERRUPT_TYPE;
#endif

/* NDIS miniport interrupt characteristics */
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS {
    NDIS_OBJECT_HEADER                      Header;
    MINIPORT_ISR_HANDLER                    InterruptHandler;
    MINIPORT_INTERRUPT_DPC_HANDLER          InterruptDpcHandler;
    MINIPORT_DISABLE_INTERRUPT_HANDLER      DisableInterruptHandler;
    MINIPORT_ENABLE_INTERRUPT_HANDLER       EnableInterruptHandler;
    BOOLEAN                                 MsiSupported;
    BOOLEAN                                 MsiSyncWithAllMessages;
    MINIPORT_MSI_ISR_HANDLER                MessageInterruptHandler;
    MINIPORT_MSI_INTERRUPT_DPC_HANDLER      MessageInterruptDpcHandler;
    MINIPORT_DISABLE_MSI_INTERRUPT_HANDLER  DisableMessageInterruptHandler;
    MINIPORT_ENABLE_MSI_INTERRUPT_HANDLER   EnableMessageInterruptHandler;
    NDIS_INTERRUPT_TYPE                     InterruptType;
    PIO_INTERRUPT_MESSAGE_INFO              MessageInfoTable;
} NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS;
typedef NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS *PNDIS_MINIPORT_INTERRUPT_CHARACTERISTICS;
#endif

/* NDIS miniport Plug and Play characteristics callbacks */
#if NDIS_SUPPORT_NDIS6
typedef NDIS_STATUS (NTAPI MINIPORT_ADD_DEVICE)( NDIS_HANDLE, NDIS_HANDLE );
typedef VOID        (NTAPI MINIPORT_REMOVE_DEVICE)( NDIS_HANDLE );
typedef NDIS_STATUS (NTAPI MINIPORT_PNP_IRP)( NDIS_HANDLE, PIRP );
typedef MINIPORT_ADD_DEVICE     *MINIPORT_ADD_DEVICE_HANDLER;
typedef MINIPORT_REMOVE_DEVICE  *MINIPORT_REMOVE_DEVICE_HANDLER;
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;
#endif

/* NDIS miniport Plug and Play characteristics */
#if NDIS_SUPPORT_NDIS6
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;
typedef NDIS_MINIPORT_PNP_CHARACTERISTICS   *PNDIS_MINIPORT_PNP_CHARACTERISTICS;
#endif

/* NDIS 5.1 miniport characteristics */
#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
    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
#endif

/* NDIS miniport interrupt */
#if NDIS_LEGACY_MINIPORT
typedef struct _NDIS_MINIPORT_INTERRUPT {
    PKINTERRUPT                 InterruptObject;
    KSPIN_LOCK                  DpcCountLock;
    PVOID                       Reserved;
    W_ISR_HANDLER               MiniportIsr;
    W_HANDLE_INTERRUPT_HANDLER  MiniportDpc;
    KDPC                        InterruptDpc;
    struct _NDIS_MINIPORT_BLOCK *Miniport;
    UCHAR                       DpcCount;
    BOOLEAN                     Filler1;
    KEVENT                      DpcsCompletedEvent;
    BOOLEAN                     SharedInterrupt;
    BOOLEAN                     IsrRequested;
} NDIS_MINIPORT_INTERRUPT;
typedef NDIS_MINIPORT_INTERRUPT *PNDIS_MINIPORT_INTERRUPT;
#endif

/* NDIS miniport timer */
typedef struct _NDIS_MINIPORT_TIMER {
    KTIMER                      Timer;
    KDPC                        Dpc;
    PNDIS_TIMER_FUNCTION        MiniportTimerFunction;
    PVOID                       MiniportTimerContext;
    struct _NDIS_MINIPORT_BLOCK *Miniport;
    struct _NDIS_MINIPORT_TIMER *NextTimer;
} NDIS_MINIPORT_TIMER;
typedef NDIS_MINIPORT_TIMER *PNDIS_MINIPORT_TIMER;

/* NDIS miniport block callbacks */
#if NDIS_LEGACY_MINIPORT
typedef VOID        (NTAPI *ETH_RCV_INDICATE_HANDLER)( PETH_FILTER, NDIS_HANDLE, PCHAR, PVOID, UINT, PVOID, UINT, UINT );
typedef VOID        (NTAPI *ETH_RCV_COMPLETE_HANDLER)( PETH_FILTER );
typedef VOID        (NTAPI *TR_RCV_INDICATE_HANDLER)( PTR_FILTER, NDIS_HANDLE, PVOID, UINT, PVOID, UINT, UINT );
typedef VOID        (NTAPI *TR_RCV_COMPLETE_HANDLER)( PTR_FILTER );
typedef VOID        (NTAPI *WAN_RCV_HANDLER)( PNDIS_STATUS, NDIS_HANDLE, NDIS_HANDLE, PUCHAR, ULONG );
typedef VOID        (NTAPI *WAN_RCV_COMPLETE_HANDLER)( NDIS_HANDLE, NDIS_HANDLE );
typedef VOID        (NTAPI *NDIS_M_SEND_COMPLETE_HANDLER)( NDIS_HANDLE, PNDIS_PACKET, NDIS_STATUS );
typedef VOID        (NTAPI *NDIS_WM_SEND_COMPLETE_HANDLER)( NDIS_HANDLE, PVOID, NDIS_STATUS );
typedef VOID        (NTAPI *NDIS_M_TD_COMPLETE_HANDLER)( NDIS_HANDLE, PNDIS_PACKET, NDIS_STATUS, UINT );
typedef VOID        (NTAPI *NDIS_M_SEND_RESOURCES_HANDLER)( NDIS_HANDLE );
typedef VOID        (NTAPI *NDIS_M_STATUS_HANDLER)( NDIS_HANDLE, NDIS_STATUS, PVOID, UINT );
typedef VOID        (NTAPI *NDIS_M_STS_COMPLETE_HANDLER)( NDIS_HANDLE );
typedef VOID        (NTAPI *NDIS_M_REQ_COMPLETE_HANDLER)( NDIS_HANDLE, NDIS_STATUS );
typedef VOID        (NTAPI *NDIS_M_RESET_COMPLETE_HANDLER)( NDIS_HANDLE, NDIS_STATUS, BOOLEAN );
typedef BOOLEAN     (FASTCALL *NDIS_M_START_SENDS)( struct _NDIS_MINIPORT_BLOCK * );
#endif

/* Callbacks for NdisMRegisterScatterGatherDma() */
#if NDIS_SUPPORT_NDIS6
typedef VOID        (NTAPI MINIPORT_PROCESS_SG_LIST)( PDEVICE_OBJECT, PVOID, PSCATTER_GATHER_LIST, PVOID );
typedef VOID        (NTAPI MINIPORT_ALLOCATE_SHARED_MEM_COMPLETE)( NDIS_HANDLE, PVOID, PNDIS_PHYSICAL_ADDRESS, ULONG, PVOID );
typedef MINIPORT_PROCESS_SG_LIST                *MINIPORT_PROCESS_SG_LIST_HANDLER;
typedef MINIPORT_ALLOCATE_SHARED_MEM_COMPLETE   *MINIPORT_ALLOCATE_SHARED_MEM_COMPLETE_HANDLER;
#endif

/* NDIS DMA description */
typedef struct _NDIS_DMA_DESCRIPTION {
    BOOLEAN     DemandMode;
    BOOLEAN     AutoInitialize;
    BOOLEAN     DmaChannelSpecified;
    DMA_WIDTH   DmaWidth;
    DMA_SPEED   DmaSpeed;
    ULONG       DmaPort;
    ULONG       DmaChannel;
} NDIS_DMA_DESCRIPTION;
typedef NDIS_DMA_DESCRIPTION    *PNDIS_DMA_DESCRIPTION;

/* NDIS DMA block */
typedef struct _NDIS_DMA_BLOCK {
    PVOID   MapRegisterBase;
    KEVENT  AllocationEvent;
    PVOID   SystemAdapterObject;
    PVOID   Miniport;
    BOOLEAN InProgress;
} NDIS_DMA_BLOCK;
typedef NDIS_DMA_BLOCK  *PNDIS_DMA_BLOCK;

/* NDIS scatter/gather DMA description */
#if NDIS_SUPPORT_NDIS6
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;
typedef NDIS_SG_DMA_DESCRIPTION *PNDIS_SG_DMA_DESCRIPTION;
#endif

/* NDIS miniport initialization parameters */
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_MINIPORT_INIT_PARAMETERS {
    NDIS_OBJECT_HEADER                      Header;
    ULONG                                   Flags;
    PNDIS_RESOURCE_LIST                     AllocatedResources;
    NDIS_HANDLE                             IMDeviceInstanceContext;
    NDIS_HANDLE                             MiniportAddDeviceContext;
    NET_IFINDEX                             IfIndex;
    NET_LUID                                NetLuid;
    PNDIS_PORT_AUTHENTICATION_PARAMETERS    DefaultPortAuthStates;
    PNDIS_PCI_DEVICE_CUSTOM_PROPERTIES      PciDeviceCustomProperties;
} NDIS_MINIPORT_INIT_PARAMETERS;
typedef NDIS_MINIPORT_INIT_PARAMETERS   *PNDIS_MINIPORT_INIT_PARAMETERS;
#endif

/* NDIS miniport restart parameters */
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_MINIPORT_RESTART_PARAMETERS {
    NDIS_OBJECT_HEADER          Header;
    PNDIS_RESTART_ATTRIBUTES    RestartAttributes;
    ULONG                       Flags;
} NDIS_MINIPORT_RESTART_PARAMETERS;
typedef NDIS_MINIPORT_RESTART_PARAMETERS    *PNDIS_MINIPORT_RESTART_PARAMETERS;
#endif

/* NDIS miniport adapter registration attributes */
#if NDIS_SUPPORT_NDIS6
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;
typedef NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES   *PNDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES;
#endif

/* NDIS miniport add device registration attributes */
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES {
    NDIS_OBJECT_HEADER  Header;
    NDIS_HANDLE         MiniportAddDeviceContext;
    ULONG               Flags;
} NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES;
typedef NDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES    *PNDIS_MINIPORT_ADD_DEVICE_REGISTRATION_ATTRIBUTES;
#endif

/* NDIS miniport adapter general attributes */
#if NDIS_SUPPORT_NDIS6
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;
    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_DIRECTION_TYPE       DirectionType;
    NET_IF_CONNECTION_TYPE      ConnectionType;
    NET_IFTYPE                  IfType;
    BOOLEAN                     IfConnectorPresent;
    ULONG                       SupportedStatistics;
    ULONG                       SupportedPauseFunctions;
    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;
typedef NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES    *PNDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES;
#endif

/* NDIS header/data split attributes */
#if NDIS_SUPPORT_NDIS61
typedef struct _NDIS_HD_SPLIT_ATTRIBUTES {
    NDIS_OBJECT_HEADER  Header;
    ULONG               HardwareCapabilities;
    ULONG               CurrentCapabilities;
    ULONG               HDSplitFlags;
    ULONG               BackfillSize;
    ULONG               MaxHeaderSize;
} NDIS_HD_SPLIT_ATTRIBUTES;
typedef NDIS_HD_SPLIT_ATTRIBUTES    *PNDIS_HD_SPLIT_ATTRIBUTES;
#endif

/* NDIS miniport adapter hardware assist attributes */
#if NDIS_SUPPORT_NDIS61
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;
typedef NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES    *PNDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES;
#endif

/* NDIS miniport adapter offload attributes */
#if NDIS_SUPPORT_NDIS6
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;
typedef NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES    *PNDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES;
#endif

/* NDIS miniport adapter native 802.11 attributes */
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_MINIPORT_ADAPTER_NATIVE_802_11_ATTRIBUTES {
    NDIS_OBJECT_HEADER          Header;
    ULONG                       OpModeCapability;
    ULONG                       NumOfTXBuffers;
    ULONG                       NumOfRXBuffers;
    BOOLEAN                     MultiDomainCapabilityImplemented;
    ULONG                       NumSupportedPhys;
    PDOT11_PHY_ATTRIBUTES       SupportedPhyAttributes;
    PDOT11_EXTSTA_ATTRIBUTES    ExtSTAAttributes;
#if NDIS_SUPPORT_NDIS620
    PDOT11_VWIFI_ATTRIBUTES     VWiFiAttributes;
    PDOT11_EXTAP_ATTRIBUTES     ExtAPAttributes;
#endif
} NDIS_MINIPORT_ADAPTER_NATIVE_802_11_ATTRIBUTES;
typedef NDIS_MINIPORT_ADAPTER_NATIVE_802_11_ATTRIBUTES  *PNDIS_MINIPORT_ADAPTER_NATIVE_802_11_ATTRIBUTES;
#endif

/* NDIS miniport adapter attributes */
#if NDIS_SUPPORT_NDIS6
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_MINIPORT_ADAPTER_ATTRIBUTES;
typedef NDIS_MINIPORT_ADAPTER_ATTRIBUTES    *PNDIS_MINIPORT_ADAPTER_ATTRIBUTES;
#endif

/* NDIS halt actions */
#if NDIS_SUPPORT_NDIS6
typedef enum _NDIS_HALT_ACTION {
    NdisHaltDeviceDisabled              = 0,
    NdisHaltDeviceInstanceDeInitialized = 1,
    NdisHaltDevicePoweredDown           = 2,
    NdisHaltDeviceSurpriseRemoved       = 3,
    NdisHaltDeviceFailed                = 4,
    NdisHaltDeviceInitializationFailed  = 5,
    NdisHaltDeviceStopped               = 6
} NDIS_HALT_ACTION;
typedef NDIS_HALT_ACTION    *PNDIS_HALT_ACTION;
#endif

/* NDIS miniport pause parameters */
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_MINIPORT_PAUSE_PARAMETERS {
    NDIS_OBJECT_HEADER  Header;
    ULONG               Flags;
    ULONG               PauseReason;
} NDIS_MINIPORT_PAUSE_PARAMETERS;
typedef NDIS_MINIPORT_PAUSE_PARAMETERS  *PNDIS_MINIPORT_PAUSE_PARAMETERS;
#endif

/* NDIS shutdown actions */
#if NDIS_SUPPORT_NDIS6
typedef enum _NDIS_SHUTDOWN_ACTION {
    NdisShutdownPowerOff    = 0,
    NdisShutdownBugCheck    = 1
} NDIS_SHUTDOWN_ACTION;
typedef NDIS_SHUTDOWN_ACTION    *PNDIS_SHUTDOWN_ACTION;
#endif

/* Network device Plug and Play event */
#if NDIS_SUPPORT_NDIS6
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;
typedef NET_DEVICE_PNP_EVENT    *PNET_DEVICE_PNP_EVENT;
#endif

/* Miniport handlers */
#if NDIS_SUPPORT_NDIS6
typedef NDIS_STATUS (NTAPI MINIPORT_INITIALIZE)( NDIS_HANDLE, NDIS_HANDLE, PNDIS_MINIPORT_INIT_PARAMETERS );
typedef VOID        (NTAPI MINIPORT_HALT)( NDIS_HANDLE, NDIS_HALT_ACTION );
typedef NDIS_STATUS (NTAPI MINIPORT_PAUSE)( NDIS_HANDLE, PNDIS_MINIPORT_PAUSE_PARAMETERS );
typedef NDIS_STATUS (NTAPI MINIPORT_RESTART)( NDIS_HANDLE, PNDIS_MINIPORT_RESTART_PARAMETERS );
typedef NDIS_STATUS (NTAPI MINIPORT_OID_REQUEST)( NDIS_HANDLE, PNDIS_OID_REQUEST );
typedef VOID        (NTAPI MINIPORT_UNLOAD)( PDRIVER_OBJECT );
typedef VOID        (NTAPI MINIPORT_SHUTDOWN)( NDIS_HANDLE, NDIS_SHUTDOWN_ACTION );
typedef VOID        (NTAPI MINIPORT_DEVICE_PNP_EVENT_NOTIFY)( NDIS_HANDLE, PNET_DEVICE_PNP_EVENT );
typedef VOID        (NTAPI MINIPORT_CANCEL_SEND)( NDIS_HANDLE, PVOID );
typedef BOOLEAN     (NTAPI MINIPORT_CHECK_FOR_HANG)( NDIS_HANDLE );
typedef NDIS_STATUS (NTAPI MINIPORT_RESET)( NDIS_HANDLE, PBOOLEAN );
typedef VOID        (NTAPI MINIPORT_CANCEL_OID_REQUEST)( NDIS_HANDLE, PVOID );
typedef VOID        (NTAPI MINIPORT_SEND_NET_BUFFER_LISTS)( NDIS_HANDLE, PNET_BUFFER_LIST, NDIS_PORT_NUMBER, ULONG );
typedef VOID        (NTAPI MINIPORT_RETURN_NET_BUFFER_LISTS)( NDIS_HANDLE, PNET_BUFFER_LIST, ULONG );
typedef MINIPORT_INITIALIZE                 *MINIPORT_INITIALIZE_HANDLER;
typedef MINIPORT_HALT                       *MINIPORT_HALT_HANDLER;
typedef MINIPORT_PAUSE                      *MINIPORT_PAUSE_HANDLER;
typedef MINIPORT_RESTART                    *MINIPORT_RESTART_HANDLER;
typedef MINIPORT_OID_REQUEST                *MINIPORT_OID_REQUEST_HANDLER;
typedef MINIPORT_UNLOAD                     *MINIPORT_DRIVER_UNLOAD;
typedef MINIPORT_SHUTDOWN                   *MINIPORT_SHUTDOWN_HANDLER;
typedef MINIPORT_DEVICE_PNP_EVENT_NOTIFY    *MINIPORT_DEVICE_PNP_EVENT_NOTIFY_HANDLER;
typedef MINIPORT_CANCEL_SEND                *MINIPORT_CANCEL_SEND_HANDLER;
typedef MINIPORT_CHECK_FOR_HANG             *MINIPORT_CHECK_FOR_HANG_HANDLER;
typedef MINIPORT_RESET                      *MINIPORT_RESET_HANDLER;
typedef MINIPORT_CANCEL_OID_REQUEST         *MINIPORT_CANCEL_OID_REQUEST_HANDLER;
typedef MINIPORT_SEND_NET_BUFFER_LISTS      *MINIPORT_SEND_NET_BUFFER_LISTS_HANDLER;
typedef MINIPORT_RETURN_NET_BUFFER_LISTS    *MINIPORT_RETURN_NET_BUFFER_LISTS_HANDLER;
#endif
#if NDIS_SUPPORT_NDIS61
typedef NDIS_STATUS (NTAPI MINIPORT_DIRECT_OID_REQUEST)( NDIS_HANDLE, PNDIS_OID_REQUEST );
typedef VOID        (NTAPI MINIPORT_CANCEL_DIRECT_OID_REQUEST)( NDIS_HANDLE, PVOID );
typedef MINIPORT_DIRECT_OID_REQUEST         *MINIPORT_DIRECT_OID_REQUEST_HANDLER;
typedef MINIPORT_CANCEL_DIRECT_OID_REQUEST  *MINIPORT_CANCEL_DIRECT_OID_REQUEST_HANDLER;
#endif

/* NDIS miniport driver characteristics */
#if NDIS_SUPPORT_NDIS6
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_MINIPORT_DRIVER_CHARACTERISTICS;
typedef NDIS_MINIPORT_DRIVER_CHARACTERISTICS    *PNDIS_MINIPORT_DRIVER_CHARACTERISTICS;
#endif

/* NDIS miniport CO characteristics */
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_MINIPORT_CO_CHARACTERISTICS {
    NDIS_OBJECT_HEADER                  Header;
    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;
typedef NDIS_MINIPORT_CO_CHARACTERISTICS    *PNDIS_MINIPORT_CO_CHARACTERISTICS;
#endif

/* FilterDBS */
typedef struct {
    union {
        PETH_FILTER     EthDB;
        PNULL_FILTER    NullDB;
    };
    PTR_FILTER  TrDB;
    PVOID       YYYDB;
    PVOID       XXXDB;
} FILTERDBS;
typedef FILTERDBS   *PFILTERDBS;

/* Filter packet indication handler */
#if NDIS_LEGACY_MINIPORT
typedef VOID        (NTAPI *FILTER_PACKET_INDICATION_HANDLER)( NDIS_HANDLE, PPNDIS_PACKET, UINT );
#endif

/* NDIS miniport block */
#if !NDIS_WRAPPER && NDIS_LEGACY_MINIPORT
typedef struct _NDIS_MINIPORT_BLOCK {
    NDIS_OBJECT_HEADER                  Header;
    struct _NDIS_MINIPORT_BLOCK         *NextMiniport;
    struct _NDIS_MINIPORT_BLOCK         *BaseMiniport;
    NDIS_HANDLE                         MiniportAdapterContext;
    UNICODE_STRING                      Reserved4;
    PVOID                               Reserved10;
    NDIS_HANDLE                         OpenQueue;
    REFERENCE                           ShortRef;
    NDIS_HANDLE                         Reserved12;
    UCHAR                               Padding1;
    UCHAR                               LockAcquired;
    UCHAR                               PmodeOpens;
    UCHAR                               Reserved23;
    KSPIN_LOCK                          Lock;
    PNDIS_REQUEST                       MediaRequest;
    PVOID                               Interrupt;
    ULONG                               Flags;
    ULONG                               PnPFlags;
    LIST_ENTRY                          PacketList;
    PNDIS_PACKET                        FirstPendingPacket;
    PNDIS_PACKET                        ReturnPacketsQueue;
    ULONG                               RequestBuffer;
    PVOID                               SetMCastBuffer;
    struct _NDIS_MINIPORT_BLOCK         *PrimaryMiniport;
    PVOID                               Reserved11;
    PVOID                               BusDataContext;
    ULONG                               Reserved3;
    PCM_RESOURCE_LIST                   Resources;
    NDIS_TIMER                          WakeUpDpcTimer;
    UNICODE_STRING                      Reserved20;
    UNICODE_STRING                      SymbolicLinkName;
    ULONG                               CheckForHandSeconds;
    USHORT                              CFHangTicks;
    USHORT                              CFHangCurrentTick;
    NDIS_STATUS                         ResetStatus;
    NDIS_HANDLE                         ResetOpen;
#ifdef __cplusplus
    FILTERDBS                           FilterDbs;
#else
    FILTERDBS;
#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;
    ULONG                               BusNumber;
    NDIS_INTERFACE_TYPE                 BusType;
    NDIS_INTERFACE_TYPE                 AdapterType;
    PDEVICE_OBJECT                      Reserved6;
    PDEVICE_OBJECT                      Reserved7;
    PDEVICE_OBJECT                      Reserved8;
    PVOID                               MiniportSGDmaBlock;
    PNDIS_AF_LIST                       CallMgrAfList;
    PVOID                               MiniportThread;
    PVOID                               SetInfoBuf;
    USHORT                              SetInfoBufLen;
    USHORT                              MaxSendPackets;
    NDIS_STATUS                         FakeStatus;
    PVOID                               Reserved24;
    PUNICODE_STRING                     Reserved9;
    PVOID                               Reserved21;
    UINT                                MacOptions;
    PNDIS_REQUEST                       PendingRequest;
    UINT                                MaximumLongAddresses;
    UINT                                MaximumShortAddresses;
    UINT                                CurrentLookahead;
    UINT                                MaximumLookahead;
    ULONG_PTR                           Reserved1;
    W_DISABLE_INTERRUPT_HANDLER         DisableInterruptHandler;
    W_ENABLE_INTERRUPT_HANDLER          EnableInterruptHandler;
    W_SEND_PACKETS_HANDLER              SendPacketsHandler;
    NDIS_M_START_SENDS                  DeferredSendHandler;
    ETH_RCV_INDICATE_HANDLER            EthRxIndicateHandler;
    TR_RCV_INDICATE_HANDLER             TrRxIndicateHandler;
    PVOID                               Reserved2;
    ETH_RCV_COMPLETE_HANDLER            EthRxCompleteHandler;
    TR_RCV_COMPLETE_HANDLER             TrRxCompleteHandler;
    PVOID                               Reserved22;
    NDIS_M_STATUS_HANDLER               StatusHandler;
    NDIS_M_STS_COMPLETE_HANDLER         StatusCompleteHandler;
    NDIS_M_TD_COMPLETE_HANDLER          TDCompleteHandler;
    NDIS_M_REQ_COMPLETE_HANDLER         QueryCompleteHandler;
    NDIS_M_REQ_COMPLETE_HANDLER         SetCompleteHandler;
    NDIS_WM_SEND_COMPLETE_HANDLER       WanSendCompleteHandler;
    WAN_RCV_HANDLER                     WanRcvHandler;
    WAN_RCV_COMPLETE_HANDLER            WanRcvCompleteHandler;
} NDIS_MINIPORT_BLOCK;
#else
typedef struct _NDIS_MINIPORT_BLOCK NDIS_MINIPORT_BLOCK;
#endif
typedef NDIS_MINIPORT_BLOCK         *PNDIS_MINIPORT_BLOCK;

/* NDIS miniport characteristics */
#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_WAN_MINIPORT_CHARACTERISTICS;
#endif

/* NDIS I/O work item routine */
#if NDIS_SUPPORT_NDIS6
typedef VOID        (NTAPI NDIS_IO_WORKITEM_FUNCTION)( PVOID, NDIS_HANDLE );
typedef NDIS_IO_WORKITEM_FUNCTION   *NDIS_IO_WORKITEM_ROUTINE;
#endif

/* NDIS MSIX table configuration operations */
#if NDIS_SUPPORT_NDIS61
typedef enum _NDIS_MSIX_TABLE_CONFIG {
    NdisMSIXTableConfigSetTableEntry    = 0,
    NdisMSIXTableConfigMaskTableEntry   = 1,
    NdisMSIXTableConfigUnmaskTableEntry = 2,
    NdisMSIXTableConfigMax              = 3
} NDIS_MSIX_TABLE_OPERATION;
typedef NDIS_MSIX_TABLE_OPERATION   *PNDIS_MSIX_TABLE_OPERATION;
#endif

/* NDIS MSIX configuration parameters */
#if NDIS_SUPPORT_NDIS61
typedef struct _NDIS_MSIX_CONFIG_PARAMETERS {
    NDIS_OBJECT_HEADER          Header;
    NDIS_MSIX_TABLE_OPERATION   ConfigOperation;
    ULONG                       TableEntry;
    ULONG                       MessageNumber;
} NDIS_MSIX_CONFIG_PARAMETERS;
typedef NDIS_MSIX_CONFIG_PARAMETERS *PNDIS_MSIX_CONFIG_PARAMETERS;
#endif

/* Client handlers */
typedef VOID        (NTAPI PROTOCOL_CL_OPEN_AF_COMPLETE)( NDIS_STATUS, NDIS_HANDLE, NDIS_HANDLE );
typedef VOID        (NTAPI PROTOCOL_CL_CLOSE_AF_COMPLETE)( NDIS_STATUS, NDIS_HANDLE );
typedef VOID        (NTAPI PROTOCOL_CL_REGISTER_SAP_COMPLETE)( NDIS_STATUS, NDIS_HANDLE, PCO_SAP, NDIS_HANDLE );
typedef VOID        (NTAPI PROTOCOL_CL_DEREGISTER_SAP_COMPLETE)( NDIS_STATUS, NDIS_HANDLE );
typedef VOID        (NTAPI PROTOCOL_CL_MAKE_CALL_COMPLETE)( NDIS_STATUS, NDIS_HANDLE, NDIS_HANDLE, PCO_CALL_PARAMETERS );
typedef VOID        (NTAPI PROTOCOL_CL_CLOSE_CALL_COMPLETE)( NDIS_STATUS, NDIS_HANDLE, NDIS_HANDLE );
typedef VOID        (NTAPI PROTOCOL_CL_ADD_PARTY_COMPLETE)( NDIS_STATUS, NDIS_HANDLE, NDIS_HANDLE, PCO_CALL_PARAMETERS );
typedef VOID        (NTAPI PROTOCOL_CL_DROP_PARTY_COMPLETE)( NDIS_STATUS, NDIS_HANDLE );
typedef NDIS_STATUS (NTAPI PROTOCOL_CL_INCOMING_CALL)( NDIS_STATUS, NDIS_STATUS, PCO_CALL_PARAMETERS );
typedef VOID        (NTAPI PROTOCOL_CL_CALL_CONNECTED)( NDIS_HANDLE );
typedef VOID        (NTAPI PROTOCOL_CL_INCOMING_CLOSE_CALL)( NDIS_STATUS, NDIS_HANDLE, PVOID, UINT );
typedef VOID        (NTAPI PROTOCOL_CL_INCOMING_DROP_PARTY)( NDIS_STATUS, NDIS_HANDLE, PVOID, UINT );
typedef VOID        (NTAPI PROTOCOL_CL_MODIFY_CALL_QOS_COMPLETE)( NDIS_STATUS, NDIS_HANDLE, PCO_CALL_PARAMETERS );
typedef VOID        (NTAPI PROTOCOL_CL_INCOMING_CALL_QOS_CHANGE)( NDIS_HANDLE, PCO_CALL_PARAMETERS );
typedef PROTOCOL_CL_OPEN_AF_COMPLETE            *CL_OPEN_AF_COMPLETE_HANDLER;
typedef PROTOCOL_CL_CLOSE_AF_COMPLETE           *CL_CLOSE_AF_COMPLETE_HANDLER;
typedef PROTOCOL_CL_REGISTER_SAP_COMPLETE       *CL_REG_SAP_COMPLETE_HANDLER;
typedef PROTOCOL_CL_DEREGISTER_SAP_COMPLETE     *CL_DEREG_SAP_COMPLETE_HANDLER;
typedef PROTOCOL_CL_MAKE_CALL_COMPLETE          *CL_MAKE_CALL_COMPLETE_HANDLER;
typedef PROTOCOL_CL_CLOSE_CALL_COMPLETE         *CL_CLOSE_CALL_COMPLETE_HANDLER;
typedef PROTOCOL_CL_ADD_PARTY_COMPLETE          *CL_ADD_PARTY_COMPLETE_HANDLER;
typedef PROTOCOL_CL_DROP_PARTY_COMPLETE         *CL_DROP_PARTY_COMPLETE_HANDLER;
typedef PROTOCOL_CL_INCOMING_CALL               *CL_INCOMING_CALL_HANDLER;
typedef PROTOCOL_CL_CALL_CONNECTED              *CL_CALL_CONNECTED_HANDLER;
typedef PROTOCOL_CL_INCOMING_CLOSE_CALL         *CL_INCOMING_CLOSE_CALL_HANDLER;
typedef PROTOCOL_CL_INCOMING_DROP_PARTY         *CL_INCOMING_DROP_PARTY_HANDLER;
typedef PROTOCOL_CL_MODIFY_CALL_QOS_COMPLETE    *CL_MODIFY_CALL_QOS_COMPLETE_HANDLER;
typedef PROTOCOL_CL_INCOMING_CALL_QOS_CHANGE    *CL_INCOMING_CALL_QOS_CHANGE_HANDLER;

/* NDIS client characteristics */
#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;
typedef NDIS_CLIENT_CHARACTERISTICS *PNDIS_CLIENT_CHARACTERISTICS;
#endif

/* Call manager handlers */
typedef NDIS_STATUS (NTAPI PROTOCOL_CM_OPEN_AF)( NDIS_HANDLE, PCO_ADDRESS_FAMILY, NDIS_HANDLE, PNDIS_HANDLE );
typedef NDIS_STATUS (NTAPI PROTOCOL_CM_CLOSE_AF)( NDIS_HANDLE );
typedef NDIS_STATUS (NTAPI PROTOCOL_CM_REG_SAP)( NDIS_HANDLE, PCO_SAP, NDIS_HANDLE, PNDIS_HANDLE );
typedef NDIS_STATUS (NTAPI PROTOCOL_CM_DEREGISTER_SAP)( NDIS_HANDLE );
typedef NDIS_STATUS (NTAPI PROTOCOL_CM_MAKE_CALL)( NDIS_HANDLE, PCO_CALL_PARAMETERS, NDIS_HANDLE, PNDIS_HANDLE );
typedef NDIS_STATUS (NTAPI PROTOCOL_CM_CLOSE_CALL)( NDIS_HANDLE, NDIS_HANDLE, PVOID, UINT );
typedef NDIS_STATUS (NTAPI PROTOCOL_CM_MODIFY_QOS_CALL)( NDIS_HANDLE, PCO_CALL_PARAMETERS );
typedef VOID        (NTAPI PROTOCOL_CM_INCOMING_CALL_COMPLETE)( NDIS_STATUS, NDIS_HANDLE, PCO_CALL_PARAMETERS );
typedef VOID        (NTAPI PROTOCOL_CM_ACTIVATE_VC_COMPLETE)( NDIS_STATUS, NDIS_HANDLE, PCO_CALL_PARAMETERS );
typedef VOID        (NTAPI PROTOCOL_CM_DEACTIVATE_VC_COMPLETE)( NDIS_STATUS, NDIS_HANDLE );
typedef NDIS_STATUS (NTAPI PROTOCOL_CM_ADD_PARTY)( NDIS_HANDLE, PCO_CALL_PARAMETERS, NDIS_HANDLE, PNDIS_HANDLE );
typedef NDIS_STATUS (NTAPI PROTOCOL_CM_DROP_PARTY)( NDIS_HANDLE, PVOID, UINT );
typedef PROTOCOL_CM_OPEN_AF                 *CM_OPEN_AF_HANDLER;
typedef PROTOCOL_CM_CLOSE_AF                *CM_CLOSE_AF_HANDLER;
typedef PROTOCOL_CM_REG_SAP                 *CM_REG_SAP_HANDLER;
typedef PROTOCOL_CM_DEREGISTER_SAP          *CM_DEREG_SAP_HANDLER;
typedef PROTOCOL_CM_MAKE_CALL               *CM_MAKE_CALL_HANDLER;
typedef PROTOCOL_CM_CLOSE_CALL              *CM_CLOSE_CALL_HANDLER;
typedef PROTOCOL_CM_MODIFY_QOS_CALL         *CM_MODIFY_CALL_QOS_HANDLER;
typedef PROTOCOL_CM_INCOMING_CALL_COMPLETE  *CM_INCOMING_CALL_COMPLETE_HANDLER;
typedef PROTOCOL_CM_ACTIVATE_VC_COMPLETE    *CM_ACTIVATE_VC_COMPLETE_HANDLER;
typedef PROTOCOL_CM_DEACTIVATE_VC_COMPLETE  *CM_DEACTIVATE_VC_COMPLETE_HANDLER;
typedef PROTOCOL_CM_ADD_PARTY               *CM_ADD_PARTY_HANDLER;
typedef PROTOCOL_CM_DROP_PARTY              *CM_DROP_PARTY_HANDLER;

/* NDIS call manager characteristics */
#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;
typedef NDIS_CALL_MANAGER_CHARACTERISTICS   *PNDIS_CALL_MANAGER_CHARACTERISTICS;
#endif

/* CO address */
typedef struct _CO_ADDRESS {
    ULONG   AddressSize;
    UCHAR   Address[1];
} CO_ADDRESS;
typedef CO_ADDRESS  *PCO_ADDRESS;

/* CO address list */
typedef struct _CO_ADDRESS_LIST {
    ULONG       NumberOfAddressesAvailable;
    ULONG       NumberOfAddresses;
    CO_ADDRESS  AddressList;
} CO_ADDRESS_LIST;
typedef CO_ADDRESS_LIST *PCO_ADDRESS_LIST;

/* CO specific parameters */
typedef struct _CO_SPECIFIC_PARAMETERS {
    ULONG   ParamType;
    ULONG   Length;
    UCHAR   Parameters[1];
} CO_SPECIFIC_PARAMETERS;
typedef CO_SPECIFIC_PARAMETERS  *PCO_SPECIFIC_PARAMETERS;

/* CO call manager parameters */
typedef struct _CO_CALL_MANAGER_PARAMETERS {
    FLOWSPEC                Transmit;
    FLOWSPEC                Receive;
    CO_SPECIFIC_PARAMETERS  CallMgrSpecific;
} CO_CALL_MANAGER_PARAMETERS;
typedef CO_CALL_MANAGER_PARAMETERS  *PCO_CALL_MANAGER_PARAMETERS;

/* CO media parameters */
typedef struct _CO_MEDIA_PARAMETERS {
    ULONG                   Flags;
    ULONG                   ReceivePriority;
    ULONG                   ReceiveSizeHint;
    CO_SPECIFIC_PARAMETERS  MediaSpecific;
} CO_MEDIA_PARAMETERS;
typedef CO_MEDIA_PARAMETERS *PCO_MEDIA_PARAMETERS;

/* CO call parameters */
typedef struct _CO_CALL_PARAMETERS {
    ULONG                       Flags;
    PCO_CALL_MANAGER_PARAMETERS CallMgrParameters;
    PCO_MEDIA_PARAMETERS        MediaParameters;
} CO_CALL_PARAMETERS;
typedef CO_CALL_PARAMETERS  *PCO_CALL_PARAMETERS;

/* CO PVC */
typedef struct _CO_PVC {
    NDIS_HANDLE             NdisAfHandle;
    CO_SPECIFIC_PARAMETERS  PvcParameters;
} CO_PVC;
typedef CO_PVC  *PCO_PVC;

/* Variable string */
#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;
typedef VAR_STRING  *PVAR_STRING;
#endif

/* NDIS CO client optional handlers */
#if NDIS_SUPPORT_NDIS6
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;
typedef NDIS_CO_CLIENT_OPTIONAL_HANDLERS    *PNDIS_CO_CLIENT_OPTIONAL_HANDLERS;
#endif

/* NDIS CO call manager optional handlers */
#if NDIS_SUPPORT_NDIS6
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;
typedef NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS  *PNDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS;
#endif

/* NDIS filter attach parameters */
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_FILTER_ATTACH_PARAMETERS {
    NDIS_OBJECT_HEADER                  Header;
    NET_IFINDEX                         IfIndex;
    NET_LUID                            NetLuid;
    PNDIS_STRING                        FilterModuleGuidName;
    NET_IFINDEX                         BaseMiniportIfIndex;
    PNDIS_STRING                        BaseMiniportInstanceName;
    PNDIS_STRING                        BaseMiniportName;
    NDIS_MEDIA_CONNECT_STATE            MediaConnectState;
    NET_IF_MEDIA_DUPLEX_STATE           MediaDuplexState;
    ULONG64                             XmitLinkSpeed;
    ULONG64                             RcvLinkSpeed;
    NDIS_MEDIUM                         MiniportMediumType;
    NDIS_PHYSICAL_MEDIUM                MiniportPhysicalMediaType;
    NDIS_HANDLE                         MiniportMediaSpecificAttributes;
    PNDIS_OFFLOAD                       DefaultOffloadConfiguration;
    USHORT                              MacAddressLength;
    UCHAR                               CurrentMacAddress[NDIS_MAX_PHYS_ADDRESS_LENGTH];
    NET_LUID                            BaseMiniportNetLuid;
    NET_IFINDEX                         LowerIfIndex;
    NET_LUID                            LowerIfNetLuid;
    ULONG                               Flags;
#if NDIS_SUPPORT_NDIS61
    PNDIS_HD_SPLIT_CURRENT_CONFIG       HDSplitCurrentConfig;
#endif
#if NDIS_SUPPORT_NDIS620
    PNDIS_RECEIVE_FILTER_CAPABILITIES   ReceiveFilterCapabilities;
    PDEVICE_OBJECT                      MiniportPhysicalDeviceObject;
    PNDIS_NIC_SWITCH_CAPABILITIES       NicSwitchCapabilities;
#endif
} NDIS_FILTER_ATTACH_PARAMETERS;
typedef NDIS_FILTER_ATTACH_PARAMETERS   *PNDIS_FILTER_ATTACH_PARAMETERS;
#endif

/* NDIS filter restart parameters */
#if NDIS_SUPPORT_NDIS6
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;
typedef NDIS_FILTER_RESTART_PARAMETERS  *PNDIS_FILTER_RESTART_PARAMETERS;
#endif

/* NDIS filter pause parameters */
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_FILTER_PAUSE_PARAMETERS {
    NDIS_OBJECT_HEADER  Header;
    ULONG               Flags;
    ULONG               PauseReason;
} NDIS_FILTER_PAUSE_PARAMETERS;
typedef NDIS_FILTER_PAUSE_PARAMETERS    *PNDIS_FILTER_PAUSE_PARAMETERS;
#endif

/* Filter handlers */
#if NDIS_SUPPORT_NDIS6
typedef NDIS_STATUS (NTAPI FILTER_ATTACH)( NDIS_HANDLE, NDIS_HANDLE, PNDIS_FILTER_ATTACH_PARAMETERS );
typedef VOID        (NTAPI FILTER_DETACH)( NDIS_HANDLE );
typedef NDIS_STATUS (NTAPI FILTER_SET_FILTER_MODULE_OPTIONS)( NDIS_HANDLE );
typedef NDIS_STATUS (NTAPI FILTER_RESTART)( NDIS_HANDLE, PNDIS_FILTER_RESTART_PARAMETERS );
typedef NDIS_STATUS (NTAPI FILTER_PAUSE)( NDIS_HANDLE, PNDIS_FILTER_PAUSE_PARAMETERS );
typedef NDIS_STATUS (NTAPI FILTER_OID_REQUEST)( NDIS_HANDLE, PNDIS_OID_REQUEST );
typedef VOID        (NTAPI FILTER_CANCEL_OID_REQUEST)( NDIS_HANDLE, PVOID );
typedef VOID        (NTAPI FILTER_SEND_NET_BUFFER_LISTS)( NDIS_HANDLE, PNET_BUFFER_LIST, NDIS_PORT_NUMBER, ULONG );
typedef VOID        (NTAPI FILTER_CANCEL_SEND_NET_BUFFER_LISTS)( NDIS_HANDLE, PVOID );
typedef VOID        (NTAPI FILTER_RETURN_NET_BUFFER_LISTS)( NDIS_HANDLE, PNET_BUFFER_LIST, ULONG );
typedef VOID        (NTAPI FILTER_SEND_NET_BUFFER_LISTS_COMPLETE)( NDIS_HANDLE, PNET_BUFFER_LIST, ULONG );
typedef VOID        (NTAPI FILTER_RECEIVE_NET_BUFFER_LISTS)( NDIS_HANDLE, PNET_BUFFER_LIST, NDIS_PORT_NUMBER, ULONG, ULONG );
typedef VOID        (NTAPI FILTER_DEVICE_PNP_EVENT_NOTIFY)( NDIS_HANDLE, PNET_DEVICE_PNP_EVENT );
typedef NDIS_STATUS (NTAPI FILTER_NET_PNP_EVENT)( NDIS_HANDLE, PNET_PNP_EVENT_NOTIFICATION );
typedef VOID        (NTAPI FILTER_STATUS)( NDIS_HANDLE, PNDIS_STATUS_INDICATION );
typedef VOID        (NTAPI FILTER_OID_REQUEST_COMPLETE)( NDIS_HANDLE, PNDIS_OID_REQUEST, NDIS_STATUS );
typedef FILTER_ATTACH                       *FILTER_ATTACH_HANDLER;
typedef FILTER_DETACH                       *FILTER_DETACH_HANDLER;
typedef FILTER_SET_FILTER_MODULE_OPTIONS    *FILTER_SET_FILTER_MODULE_OPTIONS_HANDLER;
typedef FILTER_RESTART                      *FILTER_RESTART_HANDLER;
typedef FILTER_PAUSE                        *FILTER_PAUSE_HANDLER;
typedef FILTER_OID_REQUEST                  *FILTER_OID_REQUEST_HANDLER;
typedef FILTER_CANCEL_OID_REQUEST           *FILTER_CANCEL_OID_REQUEST_HANDLER;
typedef FILTER_SEND_NET_BUFFER_LISTS        *FILTER_SEND_NET_BUFFER_LISTS_HANDLER;
typedef FILTER_CANCEL_SEND_NET_BUFFER_LISTS *FILTER_CANCEL_SEND_HANDLER;
typedef FILTER_RETURN_NET_BUFFER_LISTS      *FILTER_RETURN_NET_BUFFER_LISTS_HANDLER;
typedef FILTER_SEND_NET_BUFFER_LISTS_COMPLETE   *FILTER_SEND_NET_BUFFER_LISTS_COMPLETE_HANDLER;
typedef FILTER_RECEIVE_NET_BUFFER_LISTS     *FILTER_RECEIVE_NET_BUFFER_LISTS_HANDLER;
typedef FILTER_DEVICE_PNP_EVENT_NOTIFY      *FILTER_DEVICE_PNP_EVENT_NOTIFY_HANDLER;
typedef FILTER_NET_PNP_EVENT                *FILTER_NET_PNP_EVENT_HANDLER;
typedef FILTER_STATUS                       *FILTER_STATUS_HANDLER;
typedef FILTER_OID_REQUEST_COMPLETE         *FILTER_OID_REQUEST_COMPLETE_HANDLER;
#endif
#if NDIS_SUPPORT_NDIS61
typedef NDIS_STATUS (NTAPI FILTER_DIRECT_OID_REQUEST)( NDIS_HANDLE, PNDIS_OID_REQUEST );
typedef VOID        (NTAPI FILTER_DIRECT_OID_REQUEST_COMPLETE)( NDIS_HANDLE, PNDIS_OID_REQUEST, NDIS_STATUS );
typedef VOID        (NTAPI FILTER_CANCEL_DIRECT_OID_REQUEST)( NDIS_HANDLE, PVOID );
typedef FILTER_DIRECT_OID_REQUEST           *FILTER_DIRECT_OID_REQUEST_HANDLER;
typedef FILTER_DIRECT_OID_REQUEST_COMPLETE  *FILTER_DIRECT_OID_REQUEST_COMPLETE_HANDLER;
typedef FILTER_CANCEL_DIRECT_OID_REQUEST    *FILTER_CANCEL_DIRECT_OID_REQUEST_HANDLER;
#endif

/* NDIS filter partial characteristics */
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_FILTER_PARTIAL_CHARACTERISTICS {
    NDIS_OBJECT_HEADER                              Header;
    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;
typedef NDIS_FILTER_PARTIAL_CHARACTERISTICS *PNDIS_FILTER_PARTIAL_CHARACTERISTICS;
#endif

/* NDIS filter driver characteristics */
#if NDIS_SUPPORT_NDIS6
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_FILTER_DRIVER_CHARACTERISTICS;
typedef NDIS_FILTER_DRIVER_CHARACTERISTICS  *PNDIS_FILTER_DRIVER_CHARACTERISTICS;
#endif

/* NDIS filter attributes */
#if NDIS_SUPPORT_NDIS6
typedef struct _NDIS_FILTER_ATTRIBUTES {
    NDIS_OBJECT_HEADER  Header;
    ULONG               Flags;
} NDIS_FILTER_ATTRIBUTES;
typedef NDIS_FILTER_ATTRIBUTES  *PNDIS_FILTER_ATTRIBUTES;
#endif

/* IF provider callbacks */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef NDIS_STATUS (NTAPI *IFP_QUERY_OBJECT)( NDIS_HANDLE, NET_IF_OBJECT_ID, PULONG, PVOID );
typedef NDIS_STATUS (NTAPI *IFP_SET_OBJECT)( NDIS_HANDLE, NET_IF_OBJECT_ID, ULONG, PVOID );
#endif

/* NDIS IF provider characteristics */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef struct _NDIS_IF_PROVIDER_CHARACTERISTICS {
    NDIS_OBJECT_HEADER  Header;
    IFP_QUERY_OBJECT    QueryObjectHandler;
    IFP_SET_OBJECT      SetObjectHandler;
    PVOID               Reserved1;
    PVOID               Reserved2;
} NDIS_IF_PROVIDER_CHARACTERISTICS;
typedef NDIS_IF_PROVIDER_CHARACTERISTICS    *PNDIS_IF_PROVIDER_CHARACTERISTICS;
#endif

/* Network IF information */
#if NDIS_SUPPORT_NDIS6 || NDIS60
typedef struct _NET_IF_INFORMATION {
    NDIS_OBJECT_HEADER      Header;
    ULONG                   Flags;
    NET_PHYSICAL_LOCATION   PhysicalLocation;
    ULONG                   WanTunnelType;
    ULONG                   PortNumber;
    NET_IF_ACCESS_TYPE      AccessType;
    NET_IF_DIRECTION_TYPE   DirectionType;
    NET_IF_CONNECTION_TYPE  ConnectionType;
    BOOLEAN                 ifConnectorPresent;
    USHORT                  PhysAddressLength;
    USHORT                  PhysAddressOffset;
    USHORT                  PermanentPhysAddressOffset;
    USHORT                  FriendlyNameLength;
    USHORT                  FriendlyNameOffset;
    GUID                    InterfaceGuid;
    NET_IF_NETWORK_GUID     NetworkGuid;
    ULONG                   SupportedStatistics;
    NDIS_MEDIUM             MediaType;
    NDIS_PHYSICAL_MEDIUM    PhysicalMediumType;
} NET_IF_INFORMATION;
typedef NET_IF_INFORMATION  *PNET_IF_INFORMATION;
#endif

/* Functions in NDIS.SYS */
EXPORT NDIS_STATUS  NTAPI NdisAllocateMemoryWithTag( PVOID *, UINT, ULONG );
EXPORT VOID         NTAPI NdisCancelTimer( PNDIS_TIMER, PBOOLEAN );
EXPORT NDIS_STATUS  NTAPI NdisClAddParty( NDIS_HANDLE, NDIS_HANDLE, PCO_CALL_PARAMETERS, PNDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisClCloseAddressFamily( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisClCloseCall( NDIS_HANDLE, NDIS_HANDLE, PVOID, UINT );
EXPORT NDIS_STATUS  NTAPI NdisClDeregisterSap( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisClDropParty( NDIS_HANDLE, PVOID, UINT );
EXPORT NDIS_STATUS  NTAPI NdisClGetProtocolVcContextFromTapiCallId( UNICODE_STRING, PNDIS_HANDLE );
EXPORT VOID         NTAPI NdisClIncomingCallComplete( NDIS_STATUS, NDIS_HANDLE, PCO_CALL_PARAMETERS );
EXPORT NDIS_STATUS  NTAPI NdisClMakeCall( NDIS_HANDLE, PCO_CALL_PARAMETERS, NDIS_HANDLE, PNDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisClModifyCallQoS( NDIS_HANDLE, PCO_CALL_PARAMETERS );
EXPORT NDIS_STATUS  NTAPI NdisClRegisterSap( NDIS_HANDLE, NDIS_HANDLE, PCO_SAP, PNDIS_HANDLE );
EXPORT VOID         NTAPI NdisCloseConfiguration( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisCloseFile( PNDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisCmActivateVc( NDIS_HANDLE, PCO_CALL_PARAMETERS );
EXPORT VOID         NTAPI NdisCmAddPartyComplete( NDIS_STATUS, NDIS_HANDLE, NDIS_HANDLE, PCO_CALL_PARAMETERS );
EXPORT VOID         NTAPI NdisCmCloseAddressFamilyComplete( NDIS_STATUS, NDIS_HANDLE );
EXPORT VOID         NTAPI NdisCmCloseCallComplete( NDIS_STATUS, NDIS_HANDLE, NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisCmDeactivateVc( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisCmDeregisterSapComplete( NDIS_STATUS, NDIS_HANDLE );
EXPORT VOID         NTAPI NdisCmDispatchCallConnected( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisCmDispatchIncomingCall( NDIS_HANDLE, NDIS_HANDLE, PCO_CALL_PARAMETERS );
EXPORT VOID         NTAPI NdisCmDispatchIncomingCallQoSChange( NDIS_HANDLE, PCO_CALL_PARAMETERS );
EXPORT VOID         NTAPI NdisCmDispatchIncomingCloseCall( NDIS_STATUS, NDIS_HANDLE, PVOID, UINT );
EXPORT VOID         NTAPI NdisCmDispatchIncomingDropParty( NDIS_STATUS, NDIS_HANDLE, PVOID, UINT );
EXPORT VOID         NTAPI NdisCmDropPartyComplete( NDIS_STATUS, NDIS_HANDLE );
EXPORT VOID         NTAPI NdisCmMakeCallComplete( NDIS_STATUS, NDIS_HANDLE, NDIS_HANDLE, NDIS_HANDLE, PCO_CALL_PARAMETERS );
EXPORT VOID         NTAPI NdisCmModifyCallQoSComplete( NDIS_STATUS, NDIS_HANDLE, PCO_CALL_PARAMETERS );
EXPORT VOID         NTAPI NdisCmOpenAddressFamilyComplete( NDIS_STATUS, NDIS_HANDLE, NDIS_HANDLE );
EXPORT VOID         NTAPI NdisCmRegisterSapComplete( NDIS_STATUS, NDIS_HANDLE, NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisCoAssignInstanceName( NDIS_HANDLE, PNDIS_STRING, PNDIS_STRING );
EXPORT NDIS_STATUS  NTAPI NdisCoCreateVc( NDIS_HANDLE, NDIS_HANDLE, NDIS_HANDLE, PNDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisCoDeleteVc( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisCoGetTapiCallId( NDIS_HANDLE, PVAR_STRING );
EXPORT VOID         NTAPI NdisCompleteDmaTransfer( PNDIS_STATUS, NDIS_HANDLE, PNDIS_BUFFER, ULONG, ULONG, BOOLEAN );
EXPORT VOID         NTAPI NdisCopyBuffer( PNDIS_STATUS, PNDIS_BUFFER *, NDIS_HANDLE, PVOID, UINT, UINT );
EXPORT VOID         NTAPI NdisDeregisterTdiCallBack( VOID );
EXPORT VOID         NTAPI NdisFreeMemory( PVOID, UINT, UINT );
EXPORT VOID         NTAPI NdisFreeMemoryWithTag( PVOID, ULONG );
EXPORT UCHAR        NTAPI NdisGeneratePartialCancelId( VOID );
EXPORT VOID         NTAPI NdisGetCurrentProcessorCounts( PULONG, PULONG, PULONG );
EXPORT VOID         NTAPI NdisGetCurrentProcessorCpuUsage( PULONG );
EXPORT PVOID        NTAPI NdisGetRoutineAddress( PNDIS_STRING );
EXPORT ULONG        NTAPI NdisGetSharedDataAlignment( VOID );
EXPORT UINT         NTAPI NdisGetVersion( VOID );
EXPORT VOID         NTAPI NdisIMAssociateMiniport( NDIS_HANDLE, NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisIMCancelInitializeDeviceInstance( NDIS_HANDLE, PNDIS_STRING );
EXPORT NDIS_STATUS  NTAPI NdisIMDeInitializeDeviceInstance( NDIS_HANDLE );
EXPORT NDIS_HANDLE  NTAPI NdisIMGetBindingContext( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisIMInitializeDeviceInstanceEx( NDIS_HANDLE, PNDIS_STRING, NDIS_HANDLE );
EXPORT VOID         NTAPI NdisInitializeEvent( PNDIS_EVENT );
EXPORT VOID         NTAPI NdisInitializeString( PNDIS_STRING, PUCHAR );
EXPORT VOID         NTAPI NdisInitializeTimer( PNDIS_TIMER, PNDIS_TIMER_FUNCTION, PVOID );
EXPORT VOID         NTAPI NdisMAllocateSharedMemory( NDIS_HANDLE, ULONG, BOOLEAN, PVOID *, PNDIS_PHYSICAL_ADDRESS );
EXPORT NDIS_STATUS  NTAPI NdisMAllocateSharedMemoryAsync( NDIS_HANDLE, ULONG, BOOLEAN, PVOID );
EXPORT VOID         NTAPI NdisMCancelTimer( PNDIS_MINIPORT_TIMER, PBOOLEAN );
EXPORT VOID         NTAPI NdisMCloseLog( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisMCmActivateVc( NDIS_HANDLE, PCO_CALL_PARAMETERS );
EXPORT NDIS_STATUS  NTAPI NdisMCmCreateVc( NDIS_HANDLE, NDIS_HANDLE, NDIS_HANDLE, PNDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisMCmDeactivateVc( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisMCmDeleteVc( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisMCmRegisterAddressFamily( NDIS_HANDLE, PCO_ADDRESS_FAMILY, PNDIS_CALL_MANAGER_CHARACTERISTICS, UINT );
EXPORT VOID         NTAPI NdisMCoActivateVcComplete( NDIS_STATUS, NDIS_HANDLE, PCO_CALL_PARAMETERS );
EXPORT VOID         NTAPI NdisMCoDeactivateVcComplete( NDIS_STATUS, NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisMCreateLog( NDIS_HANDLE, UINT, PNDIS_HANDLE );
EXPORT VOID         NTAPI NdisMDeregisterDmaChannel( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisMDeregisterIoPortRange( NDIS_HANDLE, UINT, UINT, PVOID );
EXPORT VOID         NTAPI NdisMFlushLog( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisMFreeSharedMemory( NDIS_HANDLE, ULONG, BOOLEAN, PVOID, NDIS_PHYSICAL_ADDRESS );
EXPORT VOID         NTAPI NdisMGetDeviceProperty( NDIS_HANDLE, PDEVICE_OBJECT *, PDEVICE_OBJECT *, PDEVICE_OBJECT *, PCM_RESOURCE_LIST *, PCM_RESOURCE_LIST * );
EXPORT ULONG        NTAPI NdisMGetDmaAlignment( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisMInitializeTimer( PNDIS_MINIPORT_TIMER, NDIS_HANDLE, PNDIS_TIMER_FUNCTION, PVOID );
EXPORT NDIS_STATUS  NTAPI NdisMMapIoSpace( PVOID *, NDIS_HANDLE, NDIS_PHYSICAL_ADDRESS, UINT );
EXPORT NDIS_STATUS  NTAPI NdisMQueryAdapterInstanceName( PNDIS_STRING, NDIS_HANDLE );
EXPORT ULONG        NTAPI NdisMReadDmaCounter( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisMRegisterDmaChannel( PNDIS_HANDLE, NDIS_HANDLE, UINT, BOOLEAN, PNDIS_DMA_DESCRIPTION, ULONG );
EXPORT NDIS_STATUS  NTAPI NdisMRegisterIoPortRange( PVOID *, NDIS_HANDLE, UINT, UINT );
EXPORT NDIS_STATUS  NTAPI NdisMRemoveMiniport( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisMSetPeriodicTimer( PNDIS_MINIPORT_TIMER, UINT );
EXPORT VOID         NTAPI NdisMSleep( ULONG );
EXPORT VOID         NTAPI NdisMUnmapIoSpace( NDIS_HANDLE, PVOID, UINT );
EXPORT NDIS_STATUS  NTAPI NdisMWriteLogData( NDIS_HANDLE, PVOID, UINT );
EXPORT VOID         NTAPI NdisMapFile( PNDIS_STATUS, PVOID *, NDIS_HANDLE );
EXPORT VOID         NTAPI NdisOpenConfigurationKeyByIndex( PNDIS_STATUS, NDIS_HANDLE, ULONG, PNDIS_STRING, PNDIS_HANDLE );
EXPORT VOID         NTAPI NdisOpenConfigurationKeyByName( PNDIS_STATUS, NDIS_HANDLE, PNDIS_STRING, PNDIS_HANDLE );
EXPORT VOID         NTAPI NdisOpenFile( PNDIS_STATUS, PNDIS_HANDLE, PUINT, PNDIS_STRING, NDIS_PHYSICAL_ADDRESS );
EXPORT NDIS_STATUS  NTAPI NdisQueryAdapterInstanceName( PNDIS_STRING, NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisQueryBindInstanceName( PNDIS_STRING, NDIS_HANDLE );
EXPORT VOID         NTAPI NdisReEnumerateProtocolBindings( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisReadConfiguration( PNDIS_STATUS, PNDIS_CONFIGURATION_PARAMETER *, NDIS_HANDLE, PNDIS_STRING, NDIS_PARAMETER_TYPE );
EXPORT VOID         NTAPI NdisReadNetworkAddress( PNDIS_STATUS, PVOID *, PUINT, NDIS_HANDLE );
EXPORT VOID         NTAPI NdisRegisterTdiCallBack( TDI_REGISTER_CALLBACK, TDI_PNP_HANDLER );
EXPORT VOID         NTAPI NdisResetEvent( PNDIS_EVENT );
EXPORT VOID         NTAPI NdisSetEvent( PNDIS_EVENT );
EXPORT VOID         NTAPI NdisSetPeriodicTimer( PNDIS_TIMER, UINT );
EXPORT VOID         NTAPI NdisSetTimer( PNDIS_TIMER, UINT );
EXPORT VOID         NTAPI NdisSetTimerEx( PNDIS_TIMER, UINT, PVOID );
EXPORT VOID         NTAPI NdisSetupDmaTransfer( PNDIS_STATUS, NDIS_HANDLE, PNDIS_BUFFER, ULONG, ULONG, BOOLEAN );
EXPORT VOID         NTAPI NdisUnmapFile( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisUpdateSharedMemory( NDIS_HANDLE, ULONG, PVOID, NDIS_PHYSICAL_ADDRESS );
EXPORT BOOLEAN      NTAPI NdisWaitEvent( PNDIS_EVENT, UINT );
EXPORT VOID         NTAPI NdisWriteConfiguration( PNDIS_STATUS, NDIS_HANDLE, PNDIS_STRING, PNDIS_CONFIGURATION_PARAMETER );
EXPORT VOID         __cdecl NdisWriteErrorLogEntry( NDIS_HANDLE, NDIS_ERROR_CODE, ULONG, ... );
EXPORT NDIS_STATUS  NTAPI NdisWriteEventLogEntry( PVOID, NDIS_STATUS, ULONG, USHORT, PVOID, ULONG, PVOID );
#if NDIS_SUPPORT_60_COMPATIBLE_API
EXPORT VOID         NTAPI NdisAcquireReadWriteLock( PNDIS_RW_LOCK, BOOLEAN, PLOCK_STATE );
EXPORT VOID         NTAPI NdisInitializeReadWriteLock( PNDIS_RW_LOCK );
EXPORT VOID         NTAPI NdisReleaseReadWriteLock( PNDIS_RW_LOCK, PLOCK_STATE );
EXPORT CCHAR        NTAPI NdisSystemProcessorCount( VOID );
#endif
#if NDIS_LEGACY_DRIVER
EXPORT VOID         NTAPI NdisAllocateBuffer( PNDIS_STATUS, PNDIS_BUFFER *, NDIS_HANDLE, PVOID, UINT );
EXPORT VOID         NTAPI NdisAllocateBufferPool( PNDIS_STATUS, PNDIS_HANDLE, UINT );
EXPORT NDIS_STATUS  NTAPI NdisAllocateMemory( PVOID *, UINT, UINT, NDIS_PHYSICAL_ADDRESS );
EXPORT VOID         NTAPI NdisAllocatePacket( PNDIS_STATUS, PNDIS_PACKET *, NDIS_HANDLE );
EXPORT VOID         NTAPI NdisAllocatePacketPool( PNDIS_STATUS, PNDIS_HANDLE, UINT, UINT );
EXPORT VOID         NTAPI NdisAllocatePacketPoolEx( PNDIS_STATUS, PNDIS_HANDLE, UINT, UINT, UINT );
EXPORT NDIS_STATUS  NTAPI NdisCmRegisterAddressFamily( NDIS_HANDLE, PCO_ADDRESS_FAMILY, PNDIS_CALL_MANAGER_CHARACTERISTICS, UINT );
EXPORT VOID         NTAPI NdisCopyFromPacketToPacket( PNDIS_PACKET, UINT, UINT, PNDIS_PACKET, UINT, PUINT );
EXPORT VOID         NTAPI NdisCopyFromPacketToPacketSafe( PNDIS_PACKET, UINT, UINT, PNDIS_PACKET, UINT, PUINT, MM_PAGE_PRIORITY );
EXPORT VOID         NTAPI NdisDprAllocatePacket( PNDIS_STATUS, PNDIS_PACKET *, NDIS_HANDLE );
EXPORT VOID         NTAPI NdisDprAllocatePacketNonInterlocked( PNDIS_STATUS, PNDIS_PACKET *, NDIS_HANDLE );
EXPORT VOID         NTAPI NdisDprFreePacket( PNDIS_PACKET );
EXPORT VOID         NTAPI NdisDprFreePacketNonInterlocked( PNDIS_PACKET );
EXPORT VOID         NTAPI NdisFreeBufferPool( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisFreePacket( PNDIS_PACKET );
EXPORT VOID         NTAPI NdisFreePacketPool( NDIS_HANDLE );
EXPORT NDIS_HANDLE  NTAPI NdisGetPoolFromPacket( PNDIS_PACKET );
EXPORT VOID         NTAPI NdisGetSystemUpTime( PULONG );
EXPORT PNDIS_PACKET_STACK NTAPI NdisIMGetCurrentPacketStack( PNDIS_PACKET, BOOLEAN * );
EXPORT VOID         NTAPI NdisOpenConfiguration( PNDIS_STATUS, PNDIS_HANDLE, NDIS_HANDLE );
EXPORT UINT         NTAPI NdisPacketPoolUsage( NDIS_HANDLE );
EXPORT UINT         NTAPI NdisPacketSize( UINT );
EXPORT NDIS_STATUS  NTAPI NdisScheduleWorkItem( PNDIS_WORK_ITEM );
EXPORT VOID         NTAPI NdisSetPacketPoolProtocolId( NDIS_HANDLE, UINT );
EXPORT VOID         NTAPI NdisSetPacketStatus( PNDIS_PACKET, NDIS_STATUS, NDIS_HANDLE, ULONG );
EXPORT VOID         NTAPI NdisUnchainBufferAtBack( PNDIS_PACKET, PNDIS_BUFFER * );
EXPORT VOID         NTAPI NdisUnchainBufferAtFront( PNDIS_PACKET, PNDIS_BUFFER * );
#endif
#if NDIS_LEGACY_MINIPORT
EXPORT VOID         NTAPI NdisIMCopySendCompletePerPacketInfo( PNDIS_PACKET, PNDIS_PACKET );
EXPORT VOID         NTAPI NdisIMCopySendPerPacketInfo( PNDIS_PACKET, PNDIS_PACKET );
EXPORT VOID         NTAPI NdisIMDeregisterLayeredMiniport( NDIS_HANDLE );
EXPORT NDIS_HANDLE  NTAPI NdisIMGetDeviceContext( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisIMNotifyPnPEvent( NDIS_HANDLE, PNET_PNP_EVENT );
EXPORT NDIS_STATUS  NTAPI NdisIMRegisterLayeredMiniport( NDIS_HANDLE, PNDIS_MINIPORT_CHARACTERISTICS, UINT, PNDIS_HANDLE );
EXPORT VOID         NTAPI NdisInitializeWrapper( PNDIS_HANDLE, PVOID, PVOID, PVOID );
EXPORT NDIS_STATUS  NTAPI NdisMAllocateMapRegisters( NDIS_HANDLE, UINT, NDIS_DMA_SIZE, ULONG, ULONG );
EXPORT NDIS_STATUS  NTAPI NdisMCmRequest( NDIS_HANDLE, NDIS_HANDLE, NDIS_HANDLE, PNDIS_REQUEST );
EXPORT VOID         NTAPI NdisMCoIndicateReceivePacket( NDIS_HANDLE, PPNDIS_PACKET, UINT );
EXPORT VOID         NTAPI NdisMCoIndicateStatus( NDIS_HANDLE, NDIS_HANDLE, NDIS_STATUS, PVOID, ULONG );
EXPORT VOID         NTAPI NdisMCoReceiveComplete( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisMCoRequestComplete( NDIS_STATUS, NDIS_HANDLE, PNDIS_REQUEST );
EXPORT VOID         NTAPI NdisMCoSendComplete( NDIS_STATUS, NDIS_HANDLE, PNDIS_PACKET );
EXPORT VOID         NTAPI NdisMCompleteBufferPhysicalMapping( NDIS_HANDLE, PNDIS_BUFFER, ULONG );
EXPORT VOID         NTAPI NdisMDeregisterAdapterShutdownHandler( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisMDeregisterDevice( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisMDeregisterInterrupt( PNDIS_MINIPORT_INTERRUPT );
EXPORT VOID         NTAPI NdisMFreeMapRegisters( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisMIndicateStatus( NDIS_HANDLE, NDIS_STATUS, PVOID, UINT );
EXPORT VOID         NTAPI NdisMIndicateStatusComplete( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisMInitializeScatterGatherDma( NDIS_HANDLE, BOOLEAN, ULONG );
EXPORT NDIS_STATUS  NTAPI NdisMPciAssignResources( NDIS_HANDLE, ULONG, PNDIS_RESOURCE_LIST * );
EXPORT NDIS_STATUS  NTAPI NdisMPromoteMiniport( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisMQueryAdapterResources( PNDIS_STATUS, NDIS_HANDLE, PNDIS_RESOURCE_LIST, PUINT );
EXPORT VOID         NTAPI NdisMRegisterAdapterShutdownHandler( NDIS_HANDLE, PVOID, ADAPTER_SHUTDOWN_HANDLER );
EXPORT NDIS_STATUS  NTAPI NdisMRegisterDevice( NDIS_HANDLE, PNDIS_STRING, PNDIS_STRING, PDRIVER_DISPATCH [], PDEVICE_OBJECT *, NDIS_HANDLE * );
EXPORT NDIS_STATUS  NTAPI NdisMRegisterInterrupt( PNDIS_MINIPORT_INTERRUPT, NDIS_HANDLE, UINT, UINT, BOOLEAN, BOOLEAN, NDIS_INTERRUPT_MODE );
EXPORT NDIS_STATUS  NTAPI NdisMRegisterMiniport( NDIS_HANDLE, PNDIS_MINIPORT_CHARACTERISTICS, UINT );
EXPORT VOID         NTAPI NdisMRegisterUnloadHandler( NDIS_HANDLE, PDRIVER_UNLOAD );
EXPORT VOID         NTAPI NdisMSetAttributesEx( NDIS_HANDLE, NDIS_HANDLE, UINT, ULONG, NDIS_INTERFACE_TYPE );
EXPORT NDIS_STATUS  NTAPI NdisMSetMiniportSecondary( NDIS_HANDLE, NDIS_HANDLE );
EXPORT VOID         NTAPI NdisMStartBufferPhysicalMapping( NDIS_HANDLE, PNDIS_BUFFER, ULONG, BOOLEAN, PNDIS_PHYSICAL_ADDRESS_UNIT, PUINT );
EXPORT BOOLEAN      NTAPI NdisMSynchronizeWithInterrupt( PNDIS_MINIPORT_INTERRUPT, PVOID, PVOID );
EXPORT ULONG        NTAPI NdisReadPciSlotInformation( NDIS_HANDLE, ULONG, ULONG, PVOID, ULONG );
EXPORT ULONG        NTAPI NdisReadPcmciaAttributeMemory( NDIS_HANDLE, ULONG, PVOID, ULONG );
EXPORT VOID         NTAPI NdisTerminateWrapper( NDIS_HANDLE, PVOID );
EXPORT ULONG        NTAPI NdisWritePciSlotInformation( NDIS_HANDLE, ULONG, ULONG, PVOID, ULONG );
EXPORT ULONG        NTAPI NdisWritePcmciaAttributeMemory( NDIS_HANDLE, ULONG, PVOID, ULONG );
#endif
#if NDIS_LEGACY_PROTOCOL
EXPORT VOID         NTAPI NdisCancelSendPackets( NDIS_HANDLE, PVOID );
EXPORT NDIS_STATUS  NTAPI NdisClOpenAddressFamily( NDIS_HANDLE, PCO_ADDRESS_FAMILY, NDIS_HANDLE, PNDIS_CLIENT_CHARACTERISTICS, UINT, PNDIS_HANDLE );
EXPORT VOID         NTAPI NdisCloseAdapter( PNDIS_STATUS, NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisCoRequest( NDIS_HANDLE, NDIS_HANDLE, NDIS_HANDLE, NDIS_HANDLE, PNDIS_REQUEST );
EXPORT VOID         NTAPI NdisCoRequestComplete( NDIS_STATUS, NDIS_HANDLE, NDIS_HANDLE, NDIS_HANDLE, PNDIS_REQUEST );
EXPORT VOID         NTAPI NdisCoSendPackets( NDIS_HANDLE, PPNDIS_PACKET, UINT );
EXPORT VOID         NTAPI NdisCompleteBindAdapter( NDIS_HANDLE, NDIS_STATUS, NDIS_STATUS );
EXPORT VOID         NTAPI NdisCompletePnPEvent( NDIS_STATUS, NDIS_HANDLE, PNET_PNP_EVENT );
EXPORT VOID         NTAPI NdisCompleteUnbindAdapter( NDIS_HANDLE, NDIS_STATUS );
EXPORT VOID         NTAPI NdisDeregisterProtocol( PNDIS_STATUS, NDIS_HANDLE );
EXPORT VOID         NTAPI NdisGetDriverHandle( NDIS_HANDLE, PNDIS_HANDLE );
EXPORT PNDIS_PACKET NTAPI NdisGetReceivedPacket( NDIS_HANDLE, NDIS_HANDLE );
EXPORT VOID         NTAPI NdisOpenAdapter( PNDIS_STATUS, PNDIS_STATUS, PNDIS_HANDLE, PUINT, PNDIS_MEDIUM, UINT, NDIS_HANDLE, NDIS_HANDLE, PNDIS_STRING, UINT, PSTRING );
EXPORT VOID         NTAPI NdisOpenProtocolConfiguration( PNDIS_STATUS, PNDIS_HANDLE, PNDIS_STRING );
EXPORT NDIS_STATUS  NTAPI NdisQueryPendingIOCount( PVOID, PULONG );
EXPORT NDIS_STATUS  NTAPI NdisRegisterProtocol( PNDIS_STATUS, PNDIS_HANDLE, PNDIS_PROTOCOL_CHARACTERISTICS, UINT );
EXPORT VOID         NTAPI NdisRequest( PNDIS_STATUS, NDIS_HANDLE, PNDIS_REQUEST );
EXPORT VOID         NTAPI NdisReset( PNDIS_STATUS, NDIS_HANDLE );
EXPORT VOID         NTAPI NdisReturnPackets( PNDIS_PACKET *, UINT );
EXPORT VOID         NTAPI NdisSetProtocolFilter( PNDIS_STATUS, NDIS_HANDLE, RECEIVE_HANDLER, RECEIVE_PACKET_HANDLER, NDIS_MEDIUM, UINT, UINT, PUCHAR );
#endif
#if NDIS_SUPPORT_NDIS6
EXPORT NDIS_STATUS  NTAPI NdisAllocateCloneOidRequest( NDIS_HANDLE, PNDIS_OID_REQUEST, UINT, PNDIS_OID_REQUEST * );
EXPORT PNDIS_GENERIC_OBJECT NTAPI NdisAllocateGenericObject( PDRIVER_OBJECT, ULONG, USHORT );
EXPORT NDIS_HANDLE  NTAPI NdisAllocateIoWorkItem( NDIS_HANDLE );
EXPORT PVOID        NTAPI NdisAllocateMemoryWithTagPriority( NDIS_HANDLE, UINT, ULONG, EX_POOL_PRIORITY );
EXPORT NDIS_STATUS  NTAPI NdisAllocateTimerObject( NDIS_HANDLE, PNDIS_TIMER_CHARACTERISTICS, PNDIS_HANDLE );
EXPORT BOOLEAN      NTAPI NdisCancelTimerObject( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisClNotifyCloseAddressFamilyComplete( NDIS_HANDLE, NDIS_STATUS );
EXPORT NDIS_STATUS  NTAPI NdisClOpenAddressFamilyEx( NDIS_HANDLE, PCO_ADDRESS_FAMILY, NDIS_HANDLE, PNDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisCmNotifyCloseAddressFamily( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisCmRegisterAddressFamilyEx( NDIS_HANDLE, PCO_ADDRESS_FAMILY );
EXPORT NDIS_STATUS  NTAPI NdisCoOidRequest( NDIS_HANDLE, NDIS_HANDLE, NDIS_HANDLE, NDIS_HANDLE, PNDIS_OID_REQUEST );
EXPORT VOID         NTAPI NdisCoOidRequestComplete( NDIS_HANDLE, NDIS_HANDLE, NDIS_HANDLE, PNDIS_OID_REQUEST, NDIS_STATUS );
EXPORT VOID         NTAPI NdisCoSendNetBufferLists( NDIS_HANDLE, PNET_BUFFER_LIST, ULONG );
EXPORT VOID         NTAPI NdisFCancelOidRequest( NDIS_HANDLE, PVOID );
EXPORT VOID         NTAPI NdisFCancelSendNetBufferLists( NDIS_HANDLE, PVOID );
EXPORT VOID         NTAPI NdisFDeregisterFilterDriver( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisFDevicePnPEventNotify( NDIS_HANDLE, PNET_DEVICE_PNP_EVENT );
EXPORT VOID         NTAPI NdisFIndicateReceiveNetBufferLists( NDIS_HANDLE, PNET_BUFFER_LIST, NDIS_PORT_NUMBER, ULONG, ULONG );
EXPORT VOID         NTAPI NdisFIndicateStatus( NDIS_HANDLE, PNDIS_STATUS_INDICATION );
EXPORT NDIS_STATUS  NTAPI NdisFNetPnPEvent( NDIS_HANDLE, PNET_PNP_EVENT_NOTIFICATION );
EXPORT NDIS_STATUS  NTAPI NdisFOidRequest( NDIS_HANDLE, PNDIS_OID_REQUEST );
EXPORT VOID         NTAPI NdisFOidRequestComplete( NDIS_HANDLE, PNDIS_OID_REQUEST, NDIS_STATUS );
EXPORT VOID         NTAPI NdisFPauseComplete( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisFRegisterFilterDriver( PDRIVER_OBJECT, NDIS_HANDLE, PNDIS_FILTER_DRIVER_CHARACTERISTICS, PNDIS_HANDLE );
EXPORT VOID         NTAPI NdisFRestartComplete( NDIS_HANDLE, NDIS_STATUS );
EXPORT NDIS_STATUS  NTAPI NdisFRestartFilter( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisFReturnNetBufferLists( NDIS_HANDLE, PNET_BUFFER_LIST, ULONG );
EXPORT VOID         NTAPI NdisFSendNetBufferLists( NDIS_HANDLE, PNET_BUFFER_LIST, NDIS_PORT_NUMBER, ULONG );
EXPORT NDIS_STATUS  NTAPI NdisFSetAttributes( NDIS_HANDLE, NDIS_HANDLE, PNDIS_FILTER_ATTRIBUTES );
EXPORT VOID         NTAPI NdisFreeCloneOidRequest( NDIS_HANDLE, PNDIS_OID_REQUEST );
EXPORT VOID         NTAPI NdisFreeGenericObject( PNDIS_GENERIC_OBJECT );
EXPORT VOID         NTAPI NdisFreeIoWorkItem( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisFreeTimerObject( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisGetSystemUpTimeEx( PLARGE_INTEGER );
EXPORT NDIS_STATUS  NTAPI NdisMAllocateNetBufferSGList( NDIS_HANDLE, PNET_BUFFER, PVOID, ULONG, PVOID, ULONG );
EXPORT NDIS_STATUS  NTAPI NdisMAllocatePort( NDIS_HANDLE, PNDIS_PORT_CHARACTERISTICS );
EXPORT NDIS_STATUS  NTAPI NdisMCmOidRequest( NDIS_HANDLE, NDIS_HANDLE, NDIS_HANDLE, PNDIS_OID_REQUEST );
EXPORT NDIS_STATUS  NTAPI NdisMCmRegisterAddressFamilyEx( NDIS_HANDLE, PCO_ADDRESS_FAMILY );
EXPORT VOID         NTAPI NdisMCoIndicateReceiveNetBufferLists( NDIS_HANDLE, PNET_BUFFER_LIST, ULONG, ULONG );
EXPORT VOID         NTAPI NdisMCoIndicateStatusEx( NDIS_HANDLE, NDIS_HANDLE, PNDIS_STATUS_INDICATION );
EXPORT VOID         NTAPI NdisMCoOidRequestComplete( NDIS_HANDLE, NDIS_HANDLE, PNDIS_OID_REQUEST, NDIS_STATUS );
EXPORT VOID         NTAPI NdisMCoSendNetBufferListsComplete( NDIS_HANDLE, PNET_BUFFER_LIST, ULONG );
EXPORT VOID         NTAPI NdisMDeregisterInterruptEx( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisMDeregisterMiniportDriver( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisMDeregisterScatterGatherDma( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisMFreeNetBufferSGList( NDIS_HANDLE, PSCATTER_GATHER_LIST, PNET_BUFFER );
EXPORT NDIS_STATUS  NTAPI NdisMFreePort( NDIS_HANDLE, NDIS_PORT_NUMBER );
EXPORT ULONG        NTAPI NdisMGetBusData( NDIS_HANDLE, ULONG, ULONG, PVOID, ULONG );
EXPORT VOID         NTAPI NdisMIndicateReceiveNetBufferLists( NDIS_HANDLE, PNET_BUFFER_LIST, NDIS_PORT_NUMBER, ULONG, ULONG );
EXPORT VOID         NTAPI NdisMIndicateStatusEx( NDIS_HANDLE, PNDIS_STATUS_INDICATION );
EXPORT NDIS_STATUS  NTAPI NdisMNetPnPEvent( NDIS_HANDLE, PNET_PNP_EVENT_NOTIFICATION );
EXPORT VOID         NTAPI NdisMOidRequestComplete( NDIS_HANDLE, PNDIS_OID_REQUEST, NDIS_STATUS );
EXPORT VOID         NTAPI NdisMPauseComplete( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisMRegisterInterruptEx( NDIS_HANDLE, NDIS_HANDLE, PNDIS_MINIPORT_INTERRUPT_CHARACTERISTICS, PNDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisMRegisterMiniportDriver( PDRIVER_OBJECT, PUNICODE_STRING, NDIS_HANDLE, PNDIS_MINIPORT_DRIVER_CHARACTERISTICS, PNDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisMRegisterScatterGatherDma( NDIS_HANDLE, PNDIS_SG_DMA_DESCRIPTION, PNDIS_HANDLE );
EXPORT VOID         NTAPI NdisMResetComplete( NDIS_HANDLE, NDIS_STATUS, BOOLEAN );
EXPORT VOID         NTAPI NdisMRestartComplete( NDIS_HANDLE, NDIS_STATUS );
EXPORT VOID         NTAPI NdisMSendNetBufferListsComplete( NDIS_HANDLE, PNET_BUFFER_LIST, ULONG );
EXPORT ULONG        NTAPI NdisMSetBusData( NDIS_HANDLE, ULONG, ULONG, PVOID, ULONG );
EXPORT NDIS_STATUS  NTAPI NdisMSetMiniportAttributes( NDIS_HANDLE, PNDIS_MINIPORT_ADAPTER_ATTRIBUTES );
EXPORT NDIS_STATUS  NTAPI NdisOpenConfigurationEx( PNDIS_CONFIGURATION_OBJECT, PNDIS_HANDLE );
EXPORT VOID         NTAPI NdisQueueIoWorkItem( NDIS_HANDLE, NDIS_IO_WORKITEM_ROUTINE, PVOID );
EXPORT NDIS_STATUS  NTAPI NdisSetOptionalHandlers( NDIS_HANDLE, PNDIS_DRIVER_OPTIONAL_HANDLERS );
EXPORT BOOLEAN      NTAPI NdisSetTimerObject( NDIS_HANDLE, LARGE_INTEGER, LONG, PVOID );
#if NDIS_SUPPORT_60_COMPATIBLE_API
EXPORT VOID         NTAPI NdisDprAcquireReadWriteLock( PNDIS_RW_LOCK, BOOLEAN, PLOCK_STATE );
EXPORT VOID         NTAPI NdisDprReleaseReadWriteLock( PNDIS_RW_LOCK, PLOCK_STATE );
EXPORT NDIS_STATUS  NTAPI NdisGetProcessorInformation( PNDIS_SYSTEM_PROCESSOR_INFO );
EXPORT ULONG        NTAPI NdisMQueueDpc( NDIS_HANDLE, ULONG, ULONG, PVOID );
EXPORT ULONG        NTAPI NdisSystemActiveProcessorCount( PKAFFINITY );
#endif
#endif
#if NDIS_SUPPORT_NDIS6 || NDIS60
EXPORT VOID         NTAPI NdisAdjustNetBufferCurrentMdl( PNET_BUFFER );
EXPORT VOID         NTAPI NdisAdvanceNetBufferDataStart( PNET_BUFFER, ULONG, BOOLEAN, NET_BUFFER_FREE_MDL_HANDLER );
EXPORT VOID         NTAPI NdisAdvanceNetBufferListDataStart( PNET_BUFFER_LIST, ULONG, BOOLEAN, NET_BUFFER_FREE_MDL_HANDLER );
EXPORT PNET_BUFFER_LIST NTAPI NdisAllocateCloneNetBufferList( PNET_BUFFER_LIST, NDIS_HANDLE, NDIS_HANDLE, ULONG );
EXPORT PNET_BUFFER_LIST NTAPI NdisAllocateFragmentNetBufferList( PNET_BUFFER_LIST, NDIS_HANDLE, NDIS_HANDLE, ULONG, ULONG, ULONG, ULONG, ULONG );
EXPORT PMDL         NTAPI NdisAllocateMdl( NDIS_HANDLE, PVOID, UINT );
EXPORT PNET_BUFFER  NTAPI NdisAllocateNetBuffer( NDIS_HANDLE, PMDL, ULONG, SIZE_T );
EXPORT PNET_BUFFER_LIST NTAPI NdisAllocateNetBufferAndNetBufferList( NDIS_HANDLE, USHORT, USHORT, PMDL, ULONG, SIZE_T );
EXPORT PNET_BUFFER_LIST NTAPI NdisAllocateNetBufferList( NDIS_HANDLE, USHORT, USHORT );
EXPORT NDIS_STATUS  NTAPI NdisAllocateNetBufferListContext( PNET_BUFFER_LIST, USHORT, USHORT, ULONG );
EXPORT NDIS_HANDLE  NTAPI NdisAllocateNetBufferListPool( NDIS_HANDLE, PNET_BUFFER_LIST_POOL_PARAMETERS );
EXPORT PNET_BUFFER  NTAPI NdisAllocateNetBufferMdlAndData( NDIS_HANDLE );
EXPORT NDIS_HANDLE  NTAPI NdisAllocateNetBufferPool( NDIS_HANDLE, PNET_BUFFER_POOL_PARAMETERS );
EXPORT PNET_BUFFER_LIST NTAPI NdisAllocateReassembledNetBufferList( PNET_BUFFER_LIST, NDIS_HANDLE, ULONG, ULONG, ULONG, ULONG );
EXPORT VOID         NTAPI NdisCancelOidRequest( NDIS_HANDLE, PVOID );
EXPORT VOID         NTAPI NdisCancelSendNetBufferLists( NDIS_HANDLE, PVOID );
EXPORT NDIS_STATUS  NTAPI NdisCloseAdapterEx( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisCompleteBindAdapterEx( NDIS_HANDLE, NDIS_STATUS );
EXPORT VOID         NTAPI NdisCompleteNetPnPEvent( NDIS_HANDLE, PNET_PNP_EVENT_NOTIFICATION, NDIS_STATUS );
EXPORT VOID         NTAPI NdisCompleteUnbindAdapterEx( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisCopyFromNetBufferToNetBuffer( PNET_BUFFER, ULONG, ULONG, PNET_BUFFER, ULONG, PULONG );
EXPORT VOID         NTAPI NdisCopyReceiveNetBufferListInfo( PNET_BUFFER_LIST, PNET_BUFFER_LIST );
EXPORT VOID         NTAPI NdisCopySendNetBufferListInfo( PNET_BUFFER_LIST, PNET_BUFFER_LIST );
EXPORT VOID         NTAPI NdisDeregisterProtocolDriver( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisFreeCloneNetBufferList( PNET_BUFFER_LIST, ULONG );
EXPORT VOID         NTAPI NdisFreeFragmentNetBufferList( PNET_BUFFER_LIST, ULONG, ULONG );
EXPORT VOID         NTAPI NdisFreeMdl( PMDL );
EXPORT VOID         NTAPI NdisFreeNetBuffer( PNET_BUFFER );
EXPORT VOID         NTAPI NdisFreeNetBufferList( PNET_BUFFER_LIST );
EXPORT VOID         NTAPI NdisFreeNetBufferListContext( PNET_BUFFER_LIST, USHORT );
EXPORT VOID         NTAPI NdisFreeNetBufferListPool( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisFreeNetBufferPool( NDIS_HANDLE );
EXPORT VOID         NTAPI NdisFreeReassembledNetBufferList( PNET_BUFFER_LIST, ULONG, ULONG );
EXPORT PVOID        NTAPI NdisGetDataBuffer( PNET_BUFFER, ULONG, PVOID, UINT, UINT );
EXPORT UCHAR        NTAPI NdisGetNetBufferListProtocolId( PNET_BUFFER_LIST );
EXPORT NDIS_HANDLE  NTAPI NdisGetPoolFromNetBuffer( PNET_BUFFER );
EXPORT NDIS_HANDLE  NTAPI NdisGetPoolFromNetBufferList( PNET_BUFFER_LIST );
EXPORT NDIS_STATUS  NTAPI NdisIfAddIfStackEntry( NET_IFINDEX, NET_IFINDEX );
EXPORT NDIS_STATUS  NTAPI NdisIfAllocateNetLuidIndex( NET_IFTYPE, PUINT32 );
EXPORT VOID         NTAPI NdisIfDeleteIfStackEntry( NET_IFINDEX, NET_IFINDEX );
EXPORT VOID         NTAPI NdisIfDeregisterInterface( NET_IFINDEX );
EXPORT VOID         NTAPI NdisIfDeregisterProvider( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisIfFreeNetLuidIndex( NET_IFTYPE, UINT32 );
EXPORT NDIS_STATUS  NTAPI NdisIfGetInterfaceIndexFromNetLuid( NET_LUID, PNET_IFINDEX );
EXPORT NDIS_STATUS  NTAPI NdisIfGetNetLuidFromInterfaceIndex( NET_IFINDEX, PNET_LUID );
EXPORT NDIS_STATUS  NTAPI NdisIfQueryBindingIfIndex( NDIS_HANDLE, PNET_IFINDEX, PNET_LUID, PNET_IFINDEX, PNET_LUID );
EXPORT NDIS_STATUS  NTAPI NdisIfRegisterInterface( NDIS_HANDLE, NET_LUID, NDIS_HANDLE, PNET_IF_INFORMATION, PNET_IFINDEX );
EXPORT NDIS_STATUS  NTAPI NdisIfRegisterProvider( PNDIS_IF_PROVIDER_CHARACTERISTICS, NDIS_HANDLE, PNDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisOidRequest( NDIS_HANDLE, PNDIS_OID_REQUEST );
EXPORT NDIS_STATUS  NTAPI NdisOpenAdapterEx( NDIS_HANDLE, NDIS_HANDLE, PNDIS_OPEN_PARAMETERS, NDIS_HANDLE, PNDIS_HANDLE );
EXPORT ULONG        NTAPI NdisQueryNetBufferPhysicalCount( PNET_BUFFER );
EXPORT NDIS_STATUS  NTAPI NdisRegisterProtocolDriver( NDIS_HANDLE, PNDIS_PROTOCOL_DRIVER_CHARACTERISTICS, PNDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisRetreatNetBufferDataStart( PNET_BUFFER, ULONG, ULONG, NET_BUFFER_ALLOCATE_MDL_HANDLER );
EXPORT NDIS_STATUS  NTAPI NdisRetreatNetBufferListDataStart( PNET_BUFFER_LIST, ULONG, ULONG, NET_BUFFER_ALLOCATE_MDL_HANDLER, NET_BUFFER_FREE_MDL_HANDLER );
EXPORT VOID         NTAPI NdisReturnNetBufferLists( NDIS_HANDLE, PNET_BUFFER_LIST, ULONG );
EXPORT VOID         NTAPI NdisSendNetBufferLists( NDIS_HANDLE, PNET_BUFFER_LIST, NDIS_PORT_NUMBER, ULONG );
EXPORT NDIS_STATUS  NTAPI NdisUnbindAdapter( NDIS_HANDLE );
#endif
#if NDIS_SUPPORT_NDIS61
EXPORT VOID         NTAPI NdisCancelDirectOidRequest( NDIS_HANDLE, PVOID );
EXPORT NDIS_STATUS  NTAPI NdisDirectOidRequest( NDIS_HANDLE, PNDIS_OID_REQUEST );
EXPORT VOID         NTAPI NdisFCancelDirectOidRequest( NDIS_HANDLE, PVOID );
EXPORT NDIS_STATUS  NTAPI NdisFDirectOidRequest( NDIS_HANDLE, PNDIS_OID_REQUEST );
EXPORT VOID         NTAPI NdisFDirectOidRequestComplete( NDIS_HANDLE, PNDIS_OID_REQUEST, NDIS_STATUS );
EXPORT NDIS_STATUS  NTAPI NdisMConfigMSIXTableEntry( NDIS_HANDLE, PNDIS_MSIX_CONFIG_PARAMETERS );
EXPORT VOID         NTAPI NdisMDirectOidRequestComplete( NDIS_HANDLE, PNDIS_OID_REQUEST, NDIS_STATUS );
#endif
#if NDIS_SUPPORT_NDIS620
EXPORT VOID         NTAPI NdisAcquireRWLockRead( PNDIS_RW_LOCK_EX, PLOCK_STATE_EX, UCHAR );
EXPORT VOID         NTAPI NdisAcquireRWLockWrite( PNDIS_RW_LOCK_EX, PLOCK_STATE_EX, UCHAR );
EXPORT USHORT       NTAPI NdisActiveGroupCount( VOID );
EXPORT PNDIS_RW_LOCK_EX NTAPI NdisAllocateRWLock( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisAllocateSharedMemory( NDIS_HANDLE, PNDIS_SHARED_MEMORY_PARAMETERS, PNDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisBuildScatterGatherList( NDIS_HANDLE, PNDIS_SCATTER_GATHER_LIST_PARAMETERS );
EXPORT PROCESSOR_NUMBER NTAPI NdisCurrentGroupAndProcessor( VOID );
EXPORT ULONG        NTAPI NdisCurrentProcessorIndex( VOID );
EXPORT VOID         NTAPI NdisFreeMemoryWithTagPriority( NDIS_HANDLE, PVOID, ULONG );
EXPORT VOID         NTAPI NdisFreeRWLock( PNDIS_RW_LOCK_EX );
EXPORT VOID         NTAPI NdisFreeScatterGatherList( NDIS_HANDLE, PSCATTER_GATHER_LIST, BOOLEAN );
EXPORT VOID         NTAPI NdisFreeSharedMemory( NDIS_HANDLE, NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisGetHypervisorInfo( PNDIS_HYPERVISOR_INFO );
EXPORT NDIS_STATUS  NTAPI NdisGetProcessorInformationEx( NDIS_HANDLE, PNDIS_SYSTEM_PROCESSOR_INFO_EX, PSIZE_T );
EXPORT NDIS_STATUS  NTAPI NdisGetRssProcessorInformation( NDIS_HANDLE, PNDIS_RSS_PROCESSOR_INFO, PSIZE_T );
EXPORT ULONG        NTAPI NdisGroupActiveProcessorCount( USHORT );
EXPORT KAFFINITY    NTAPI NdisGroupActiveProcessorMask( USHORT );
EXPORT ULONG        NTAPI NdisGroupMaxProcessorCount( USHORT );
EXPORT KAFFINITY    NTAPI NdisMQueueDpcEx( NDIS_HANDLE, ULONG, PGROUP_AFFINITY, PVOID );
EXPORT USHORT       NTAPI NdisMaxGroupCount( VOID );
EXPORT NTSTATUS     NTAPI NdisProcessorIndexToNumber( ULONG, PPROCESSOR_NUMBER );
EXPORT ULONG        NTAPI NdisProcessorNumberToIndex( PROCESSOR_NUMBER );
EXPORT VOID         NTAPI NdisReleaseRWLock( PNDIS_RW_LOCK_EX, PLOCK_STATE_EX );
EXPORT BOOLEAN      NTAPI NdisSetCoalescableTimerObject( NDIS_HANDLE, LARGE_INTEGER, LONG, PVOID, ULONG );
#endif
#if (NTDDI_VERSION == 0x06000000) && (NDIS_LEGACY_DRIVER || NDIS_SUPPORT_NDIS6)
EXPORT VOID         NTAPI NdisDeregisterDeviceEx( NDIS_HANDLE );
EXPORT NDIS_STATUS  NTAPI NdisEnumerateFilterModules( NDIS_HANDLE, PVOID, ULONG, PULONG, PULONG );
EXPORT PVOID        NTAPI NdisGetDeviceReservedExtension( PDEVICE_OBJECT );
EXPORT NDIS_STATUS  NTAPI NdisRegisterDeviceEx( NDIS_HANDLE, PNDIS_DEVICE_OBJECT_ATTRIBUTES, PDEVICE_OBJECT *, PNDIS_HANDLE );
#endif

/* Functions in NDIS.SYS that are defined differently on different versions
 * of Windows.
 */
#if NDIS_SUPPORT_NDIS620
EXPORT BOOLEAN      NTAPI NdisMSychronizeWithInterruptEx( NDIS_HANDLE, ULONG, MINIPORT_SYNCHRONIZE_INTERRUPT_HANDLER, PVOID );
#elif NDIS_SUPPORT_NDIS6
EXPORT BOOLEAN      NTAPI NdisMSynchronizeWithInterruptEx( NDIS_HANDLE, ULONG, PVOID, PVOID );
#endif

/* Functions implemented as macros */
#define NdisGetPhysicalAddressHigh( x )         ((x).HighPart)
#define NdisSetPhysicalAddressHigh( x, p )      ((x).HighPart) = (p)
#define NdisGetPhysicalAddressLow( x )          ((x).LowPart)
#define NdisSetPhysicalAddressLow( x, p )       ((x).LowPart) = (p)
#define NdisAllocateSpinLock( x )               KeInitializeSpinLock( &(x)->SpinLock )
#define NdisFreeSpinLock( x )
#define NdisAcquireSpinLock( x ) \
    KeAcquireSpinLock( &(x)->SpinLock, &(x)->OldIrql )
#define NdisReleaseSpinLock( x ) \
    KeReleaseSpinLock( &(x)->SpinLock, (x)->OldIrql )
#define NdisDprAcquireSpinLock( x ) \
    KeAcquireSpinLockAtDpcLevel( &(x)->SpinLock )
#define NdisDprReleaseSpinLock( x ) \
    KeReleaseSpinLockFromDpcLevel( &(x)->SpinLock )
#define NdisInterlockedAddUlong( x, p1, p2 ) \
    ExInterlockedAddUlong( x, p1, &(p2)->SpinLock )
#define NdisInterlockedInsertHeadList( x, p1, p2 ) \
    ExInterlockedInsertHeadList( x, p1, &(p2)->SpinLock )
#define NdisInterlockedInsertTailList( x, p1, p2 ) \
    ExInterlockedInsertTailList( x, p1, &(p2)->SpinLock )
#define NdisInterlockedRemoveHeadList( x, p ) \
    ExInterlockedRemoveHeadList( x, &(p)->SpinLock )
#define NdisInterlockedPushEntryList( x, p1, p2 ) \
    ExInterlockedPushEntryList( x, p1, &(p2)->SpinLock )
#define NdisInterlockedPopEntryList( x, p ) \
    ExInterlockedPopEntryList( x, &(p)->SpinLock )
#define NdisInterlockedAddLargeStatistic( x, p ) \
    ExInterlockedAddLargeStatistic( (PLARGE_INTEGER)(x), p )
#define NdisInterlockedPushEntrySList( x, p1, p2 ) \
    ExInterlockedPushEntrySList( x, p1, &(p2)->SpinLock )
#define NdisInterlockedPopEntrySList( x, p ) \
    ExInterlockedPopEntrySList( x, &(p)->SpinLock )
#define NdisQueryBufferState( x, p1, p2, p3 ) \
    { \
        if( (p1) != NULL ) { \
            *(PVOID *)(p1) = MmGetSystemAddressForMdlSafe( x, p3 ); \
        } \
        *(p2) = MmGetMdlByteCount( x ); \
    }
#define NdisQueryBufferOffset( x, p1, p2 ) \
    { \
        *(p1) = MmGetMdlByteOffset( x ); \
        *(p2) = MmGetMdlByteCount( x ); \
    }
#define NdisGetBufferPhysicalArraySize( x, p ) \
    (*(p) = NDIS_BUFFER_TO_SPAN_PAGES( x ))
#define NdisGetNextBuffer( x, p )               { *(p) = (x)->Next; }
#define NdisAdjustBufferLength( x, p )          ((x)->ByteCount = (p))
#define NdisFlushBuffer( x, p )                 KeFlushIoBuffers( x, !(p), TRUE )
#define NdisRawWritePortUchar( p1, p2 ) \
    WRITE_PORT_UCHAR( (PUCHAR)(p1), (UCHAR)(p2) )
#define NdisRawWritePortUshort( p1, p2 ) \
    WRITE_PORT_USHORT( (PUSHORT)(p1), (USHORT)(p2) )
#define NdisRawWritePortUlong( p1, p2 ) \
    WRITE_PORT_ULONG( (PULONG)(p1), (ULONG)(p2) )
#define NdisRawWritePortBufferUchar( p1, p2, p3 ) \
    WRITE_PORT_BUFFER_UCHAR( (PUCHAR)(p1), (PUCHAR)(p2), p3 )
#define NdisRawReadPortUchar( p1, p2 )          *(p2) = READ_PORT_UCHAR( (PUCHAR)(p1) )
#define NdisRawReadPortUshort( p1, p2 )         *(p2) = READ_PORT_USHORT( (PUSHORT)(p1) )
#define NdisRawReadPortUlong( p1, p2 )          *(p2) = READ_PORT_ULONG( (PULONG)(p1) )
#define NdisRawReadPortBufferUchar( p1, p2, p3 ) \
    READ_PORT_BUFFER_UCHAR( (PUCHAR)(p1), (PUCHAR)(p2), p3 )
#define NdisFreeString( x ) \
    NdisFreeMemory( (x).Buffer, (x).MaximumLength, 0 )
#define NdisPrintString( x )                    DbgPrint( "%ls", (x).Buffer );
#define NdisCreateLookaheadBufferFromSharedMemory( p1, p2, p3 ) (*(p3) = (p1))
#define NdisDestroyLookaheadBufferFromSharedMemory( x )
#define NdisAnsiStringToUnicodeString( p1, p2 ) \
    RtlAnsiStringToUnicodeString( p1, p2, FALSE )
#define NdisUnicodeStringToAnsiString( p1, p2 ) \
    RtlUnicodeStringToAnsiString( p1, p2, FALSE )
#define NdisUpcaseUnicodeString( p1, p2 )       RtlUpcaseUnicodeString( p1, p2, FALSE )
#define NdisMSetTimer( x, p )                   NdisSetTimer( (PNDIS_TIMER)(x), p )
#define NdisBufferLength( x )                   MmGetMdlByteCount( x )
#define NdisBufferVirtualAddress( x )           MmGetSystemAddressForMdl( x )
#define NdisBufferVirtualAddressSafe( x, p )    MmGetSystemAddressForMdlSafe( x, p )
#ifdef __cplusplus
    #define WanMiniportSend( x, p1, p2, p3 ) \
        { \
            *(x) = (((PNDIS_OPEN_BLOCK)(p1))->NdisCommonOpenBlock.WanSendHandler)( \
                ((PNDIS_OPEN_BLOCK)(p1))->NdisCommonOpenBlock.BindingHandle, (p2), \
                (PNDIS_PACKET)(p3) ); \
        }
#else
    #define WanMiniportSend( x, p1, p2, p3 ) \
        { \
            *(x) = (((PNDIS_OPEN_BLOCK)(p1))->WanSendHandler)( \
                ((PNDIS_OPEN_BLOCK)(p1))->BindingHandle, (p2), (PNDIS_PACKET)(p3) ); \
        }
#endif
#ifdef _X86_
    #define NdisMoveMappedMemory( p1, p2, p3 )  RtlCopyMemory( p1, p2, p3 )
    #define NdisZeroMappedMemory( p1, p2 )      RtlZeroMemory( p1, p2 )
    #define NdisCopyLookaheadData( p1, p2, p3, p4 ) RtlCopyMemory( p1, p2, p3 )
    #define NdisRawWritePortBufferUshort( p1, p2, p3 ) \
        WRITE_PORT_BUFFER_USHORT( (PUSHORT)(p1), (PUSHORT)(p2), p3 )
    #define NdisRawWritePortBufferUlong( p1, p2, p3 ) \
        WRITE_PORT_BUFFER_ULONG( (PULONG)(p1), (PULONG)(p2), p3 )
    #define NdisRawReadPortBufferUshort( p1, p2, p3 ) \
        READ_PORT_BUFFER_USHORT( (PUSHORT)(p1), (PUSHORT)(p2), p3 )
    #define NdisRawReadPortBufferUlong( p1, p2, p3 ) \
        READ_PORT_BUFFER_ULONG( (PULONG)(p1), (PULONG)(p2), p3 )
    #define NdisReadRegisterUchar( p1, p2 ) \
        *(p2) = *((volatile UCHAR * const)(p1))
    #define NdisReadRegisterUshort( p1, p2 ) \
        *(p2) = *((volatile USHORT * const)(p1))
    #define NdisReadRegisterUlong( p1, p2 ) \
        *(p2) = *((volatile ULONG * const)(p1))
#endif
#if NDIS_LEGACY_DRIVER
    #define NdisSetPacketCancelId( x, p )       NDIS_SET_PACKET_CANCEL_ID( x, p )
    #define NdisGetPacketCancelId( x )          NDIS_GET_PACKET_CANCEL_ID( x )
    #define NdisGetPacketFlags( x )             ((x)->Private.Flags)
    #define NdisSetPacketFlags( x, p )          ((x)->Private.Flags |= (p))
    #define NdisClearPacketFlags( x, p )        ((x)->Private.Flags &= ~(p))
    #define NdisReinitializePacket( x ) \
        { \
            (x)->Private.Head = (PNDIS_BUFFER)NULL; \
            (x)->Private.ValidCounts = FALSE; \
        }
    #define NdisQueryBuffer( x, p1, p2 ) \
        { \
            if( (p1) != NULL ) { \
                *(PVOID *)(p1) = MmGetSystemAddressForMdl( x ); \
            } \
            *(p2) = MmGetMdlByteCount( x ); \
        }
    #define NdisGetFirstBufferFromPacket( x, p1, p2, p3, p4 ) \
        { \
            PNDIS_BUFFER    _v; \
            _v = (x)->Private.Head; \
            *(p1) = _v; \
            if( _v ) { \
                *(p2) = MmGetSystemAddressForMdl( _v ); \
                *(p3) = *(p4) = MmGetMdlByteCount( _v ); \
                for( _v = _v->Next; _v != NULL; _v = _v->Next ) { \
                    *(p4) += MmGetMdlByteCount( _v ); \
                } \
            } else { \
                *(p2) = 0; \
                *(p3) = 0; \
                *(p4) = 0; \
            } \
        }
    #define NdisGetFirstBufferFromPacketSafe( x, p1, p2, p3, p4, p5 ) \
        { \
            PNDIS_BUFFER    _v; \
            _v = (x)->Private.Head; \
            *(p1) = _v; \
            if( _v ) { \
                *(p2) = MmGetSystemAddressForMdlSafe( _v, p5 ); \
                *(p3) = *(p4) = MmGetMdlByteCount( _v ); \
                for( _v = _v->Next; _v != NULL; _v = _v->Next ) { \
                    *(p4) += MmGetMdlByteCount( _v ); \
                } \
            } else { \
                *(p2) = 0; \
                *(p3) = 0; \
                *(p4) = 0; \
            } \
        }
    #define NdisRecalculatePacketCounts( x ) \
        { \
            PNDIS_BUFFER _v = (x)->Private.Head; \
            if( _v ) { \
                while( _v->Next ) { \
                    _v = _v->Next; \
                } \
                (x)->Private.Tail = _v; \
            } \
            (x)->Private.ValidCounts = FALSE; \
        }
    #define NdisChainBufferAtFront( x, p ) \
        { \
            PNDIS_BUFFER _v = (p); \
            for( ;; ) { \
                if( _v->Next == NULL ) { \
                    break; \
                } \
                _v = _v->Next; \
            } \
            if( (x)->Private.Head == NULL ) { \
                (x)->Private.Tail = _v; \
            } \
            _v->Next = (x)->Private.Head; \
            (x)->Private.Head = p; \
            (x)->Private.ValidCounts = FALSE; \
        }
    #define NdisChainBufferAtBack( x, p ) \
        { \
            PNDIS_BUFFER _v = (p); \
            for( ;; ) { \
                if( _v->Next == NULL ) { \
                    break; \
                } \
                _v = _v->Next; \
            } \
            if( (x)->Private.Head != NULL ) { \
                (x)->Private.Tail->Next = p; \
            } else { \
                (x)->Private.Head = p; \
            } \
            (x)->Private.Tail = _v; \
            (x)->Private.ValidCounts = FALSE; \
        }
    #define NdisQueryPacketLength( x, p ) \
        { \
            if( !(x)->Private.ValidCounts ) { \
                NdisQueryPacket( x, NULL, NULL, NULL, p ); \
            } else { \
                *(p) = (x)->Private.TotalLength; \
            } \
        }
    #define NdisInitializeWorkItem( x, p1, p2 ) \
        { \
            (x)->Context = p1; \
            (x)->Context = p2; \
        }
#endif
#if NDIS_LEGACY_PROTOCOL
    #define NdisSetSendFlags( x, p )            (x)->Private.Flags = (p)
    #define NdisQuerySendFlags( x, p )          *(p) = (x)->Private.Flags
    #ifdef __cplusplus
        #define NdisSend( x, p1, p2 ) \
            { \
                *(x) = (((PNDIS_OPEN_BLOCK)(p1))->NdisCommonOpenBlock.SendHandler)( \
                    ((PNDIS_OPEN_BLOCK)(p1))->NdisCommonOpenBlock.BindingHandle, 
                    (p2) ); \
            }
        #define NdisSendPackets( x, p1, p2 ) \
            { \
                (((PNDIS_OPEN_BLOCK)(x))->NdisCommonOpenBlock.SendPacketsHandler)( \
                    (PNDIS_OPEN_BLOCK)(x), (p1), (p2) ); \
            }
        #define NdisTransferData( x, p1, p2, p3, p4, p5, p6 ) \
            { \
                *(x) = (((PNDIS_OPEN_BLOCK)(p1))->NdisCommonOpenBlock.TransferDataHandler)( \
                    ((PNDIS_OPEN_BLOCK)(p1))->NdisCommonOpenBlock.BindingHandle, (p2), \
                    (p3), (p4), (p5), (p6) ); \
            }
    #else
        #define NdisSend( x, p1, p2 ) \
            { \
                *(x) = (((PNDIS_OPEN_BLOCK)(p1))->SendHandler)( \
                    ((PNDIS_OPEN_BLOCK)(p1))->BindingHandle, (p2) ); \
            }
        #define NdisSendPackets( x, p1, p2 ) \
            { \
                (((PNDIS_OPEN_BLOCK)(x))->SendPacketsHandler)( \
                    (PNDIS_OPEN_BLOCK)(x), (p1), (p2) ); \
            }
        #define NdisTransferData( x, p1, p2, p3, p4, p5, p6 ) \
            { \
                *(x) = (((PNDIS_OPEN_BLOCK)(p1))->TransferDataHandler)( \
                    ((PNDIS_OPEN_BLOCK)(p1))->BindingHandle, (p2), (p3), (p4), (p5), \
                    (p6) ); \
            }
    #endif
#endif
#if NDIS_LEGACY_MINIPORT
    #define NdisMUpdateSharedMemory( p1, p2, p3, p4 )
    #define NdisMInitializeWrapper( p1, p2, p3, p4 ) \
        NdisInitializeWrapper( p1, p2, p3, p4 )
    #define NdisIMInitializeDeviceInstance( p1, p2 ) \
        NdisIMInitializeDeviceInstanceEx( p1, p2, NULL )
    #define NdisMSetAttributes( p1, p2, p3, p4 ) \
        NdisMSetAttributesEx( p1, p2, 0, (p3) ? NDIS_ATTRIBUTE_BUS_MASTER : 0, p4 )
    #define NdisMSendComplete( x, p1, p2 ) \
        (*((PNDIS_MINIPORT_BLOCK)(x))->SendCompleteHandler)( x, p1, p2 )
    #define NdisMSendResourcesAvailable( x ) \
        (*((PNDIS_MINIPORT_BLOCK)(x))->SendResourcesHandler)( x )
    #define NdisMTransferDataComplete( x, p1, p2, p3 ) \
        (*((PNDIS_MINIPORT_BLOCK)(x))->TDCompleteHandler)( x, p1, p2, p3 )
    #define NdisMWanSendComplete( x, p1, p2 ) \
        (*((PNDIS_MINIPORT_BLOCK)(x))->WanSendCompleteHandler)( x, p1, p2 )
    #define NdisMQueryInformationComplete( x, p ) \
        (*((PNDIS_MINIPORT_BLOCK)(x))->QueryCompleteHandler)( x, p )
    #define NdisMSetInformationComplete( x, p ) \
        (*((PNDIS_MINIPORT_BLOCK)(x))->SetCompleteHandler)( x, p )
    #define NdisMIndicateReceivePacket( x, p1, p2 ) \
        { (*((PNDIS_MINIPORT_BLOCK)(x))->PacketIndicateHandler)( x, p1, p2 ); }
    #define NdisMWanIndicateReceive( p1, p2, p3, p4, p5 ) \
        (*((PNDIS_MINIPORT_BLOCK)(p2))->WanRcvHandler)( p1, p2, p3, p4, p5 )
    #define NdisMWanIndicateReceiveComplete( x, p ) \
        (*((PNDIS_MINIPORT_BLOCK)(x))->WanRcvCompleteHandler)( x, p )
    #define NdisMCmRequestComplete( p1, p2, p3, p4, p5 ) \
        NdisCoRequestComplete( p1, p2, p3, p4, p5 )
    #ifdef __cplusplus
        #define NdisMEthIndicateReceive( x, p1, p2, p3, p4, p5, p6 ) \
            { (*((PNDIS_MINIPORT_BLOCK)(x))->EthRxIndicateHandler)( \
            ((PNDIS_MINIPORT_BLOCK)(x))->FilterDbs.EthDB, p1, p2, p2, p3, p4, p5, p6 ); }
        #define NdisMTrIndicateReceive( x, p1, p2, p3, p4, p5, p6 ) \
            { (*((PNDIS_MINIPORT_BLOCK)(x))->TrRxIndicateHandler)( \
            ((PNDIS_MINIPORT_BLOCK)(x))->FilterDbs.TrDB, p1, p2, p3, p4, p5, p6 ); }
        #define NdisMEthIndicateReceiveComplete( x ) \
            { (*((PNDIS_MINIPORT_BLOCK)(x))->EthRxCompleteHandler)( \
            ((PNDIS_MINIPORT_BLOCK)(x))->FilterDbs.EthDB ); }
        #define NdisMTrIndicateReceiveComplete( x ) \
            { (*((PNDIS_MINIPORT_BLOCK)(x))->TrRxCompleteHandler)( \
            ((PNDIS_MINIPORT_BLOCK)(x))->FilterDbs.TrDB ); }
    #else
        #define NdisMEthIndicateReceive( x, p1, p2, p3, p4, p5, p6 ) \
            { (*((PNDIS_MINIPORT_BLOCK)(x))->EthRxIndicateHandler)( \
            ((PNDIS_MINIPORT_BLOCK)(x))->EthDB, p1, p2, p2, p3, p4, p5, p6 ); }
        #define NdisMTrIndicateReceive( x, p1, p2, p3, p4, p5, p6 ) \
            { (*((PNDIS_MINIPORT_BLOCK)(x))->TrRxIndicateHandler)( \
            ((PNDIS_MINIPORT_BLOCK)(x))->TrDB, p1, p2, p3, p4, p5, p6 ); }
        #define NdisMEthIndicateReceiveComplete( x ) \
            { (*((PNDIS_MINIPORT_BLOCK)(x))->EthRxCompleteHandler)( \
            ((PNDIS_MINIPORT_BLOCK)(x))->EthDB ); }
        #define NdisMTrIndicateReceiveComplete( x ) \
            { (*((PNDIS_MINIPORT_BLOCK)(x))->TrRxCompleteHandler)( \
            ((PNDIS_MINIPORT_BLOCK)(x))->TrDB ); }
    #endif
    #if NDIS_LEGACY_MINIPORT && !NDIS_WRAPPER && !NDIS_SUPPORT_NDIS6
        #define NdisMResetComplete( x, p1, p2 ) \
            (*((PNDIS_MINIPORT_BLOCK)(x))->ResetCompleteHandler)( x, p1, p2 )
    #endif
#endif
#if NDIS_SUPPORT_NDIS6
    #define NdisAdjustMdlLength( x, p )         ((x)->ByteLength = (p))
#endif
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #define NdisSetNetBufferListProtocolId( x, p ) \
        *((PUCHAR)(&NET_BUFFER_LIST_INFO( x, NetBufferListProtocolId )) = (p)
    #define NdisQueryMdl( x, p1, p2, p3 ) \
        { \
            if( (p1) != NULL ) { \
                *(PVOID *)(p1) = MmGetSystemAddressForMdlSafe( x, p3 ); \
            } \
            *(p2) = MmGetMdlByteCount( x ); \
        }
    #define NdisQueryMdlOffset( x, p1, p2 ) \
        { \
            *(p1) = MmGetMdlByteOffset( x ); \
            *(p2) = MmGetMdlByteCount( x ); \
        }
    #define NdisGetMdlPhysicalArraySize( x, p ) \
        (*(p) = NDIS_MDL_TO_SPAN_PAGES( x ))
    #define NdisGetNextMdl( x, p ) \
        { *(p) = (x)->Next; }
    #define NdisTestNblFlag( x, p )             (((x)->NblFlags & (p)) != 0)
    #define NdisTestNblFlags( x, p )            (((x)->NblFlags & (p)) == (p))
    #define NdisSetNblFlag( x, p )              ((x)->NblFlags |= (p))
    #define NdisClearNblFlag( x, p )            ((x)->NblFlags &= ~(p))
    #define NdisMCmOidRequestComplete( p1, p2, p3, p4, p5 ) \
        NdisCoOidRequestComplete( p1, p2, p3, p4, p5 )
#endif

/* Other macros */
#if NDIS_LEGACY_DRIVER
    #define NDIS_GET_PACKET_PROTOCOL_TYPE( x ) \
        ((x)->Private.Flags & NDIS_PROTOCOL_ID_MASK)
    #define NDIS_OOB_DATA_FROM_PACKET( x ) \
        (PNDIS_PACKET_OOB_DATA)((PUCHAR)(x) + (x)->Private.NdisPacketOobOffset)
    #define NDIS_GET_PACKET_HEADER_SIZE( x ) \
        ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(x) + \
        (x)->Private.NdisPacketOobOffset))->HeaderSize
    #define NDIS_GET_PACKET_STATUS( x ) \
        ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(x) + \
        (x)->Private.NdisPacketOobOffset))->Status
    #define NDIS_GET_PACKET_TIME_TO_SEND( x ) \
        ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(x) + \
        (x)->Private.NdisPacketOobOffset))->TimeToSend
    #define NDIS_GET_PACKET_TIME_SENT( x ) \
        ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(x) + \
        (x)->Private.NdisPacketOobOffset))->TimeSent
    #define NDIS_GET_PACKET_TIME_RECEIVED( x ) \
        ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(x) + \
        (x)->Private.NdisPacketOobOffset))->TimeReceived
    #define NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO( x, p1, p2 ) \
        { \
            if( !((x)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS) || \
                !((x)->Private.NdisPacketFlags & \
                fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO)) { \
                *(p1) = NULL; \
                *(p2) = 0; \
            } else { \
                *(p1) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(x) + \
                    (x)->Private.NdisPacketOobOffset))->MediaSpecificInformation; \
                *(p2) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(x) + \
                    (x)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo; \
            } \
        }
    #define NDIS_SET_PACKET_HEADER_SIZE( x, p ) \
        ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(x) + \
        (x)->Private.NdisPacketOobOffset))->HeaderSize = (p)
    #define NDIS_SET_PACKET_STATUS( x, p ) \
        ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(x) + \
        (x)->Private.NdisPacketOobOffset))->Status = (p)
    #define NDIS_SET_PACKET_TIME_TO_SEND( x, p ) \
        ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(x) + \
        (x)->Private.NdisPacketOobOffset))->TimeToSend = (p)
    #define NDIS_SET_PACKET_TIME_SENT( x, p ) \
        ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(x) + \
        (x)->Private.NdisPacketOobOffset))->TimeSent = (p)
    #define NDIS_SET_PACKET_TIME_RECEIVED( x, p ) \
        ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(x) + \
        (x)->Private.NdisPacketOobOffset))->TimeReceived = (p)
    #define NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO( x, p1, p2 ) \
        { \
            if( (x)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS ) { \
                (x)->Private.NdisPacketFlags |= fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO; \
                ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(x) + \
                    (x)->Private.NdisPacketOobOffset))->MediaSpecificInformation = (p1); \
                ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(x) + \
                    (x)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo = (p2); \
            } \
        }
    #define NDIS_PACKET_EXTENSION_FROM_PACKET( x ) \
        ((PNDIS_PACKET_EXTENSION)((PUCHAR)(x) + (x)->Private.NdisPacketOobOffset + \
        sizeof( NDIS_PACKET_OOB_DATA )))
    #define NDIS_PER_PACKET_INFO_FROM_PACKET( x, p ) \
        ((PNDIS_PACKET_EXTENSION)((PUCHAR)(x) + (x)->Private.NdisPacketOobOffset + \
        sizeof( NDIS_PACKET_OOB_DATA )))->NdisPacketInfo[(p)]
    #define NDIS_GET_ORIGINAL_PACKET( x ) \
        NDIS_PER_PACKET_INFO_FROM_PACKET( x, OriginalPacketInfo )
    #define NDIS_SET_ORIGINAL_PACKET( x, p ) \
        NDIS_PER_PACKET_INFO_FROM_PACKET( x, OriginalPacketInfo ) = (p)
    #define NDIS_GET_PACKET_CANCEL_ID( x ) \
        NDIS_PER_PACKET_INFO_FROM_PACKET( x, PacketCancelId )
    #define NDIS_SET_PACKET_CANCEL_ID( x, p ) \
        NDIS_PER_PACKET_INFO_FROM_PACKET( x, PacketCancelId ) = (p)
    #define NDIS_PACKET_FIRST_NDIS_BUFFER( x )  ((x)->Private.Head)
    #define NDIS_PACKET_LAST_NDIS_BUFFER( x )   ((x)->Private.Tail)
    #define NDIS_PACKET_VALID_COUNTS( x )       ((x)->Private.ValidCounts)
#endif
#if NDIS_SUPPORT_NDIS6
    #define NDIS_STATUS_INDICATION_SET_FLAG( x, p ) ((x)->Flags |= (p))
    #define NDIS_STATUS_INDICATION_TEST_FLAG( x, p )    (((x)->Flags & (p)) != 0)
    #define NDIS_STATUS_INDICATION_CLEAR_FLAG( x, p )   ((x)->Flags &= ~(p))
#endif
#if NDIS_SUPPORT_NDIS6 || NDIS60
    #ifdef __cplusplus 
        #define NET_BUFFER_NEXT_NB( x )         ((x)->NetBufferHeader.NetBufferData.Next)
        #define NET_BUFFER_FIRST_MDL( x ) \
            ((x)->NetBufferHeader.NetBufferData.MdlChain)
        #define NET_BUFFER_DATA_LENGTH( x ) \
            ((x)->NetBufferHeader.NetBufferData.NbDataLength.DataLength)
        #define NET_BUFFER_DATA_OFFSET( x ) \
            ((x)->NetBufferHeader.NetBufferData.DataOffset)
        #define NET_BUFFER_CURRENT_MDL( x ) \
            ((x)->NetBufferHeader.NetBufferData.CurrentMdl)
        #define NET_BUFFER_CURRENT_MDL_OFFSET( x ) \
            ((x)->NetBufferHeader.NetBufferData.CurrentMdlOffset)
        #define NET_BUFFER_LIST_NEXT_NBL( x ) \
            ((x)->NetBufferListHeader.NetBufferListData.Next)
        #define NET_BUFFER_LIST_FIRST_NB( x ) \
            ((x)->NetBufferListHeader.NetBufferListData.FirstNetBuffer)
    #else
        #define NET_BUFFER_NEXT_NB( x )         ((x)->Next)
        #define NET_BUFFER_FIRST_MDL( x )       ((x)->MdlChain)
        #define NET_BUFFER_DATA_LENGTH( x )     ((x)->DataLength)
        #define NET_BUFFER_DATA_OFFSET( x )     ((x)->DataOffset)
        #define NET_BUFFER_CURRENT_MDL( x )     ((x)->CurrentMdl)
        #define NET_BUFFER_CURRENT_MDL_OFFSET( x )  ((x)->CurrentMdlOffset)
        #define NET_BUFFER_LIST_NEXT_NBL( x )   ((x)->Next)
        #define NET_BUFFER_LIST_FIRST_NB( x )   ((x)->FirstNetBuffer)
    #endif
    #define NET_BUFFER_PROTOCOL_RESERVED( x )   ((x)->ProtocolReserved)
    #define NET_BUFFER_MINIPORT_RESERVED( x )   ((x)->MiniportReserved)
    #define NET_BUFFER_CHECKSUM_BIAS( x )       ((x)->ChecksumBias)
    #define NET_BUFFER_LIST_FLAGS( x )          ((x)->Flags)
    #define NET_BUFFER_LIST_NBL_FLAGS( x )      ((x)->NblFlags)
    #define NET_BUFFER_LIST_PROTOCOL_RESERVED( x )  ((x)->ProtocolReserved)
    #define NET_BUFFER_LIST_MINIPORT_RESERVED( x )  ((x)->MiniportReserved)
    #define NET_BUFFER_LIST_CONTEXT_DATA_START( x ) \
        ((PUCHAR)(((x)->Context) + 1) + (x)->Context->Offset)
    #define NET_BUFFER_LIST_CONTEXT_DATA_SIZE( x )  (((x)->Context)->Size)
    #define NET_BUFFER_LIST_INFO( p1, p2 )      ((p1)->NetBufferListInfo[p2])
    #define NET_BUFFER_LIST_STATUS( x )         ((x)->Status)
    #define NDIS_GET_NET_BUFFER_LIST_CANCEL_ID( x ) \
        NET_BUFFER_LIST_INFO( x, NetBufferListCancelId )
    #define NDIS_SET_NET_BUFFER_LIST_CANCEL_ID( x, p ) \
        NET_BUFFER_LIST_INFO( x, NetBufferListCancelId ) = p
    #define NDIS_NBL_ADD_MEDIA_SPECIFIC_INFO( x, p ) \
        { \
            PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION    _v = NULL; \
            if( NET_BUFFER_LIST_INFO( x, MediaSpecificInformation ) != NULL ) { \
                _v = (PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION)(NET_BUFFER_LIST_INFO( x, \
                    MediaSpecificInformation )); \
            } \
            NET_BUFFER_LIST_INFO( x, MediaSpecificInformation ) = (p); \
            (p)->NextEntry = _v; \
        }
    #define NDIS_NBL_REMOVE_MEDIA_SPECIFIC_INFO( x, p ) \
        { \
            PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION    *_v; \
            _v = (PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION *)&(NET_BUFFER_LIST_INFO( x, \
                MediaSpecificInformation )); \
            for( ; *_v != NULL; _v = &(*_v)->NextEntry ) { \
                if( (*_v)->Tag == (p)->Tag ) { \
                    *_v = (*_v)->NextEntry; \
                    break; \
                } \
            } \
        }
    #define NDIS_NBL_GET_MEDIA_SPECIFIC_INFO( x, p1, p2 ) \
        { \
            PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION    _v; \
            (p2) = NULL; \
            _v = (PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION)(NET_BUFFER_LIST_INFO( x, \
                MediaSpecificInformation )); \
            for( ; _v != NULL; _v = _v->NextEntry ) { \
                if( _v->Tag == (p1) ) { \
                    (p2) = _v; \
                    break; \
                } \
            } \
        }
    #define NET_BUFFER_LIST_SET_HASH_TYPE( x, p ) \
        (NET_BUFFER_LIST_INFO( x, NetBufferListHashInfo ) = UlongToPtr( ((PtrToLong( \
        NET_BUFFER_LIST_INFO( x, NetBufferListHashInfo ) ) & ~NDIS_HASH_TYPE_MASK) | \
        ((p) & NDIS_HASH_TYPEMASK)) ))
    #define NET_BUFFER_LIST_SET_HASH_FUNCTION( x, p ) \
        (NET_BUFFER_LIST_INFO( x, NetBufferListHashInfo ) = UlongToPtr( ((PtrToLong( \
        NET_BUFFER_LIST_INFO( x, NetBufferListHashInfo ) ) & \
        ~NDIS_HASH_FUNCTION_MASK) | ((p) & NDIS_HASH_FUNCTION_MASK)) ))
    #define NET_BUFFER_LIST_SET_HASH_VALUE( x, p ) \
        (NET_BUFFER_LIST_INFO( x, NetBufferListHashValue ) = UlongToPtr( p ))
    #define NET_BUFFER_LIST_GET_HASH_TYPE( x ) \
        (PtrToUlong( NET_BUFFER_LIST_INFO( x, NetBufferListHashInfo ) ) & \
        NDIS_HASH_TYPE_MASK)
    #define NET_BUFFER_LIST_GET_HASH_FUNCTION( x ) \
        (PtrToUlong( NET_BUFFER_LIST_INFO( x, NetBufferListHashInfo ) ) & \
        NDIS_HASH_FUNCTION_MASK)
    #define NET_BUFFER_LIST_GET_HASH_VALUE( x ) \
        PtrToUlong( NET_BUFFER_LIST_INFO( x, NetBufferListHashValue ) )
    #define NDIS_MDL_TO_SPAN_PAGES( x ) \
        (MmGetMdlByteCount( x ) == 0 ? 1 : (ADDRESS_AND_SIZE_TO_SPAN_PAGES( \
        MmGetMdlVirtualAddress( x ), MmGetMdlByteCount( x ) )))
    #define NDIS_MDL_LINKAGE( x )               ((x)->Next)
#endif
#if NDIS_SUPPORT_NDIS61
    #define NET_BUFFER_DATA_PHYSICAL_ADDRESS( x )   ((x)->DataPhysicalAddress)
#endif
#if NDIS_SUPPORT_NDIS620
    #define NET_BUFFER_FIRST_SHARED_MEM_INFO( x )   ((x)->SharedMemoryInfo)
    #define NET_BUFFER_SHARED_MEM_NEXT_SEGMENT( x ) ((x)->NextSharedMemorySegment)
    #define NET_BUFFER_SHARED_MEM_FLAGS( x )    ((x)->SharedMemoryFlags)
    #define NET_BUFFER_SHARED_MEM_HANDLE( x )   ((x)->SharedMemoryHandle)
    #define NET_BUFFER_SHARED_MEM_OFFSET( x )   ((x)->SharedMemoryOffset)
    #define NET_BUFFER_SHARED_MEM_LENGTH( x )   ((x)->SharedMemoryLength)
    #define NET_BUFFER_SCATTER_GATHER_LIST( x ) ((x)->ScatterGatherList)
    #define NDIS_NBL_ADD_MEDIA_SPECIFIC_INFO_EX( x, p ) \
        { \
            PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION_EX v; \
            v = NET_BUFFER_LIST_INFO( x, MediaSpecificInformationEx ); \
            NET_BUFFER_LIST_INFO( x, MediaSpecificInformationEx ) = (p); \
            (p)->NextEntry = v; \
        }
    #define NDIS_NBL_REMOVE_MEDIA_SPECIFIC_INFO_EX( x, p ) \
        { \
            PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION_EX *v; \
            v = (PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION_EX *) \
                &NET_BUFFER_LIST_INFO( x, MediaSpecificInformationEx ); \
            while( *v != NULL ) { \
                if( (*v)->Tag == (p)->Tag ) { \
                    *v = (*v)->NextEntry; \
                    break; \
                } \
                v = &(*v)->NextEntry; \
            } \
        }
    #define NDIS_NBL_GET_MEDIA_SPECIFIC_INFO_EX( x, p1, p2 ) \
        { \
            PNDIS_NBL_MEDIA_SPECIFIC_INFORMATION_EX v; \
            p2 = NULL; \
            v = (PNDIS_MEDIA_SPECIFIC_INFORMATION_EX) \
                NET_BUFFER_LIST_INFO( x, MediaSpecificInformationEx ); \
            while( v != NULL ) { \
                if( v->Tag == p1 ) { \
                    p2 = v; \
                    break; \
                } \
                v = v->NextEntry; \
            } \
        }
    #define NET_BUFFER_LIST_RECEIVE_FILTER_ID( x ) \
        (((PNDIS_NET_BUFFER_LIST_FILTERING_INFO)&NET_BUFFER_LIST_INFO( x, \
        NetBufferListFilteringInfo ))->FilteringInfo.FilterId)
    #define NET_BUFFER_LIST_RECEIVE_QUEUE_ID( x ) \
        (((PNDIS_NET_BUFFER_LIST_FILTERING_INFO)&NET_BUFFER_LIST_INFO( x, \
        NetBufferListFilteringInfo ))->FilteringInfo.QueueId)
#endif

/* Aliases */
#define NdisMoveMemory                      RtlCopyMemory
#define NdisZeroMemory                      RtlZeroMemory
#define NdisEqualMemory                     RtlEqualMemory
#define NdisFillMemory                      RtlFillMemory
#define NdisRetrieveUlong                   RtlRetrieveUlong
#define NdisStoreUlong                      RtlStroeUlong
#define NdisMoveToMappedMemory              NdisMoveMappedMemory
#define NdisMoveFromMappedMemory            NdisMoveMappedMemory
#define NdisGetCurrentSystemTime            KeQuerySystemTime
#define NdisInterlockedIncrement            InterlockedIncrement
#define NdisInterlockedDecrement            InterlockedDecrement
#define NdisInterlockedFlushSList           ExInterlockedFlushSList
#define NdisInitializeSListHead             ExInitializeSListHead
#define NdisQueryDepthSList                 ExQueryDepthSList
#define NdisInitializeListHead              InitializeListHead
#define NdisStallExecution                  KeStallExecutionProcessor
#define NdisEqualString                     RtlEqualUnicodeString
#define NdisEqualUnicodeString              RtlEqualUnicodeString
#define NdisInitAnsiString                  RtlInitString
#define NdisInitUnicodeString               RtlInitUnicodeString
#define NdisInitializeNPagedLookasideList   ExInitializeNPagedLookasideList
#define NdisDeleteNPagedLookasideList       ExDeleteNPagedLookasideList
#define NdisAllocateFromNPagedLookasideList ExAllocateFromNPagedLookasideList
#define NdisFreeToNPagedLookasideList       ExFreeToNPagedLookasideList
#define NdisMSetupDmaTransfer               NdisSetupDmaTransfer
#define NdisMCompleteDmaTransfer            NdisCompleteDmaTransfer
#define NdisMCmOpenAddressFamilyComplete    NdisCmOpenAddressFamilyComplete
#define NdisMCmNotifyCloseAddressFamily     NdisCmNotifyCloseAddressFamily
#define NdisMCmCloseAddressFamilyComplete   NdisCmCloseAddressFamilyComplete
#define NdisMCmRegisterSapComplete          NdisCmRegisterSapComplete
#define NdisMCmDeregisterSapComplete        NdisCmDeregisterSapComplete
#define NdisMCmMakeCallComplete             NdisCmMakeCallComplete
#define NdisMCmCloseCallComplete            NdisCmCloseCallComplete
#define NdisMCmAddPartyComplete             NdisCmAddPartyComplete
#define NdisMCmDropPartyComplete            NdisCmDropPartyComplete
#define NdisMCmDispatchIncomingCall         NdisCmDispatchIncomingCall
#define NdisMCmDispatchCallConnected        NdisCmDispatchCallConnected
#define NdisMCmModifyCallQoSComplete        NdisCmModifyCallQoSComplete
#define NdisMCmDispatchIncomingCallQoSChange    NdisCmDispatchIncomingCallQoSChange
#define NdisMCmDispatchIncomingCloseCall    NdisCmDispatchIncomingCloseCall
#define NdisMCmDispatchIncomingDropParty    NdisCmDispatchIncomingDropParty

#ifdef _X86_
    #define NdisWriteRegisterUchar          WRITE_REGISTER_UCHAR
    #define NdisWriteRegisterUshort         WRITE_REGISTER_USHORT
    #define NdisWriteRegisterUlong          WRITE_REGISTER_ULONG
#endif
#if NDIS_LEGACY_DRIVER
    #define NdisFreeBuffer                  IoFreeMdl
#endif
#if NDIS_SUPPORT_NDIS6
    #define NdisMAllocateSharedMemoryAsyncEx    NdisMAllocateSharedMemoryAsync
#endif

#if NDIS_LEGACY_DRIVER

__inline VOID NdisQueryPacket( PNDIS_PACKET x, PUINT p1, PUINT p2, PNDIS_BUFFER *p3,
                               PUINT p4 )
{
    if( p3 != NULL ) {
        PNDIS_BUFFER *v1 = p3;
        *v1 = x->Private.Head;
    }
    if( p1 || p2 || p4 ) {
        if( !x->Private.ValidCounts ) {
            PNDIS_BUFFER    v2 = (x)->Private.Head;
            UINT            v3 = 0;
            UINT            v4 = 0;
            UINT            v5 = 0;
            UINT            v6;
            UINT            v7;
            while( v2 != NULL ) {
                NdisQueryBufferOffset( v2, &v7, &v6 );
                v3 += v6;
                v4 += (UINT)NDIS_BUFFER_TO_SPAN_PAGES( v2 );
                ++v5;
                v2 = v2->Next;
            }
            x->Private.Count = v5;
            x->Private.TotalLength = v3;
            x->Private.PhysicalCount = v4;
            x->Private.ValidCounts = TRUE;
        }
        if( p1 ) {
            *p1 = x->Private.PhysicalCount;
        }
        if( p2 ) {
            *p2 = x->Private.Count;
        }
        if( p4 ) {
            *p4 = x->Private.TotalLength;
        }
    }
}

#endif /* NDIS_LEGACY_DRIVER */

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* _NDIS_ */
