1/*
2 * ndis.h
3 *
4 * Network Device Interface Specification definitions
5 *
6 * This file is part of the ReactOS DDK package.
7 *
8 * Contributors:
9 *   Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
10 *
11 * THIS SOFTWARE IS NOT COPYRIGHTED
12 *
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
15 *
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20 *
21 * DEFINES: i386                 - Target platform is i386
22 *          NDIS_WRAPPER         - Define only for NDIS library
23 *          NDIS_MINIPORT_DRIVER - Define only for NDIS miniport drivers
24 *          NDIS40               - Use NDIS 4.0 structures by default
25 *          NDIS50               - Use NDIS 5.0 structures by default
26 *          NDIS51               - Use NDIS 5.1 structures by default
27 *          NDIS40_MINIPORT      - Building NDIS 4.0 miniport driver
28 *          NDIS50_MINIPORT      - Building NDIS 5.0 miniport driver
29 *          NDIS51_MINIPORT      - Building NDIS 5.1 miniport driver
30 */
31
32#ifndef _NDIS_
33#define _NDIS_
34
35#ifndef NDIS_WDM
36#define NDIS_WDM 0
37#endif
38
39#include "ntddk.h"
40#include "netpnp.h"
41#include "ntstatus.h"
42#include "netevent.h"
43#include <qos.h>
44
45typedef int NDIS_STATUS, *PNDIS_STATUS;
46
47#include "ntddndis.h"
48
49#if !defined(_WINDEF_H)
50typedef unsigned int UINT, *PUINT;
51#endif
52
53#ifdef __cplusplus
54extern "C" {
55#endif
56
57#ifndef __NET_PNP__
58#define __NET_PNP__
59
60typedef enum _NET_DEVICE_POWER_STATE {
61  NetDeviceStateUnspecified = 0,
62  NetDeviceStateD0,
63  NetDeviceStateD1,
64  NetDeviceStateD2,
65  NetDeviceStateD3,
66  NetDeviceStateMaximum
67} NET_DEVICE_POWER_STATE, *PNET_DEVICE_POWER_STATE;
68
69typedef enum _NET_PNP_EVENT_CODE {
70  NetEventSetPower,
71  NetEventQueryPower,
72  NetEventQueryRemoveDevice,
73  NetEventCancelRemoveDevice,
74  NetEventReconfigure,
75  NetEventBindList,
76  NetEventBindsComplete,
77  NetEventPnPCapabilities,
78  NetEventPause,
79  NetEventRestart,
80  NetEventPortActivation,
81  NetEventPortDeactivation,
82  NetEventIMReEnableDevice,
83  NetEventMaximum
84} NET_PNP_EVENT_CODE, *PNET_PNP_EVENT_CODE;
85
86typedef struct _NET_PNP_EVENT {
87  NET_PNP_EVENT_CODE NetEvent;
88  PVOID Buffer;
89  ULONG BufferLength;
90  ULONG_PTR NdisReserved[4];
91  ULONG_PTR TransportReserved[4];
92  ULONG_PTR TdiReserved[4];
93  ULONG_PTR TdiClientReserved[4];
94} NET_PNP_EVENT, *PNET_PNP_EVENT;
95
96#endif /* __NET_PNP__ */
97
98#if !defined(NDIS_WRAPPER)
99
100#if (defined(NDIS_MINIPORT_MAJOR_VERSION) ||  \
101    (defined(NDIS_MINIPORT_MINOR_VERSION)) || \
102    (defined(NDIS_PROTOCOL_MAJOR_VERSION)) || \
103    (defined(NDIS_PROTOCOL_MINOR_VERSION)) || \
104    (defined(NDIS_FILTER_MAJOR_VERSION)) ||   \
105    (defined(NDIS_FILTER_MINOR_VERSION)))
106#error "Driver should not redefine NDIS reserved macros"
107#endif
108
109#if defined(NDIS_MINIPORT_DRIVER)
110
111#if defined(NDIS620_MINIPORT)
112#define NDIS_MINIPORT_MAJOR_VERSION 6
113#define NDIS_MINIPORT_MINOR_VERSION 20
114#elif defined(NDIS61_MINIPORT)
115#define NDIS_MINIPORT_MAJOR_VERSION 6
116#define NDIS_MINIPORT_MINOR_VERSION 1
117#elif defined(NDIS60_MINIPORT)
118#define NDIS_MINIPORT_MAJOR_VERSION 6
119#define NDIS_MINIPORT_MINOR_VERSION 0
120#elif defined(NDIS51_MINIPORT)
121#define NDIS_MINIPORT_MAJOR_VERSION 5
122#define NDIS_MINIPORT_MINOR_VERSION 1
123#elif defined(NDIS50_MINIPORT)
124#define NDIS_MINIPORT_MAJOR_VERSION 5
125#define NDIS_MINIPORT_MINOR_VERSION 0
126#else
127#error "Only NDIS miniport drivers with version >= 5 are supported"
128#endif
129
130#if ((NDIS_MINIPORT_MAJOR_VERSION == 6) &&    \
131       (NDIS_MINIPORT_MINOR_VERSION != 20) && \
132       (NDIS_MINIPORT_MINOR_VERSION != 1) &&  \
133       (NDIS_MINIPORT_MINOR_VERSION != 0))
134#error "Invalid miniport major/minor version combination"
135#elif ((NDIS_MINIPORT_MAJOR_VERSION == 5) &&  \
136       (NDIS_MINIPORT_MINOR_VERSION != 1) &&  \
137       (NDIS_MINIPORT_MINOR_VERSION != 0))
138#error "Invalid miniport major/minor version combination"
139#endif
140
141#if  (NDIS_MINIPORT_MAJOR_VERSION == 6) && \
142     ((NDIS_MINIPORT_MINOR_VERSION == 20 && NTDDI_VERSION < NTDDI_WIN7)  || \
143      (NDIS_MINIPORT_MINOR_VERSION == 1 && NTDDI_VERSION < NTDDI_VISTA) || \
144      (NDIS_MINIPORT_MINOR_VERSION == 0 && NTDDI_VERSION < NTDDI_VISTA))
145#error "Wrong NDIS/DDI version"
146#elif ((NDIS_MINIPORT_MAJOR_VERSION == 5) && \
147       (((NDIS_MINIPORT_MINOR_VERSION == 1) && (NTDDI_VERSION < NTDDI_WINXP)) || \
148         ((NDIS_MINIPORT_MINOR_VERSION == 0) && (NTDDI_VERSION < NTDDI_WIN2K))))
149#error "Wrong NDIS/DDI version"
150#endif
151
152
153#endif /* defined(NDIS_MINIPORT_DRIVER) */
154
155#if defined(NDIS30)
156#error "Only NDIS Protocol drivers version 4 or later are supported"
157#endif
158
159#if defined(NDIS620)
160#define NDIS_PROTOCOL_MAJOR_VERSION 6
161#define NDIS_PROTOCOL_MINOR_VERSION 20
162#define NDIS_FILTER_MAJOR_VERSION 6
163#define NDIS_FILTER_MINOR_VERSION 20
164#elif defined(NDIS61)
165#define NDIS_PROTOCOL_MAJOR_VERSION 6
166#define NDIS_PROTOCOL_MINOR_VERSION 1
167#define NDIS_FILTER_MAJOR_VERSION 6
168#define NDIS_FILTER_MINOR_VERSION 1
169#elif defined(NDIS60)
170#define NDIS_PROTOCOL_MAJOR_VERSION 6
171#define NDIS_PROTOCOL_MINOR_VERSION 0
172#define NDIS_FILTER_MAJOR_VERSION 6
173#define NDIS_FILTER_MINOR_VERSION 0
174#elif defined(NDIS51)
175#define NDIS_PROTOCOL_MAJOR_VERSION 5
176#define NDIS_PROTOCOL_MINOR_VERSION 1
177#elif defined(NDIS50)
178#define NDIS_PROTOCOL_MAJOR_VERSION 5
179#define NDIS_PROTOCOL_MINOR_VERSION 0
180#elif defined(NDIS40)
181#define NDIS_PROTOCOL_MAJOR_VERSION 4
182#define NDIS_PROTOCOL_MINOR_VERSION 0
183#endif
184
185#if !defined(NDIS_MINIPORT_DRIVER) && !defined(NDIS_PROTOCOL_MAJOR_VERSION)
186#define NDIS40
187#define NDIS_PROTOCOL_MAJOR_VERSION 4
188#define NDIS_PROTOCOL_MINOR_VERSION 0
189#endif
190
191#if defined(NDIS_FILTER_MAJOR_VERSION)
192
193#if ((NDIS_FILTER_MAJOR_VERSION == 6) &&  \
194     (NDIS_FILTER_MINOR_VERSION != 20) && \
195     (NDIS_FILTER_MINOR_VERSION != 1) &&  \
196     (NDIS_FILTER_MINOR_VERSION != 0))
197#error "Invalid Filter version"
198#endif
199
200#endif /* defined(NDIS_FILTER_MAJOR_VERSION) */
201
202
203#if defined(NDIS_PROTOCOL_MAJOR_VERSION)
204
205#if ((NDIS_PROTOCOL_MAJOR_VERSION == 6) &&  \
206     (NDIS_PROTOCOL_MINOR_VERSION != 20) && \
207     (NDIS_PROTOCOL_MINOR_VERSION != 1) &&  \
208     (NDIS_PROTOCOL_MINOR_VERSION != 0))
209#error "Invalid Protocol version"
210#elif ((NDIS_PROTOCOL_MAJOR_VERSION == 5) && \
211     (NDIS_PROTOCOL_MINOR_VERSION != 1) && (NDIS_PROTOCOL_MINOR_VERSION != 0))
212#error "Invalid Protocol version"
213#elif ((NDIS_PROTOCOL_MAJOR_VERSION == 4) && (NDIS_PROTOCOL_MINOR_VERSION != 0))
214#error "Invalid Protocol major/minor version"
215#endif
216
217#if ((NDIS_PROTOCOL_MAJOR_VERSION == 6) && (NTDDI_VERSION < NTDDI_VISTA))
218#error "Wrong NDIS/DDI version"
219#endif
220
221#endif /* defined(NDIS_PROTOCOL_MAJOR_VERSION) */
222
223#endif /* !defined(NDIS_WRAPPER) */
224
225#if !defined(NDIS_LEGACY_MINIPORT)
226
227#if ((defined(NDIS_MINIPORT_DRIVER) && (NDIS_MINIPORT_MAJOR_VERSION < 6)) || NDIS_WRAPPER)
228#define NDIS_LEGACY_MINIPORT    1
229#else
230#define NDIS_LEGACY_MINIPORT    0
231#endif
232
233#endif /* !defined(NDIS_LEGACY_MINIPORT) */
234
235#if !defined(NDIS_LEGACY_PROTOCOL)
236
237#if ((defined(NDIS_PROTOCOL_MAJOR_VERSION) && (NDIS_PROTOCOL_MAJOR_VERSION < 6)) || NDIS_WRAPPER)
238#define NDIS_LEGACY_PROTOCOL    1
239#else
240#define NDIS_LEGACY_PROTOCOL    0
241#endif
242
243#endif /* !defined(NDIS_LEGACY_PROTOCOL) */
244
245#if !defined(NDIS_LEGACY_DRIVER)
246
247#if (NDIS_LEGACY_MINIPORT || NDIS_LEGACY_PROTOCOL || NDIS_WRAPPER)
248#define NDIS_LEGACY_DRIVER      1
249#else
250#define NDIS_LEGACY_DRIVER      0
251#endif
252
253#endif /* !defined(NDIS_LEGACY_DRIVER) */
254
255#if !defined(NDIS_SUPPORT_NDIS6)
256
257#if ((defined (NDIS_MINIPORT_MAJOR_VERSION) && (NDIS_MINIPORT_MAJOR_VERSION >= 6)) || \
258     (defined (NDIS60)) || NDIS_WRAPPER)
259#define NDIS_SUPPORT_NDIS6      1
260#else
261#define NDIS_SUPPORT_NDIS6      0
262#endif
263
264#endif /* !defined(NDIS_SUPPORT_NDIS6) */
265
266#if !defined(NDIS_SUPPORT_NDIS61)
267#if  (((defined (NDIS_MINIPORT_MAJOR_VERSION) && (NDIS_MINIPORT_MAJOR_VERSION >= 6)) && \
268       (defined (NDIS_MINIPORT_MINOR_VERSION) && (NDIS_MINIPORT_MINOR_VERSION >= 1))) || \
269      (defined (NDIS61)) || NDIS_WRAPPER)
270#define NDIS_SUPPORT_NDIS61      1
271#else
272#define NDIS_SUPPORT_NDIS61      0
273#endif
274#endif /* !defined(NDIS_SUPPORT_NDIS61) */
275
276#if !defined(NDIS_SUPPORT_NDIS620)
277
278#if  (((defined (NDIS_MINIPORT_MAJOR_VERSION) && (NDIS_MINIPORT_MAJOR_VERSION >= 6)) && \
279       (defined (NDIS_MINIPORT_MINOR_VERSION) && (NDIS_MINIPORT_MINOR_VERSION >= 20))) || \
280      (defined (NDIS620)) || NDIS_WRAPPER)
281#define NDIS_SUPPORT_NDIS620      1
282#else
283#define NDIS_SUPPORT_NDIS620      0
284#endif
285
286#endif /* !defined(NDIS_SUPPORT_NDIS620) */
287
288#if (NDIS_SUPPORT_NDIS620)
289#undef NDIS_SUPPORT_NDIS61
290#define NDIS_SUPPORT_NDIS61 1
291#endif
292
293#if (NDIS_SUPPORT_NDIS61)
294#undef NDIS_SUPPORT_NDIS6
295#define NDIS_SUPPORT_NDIS6 1
296#endif
297
298#if defined(NDIS61_MINIPORT) || defined(NDIS60_MINIPORT) || defined(NDIS61) || \
299    defined(NDIS60) || defined(NDIS_WRAPPER) || defined(NDIS_LEGACY_DRIVER)
300#define NDIS_SUPPORT_60_COMPATIBLE_API      1
301#else
302#define NDIS_SUPPORT_60_COMPATIBLE_API      0
303#endif
304
305#if defined(NDIS_WRAPPER)
306#define NDISAPI
307#else
308#define NDISAPI DECLSPEC_IMPORT
309#endif
310
311typedef PVOID QUEUED_CLOSE; //FIXME : Doesn't exist in public headers
312
313typedef struct _X_FILTER FDDI_FILTER, *PFDDI_FILTER;
314typedef struct _X_FILTER TR_FILTER, *PTR_FILTER;
315typedef struct _X_FILTER NULL_FILTER, *PNULL_FILTER;
316
317typedef struct _NDIS_MINIPORT_BLOCK NDIS_MINIPORT_BLOCK, *PNDIS_MINIPORT_BLOCK;
318
319typedef struct _REFERENCE {
320  KSPIN_LOCK SpinLock;
321  USHORT ReferenceCount;
322  BOOLEAN Closing;
323} REFERENCE, *PREFERENCE;
324
325/* NDIS base types */
326
327typedef struct _NDIS_SPIN_LOCK {
328  KSPIN_LOCK SpinLock;
329  KIRQL OldIrql;
330} NDIS_SPIN_LOCK, *PNDIS_SPIN_LOCK;
331
332typedef struct _NDIS_EVENT {
333  KEVENT Event;
334} NDIS_EVENT, *PNDIS_EVENT;
335
336typedef PVOID NDIS_HANDLE, *PNDIS_HANDLE;
337
338typedef ANSI_STRING NDIS_ANSI_STRING, *PNDIS_ANSI_STRING;
339typedef UNICODE_STRING NDIS_STRING, *PNDIS_STRING;
340
341typedef MDL NDIS_BUFFER, *PNDIS_BUFFER;
342
343/* NDIS_STATUS constants */
344#define NDIS_STATUS_SUCCESS                     ((NDIS_STATUS)STATUS_SUCCESS)
345#define NDIS_STATUS_PENDING                     ((NDIS_STATUS)STATUS_PENDING)
346#define NDIS_STATUS_NOT_RECOGNIZED              ((NDIS_STATUS)0x00010001L)
347#define NDIS_STATUS_NOT_COPIED                  ((NDIS_STATUS)0x00010002L)
348#define NDIS_STATUS_NOT_ACCEPTED                ((NDIS_STATUS)0x00010003L)
349#define NDIS_STATUS_CALL_ACTIVE                 ((NDIS_STATUS)0x00010007L)
350#define NDIS_STATUS_INDICATION_REQUIRED         ((NDIS_STATUS)STATUS_NDIS_INDICATION_REQUIRED)
351#define NDIS_STATUS_ONLINE                      ((NDIS_STATUS)0x40010003L)
352#define NDIS_STATUS_RESET_START                 ((NDIS_STATUS)0x40010004L)
353#define NDIS_STATUS_RESET_END                   ((NDIS_STATUS)0x40010005L)
354#define NDIS_STATUS_RING_STATUS                 ((NDIS_STATUS)0x40010006L)
355#define NDIS_STATUS_CLOSED                      ((NDIS_STATUS)0x40010007L)
356#define NDIS_STATUS_WAN_LINE_UP                 ((NDIS_STATUS)0x40010008L)
357#define NDIS_STATUS_WAN_LINE_DOWN               ((NDIS_STATUS)0x40010009L)
358#define NDIS_STATUS_WAN_FRAGMENT                ((NDIS_STATUS)0x4001000AL)
359#define NDIS_STATUS_MEDIA_CONNECT               ((NDIS_STATUS)0x4001000BL)
360#define NDIS_STATUS_MEDIA_DISCONNECT            ((NDIS_STATUS)0x4001000CL)
361#define NDIS_STATUS_HARDWARE_LINE_UP            ((NDIS_STATUS)0x4001000DL)
362#define NDIS_STATUS_HARDWARE_LINE_DOWN          ((NDIS_STATUS)0x4001000EL)
363#define NDIS_STATUS_INTERFACE_UP                ((NDIS_STATUS)0x4001000FL)
364#define NDIS_STATUS_INTERFACE_DOWN              ((NDIS_STATUS)0x40010010L)
365#define NDIS_STATUS_MEDIA_BUSY                  ((NDIS_STATUS)0x40010011L)
366#define NDIS_STATUS_MEDIA_SPECIFIC_INDICATION   ((NDIS_STATUS)0x40010012L)
367#define NDIS_STATUS_WW_INDICATION               NDIS_STATUS_MEDIA_SPECIFIC_INDICATION
368#define NDIS_STATUS_LINK_SPEED_CHANGE           ((NDIS_STATUS)0x40010013L)
369#define NDIS_STATUS_WAN_GET_STATS               ((NDIS_STATUS)0x40010014L)
370#define NDIS_STATUS_WAN_CO_FRAGMENT             ((NDIS_STATUS)0x40010015L)
371#define NDIS_STATUS_WAN_CO_LINKPARAMS           ((NDIS_STATUS)0x40010016L)
372#if NDIS_SUPPORT_NDIS6
373#define NDIS_STATUS_LINK_STATE                  ((NDIS_STATUS)0x40010017L)
374#define NDIS_STATUS_NETWORK_CHANGE              ((NDIS_STATUS)0x40010018L)
375#define NDIS_STATUS_MEDIA_SPECIFIC_INDICATION_EX ((NDIS_STATUS)0x40010019L)
376#define NDIS_STATUS_PORT_STATE                  ((NDIS_STATUS)0x40010022L)
377#define NDIS_STATUS_OPER_STATUS                 ((NDIS_STATUS)0x40010023L)
378#define NDIS_STATUS_PACKET_FILTER               ((NDIS_STATUS)0x40010024L)
379#endif /* NDIS_SUPPORT_NDIS6 */
380#define NDIS_STATUS_WAN_CO_MTULINKPARAMS        ((NDIS_STATUS)0x40010025L)
381
382#if NDIS_SUPPORT_NDIS6
383
384#define NDIS_STATUS_IP_OPER_STATUS              ((NDIS_STATUS)0x40010026L)
385
386#define NDIS_STATUS_OFFLOAD_PAUSE               ((NDIS_STATUS)0x40020001L)
387#define NDIS_STATUS_UPLOAD_ALL                  ((NDIS_STATUS)0x40020002L)
388#define NDIS_STATUS_OFFLOAD_RESUME              ((NDIS_STATUS)0x40020003L)
389#define NDIS_STATUS_OFFLOAD_PARTIAL_SUCCESS     ((NDIS_STATUS)0x40020004L)
390#define NDIS_STATUS_OFFLOAD_STATE_INVALID       ((NDIS_STATUS)0x40020005L)
391#define NDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG ((NDIS_STATUS)0x40020006L)
392#define NDIS_STATUS_TASK_OFFLOAD_HARDWARE_CAPABILITIES ((NDIS_STATUS)0x40020007L)
393#define NDIS_STATUS_OFFLOAD_ENCASPULATION_CHANGE ((NDIS_STATUS)0x40020008L)
394#define NDIS_STATUS_TCP_CONNECTION_OFFLOAD_HARDWARE_CAPABILITIES ((NDIS_STATUS)0x4002000BL)
395
396#if (NDIS_SUPPORT_NDIS61)
397#define NDIS_STATUS_HD_SPLIT_CURRENT_CONFIG     ((NDIS_STATUS)0x4002000CL)
398#endif
399
400#if (NDIS_SUPPORT_NDIS620)
401#define NDIS_STATUS_RECEIVE_QUEUE_STATE         ((NDIS_STATUS)0x4002000DL)
402#endif
403
404#define NDIS_STATUS_OFFLOAD_IM_RESERVED1        ((NDIS_STATUS)0x40020100L)
405#define NDIS_STATUS_OFFLOAD_IM_RESERVED2        ((NDIS_STATUS)0x40020101L)
406#define NDIS_STATUS_OFFLOAD_IM_RESERVED3        ((NDIS_STATUS)0x40020102L)
407
408#define NDIS_STATUS_DOT11_SCAN_CONFIRM          ((NDIS_STATUS)0x40030000L)
409#define NDIS_STATUS_DOT11_MPDU_MAX_LENGTH_CHANGED ((NDIS_STATUS)0x40030001L)
410#define NDIS_STATUS_DOT11_ASSOCIATION_START     ((NDIS_STATUS)0x40030002L)
411#define NDIS_STATUS_DOT11_ASSOCIATION_COMPLETION ((NDIS_STATUS)0x40030003L)
412#define NDIS_STATUS_DOT11_CONNECTION_START      ((NDIS_STATUS)0x40030004L)
413#define NDIS_STATUS_DOT11_CONNECTION_COMPLETION ((NDIS_STATUS)0x40030005L)
414#define NDIS_STATUS_DOT11_ROAMING_START         ((NDIS_STATUS)0x40030006L)
415#define NDIS_STATUS_DOT11_ROAMING_COMPLETION    ((NDIS_STATUS)0x40030007L)
416#define NDIS_STATUS_DOT11_DISASSOCIATION        ((NDIS_STATUS)0x40030008L)
417#define NDIS_STATUS_DOT11_TKIPMIC_FAILURE       ((NDIS_STATUS)0x40030009L)
418#define NDIS_STATUS_DOT11_PMKID_CANDIDATE_LIST  ((NDIS_STATUS)0x4003000AL)
419#define NDIS_STATUS_DOT11_PHY_STATE_CHANGED     ((NDIS_STATUS)0x4003000BL)
420#define NDIS_STATUS_DOT11_LINK_QUALITY          ((NDIS_STATUS)0x4003000CL)
421#define NDIS_STATUS_DOT11_INCOMING_ASSOC_STARTED ((NDIS_STATUS)0x4003000DL)
422#define NDIS_STATUS_DOT11_INCOMING_ASSOC_REQUEST_RECEIVED ((NDIS_STATUS)0x4003000EL)
423#define NDIS_STATUS_DOT11_INCOMING_ASSOC_COMPLETION ((NDIS_STATUS)0x4003000FL)
424#define NDIS_STATUS_DOT11_STOP_AP               ((NDIS_STATUS)0x40030010L)
425#define NDIS_STATUS_DOT11_PHY_FREQUENCY_ADOPTED ((NDIS_STATUS)0x40030011L)
426#define NDIS_STATUS_DOT11_CAN_SUSTAIN_AP        ((NDIS_STATUS)0x40030012L)
427
428#define NDIS_STATUS_WWAN_DEVICE_CAPS            ((NDIS_STATUS)0x40041000)
429#define NDIS_STATUS_WWAN_READY_INFO             ((NDIS_STATUS)0x40041001)
430#define NDIS_STATUS_WWAN_RADIO_STATE            ((NDIS_STATUS)0x40041002)
431#define NDIS_STATUS_WWAN_PIN_INFO               ((NDIS_STATUS)0x40041003)
432#define NDIS_STATUS_WWAN_PIN_LIST               ((NDIS_STATUS)0x40041004)
433#define NDIS_STATUS_WWAN_HOME_PROVIDER          ((NDIS_STATUS)0x40041005)
434#define NDIS_STATUS_WWAN_PREFERRED_PROVIDERS    ((NDIS_STATUS)0x40041006)
435#define NDIS_STATUS_WWAN_VISIBLE_PROVIDERS      ((NDIS_STATUS)0x40041007)
436#define NDIS_STATUS_WWAN_REGISTER_STATE         ((NDIS_STATUS)0x40041008)
437#define NDIS_STATUS_WWAN_PACKET_SERVICE         ((NDIS_STATUS)0x40041009)
438#define NDIS_STATUS_WWAN_SIGNAL_STATE           ((NDIS_STATUS)0x4004100a)
439#define NDIS_STATUS_WWAN_CONTEXT_STATE          ((NDIS_STATUS)0x4004100b)
440#define NDIS_STATUS_WWAN_PROVISIONED_CONTEXTS   ((NDIS_STATUS)0x4004100c)
441#define NDIS_STATUS_WWAN_SERVICE_ACTIVATION     ((NDIS_STATUS)0x4004100d)
442#define NDIS_STATUS_WWAN_SMS_CONFIGURATION      ((NDIS_STATUS)0x4004100e)
443#define NDIS_STATUS_WWAN_SMS_RECEIVE            ((NDIS_STATUS)0x4004100f)
444#define NDIS_STATUS_WWAN_SMS_SEND               ((NDIS_STATUS)0x40041010)
445#define NDIS_STATUS_WWAN_SMS_DELETE             ((NDIS_STATUS)0x40041011)
446#define NDIS_STATUS_WWAN_SMS_STATUS             ((NDIS_STATUS)0x40041012)
447#define NDIS_STATUS_WWAN_DNS_ADDRESS            ((NDIS_STATUS)0x40041013)
448
449#define NDIS_STATUS_WWAN_VENDOR_SPECIFIC        ((NDIS_STATUS)0x40043000)
450
451#endif /* NDIS_SUPPORT_NDIS6 */
452
453#if (NDIS_SUPPORT_NDIS620)
454#define NDIS_STATUS_PM_WOL_PATTERN_REJECTED     ((NDIS_STATUS)0x40030051L)
455#define NDIS_STATUS_PM_OFFLOAD_REJECTED         ((NDIS_STATUS)0x40030052L)
456#define NDIS_STATUS_PM_CAPABILITIES_CHANGE      ((NDIS_STATUS)0x40030053L)
457#endif
458
459#define NDIS_STATUS_NOT_RESETTABLE              ((NDIS_STATUS)0x80010001L)
460#define NDIS_STATUS_SOFT_ERRORS                 ((NDIS_STATUS)0x80010003L)
461#define NDIS_STATUS_HARD_ERRORS                 ((NDIS_STATUS)0x80010004L)
462#define NDIS_STATUS_BUFFER_OVERFLOW             ((NDIS_STATUS)STATUS_BUFFER_OVERFLOW)
463#define NDIS_STATUS_FAILURE                     ((NDIS_STATUS)STATUS_UNSUCCESSFUL)
464#define NDIS_STATUS_RESOURCES                   ((NDIS_STATUS)STATUS_INSUFFICIENT_RESOURCES)
465#define NDIS_STATUS_CLOSING                     ((NDIS_STATUS)0xC0010002L)
466#define NDIS_STATUS_BAD_VERSION                 ((NDIS_STATUS)0xC0010004L)
467#define NDIS_STATUS_BAD_CHARACTERISTICS         ((NDIS_STATUS)0xC0010005L)
468#define NDIS_STATUS_ADAPTER_NOT_FOUND           ((NDIS_STATUS)0xC0010006L)
469#define NDIS_STATUS_OPEN_FAILED                 ((NDIS_STATUS)0xC0010007L)
470#define NDIS_STATUS_DEVICE_FAILED               ((NDIS_STATUS)0xC0010008L)
471#define NDIS_STATUS_MULTICAST_FULL              ((NDIS_STATUS)0xC0010009L)
472#define NDIS_STATUS_MULTICAST_EXISTS            ((NDIS_STATUS)0xC001000AL)
473#define NDIS_STATUS_MULTICAST_NOT_FOUND         ((NDIS_STATUS)0xC001000BL)
474#define NDIS_STATUS_REQUEST_ABORTED             ((NDIS_STATUS)0xC001000CL)
475#define NDIS_STATUS_RESET_IN_PROGRESS           ((NDIS_STATUS)0xC001000DL)
476#define NDIS_STATUS_CLOSING_INDICATING          ((NDIS_STATUS)0xC001000EL)
477#define NDIS_STATUS_NOT_SUPPORTED               ((NDIS_STATUS)STATUS_NOT_SUPPORTED)
478#define NDIS_STATUS_INVALID_PACKET              ((NDIS_STATUS)0xC001000FL)
479#define NDIS_STATUS_OPEN_LIST_FULL              ((NDIS_STATUS)0xC0010010L)
480#define NDIS_STATUS_ADAPTER_NOT_READY           ((NDIS_STATUS)0xC0010011L)
481#define NDIS_STATUS_ADAPTER_NOT_OPEN            ((NDIS_STATUS)0xC0010012L)
482#define NDIS_STATUS_NOT_INDICATING              ((NDIS_STATUS)0xC0010013L)
483#define NDIS_STATUS_INVALID_LENGTH              ((NDIS_STATUS)0xC0010014L)
484#define NDIS_STATUS_INVALID_DATA                ((NDIS_STATUS)0xC0010015L)
485#define NDIS_STATUS_BUFFER_TOO_SHORT            ((NDIS_STATUS)0xC0010016L)
486#define NDIS_STATUS_INVALID_OID                 ((NDIS_STATUS)0xC0010017L)
487#define NDIS_STATUS_ADAPTER_REMOVED             ((NDIS_STATUS)0xC0010018L)
488#define NDIS_STATUS_UNSUPPORTED_MEDIA           ((NDIS_STATUS)0xC0010019L)
489#define NDIS_STATUS_GROUP_ADDRESS_IN_USE        ((NDIS_STATUS)0xC001001AL)
490#define NDIS_STATUS_FILE_NOT_FOUND              ((NDIS_STATUS)0xC001001BL)
491#define NDIS_STATUS_ERROR_READING_FILE          ((NDIS_STATUS)0xC001001CL)
492#define NDIS_STATUS_ALREADY_MAPPED              ((NDIS_STATUS)0xC001001DL)
493#define NDIS_STATUS_RESOURCE_CONFLICT           ((NDIS_STATUS)0xC001001EL)
494#define NDIS_STATUS_NO_CABLE                    ((NDIS_STATUS)0xC001001FL)
495
496#define NDIS_STATUS_INVALID_SAP                 ((NDIS_STATUS)0xC0010020L)
497#define NDIS_STATUS_SAP_IN_USE                  ((NDIS_STATUS)0xC0010021L)
498#define NDIS_STATUS_INVALID_ADDRESS             ((NDIS_STATUS)0xC0010022L)
499#define NDIS_STATUS_VC_NOT_ACTIVATED            ((NDIS_STATUS)0xC0010023L)
500#define NDIS_STATUS_DEST_OUT_OF_ORDER           ((NDIS_STATUS)0xC0010024L)
501#define NDIS_STATUS_VC_NOT_AVAILABLE            ((NDIS_STATUS)0xC0010025L)
502#define NDIS_STATUS_CELLRATE_NOT_AVAILABLE      ((NDIS_STATUS)0xC0010026L)
503#define NDIS_STATUS_INCOMPATABLE_QOS            ((NDIS_STATUS)0xC0010027L)
504#define NDIS_STATUS_AAL_PARAMS_UNSUPPORTED      ((NDIS_STATUS)0xC0010028L)
505#define NDIS_STATUS_NO_ROUTE_TO_DESTINATION     ((NDIS_STATUS)0xC0010029L)
506
507#define NDIS_STATUS_TOKEN_RING_OPEN_ERROR       ((NDIS_STATUS)0xC0011000L)
508#define NDIS_STATUS_INVALID_DEVICE_REQUEST      ((NDIS_STATUS)STATUS_INVALID_DEVICE_REQUEST)
509#define NDIS_STATUS_NETWORK_UNREACHABLE         ((NDIS_STATUS)STATUS_NETWORK_UNREACHABLE)
510
511#if NDIS_SUPPORT_NDIS6
512
513#define NDIS_STATUS_SEND_ABORTED                ((NDIS_STATUS)STATUS_NDIS_REQUEST_ABORTED)
514#define NDIS_STATUS_PAUSED                      ((NDIS_STATUS)STATUS_NDIS_PAUSED)
515#define NDIS_STATUS_INTERFACE_NOT_FOUND         ((NDIS_STATUS)STATUS_NDIS_INTERFACE_NOT_FOUND)
516#define NDIS_STATUS_INVALID_PARAMETER           ((NDIS_STATUS)STATUS_INVALID_PARAMETER)
517#define NDIS_STATUS_UNSUPPORTED_REVISION        ((NDIS_STATUS)STATUS_NDIS_UNSUPPORTED_REVISION)
518#define NDIS_STATUS_INVALID_PORT                ((NDIS_STATUS)STATUS_NDIS_INVALID_PORT)
519#define NDIS_STATUS_INVALID_PORT_STATE          ((NDIS_STATUS)STATUS_NDIS_INVALID_PORT_STATE)
520#define NDIS_STATUS_INVALID_STATE               ((NDIS_STATUS)STATUS_INVALID_DEVICE_STATE)
521#define NDIS_STATUS_MEDIA_DISCONNECTED          ((NDIS_STATUS)STATUS_NDIS_MEDIA_DISCONNECTED)
522#define NDIS_STATUS_LOW_POWER_STATE             ((NDIS_STATUS)STATUS_NDIS_LOW_POWER_STATE)
523#define NDIS_STATUS_DOT11_AUTO_CONFIG_ENABLED   ((NDIS_STATUS)STATUS_NDIS_DOT11_AUTO_CONFIG_ENABLED)
524#define NDIS_STATUS_DOT11_MEDIA_IN_USE          ((NDIS_STATUS)STATUS_NDIS_DOT11_MEDIA_IN_USE)
525#define NDIS_STATUS_DOT11_POWER_STATE_INVALID   ((NDIS_STATUS)STATUS_NDIS_DOT11_POWER_STATE_INVALID)
526#define NDIS_STATUS_UPLOAD_IN_PROGRESS          ((NDIS_STATUS)0xC0231001L)
527#define NDIS_STATUS_REQUEST_UPLOAD              ((NDIS_STATUS)0xC0231002L)
528#define NDIS_STATUS_UPLOAD_REQUESTED            ((NDIS_STATUS)0xC0231003L)
529#define NDIS_STATUS_OFFLOAD_TCP_ENTRIES         ((NDIS_STATUS)0xC0231004L)
530#define NDIS_STATUS_OFFLOAD_PATH_ENTRIES        ((NDIS_STATUS)0xC0231005L)
531#define NDIS_STATUS_OFFLOAD_NEIGHBOR_ENTRIES    ((NDIS_STATUS)0xC0231006L)
532#define NDIS_STATUS_OFFLOAD_IP_ADDRESS_ENTRIES  ((NDIS_STATUS)0xC0231007L)
533#define NDIS_STATUS_OFFLOAD_HW_ADDRESS_ENTRIES  ((NDIS_STATUS)0xC0231008L)
534#define NDIS_STATUS_OFFLOAD_VLAN_ENTRIES        ((NDIS_STATUS)0xC0231009L)
535#define NDIS_STATUS_OFFLOAD_TCP_XMIT_BUFFER     ((NDIS_STATUS)0xC023100AL)
536#define NDIS_STATUS_OFFLOAD_TCP_RCV_BUFFER      ((NDIS_STATUS)0xC023100BL)
537#define NDIS_STATUS_OFFLOAD_TCP_RCV_WINDOW      ((NDIS_STATUS)0xC023100CL)
538#define NDIS_STATUS_OFFLOAD_VLAN_MISMATCH       ((NDIS_STATUS)0xC023100DL)
539#define NDIS_STATUS_OFFLOAD_DATA_NOT_ACCEPTED   ((NDIS_STATUS)0xC023100EL)
540#define NDIS_STATUS_OFFLOAD_POLICY              ((NDIS_STATUS)0xC023100FL)
541#define NDIS_STATUS_OFFLOAD_DATA_PARTIALLY_ACCEPTED ((NDIS_STATUS)0xC0231010L)
542#define NDIS_STATUS_OFFLOAD_REQUEST_RESET       ((NDIS_STATUS)0xC0231011L)
543
544#if NDIS_SUPPORT_NDIS620
545#define NDIS_STATUS_PM_WOL_PATTERN_LIST_FULL    ((NDIS_STATUS)STATUS_NDIS_PM_WOL_PATTERN_LIST_FULL)
546#define NDIS_STATUS_PM_PROTOCOL_OFFLOAD_LIST_FULL ((NDIS_STATUS)STATUS_NDIS_PM_PROTOCOL_OFFLOAD_LIST_FULL)
547#endif
548
549#endif /* NDIS_SUPPORT_NDIS6 */
550
551#if (NDIS_SUPPORT_NDIS620)
552#define NDIS_STATUS_OFFLOAD_CONNECTION_REJECTED ((NDIS_STATUS)STATUS_NDIS_OFFLOAD_CONNECTION_REJECTED)
553#endif
554
555/* NDIS error codes for error logging */
556
557#define NDIS_ERROR_CODE ULONG
558
559#define NDIS_ERROR_CODE_RESOURCE_CONFLICT               EVENT_NDIS_RESOURCE_CONFLICT
560#define NDIS_ERROR_CODE_OUT_OF_RESOURCES                EVENT_NDIS_OUT_OF_RESOURCE
561#define NDIS_ERROR_CODE_HARDWARE_FAILURE                EVENT_NDIS_HARDWARE_FAILURE
562#define NDIS_ERROR_CODE_ADAPTER_NOT_FOUND               EVENT_NDIS_ADAPTER_NOT_FOUND
563#define NDIS_ERROR_CODE_INTERRUPT_CONNECT               EVENT_NDIS_INTERRUPT_CONNECT
564#define NDIS_ERROR_CODE_DRIVER_FAILURE                  EVENT_NDIS_DRIVER_FAILURE
565#define NDIS_ERROR_CODE_BAD_VERSION                     EVENT_NDIS_BAD_VERSION
566#define NDIS_ERROR_CODE_TIMEOUT                         EVENT_NDIS_TIMEOUT
567#define NDIS_ERROR_CODE_NETWORK_ADDRESS                 EVENT_NDIS_NETWORK_ADDRESS
568#define NDIS_ERROR_CODE_UNSUPPORTED_CONFIGURATION       EVENT_NDIS_UNSUPPORTED_CONFIGURATION
569#define NDIS_ERROR_CODE_INVALID_VALUE_FROM_ADAPTER      EVENT_NDIS_INVALID_VALUE_FROM_ADAPTER
570#define NDIS_ERROR_CODE_MISSING_CONFIGURATION_PARAMETER EVENT_NDIS_MISSING_CONFIGURATION_PARAMETER
571#define NDIS_ERROR_CODE_BAD_IO_BASE_ADDRESS             EVENT_NDIS_BAD_IO_BASE_ADDRESS
572#define NDIS_ERROR_CODE_RECEIVE_SPACE_SMALL             EVENT_NDIS_RECEIVE_SPACE_SMALL
573#define NDIS_ERROR_CODE_ADAPTER_DISABLED                EVENT_NDIS_ADAPTER_DISABLED
574
575/* Memory allocation flags. Used by Ndis[Allocate|Free]Memory */
576#define NDIS_MEMORY_CONTIGUOUS            0x00000001
577#define NDIS_MEMORY_NONCACHED             0x00000002
578
579/* NIC attribute flags. Used by NdisMSetAttributes(Ex) */
580#define	NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT    0x00000001
581#define NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT   0x00000002
582#define NDIS_ATTRIBUTE_IGNORE_TOKEN_RING_ERRORS 0x00000004
583#define NDIS_ATTRIBUTE_BUS_MASTER               0x00000008
584#define NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER      0x00000010
585#define NDIS_ATTRIBUTE_DESERIALIZE              0x00000020
586#define NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND       0x00000040
587#define NDIS_ATTRIBUTE_SURPRISE_REMOVE_OK       0x00000080
588#define NDIS_ATTRIBUTE_NOT_CO_NDIS              0x00000100
589#define NDIS_ATTRIBUTE_USES_SAFE_BUFFER_APIS    0x00000200
590
591/* Lock */
592
593#if NDIS_SUPPORT_60_COMPATIBLE_API
594
595typedef union _NDIS_RW_LOCK_REFCOUNT {
596  UINT RefCount;
597  UCHAR cacheLine[16];
598} NDIS_RW_LOCK_REFCOUNT;
599
600typedef struct _NDIS_RW_LOCK {
601  __MINGW_EXTENSION union {
602    __MINGW_EXTENSION struct {
603      KSPIN_LOCK SpinLock;
604      PVOID Context;
605    };
606    UCHAR Reserved[16];
607  };
608  __MINGW_EXTENSION union {
609    NDIS_RW_LOCK_REFCOUNT RefCount[MAXIMUM_PROCESSORS];
610    ULONG RefCountEx[sizeof(NDIS_RW_LOCK_REFCOUNT)/sizeof(ULONG) * MAXIMUM_PROCESSORS];
611    __MINGW_EXTENSION struct {
612      KSPIN_LOCK RefCountLock;
613      volatile ULONG SharedRefCount;
614      volatile BOOLEAN WriterWaiting;
615    };
616  };
617} NDIS_RW_LOCK, *PNDIS_RW_LOCK;
618
619typedef struct _LOCK_STATE {
620  USHORT LockState;
621  KIRQL OldIrql;
622} LOCK_STATE, *PLOCK_STATE;
623
624#endif /* NDIS_SUPPORT_60_COMPATIBLE_API */
625
626/* Timer */
627
628typedef VOID
629(NTAPI NDIS_TIMER_FUNCTION)(
630  IN PVOID SystemSpecific1,
631  IN PVOID FunctionContext,
632  IN PVOID SystemSpecific2,
633  IN PVOID SystemSpecific3);
634typedef NDIS_TIMER_FUNCTION *PNDIS_TIMER_FUNCTION;
635
636typedef struct _NDIS_TIMER {
637  KTIMER Timer;
638  KDPC Dpc;
639} NDIS_TIMER, *PNDIS_TIMER;
640
641/* Hardware */
642
643typedef CM_MCA_POS_DATA NDIS_MCA_POS_DATA, *PNDIS_MCA_POS_DATA;
644typedef CM_EISA_SLOT_INFORMATION NDIS_EISA_SLOT_INFORMATION, *PNDIS_EISA_SLOT_INFORMATION;
645typedef CM_EISA_FUNCTION_INFORMATION NDIS_EISA_FUNCTION_INFORMATION, *PNDIS_EISA_FUNCTION_INFORMATION;
646typedef CM_PARTIAL_RESOURCE_LIST NDIS_RESOURCE_LIST, *PNDIS_RESOURCE_LIST;
647
648/* Flag bits */
649#define	READABLE_LOCAL_CLOCK                    0x00000001
650#define	CLOCK_NETWORK_DERIVED                   0x00000002
651#define	CLOCK_PRECISION                         0x00000004
652#define	RECEIVE_TIME_INDICATION_CAPABLE         0x00000008
653#define	TIMED_SEND_CAPABLE                      0x00000010
654#define	TIME_STAMP_CAPABLE                      0x00000020
655
656/* NDIS packet filter bits (OID_GEN_CURRENT_PACKET_FILTER) */
657#define NDIS_PACKET_TYPE_DIRECTED               0x00000001
658#define NDIS_PACKET_TYPE_MULTICAST              0x00000002
659#define NDIS_PACKET_TYPE_ALL_MULTICAST          0x00000004
660#define NDIS_PACKET_TYPE_BROADCAST              0x00000008
661#define NDIS_PACKET_TYPE_SOURCE_ROUTING         0x00000010
662#define NDIS_PACKET_TYPE_PROMISCUOUS            0x00000020
663#define NDIS_PACKET_TYPE_SMT                    0x00000040
664#define NDIS_PACKET_TYPE_ALL_LOCAL              0x00000080
665#define NDIS_PACKET_TYPE_GROUP                  0x00001000
666#define NDIS_PACKET_TYPE_ALL_FUNCTIONAL         0x00002000
667#define NDIS_PACKET_TYPE_FUNCTIONAL             0x00004000
668#define NDIS_PACKET_TYPE_MAC_FRAME              0x00008000
669
670/* NDIS protocol option bits (OID_GEN_PROTOCOL_OPTIONS) */
671#define NDIS_PROT_OPTION_ESTIMATED_LENGTH       0x00000001
672#define NDIS_PROT_OPTION_NO_LOOPBACK            0x00000002
673#define NDIS_PROT_OPTION_NO_RSVD_ON_RCVPKT      0x00000004
674
675/* NDIS MAC option bits (OID_GEN_MAC_OPTIONS) */
676#define NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA     0x00000001
677#define NDIS_MAC_OPTION_RECEIVE_SERIALIZED      0x00000002
678#define NDIS_MAC_OPTION_TRANSFERS_NOT_PEND      0x00000004
679#define NDIS_MAC_OPTION_NO_LOOPBACK             0x00000008
680#define NDIS_MAC_OPTION_FULL_DUPLEX             0x00000010
681#define	NDIS_MAC_OPTION_EOTX_INDICATION         0x00000020
682#define	NDIS_MAC_OPTION_8021P_PRIORITY          0x00000040
683#define NDIS_MAC_OPTION_RESERVED                0x80000000
684
685#define	NDIS_GUID_TO_OID                  0x00000001
686#define	NDIS_GUID_TO_STATUS               0x00000002
687#define	NDIS_GUID_ANSI_STRING             0x00000004
688#define	NDIS_GUID_UNICODE_STRING          0x00000008
689#define	NDIS_GUID_ARRAY                   0x00000010
690
691#if NDIS_LEGACY_DRIVER
692
693/* NDIS_PACKET_PRIVATE.Flags constants */
694#define fPACKET_WRAPPER_RESERVED             0x3f
695#define fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO 0x40
696#define fPACKET_ALLOCATED_BY_NDIS            0x80
697
698#define NDIS_FLAGS_PROTOCOL_ID_MASK          0x0000000f
699#define NDIS_FLAGS_MULTICAST_PACKET          0x00000010
700#define NDIS_FLAGS_RESERVED2                 0x00000020
701#define NDIS_FLAGS_RESERVED3                 0x00000040
702#define NDIS_FLAGS_DONT_LOOPBACK             0x00000080
703#define NDIS_FLAGS_IS_LOOPBACK_PACKET        0x00000100
704#define NDIS_FLAGS_LOOPBACK_ONLY             0x00000200
705#define NDIS_FLAGS_RESERVED4                 0x00000400
706#define NDIS_FLAGS_DOUBLE_BUFFERED           0x00000800
707#define NDIS_FLAGS_SENT_AT_DPC               0x00001000
708#define NDIS_FLAGS_USES_SG_BUFFER_LIST       0x00002000
709#define NDIS_FLAGS_USES_ORIGINAL_PACKET      0x00004000
710#define NDIS_FLAGS_PADDED                    0x00010000
711#define NDIS_FLAGS_XLATE_AT_TOP              0x00020000
712
713typedef NDIS_HANDLE PNDIS_PACKET_POOL;
714
715typedef struct _NDIS_PACKET_PRIVATE {
716  UINT PhysicalCount;
717  UINT TotalLength;
718  PNDIS_BUFFER Head;
719  PNDIS_BUFFER Tail;
720  PNDIS_PACKET_POOL Pool;
721  UINT Count;
722  ULONG Flags;
723  BOOLEAN ValidCounts;
724  UCHAR NdisPacketFlags;
725  USHORT NdisPacketOobOffset;
726} NDIS_PACKET_PRIVATE, *PNDIS_PACKET_PRIVATE;
727
728typedef struct _NDIS_PACKET {
729  NDIS_PACKET_PRIVATE Private;
730  __MINGW_EXTENSION union {
731    __MINGW_EXTENSION struct {
732      UCHAR MiniportReserved[2 * sizeof(PVOID)];
733      UCHAR WrapperReserved[2 * sizeof(PVOID)];
734    };
735    __MINGW_EXTENSION struct {
736      UCHAR MiniportReservedEx[3 * sizeof(PVOID)];
737      UCHAR WrapperReservedEx[sizeof(PVOID)];
738    };
739    __MINGW_EXTENSION struct {
740      UCHAR MacReserved[4 * sizeof(PVOID)];
741    };
742  };
743  ULONG_PTR Reserved[2];
744  UCHAR ProtocolReserved[1];
745} NDIS_PACKET, *PNDIS_PACKET, **PPNDIS_PACKET;
746
747typedef struct _NDIS_PACKET_STACK {
748  ULONG_PTR IMReserved[2];
749  ULONG_PTR NdisReserved[4];
750} NDIS_PACKET_STACK, *PNDIS_PACKET_STACK;
751
752#endif /* NDIS_LEGACY_DRIVER */
753
754typedef enum _NDIS_CLASS_ID {
755  NdisClass802_3Priority,
756  NdisClassWirelessWanMbxMailbox,
757  NdisClassIrdaPacketInfo,
758  NdisClassAtmAALInfo
759} NDIS_CLASS_ID;
760
761typedef struct _MEDIA_SPECIFIC_INFORMATION {
762  UINT NextEntryOffset;
763  NDIS_CLASS_ID ClassId;
764  UINT Size;
765  UCHAR ClassInformation[1];
766} MEDIA_SPECIFIC_INFORMATION, *PMEDIA_SPECIFIC_INFORMATION;
767
768#if NDIS_LEGACY_DRIVER
769typedef struct _NDIS_PACKET_OOB_DATA {
770  __MINGW_EXTENSION union {
771    ULONGLONG TimeToSend;
772    ULONGLONG TimeSent;
773  };
774  ULONGLONG TimeReceived;
775  UINT HeaderSize;
776  UINT SizeMediaSpecificInfo;
777  PVOID MediaSpecificInformation;
778  NDIS_STATUS Status;
779} NDIS_PACKET_OOB_DATA, *PNDIS_PACKET_OOB_DATA;
780#endif
781
782/* Request types used by NdisRequest */
783typedef enum _NDIS_REQUEST_TYPE {
784  NdisRequestQueryInformation,
785  NdisRequestSetInformation,
786  NdisRequestQueryStatistics,
787  NdisRequestOpen,
788  NdisRequestClose,
789  NdisRequestSend,
790  NdisRequestTransferData,
791  NdisRequestReset,
792  NdisRequestGeneric1,
793  NdisRequestGeneric2,
794  NdisRequestGeneric3,
795  NdisRequestGeneric4,
796#if NDIS_SUPPORT_NDIS6
797  NdisRequestMethod,
798#endif
799} NDIS_REQUEST_TYPE, *PNDIS_REQUEST_TYPE;
800
801#if NDIS_LEGACY_DRIVER
802typedef struct _NDIS_REQUEST {
803  UCHAR MacReserved[4 * sizeof(PVOID)];
804  NDIS_REQUEST_TYPE RequestType;
805  union _DATA {
806    struct QUERY_INFORMATION {
807      NDIS_OID Oid;
808      PVOID InformationBuffer;
809      UINT InformationBufferLength;
810      UINT BytesWritten;
811      UINT BytesNeeded;
812    } QUERY_INFORMATION;
813    struct SET_INFORMATION {
814      NDIS_OID Oid;
815      PVOID InformationBuffer;
816      UINT InformationBufferLength;
817      UINT BytesRead;
818      UINT BytesNeeded;
819    } SET_INFORMATION;
820 } DATA;
821#if (defined(NDIS50) || defined(NDIS51) || defined(NDIS50_MINIPORT) || defined(NDIS51_MINIPORT))
822  UCHAR NdisReserved[9 * sizeof(PVOID)];
823  __MINGW_EXTENSION union {
824    UCHAR CallMgrReserved[2 * sizeof(PVOID)];
825    UCHAR ProtocolReserved[2 * sizeof(PVOID)];
826  };
827  UCHAR MiniportReserved[2 * sizeof(PVOID)];
828#endif
829} NDIS_REQUEST, *PNDIS_REQUEST;
830#endif /* NDIS_LEGACY_DRIVER */
831
832/* Wide Area Networks definitions */
833
834#if NDIS_LEGACY_DRIVER
835typedef struct _NDIS_WAN_PACKET {
836  LIST_ENTRY WanPacketQueue;
837  PUCHAR CurrentBuffer;
838  ULONG CurrentLength;
839  PUCHAR StartBuffer;
840  PUCHAR EndBuffer;
841  PVOID ProtocolReserved1;
842  PVOID ProtocolReserved2;
843  PVOID ProtocolReserved3;
844  PVOID ProtocolReserved4;
845  PVOID MacReserved1;
846  PVOID MacReserved2;
847  PVOID MacReserved3;
848  PVOID MacReserved4;
849} NDIS_WAN_PACKET, *PNDIS_WAN_PACKET;
850#endif
851
852/* DMA channel information */
853
854typedef struct _NDIS_DMA_DESCRIPTION {
855  BOOLEAN  DemandMode;
856  BOOLEAN  AutoInitialize;
857  BOOLEAN  DmaChannelSpecified;
858  DMA_WIDTH  DmaWidth;
859  DMA_SPEED  DmaSpeed;
860  ULONG  DmaPort;
861  ULONG  DmaChannel;
862} NDIS_DMA_DESCRIPTION, *PNDIS_DMA_DESCRIPTION;
863
864typedef struct _NDIS_DMA_BLOCK {
865  PVOID  MapRegisterBase;
866  KEVENT  AllocationEvent;
867  PADAPTER_OBJECT  SystemAdapterObject;
868  PVOID  Miniport;
869  BOOLEAN  InProgress;
870} NDIS_DMA_BLOCK, *PNDIS_DMA_BLOCK;
871
872typedef UCHAR NDIS_DMA_SIZE;
873
874#define NDIS_DMA_24BITS                         ((NDIS_DMA_SIZE)0)
875#define NDIS_DMA_32BITS                         ((NDIS_DMA_SIZE)1)
876#define NDIS_DMA_64BITS                         ((NDIS_DMA_SIZE)2)
877
878typedef enum _NDIS_PROCESSOR_TYPE {
879  NdisProcessorX86,
880  NdisProcessorMips,
881  NdisProcessorAlpha,
882  NdisProcessorPpc,
883  NdisProcessorAmd64,
884  NdisProcessorIA64
885} NDIS_PROCESSOR_TYPE, *PNDIS_PROCESSOR_TYPE;
886
887typedef enum _NDIS_ENVIRONMENT_TYPE {
888  NdisEnvironmentWindows,
889  NdisEnvironmentWindowsNt
890} NDIS_ENVIRONMENT_TYPE, *PNDIS_ENVIRONMENT_TYPE;
891
892/* Possible hardware architecture */
893typedef enum _NDIS_INTERFACE_TYPE {
894  NdisInterfaceInternal = Internal,
895  NdisInterfaceIsa = Isa,
896  NdisInterfaceEisa = Eisa,
897  NdisInterfaceMca = MicroChannel,
898  NdisInterfaceTurboChannel = TurboChannel,
899  NdisInterfacePci = PCIBus,
900  NdisInterfacePcMcia = PCMCIABus,
901  NdisInterfaceCBus = CBus,
902  NdisInterfaceMPIBus = MPIBus,
903  NdisInterfaceMPSABus = MPSABus,
904  NdisInterfaceProcessorInternal = ProcessorInternal,
905  NdisInterfaceInternalPowerBus = InternalPowerBus,
906  NdisInterfacePNPISABus = PNPISABus,
907  NdisInterfacePNPBus = PNPBus,
908  NdisInterfaceUSB,
909  NdisInterfaceIrda,
910  NdisInterface1394,
911  NdisMaximumInterfaceType
912} NDIS_INTERFACE_TYPE, *PNDIS_INTERFACE_TYPE;
913
914#define NdisInterruptLevelSensitive       LevelSensitive
915#define NdisInterruptLatched              Latched
916
917typedef KINTERRUPT_MODE NDIS_INTERRUPT_MODE, *PNDIS_INTERRUPT_MODE;
918
919typedef enum _NDIS_PARAMETER_TYPE {
920  NdisParameterInteger,
921  NdisParameterHexInteger,
922  NdisParameterString,
923  NdisParameterMultiString,
924  NdisParameterBinary
925} NDIS_PARAMETER_TYPE, *PNDIS_PARAMETER_TYPE;
926
927typedef struct _BINARY_DATA {
928  USHORT Length;
929  PVOID Buffer;
930} BINARY_DATA;
931
932typedef struct _NDIS_CONFIGURATION_PARAMETER {
933  NDIS_PARAMETER_TYPE ParameterType;
934  union {
935    ULONG IntegerData;
936    NDIS_STRING StringData;
937    BINARY_DATA BinaryData;
938  } ParameterData;
939} NDIS_CONFIGURATION_PARAMETER, *PNDIS_CONFIGURATION_PARAMETER;
940
941typedef PHYSICAL_ADDRESS NDIS_PHYSICAL_ADDRESS, *PNDIS_PHYSICAL_ADDRESS;
942
943typedef struct _NDIS_PHYSICAL_ADDRESS_UNIT {
944  NDIS_PHYSICAL_ADDRESS PhysicalAddress;
945  UINT Length;
946} NDIS_PHYSICAL_ADDRESS_UNIT, *PNDIS_PHYSICAL_ADDRESS_UNIT;
947
948typedef struct _NDIS_WAN_LINE_DOWN {
949  UCHAR RemoteAddress[6];
950  UCHAR LocalAddress[6];
951} NDIS_WAN_LINE_DOWN, *PNDIS_WAN_LINE_DOWN;
952
953typedef struct _NDIS_WAN_LINE_UP {
954  ULONG LinkSpeed;
955  ULONG MaximumTotalSize;
956  NDIS_WAN_QUALITY Quality;
957  USHORT SendWindow;
958  UCHAR RemoteAddress[6];
959  OUT UCHAR LocalAddress[6];
960  ULONG ProtocolBufferLength;
961  PUCHAR ProtocolBuffer;
962  USHORT ProtocolType;
963  NDIS_STRING DeviceName;
964} NDIS_WAN_LINE_UP, *PNDIS_WAN_LINE_UP;
965
966typedef NTSTATUS
967(NTAPI *TDI_REGISTER_CALLBACK)(
968  IN PUNICODE_STRING DeviceName,
969  OUT HANDLE *TdiHandle);
970
971typedef NTSTATUS
972(NTAPI *TDI_PNP_HANDLER)(
973  IN PUNICODE_STRING UpperComponent,
974  IN PUNICODE_STRING LowerComponent,
975  IN PUNICODE_STRING BindList,
976  IN PVOID ReconfigBuffer,
977  IN UINT ReconfigBufferSize,
978  IN UINT Operation);
979
980typedef struct _OID_LIST    OID_LIST, *POID_LIST;
981
982/* PnP state */
983
984typedef enum _NDIS_PNP_DEVICE_STATE {
985  NdisPnPDeviceAdded,
986  NdisPnPDeviceStarted,
987  NdisPnPDeviceQueryStopped,
988  NdisPnPDeviceStopped,
989  NdisPnPDeviceQueryRemoved,
990  NdisPnPDeviceRemoved,
991  NdisPnPDeviceSurpriseRemoved
992} NDIS_PNP_DEVICE_STATE;
993
994#define	NDIS_DEVICE_NOT_STOPPABLE                 0x00000001
995#define	NDIS_DEVICE_NOT_REMOVEABLE                0x00000002
996#define	NDIS_DEVICE_NOT_SUSPENDABLE               0x00000004
997#define NDIS_DEVICE_DISABLE_PM                    0x00000008
998#define NDIS_DEVICE_DISABLE_WAKE_UP               0x00000010
999#define NDIS_DEVICE_DISABLE_WAKE_ON_RECONNECT     0x00000020
1000#define NDIS_DEVICE_RESERVED                      0x00000040
1001#define NDIS_DEVICE_DISABLE_WAKE_ON_MAGIC_PACKET  0x00000080
1002#define NDIS_DEVICE_DISABLE_WAKE_ON_PATTERN_MATCH 0x00000100
1003
1004/* Protocol types supported by NDIS */
1005#define	NDIS_PROTOCOL_ID_DEFAULT        0x00
1006#define	NDIS_PROTOCOL_ID_TCP_IP         0x02
1007#define	NDIS_PROTOCOL_ID_IPX            0x06
1008#define	NDIS_PROTOCOL_ID_NBF            0x07
1009#define	NDIS_PROTOCOL_ID_MAX            0x0F
1010#define	NDIS_PROTOCOL_ID_MASK           0x0F
1011
1012typedef ULONG NDIS_AF, *PNDIS_AF;
1013
1014#define CO_ADDRESS_FAMILY_Q2931           ((NDIS_AF)0x1)
1015#define CO_ADDRESS_FAMILY_PSCHED          ((NDIS_AF)0x2)
1016#define CO_ADDRESS_FAMILY_L2TP            ((NDIS_AF)0x3)
1017#define CO_ADDRESS_FAMILY_IRDA            ((NDIS_AF)0x4)
1018#define CO_ADDRESS_FAMILY_1394            ((NDIS_AF)0x5)
1019#define CO_ADDRESS_FAMILY_PPP             ((NDIS_AF)0x6)
1020#define CO_ADDRESS_FAMILY_INFINIBAND      ((NDIS_AF)0x7)
1021#define CO_ADDRESS_FAMILY_TAPI            ((NDIS_AF)0x800)
1022#define CO_ADDRESS_FAMILY_TAPI_PROXY      ((NDIS_AF)0x801)
1023
1024#define CO_ADDRESS_FAMILY_PROXY           0x80000000
1025
1026typedef struct _CO_ADDRESS_FAMILY {
1027  NDIS_AF AddressFamily;
1028  ULONG MajorVersion;
1029  ULONG MinorVersion;
1030} CO_ADDRESS_FAMILY, *PCO_ADDRESS_FAMILY;
1031
1032typedef struct _CO_SPECIFIC_PARAMETERS {
1033  ULONG  ParamType;
1034  ULONG  Length;
1035  UCHAR  Parameters[1];
1036} CO_SPECIFIC_PARAMETERS, *PCO_SPECIFIC_PARAMETERS;
1037
1038typedef struct _CO_CALL_MANAGER_PARAMETERS {
1039  FLOWSPEC  Transmit;
1040  FLOWSPEC  Receive;
1041  CO_SPECIFIC_PARAMETERS  CallMgrSpecific;
1042} CO_CALL_MANAGER_PARAMETERS, *PCO_CALL_MANAGER_PARAMETERS;
1043
1044/* CO_MEDIA_PARAMETERS.Flags constants */
1045#define RECEIVE_TIME_INDICATION           0x00000001
1046#define USE_TIME_STAMPS                   0x00000002
1047#define TRANSMIT_VC                       0x00000004
1048#define RECEIVE_VC                        0x00000008
1049#define INDICATE_ERRED_PACKETS            0x00000010
1050#define INDICATE_END_OF_TX                0x00000020
1051#define RESERVE_RESOURCES_VC              0x00000040
1052#define	ROUND_DOWN_FLOW                   0x00000080
1053#define	ROUND_UP_FLOW                     0x00000100
1054
1055typedef struct _CO_MEDIA_PARAMETERS {
1056  ULONG  Flags;
1057  ULONG  ReceivePriority;
1058  ULONG  ReceiveSizeHint;
1059  CO_SPECIFIC_PARAMETERS  MediaSpecific;
1060} CO_MEDIA_PARAMETERS, *PCO_MEDIA_PARAMETERS;
1061
1062/* CO_CALL_PARAMETERS.Flags constants */
1063#define PERMANENT_VC                      0x00000001
1064#define CALL_PARAMETERS_CHANGED           0x00000002
1065#define QUERY_CALL_PARAMETERS             0x00000004
1066#define BROADCAST_VC                      0x00000008
1067#define MULTIPOINT_VC                     0x00000010
1068
1069typedef struct _CO_CALL_PARAMETERS {
1070  ULONG  Flags;
1071  PCO_CALL_MANAGER_PARAMETERS  CallMgrParameters;
1072  PCO_MEDIA_PARAMETERS  MediaParameters;
1073} CO_CALL_PARAMETERS, *PCO_CALL_PARAMETERS;
1074
1075typedef struct _CO_SAP {
1076  ULONG SapType;
1077  ULONG SapLength;
1078  UCHAR Sap[1];
1079} CO_SAP, *PCO_SAP;
1080
1081#if NDIS_LEGACY_DRIVER
1082typedef struct _NDIS_IPSEC_PACKET_INFO {
1083  __MINGW_EXTENSION union {
1084    struct {
1085      NDIS_HANDLE OffloadHandle;
1086      NDIS_HANDLE NextOffloadHandle;
1087    } Transmit;
1088    struct {
1089      ULONG SA_DELETE_REQ:1;
1090      ULONG CRYPTO_DONE:1;
1091      ULONG NEXT_CRYPTO_DONE:1;
1092      ULONG CryptoStatus;
1093    } Receive;
1094  };
1095} NDIS_IPSEC_PACKET_INFO, *PNDIS_IPSEC_PACKET_INFO;
1096#endif
1097
1098#if (NDIS_SUPPORT_NDIS6 || NDIS60)
1099typedef struct _NDIS_IPSEC_OFFLOAD_V1_NET_BUFFER_LIST_INFO {
1100  __MINGW_EXTENSION union {
1101    struct {
1102      NDIS_HANDLE OffloadHandle;
1103    } Transmit;
1104    struct {
1105      USHORT SaDeleteReq:1;
1106      USHORT CryptoDone:1;
1107      USHORT NextCryptoDone:1;
1108      USHORT Pad:13;
1109      USHORT CryptoStatus;
1110    } Receive;
1111  };
1112} NDIS_IPSEC_OFFLOAD_V1_NET_BUFFER_LIST_INFO, *PNDIS_IPSEC_OFFLOAD_V1_NET_BUFFER_LIST_INFO;
1113#endif
1114
1115/* NDIS_MAC_FRAGMENT.Errors constants */
1116#define WAN_ERROR_CRC					0x00000001
1117#define WAN_ERROR_FRAMING				0x00000002
1118#define WAN_ERROR_HARDWAREOVERRUN			0x00000004
1119#define WAN_ERROR_BUFFEROVERRUN				0x00000008
1120#define WAN_ERROR_TIMEOUT				0x00000010
1121#define WAN_ERROR_ALIGNMENT				0x00000020
1122
1123typedef struct _NDIS_MAC_FRAGMENT {
1124  NDIS_HANDLE  NdisLinkContext;
1125  ULONG  Errors;
1126} NDIS_MAC_FRAGMENT, *PNDIS_MAC_FRAGMENT;
1127
1128typedef struct _NDIS_MAC_LINE_DOWN {
1129  NDIS_HANDLE  NdisLinkContext;
1130} NDIS_MAC_LINE_DOWN, *PNDIS_MAC_LINE_DOWN;
1131
1132typedef struct _NDIS_MAC_LINE_UP {
1133  ULONG  LinkSpeed;
1134  NDIS_WAN_QUALITY  Quality;
1135  USHORT  SendWindow;
1136  NDIS_HANDLE  ConnectionWrapperID;
1137  NDIS_HANDLE  NdisLinkHandle;
1138  NDIS_HANDLE  NdisLinkContext;
1139} NDIS_MAC_LINE_UP, *PNDIS_MAC_LINE_UP;
1140
1141typedef struct _NDIS_PACKET_8021Q_INFO {
1142  __MINGW_EXTENSION union {
1143    struct {
1144      UINT32 UserPriority:3;
1145      UINT32 CanonicalFormatId:1;
1146      UINT32 VlanId:12;
1147      UINT32 Reserved:16;
1148    } TagHeader;
1149    PVOID Value;
1150  };
1151} NDIS_PACKET_8021Q_INFO, *PNDIS_PACKET_8021Q_INFO;
1152
1153typedef enum _NDIS_PER_PACKET_INFO {
1154  TcpIpChecksumPacketInfo,
1155  IpSecPacketInfo,
1156  TcpLargeSendPacketInfo,
1157  ClassificationHandlePacketInfo,
1158  NdisReserved,
1159  ScatterGatherListPacketInfo,
1160  Ieee8021QInfo,
1161  OriginalPacketInfo,
1162  PacketCancelId,
1163  OriginalNetBufferList,
1164  CachedNetBufferList,
1165  ShortPacketPaddingInfo,
1166  MaxPerPacketInfo
1167} NDIS_PER_PACKET_INFO, *PNDIS_PER_PACKET_INFO;
1168
1169#if NDIS_LEGACY_DRIVER
1170
1171typedef struct _NDIS_PACKET_EXTENSION {
1172  PVOID NdisPacketInfo[MaxPerPacketInfo];
1173} NDIS_PACKET_EXTENSION, *PNDIS_PACKET_EXTENSION;
1174
1175typedef enum _NDIS_TASK {
1176  TcpIpChecksumNdisTask,
1177  IpSecNdisTask,
1178  TcpLargeSendNdisTask,
1179  MaxNdisTask
1180} NDIS_TASK, *PNDIS_TASK;
1181
1182typedef enum _NDIS_ENCAPSULATION {
1183  UNSPECIFIED_Encapsulation,
1184  NULL_Encapsulation,
1185  IEEE_802_3_Encapsulation,
1186  IEEE_802_5_Encapsulation,
1187  LLC_SNAP_ROUTED_Encapsulation,
1188  LLC_SNAP_BRIDGED_Encapsulation
1189} NDIS_ENCAPSULATION;
1190
1191typedef struct _NDIS_ENCAPSULATION_FORMAT {
1192  NDIS_ENCAPSULATION Encapsulation;
1193  struct {
1194    ULONG FixedHeaderSize:1;
1195    ULONG Reserved:31;
1196  } Flags;
1197  ULONG EncapsulationHeaderSize;
1198} NDIS_ENCAPSULATION_FORMAT, *PNDIS_ENCAPSULATION_FORMAT;
1199
1200typedef struct _NDIS_TASK_OFFLOAD_HEADER {
1201  ULONG Version;
1202  ULONG Size;
1203  ULONG Reserved;
1204  ULONG OffsetFirstTask;
1205  NDIS_ENCAPSULATION_FORMAT EncapsulationFormat;
1206} NDIS_TASK_OFFLOAD_HEADER, *PNDIS_TASK_OFFLOAD_HEADER;
1207
1208typedef struct _NDIS_TASK_OFFLOAD {
1209  ULONG Version;
1210  ULONG Size;
1211  NDIS_TASK Task;
1212  ULONG OffsetNextTask;
1213  ULONG TaskBufferLength;
1214  UCHAR TaskBuffer[1];
1215} NDIS_TASK_OFFLOAD, *PNDIS_TASK_OFFLOAD;
1216
1217typedef struct _NDIS_TASK_TCP_IP_CHECKSUM {
1218  struct {
1219    ULONG IpOptionsSupported:1;
1220    ULONG TcpOptionsSupported:1;
1221    ULONG TcpChecksum:1;
1222    ULONG UdpChecksum:1;
1223    ULONG IpChecksum:1;
1224  } V4Transmit;
1225  struct {
1226    ULONG IpOptionsSupported:1;
1227    ULONG TcpOptionsSupported:1;
1228    ULONG TcpChecksum:1;
1229    ULONG UdpChecksum:1;
1230    ULONG IpChecksum:1;
1231  } V4Receive;
1232  struct {
1233    ULONG IpOptionsSupported:1;
1234    ULONG TcpOptionsSupported:1;
1235    ULONG TcpChecksum:1;
1236    ULONG UdpChecksum:1;
1237  } V6Transmit;
1238  struct {
1239    ULONG IpOptionsSupported:1;
1240    ULONG TcpOptionsSupported:1;
1241    ULONG TcpChecksum:1;
1242    ULONG UdpChecksum:1;
1243  } V6Receive;
1244} NDIS_TASK_TCP_IP_CHECKSUM, *PNDIS_TASK_TCP_IP_CHECKSUM;
1245
1246#define NDIS_TASK_TCP_LARGE_SEND_V0 0
1247
1248typedef struct _NDIS_TASK_TCP_LARGE_SEND {
1249  ULONG Version;
1250  ULONG MaxOffLoadSize;
1251  ULONG MinSegmentCount;
1252  BOOLEAN TcpOptions;
1253  BOOLEAN IpOptions;
1254} NDIS_TASK_TCP_LARGE_SEND, *PNDIS_TASK_TCP_LARGE_SEND;
1255
1256typedef struct _NDIS_TASK_IPSEC {
1257  struct {
1258    ULONG AH_ESP_COMBINED;
1259    ULONG TRANSPORT_TUNNEL_COMBINED;
1260    ULONG V4_OPTIONS;
1261    ULONG RESERVED;
1262  } Supported;
1263  struct {
1264    ULONG MD5:1;
1265    ULONG SHA_1:1;
1266    ULONG Transport:1;
1267    ULONG Tunnel:1;
1268    ULONG Send:1;
1269    ULONG Receive:1;
1270  } V4AH;
1271  struct {
1272    ULONG DES:1;
1273    ULONG RESERVED:1;
1274    ULONG TRIPLE_DES:1;
1275    ULONG NULL_ESP:1;
1276    ULONG Transport:1;
1277    ULONG Tunnel:1;
1278    ULONG Send:1;
1279    ULONG Receive:1;
1280  } V4ESP;
1281} NDIS_TASK_IPSEC, *PNDIS_TASK_IPSEC;
1282
1283#endif /* NDIS_LEGACY_DRIVER */
1284
1285#define IPSEC_TPT_UDPESP_ENCAPTYPE_IKE                 0x00000001
1286#define IPSEC_TUN_UDPESP_ENCAPTYPE_IKE                 0x00000002
1287#define IPSEC_TPTOVERTUN_UDPESP_ENCAPTYPE_IKE          0x00000004
1288#define IPSEC_TPT_UDPESP_OVER_PURE_TUN_ENCAPTYPE_IKE   0x00000008
1289#define IPSEC_TPT_UDPESP_ENCAPTYPE_OTHER               0x00000010
1290#define IPSEC_TUN_UDPESP_ENCAPTYPE_OTHER               0x00000020
1291#define IPSEC_TPTOVERTUN_UDPESP_ENCAPTYPE_OTHER        0x00000040
1292#define IPSEC_TPT_UDPESP_OVER_PURE_TUN_ENCAPTYPE_OTHER 0x00000080
1293
1294#if NDIS_LEGACY_DRIVER
1295
1296/*
1297 * PNDIS_PACKET
1298 * NDIS_GET_ORIGINAL_PACKET(
1299 *   IN PNDIS_PACKET  Packet);
1300 */
1301#define NDIS_GET_ORIGINAL_PACKET(Packet) \
1302  NDIS_PER_PACKET_INFO_FROM_PACKET(Packet, OriginalPacketInfo)
1303
1304/*
1305 * PVOID
1306 * NDIS_GET_PACKET_CANCEL_ID(
1307 *   IN PNDIS_PACKET  Packet);
1308 */
1309#define NDIS_GET_PACKET_CANCEL_ID(Packet) \
1310  NDIS_PER_PACKET_INFO_FROM_PACKET(Packet, PacketCancelId)
1311
1312/*
1313 * PNDIS_PACKET_EXTENSION
1314 * NDIS_PACKET_EXTENSION_FROM_PACKET(
1315 *   IN PNDIS_PACKET  Packet);
1316 */
1317#define NDIS_PACKET_EXTENSION_FROM_PACKET(Packet) \
1318  ((PNDIS_PACKET_EXTENSION)((PUCHAR)(Packet) \
1319    + (Packet)->Private.NdisPacketOobOffset + sizeof(NDIS_PACKET_OOB_DATA)))
1320
1321/*
1322 * PVOID
1323 * NDIS_PER_PACKET_INFO_FROM_PACKET(
1324 *   IN OUT  PNDIS_PACKET  Packet,
1325 *   IN NDIS_PER_PACKET_INFO  InfoType);
1326 */
1327#define NDIS_PER_PACKET_INFO_FROM_PACKET(Packet, InfoType) \
1328  ((PNDIS_PACKET_EXTENSION)((PUCHAR)(Packet) + (Packet)->Private.NdisPacketOobOffset \
1329    + sizeof(NDIS_PACKET_OOB_DATA)))->NdisPacketInfo[(InfoType)]
1330
1331/*
1332 * VOID
1333 * NDIS_SET_ORIGINAL_PACKET(
1334 *   IN OUT  PNDIS_PACKET  Packet,
1335 *   IN PNDIS_PACKET  OriginalPacket);
1336 */
1337#define NDIS_SET_ORIGINAL_PACKET(Packet, OriginalPacket) \
1338  NDIS_PER_PACKET_INFO_FROM_PACKET(Packet, OriginalPacketInfo) = (OriginalPacket)
1339
1340/*
1341 * VOID
1342 * NDIS_SET_PACKET_CANCEL_ID(
1343 *  IN PNDIS_PACKET  Packet
1344 *  IN ULONG_PTR  CancelId);
1345 */
1346#define NDIS_SET_PACKET_CANCEL_ID(Packet, CancelId) \
1347  NDIS_PER_PACKET_INFO_FROM_PACKET(Packet, PacketCancelId) = (CancelId)
1348
1349#define NdisSetPacketCancelId(_Packet, _CancelId) NDIS_SET_PACKET_CANCEL_ID(_Packet, _CancelId)
1350#define NdisGetPacketCancelId(_Packet) NDIS_GET_PACKET_CANCEL_ID(_Packet)
1351
1352#endif /* NDIS_LEGACY_DRIVER */
1353
1354#if NDIS_SUPPORT_NDIS6
1355typedef struct _NDIS_GENERIC_OBJECT {
1356  NDIS_OBJECT_HEADER Header;
1357  PVOID Caller;
1358  PVOID CallersCaller;
1359  PDRIVER_OBJECT DriverObject;
1360} NDIS_GENERIC_OBJECT, *PNDIS_GENERIC_OBJECT;
1361#endif
1362
1363/* NDIS_TASK_OFFLOAD_HEADER.Version constants */
1364#define NDIS_TASK_OFFLOAD_VERSION 1
1365
1366#define MAX_HASHES                     4
1367#define TRUNCATED_HASH_LEN             12
1368
1369#define CRYPTO_SUCCESS                   0
1370#define CRYPTO_GENERIC_ERROR             1
1371#define CRYPTO_TRANSPORT_AH_AUTH_FAILED  2
1372#define CRYPTO_TRANSPORT_ESP_AUTH_FAILED 3
1373#define CRYPTO_TUNNEL_AH_AUTH_FAILED     4
1374#define CRYPTO_TUNNEL_ESP_AUTH_FAILED    5
1375#define CRYPTO_INVALID_PACKET_SYNTAX     6
1376#define CRYPTO_INVALID_PROTOCOL          7
1377
1378typedef struct _NDIS_TCP_IP_CHECKSUM_PACKET_INFO {
1379  __MINGW_EXTENSION union {
1380    struct {
1381      ULONG NdisPacketChecksumV4:1;
1382      ULONG NdisPacketChecksumV6:1;
1383      ULONG NdisPacketTcpChecksum:1;
1384      ULONG NdisPacketUdpChecksum:1;
1385      ULONG NdisPacketIpChecksum:1;
1386      } Transmit;
1387    struct {
1388      ULONG NdisPacketTcpChecksumFailed:1;
1389      ULONG NdisPacketUdpChecksumFailed:1;
1390      ULONG NdisPacketIpChecksumFailed:1;
1391      ULONG NdisPacketTcpChecksumSucceeded:1;
1392      ULONG NdisPacketUdpChecksumSucceeded:1;
1393      ULONG NdisPacketIpChecksumSucceeded:1;
1394      ULONG NdisPacketLoopback:1;
1395    } Receive;
1396    ULONG Value;
1397  };
1398} NDIS_TCP_IP_CHECKSUM_PACKET_INFO, *PNDIS_TCP_IP_CHECKSUM_PACKET_INFO;
1399
1400typedef struct _NDIS_WAN_CO_FRAGMENT {
1401  ULONG Errors;
1402} NDIS_WAN_CO_FRAGMENT, *PNDIS_WAN_CO_FRAGMENT;
1403
1404typedef struct _NDIS_WAN_FRAGMENT {
1405  UCHAR RemoteAddress[6];
1406  UCHAR LocalAddress[6];
1407} NDIS_WAN_FRAGMENT, *PNDIS_WAN_FRAGMENT;
1408
1409typedef struct _WAN_CO_LINKPARAMS {
1410  ULONG TransmitSpeed;
1411  ULONG ReceiveSpeed;
1412  ULONG SendWindow;
1413} WAN_CO_LINKPARAMS, *PWAN_CO_LINKPARAMS;
1414
1415typedef struct _NDIS_WAN_GET_STATS {
1416  UCHAR LocalAddress[6];
1417  ULONG BytesSent;
1418  ULONG BytesRcvd;
1419  ULONG FramesSent;
1420  ULONG FramesRcvd;
1421  ULONG CRCErrors;
1422  ULONG TimeoutErrors;
1423  ULONG AlignmentErrors;
1424  ULONG SerialOverrunErrors;
1425  ULONG FramingErrors;
1426  ULONG BufferOverrunErrors;
1427  ULONG BytesTransmittedUncompressed;
1428  ULONG BytesReceivedUncompressed;
1429  ULONG BytesTransmittedCompressed;
1430  ULONG BytesReceivedCompressed;
1431} NDIS_WAN_GET_STATS, *PNDIS_WAN_GET_STATS;
1432
1433/* Call Manager */
1434
1435typedef VOID
1436(NTAPI *CM_ACTIVATE_VC_COMPLETE_HANDLER)(
1437  IN NDIS_STATUS  Status,
1438  IN NDIS_HANDLE  CallMgrVcContext,
1439  IN PCO_CALL_PARAMETERS  CallParameters);
1440
1441typedef NDIS_STATUS
1442(NTAPI *CM_ADD_PARTY_HANDLER)(
1443  IN NDIS_HANDLE  CallMgrVcContext,
1444  IN OUT PCO_CALL_PARAMETERS  CallParameters,
1445  IN NDIS_HANDLE  NdisPartyHandle,
1446  OUT PNDIS_HANDLE  CallMgrPartyContext);
1447
1448typedef NDIS_STATUS
1449(NTAPI *CM_CLOSE_AF_HANDLER)(
1450  IN NDIS_HANDLE  CallMgrAfContext);
1451
1452typedef NDIS_STATUS
1453(NTAPI *CM_CLOSE_CALL_HANDLER)(
1454  IN NDIS_HANDLE  CallMgrVcContext,
1455  IN NDIS_HANDLE  CallMgrPartyContext  OPTIONAL,
1456  IN PVOID  CloseData  OPTIONAL,
1457  IN UINT  Size  OPTIONAL);
1458
1459typedef NDIS_STATUS
1460(NTAPI *CM_DEREG_SAP_HANDLER)(
1461  IN NDIS_HANDLE  CallMgrSapContext);
1462
1463typedef VOID
1464(NTAPI *CM_DEACTIVATE_VC_COMPLETE_HANDLER)(
1465	IN NDIS_STATUS  Status,
1466	IN NDIS_HANDLE  CallMgrVcContext);
1467
1468typedef NDIS_STATUS
1469(NTAPI *CM_DROP_PARTY_HANDLER)(
1470  IN NDIS_HANDLE  CallMgrPartyContext,
1471  IN PVOID  CloseData  OPTIONAL,
1472  IN UINT  Size  OPTIONAL);
1473
1474typedef VOID
1475(NTAPI *CM_INCOMING_CALL_COMPLETE_HANDLER)(
1476  IN NDIS_STATUS  Status,
1477  IN NDIS_HANDLE  CallMgrVcContext,
1478  IN PCO_CALL_PARAMETERS  CallParameters);
1479
1480typedef NDIS_STATUS
1481(NTAPI *CM_MAKE_CALL_HANDLER)(
1482  IN NDIS_HANDLE  CallMgrVcContext,
1483  IN OUT PCO_CALL_PARAMETERS  CallParameters,
1484  IN NDIS_HANDLE  NdisPartyHandle	OPTIONAL,
1485  OUT PNDIS_HANDLE  CallMgrPartyContext  OPTIONAL);
1486
1487typedef NDIS_STATUS
1488(NTAPI *CM_MODIFY_CALL_QOS_HANDLER)(
1489  IN NDIS_HANDLE  CallMgrVcContext,
1490  IN PCO_CALL_PARAMETERS  CallParameters);
1491
1492typedef NDIS_STATUS
1493(NTAPI *CM_OPEN_AF_HANDLER)(
1494	IN NDIS_HANDLE  CallMgrBindingContext,
1495	IN PCO_ADDRESS_FAMILY  AddressFamily,
1496	IN NDIS_HANDLE  NdisAfHandle,
1497	OUT PNDIS_HANDLE  CallMgrAfContext);
1498
1499typedef NDIS_STATUS
1500(NTAPI *CM_REG_SAP_HANDLER)(
1501  IN NDIS_HANDLE  CallMgrAfContext,
1502  IN PCO_SAP  Sap,
1503  IN NDIS_HANDLE  NdisSapHandle,
1504  OUT	PNDIS_HANDLE  CallMgrSapContext);
1505
1506typedef NDIS_STATUS
1507(NTAPI *CO_CREATE_VC_HANDLER)(
1508  IN NDIS_HANDLE  ProtocolAfContext,
1509  IN NDIS_HANDLE  NdisVcHandle,
1510  OUT PNDIS_HANDLE  ProtocolVcContext);
1511
1512typedef NDIS_STATUS
1513(NTAPI *CO_DELETE_VC_HANDLER)(
1514  IN NDIS_HANDLE  ProtocolVcContext);
1515
1516#define PROTOCOL_RESERVED_SIZE_IN_PACKET (4 * sizeof(PVOID))
1517
1518/* Prototypes for NDIS 5.0 protocol characteristics */
1519
1520typedef VOID
1521(NTAPI *CO_SEND_COMPLETE_HANDLER)(
1522  IN NDIS_STATUS Status,
1523  IN NDIS_HANDLE ProtocolVcContext,
1524  IN PNDIS_PACKET Packet);
1525
1526typedef VOID
1527(NTAPI *CO_STATUS_HANDLER)(
1528  IN NDIS_HANDLE ProtocolBindingContext,
1529  IN NDIS_HANDLE ProtocolVcContext OPTIONAL,
1530  IN NDIS_STATUS GeneralStatus,
1531  IN PVOID StatusBuffer,
1532  IN UINT StatusBufferSize);
1533
1534typedef UINT
1535(NTAPI *CO_RECEIVE_PACKET_HANDLER)(
1536  IN NDIS_HANDLE ProtocolBindingContext,
1537  IN NDIS_HANDLE ProtocolVcContext,
1538  IN PNDIS_PACKET Packet);
1539
1540typedef NDIS_STATUS
1541(NTAPI *CO_REQUEST_HANDLER)(
1542  IN NDIS_HANDLE ProtocolAfContext,
1543  IN NDIS_HANDLE ProtocolVcContext OPTIONAL,
1544  IN NDIS_HANDLE ProtocolPartyContext OPTIONAL,
1545  IN OUT PNDIS_REQUEST NdisRequest);
1546
1547typedef VOID
1548(NTAPI *CO_REQUEST_COMPLETE_HANDLER)(
1549  IN NDIS_STATUS Status,
1550  IN NDIS_HANDLE ProtocolAfContext OPTIONAL,
1551  IN NDIS_HANDLE ProtocolVcContext OPTIONAL,
1552  IN NDIS_HANDLE ProtocolPartyContext OPTIONAL,
1553  IN PNDIS_REQUEST NdisRequest);
1554
1555typedef struct _NDIS_CALL_MANAGER_CHARACTERISTICS {
1556	UCHAR  MajorVersion;
1557	UCHAR  MinorVersion;
1558	USHORT  Filler;
1559	UINT  Reserved;
1560	CO_CREATE_VC_HANDLER  CmCreateVcHandler;
1561	CO_DELETE_VC_HANDLER  CmDeleteVcHandler;
1562	CM_OPEN_AF_HANDLER  CmOpenAfHandler;
1563	CM_CLOSE_AF_HANDLER	 CmCloseAfHandler;
1564	CM_REG_SAP_HANDLER  CmRegisterSapHandler;
1565	CM_DEREG_SAP_HANDLER  CmDeregisterSapHandler;
1566	CM_MAKE_CALL_HANDLER  CmMakeCallHandler;
1567	CM_CLOSE_CALL_HANDLER  CmCloseCallHandler;
1568	CM_INCOMING_CALL_COMPLETE_HANDLER  CmIncomingCallCompleteHandler;
1569	CM_ADD_PARTY_HANDLER  CmAddPartyHandler;
1570	CM_DROP_PARTY_HANDLER  CmDropPartyHandler;
1571	CM_ACTIVATE_VC_COMPLETE_HANDLER  CmActivateVcCompleteHandler;
1572	CM_DEACTIVATE_VC_COMPLETE_HANDLER  CmDeactivateVcCompleteHandler;
1573	CM_MODIFY_CALL_QOS_HANDLER  CmModifyCallQoSHandler;
1574	CO_REQUEST_HANDLER  CmRequestHandler;
1575	CO_REQUEST_COMPLETE_HANDLER  CmRequestCompleteHandler;
1576} NDIS_CALL_MANAGER_CHARACTERISTICS, *PNDIS_CALL_MANAGER_CHARACTERISTICS;
1577
1578
1579
1580/* Call Manager clients */
1581
1582typedef VOID (*CL_OPEN_AF_COMPLETE_HANDLER)(
1583  IN NDIS_STATUS Status,
1584  IN NDIS_HANDLE ProtocolAfContext,
1585  IN NDIS_HANDLE NdisAfHandle);
1586
1587typedef VOID
1588(NTAPI *CL_CLOSE_AF_COMPLETE_HANDLER)(
1589  IN NDIS_STATUS  Status,
1590  IN NDIS_HANDLE  ProtocolAfContext);
1591
1592typedef VOID
1593(NTAPI *CL_REG_SAP_COMPLETE_HANDLER)(
1594  IN NDIS_STATUS  Status,
1595  IN NDIS_HANDLE  ProtocolSapContext,
1596  IN PCO_SAP  Sap,
1597  IN NDIS_HANDLE  NdisSapHandle);
1598
1599typedef VOID
1600(NTAPI *CL_DEREG_SAP_COMPLETE_HANDLER)(
1601  IN NDIS_STATUS  Status,
1602  IN NDIS_HANDLE  ProtocolSapContext);
1603
1604typedef VOID
1605(NTAPI *CL_MAKE_CALL_COMPLETE_HANDLER)(
1606  IN NDIS_STATUS  Status,
1607  IN NDIS_HANDLE  ProtocolVcContext,
1608  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL,
1609  IN PCO_CALL_PARAMETERS  CallParameters);
1610
1611typedef VOID
1612(NTAPI *CL_MODIFY_CALL_QOS_COMPLETE_HANDLER)(
1613  IN NDIS_STATUS  Status,
1614  IN NDIS_HANDLE  ProtocolVcContext,
1615  IN PCO_CALL_PARAMETERS  CallParameters);
1616
1617typedef VOID
1618(NTAPI *CL_CLOSE_CALL_COMPLETE_HANDLER)(
1619  IN NDIS_STATUS  Status,
1620  IN NDIS_HANDLE  ProtocolVcContext,
1621  IN NDIS_HANDLE  ProtocolPartyContext  OPTIONAL);
1622
1623typedef VOID
1624(NTAPI *CL_ADD_PARTY_COMPLETE_HANDLER)(
1625  IN NDIS_STATUS  Status,
1626  IN NDIS_HANDLE  ProtocolPartyContext,
1627  IN NDIS_HANDLE  NdisPartyHandle,
1628  IN PCO_CALL_PARAMETERS  CallParameters);
1629
1630typedef VOID
1631(NTAPI *CL_DROP_PARTY_COMPLETE_HANDLER)(
1632  IN NDIS_STATUS  Status,
1633  IN NDIS_HANDLE  ProtocolPartyContext);
1634
1635typedef NDIS_STATUS
1636(NTAPI *CL_INCOMING_CALL_HANDLER)(
1637  IN NDIS_HANDLE  ProtocolSapContext,
1638  IN NDIS_HANDLE  ProtocolVcContext,
1639  IN OUT PCO_CALL_PARAMETERS  CallParameters);
1640
1641typedef VOID
1642(NTAPI *CL_INCOMING_CALL_QOS_CHANGE_HANDLER)(
1643  IN NDIS_HANDLE  ProtocolVcContext,
1644  IN PCO_CALL_PARAMETERS  CallParameters);
1645
1646typedef VOID
1647(NTAPI *CL_INCOMING_CLOSE_CALL_HANDLER)(
1648  IN NDIS_STATUS  CloseStatus,
1649  IN NDIS_HANDLE  ProtocolVcContext,
1650  IN PVOID  CloseData  OPTIONAL,
1651  IN UINT  Size  OPTIONAL);
1652
1653typedef VOID
1654(NTAPI *CL_INCOMING_DROP_PARTY_HANDLER)(
1655  IN NDIS_STATUS  DropStatus,
1656  IN NDIS_HANDLE  ProtocolPartyContext,
1657  IN PVOID  CloseData  OPTIONAL,
1658  IN UINT  Size  OPTIONAL);
1659
1660typedef VOID
1661(NTAPI *CL_CALL_CONNECTED_HANDLER)(
1662  IN NDIS_HANDLE  ProtocolVcContext);
1663
1664
1665typedef struct _NDIS_CLIENT_CHARACTERISTICS {
1666  UCHAR  MajorVersion;
1667  UCHAR  MinorVersion;
1668  USHORT  Filler;
1669  UINT  Reserved;
1670  CO_CREATE_VC_HANDLER  ClCreateVcHandler;
1671  CO_DELETE_VC_HANDLER  ClDeleteVcHandler;
1672  CO_REQUEST_HANDLER  ClRequestHandler;
1673  CO_REQUEST_COMPLETE_HANDLER  ClRequestCompleteHandler;
1674  CL_OPEN_AF_COMPLETE_HANDLER  ClOpenAfCompleteHandler;
1675  CL_CLOSE_AF_COMPLETE_HANDLER  ClCloseAfCompleteHandler;
1676  CL_REG_SAP_COMPLETE_HANDLER  ClRegisterSapCompleteHandler;
1677  CL_DEREG_SAP_COMPLETE_HANDLER  ClDeregisterSapCompleteHandler;
1678  CL_MAKE_CALL_COMPLETE_HANDLER  ClMakeCallCompleteHandler;
1679  CL_MODIFY_CALL_QOS_COMPLETE_HANDLER	 ClModifyCallQoSCompleteHandler;
1680  CL_CLOSE_CALL_COMPLETE_HANDLER  ClCloseCallCompleteHandler;
1681  CL_ADD_PARTY_COMPLETE_HANDLER  ClAddPartyCompleteHandler;
1682  CL_DROP_PARTY_COMPLETE_HANDLER  ClDropPartyCompleteHandler;
1683  CL_INCOMING_CALL_HANDLER  ClIncomingCallHandler;
1684  CL_INCOMING_CALL_QOS_CHANGE_HANDLER  ClIncomingCallQoSChangeHandler;
1685  CL_INCOMING_CLOSE_CALL_HANDLER  ClIncomingCloseCallHandler;
1686  CL_INCOMING_DROP_PARTY_HANDLER  ClIncomingDropPartyHandler;
1687  CL_CALL_CONNECTED_HANDLER  ClCallConnectedHandler;
1688} NDIS_CLIENT_CHARACTERISTICS, *PNDIS_CLIENT_CHARACTERISTICS;
1689
1690
1691/* NDIS protocol structures */
1692
1693/* Prototypes for NDIS 3.0 protocol characteristics */
1694
1695typedef VOID
1696(NTAPI *OPEN_ADAPTER_COMPLETE_HANDLER)(
1697  IN NDIS_HANDLE ProtocolBindingContext,
1698  IN NDIS_STATUS Status,
1699  IN NDIS_STATUS OpenErrorStatus);
1700
1701typedef VOID
1702(NTAPI *CLOSE_ADAPTER_COMPLETE_HANDLER)(
1703  IN NDIS_HANDLE ProtocolBindingContext,
1704  IN NDIS_STATUS Status);
1705
1706typedef VOID
1707(NTAPI *RESET_COMPLETE_HANDLER)(
1708  IN NDIS_HANDLE ProtocolBindingContext,
1709  IN NDIS_STATUS Status);
1710
1711typedef VOID
1712(NTAPI *REQUEST_COMPLETE_HANDLER)(
1713  IN NDIS_HANDLE ProtocolBindingContext,
1714  IN PNDIS_REQUEST NdisRequest,
1715  IN NDIS_STATUS Status);
1716
1717typedef VOID
1718(NTAPI *STATUS_HANDLER)(
1719  IN NDIS_HANDLE ProtocolBindingContext,
1720  IN NDIS_STATUS GeneralStatus,
1721  IN PVOID StatusBuffer,
1722  IN UINT StatusBufferSize);
1723
1724typedef VOID
1725(NTAPI *STATUS_COMPLETE_HANDLER)(
1726  IN NDIS_HANDLE ProtocolBindingContext);
1727
1728typedef VOID
1729(NTAPI *SEND_COMPLETE_HANDLER)(
1730  IN NDIS_HANDLE ProtocolBindingContext,
1731  IN PNDIS_PACKET Packet,
1732  IN NDIS_STATUS Status);
1733
1734typedef VOID
1735(NTAPI *WAN_SEND_COMPLETE_HANDLER)(
1736  IN NDIS_HANDLE ProtocolBindingContext,
1737  IN PNDIS_WAN_PACKET Packet,
1738  IN NDIS_STATUS Status);
1739
1740typedef VOID
1741(NTAPI *TRANSFER_DATA_COMPLETE_HANDLER)(
1742  IN NDIS_HANDLE ProtocolBindingContext,
1743  IN PNDIS_PACKET Packet,
1744  IN NDIS_STATUS Status,
1745  IN UINT BytesTransferred);
1746
1747typedef VOID
1748(NTAPI *WAN_TRANSFER_DATA_COMPLETE_HANDLER)(
1749  VOID);
1750
1751typedef NDIS_STATUS
1752(NTAPI *RECEIVE_HANDLER)(
1753  IN NDIS_HANDLE ProtocolBindingContext,
1754  IN NDIS_HANDLE MacReceiveContext,
1755  IN PVOID HeaderBuffer,
1756  IN UINT HeaderBufferSize,
1757  IN PVOID LookAheadBuffer,
1758  IN UINT LookaheadBufferSize,
1759  IN UINT PacketSize);
1760
1761typedef NDIS_STATUS
1762(NTAPI *WAN_RECEIVE_HANDLER)(
1763  IN NDIS_HANDLE NdisLinkHandle,
1764  IN PUCHAR Packet,
1765  IN ULONG PacketSize);
1766
1767typedef VOID
1768(NTAPI *RECEIVE_COMPLETE_HANDLER)(
1769  IN NDIS_HANDLE ProtocolBindingContext);
1770
1771/* Protocol characteristics for NDIS 3.0 protocols */
1772
1773#define NDIS30_PROTOCOL_CHARACTERISTICS_S \
1774  UCHAR  MajorNdisVersion; \
1775  UCHAR  MinorNdisVersion; \
1776  USHORT  Filler; \
1777  _ANONYMOUS_UNION union { \
1778    UINT  Reserved; \
1779    UINT  Flags; \
1780  } DUMMYUNIONNAME; \
1781  OPEN_ADAPTER_COMPLETE_HANDLER  OpenAdapterCompleteHandler; \
1782  CLOSE_ADAPTER_COMPLETE_HANDLER  CloseAdapterCompleteHandler; \
1783  _ANONYMOUS_UNION union { \
1784    SEND_COMPLETE_HANDLER  SendCompleteHandler; \
1785    WAN_SEND_COMPLETE_HANDLER  WanSendCompleteHandler; \
1786  } DUMMYUNIONNAME2; \
1787  _ANONYMOUS_UNION union { \
1788    TRANSFER_DATA_COMPLETE_HANDLER  TransferDataCompleteHandler; \
1789    WAN_TRANSFER_DATA_COMPLETE_HANDLER  WanTransferDataCompleteHandler; \
1790  } DUMMYUNIONNAME3; \
1791  RESET_COMPLETE_HANDLER  ResetCompleteHandler; \
1792  REQUEST_COMPLETE_HANDLER  RequestCompleteHandler; \
1793  _ANONYMOUS_UNION union { \
1794    RECEIVE_HANDLER	 ReceiveHandler; \
1795    WAN_RECEIVE_HANDLER  WanReceiveHandler; \
1796  } DUMMYUNIONNAME4; \
1797  RECEIVE_COMPLETE_HANDLER  ReceiveCompleteHandler; \
1798  STATUS_HANDLER  StatusHandler; \
1799  STATUS_COMPLETE_HANDLER  StatusCompleteHandler; \
1800  NDIS_STRING  Name;
1801
1802typedef struct _NDIS30_PROTOCOL_CHARACTERISTICS {
1803  NDIS30_PROTOCOL_CHARACTERISTICS_S
1804} NDIS30_PROTOCOL_CHARACTERISTICS, *PNDIS30_PROTOCOL_CHARACTERISTICS;
1805
1806
1807/* Prototypes for NDIS 4.0 protocol characteristics */
1808
1809typedef INT
1810(NTAPI *RECEIVE_PACKET_HANDLER)(
1811  IN NDIS_HANDLE ProtocolBindingContext,
1812  IN PNDIS_PACKET Packet);
1813
1814typedef VOID
1815(NTAPI *BIND_HANDLER)(
1816  OUT PNDIS_STATUS Status,
1817  IN NDIS_HANDLE BindContext,
1818  IN PNDIS_STRING DeviceName,
1819  IN PVOID SystemSpecific1,
1820  IN PVOID SystemSpecific2);
1821
1822typedef VOID
1823(NTAPI *UNBIND_HANDLER)(
1824  OUT PNDIS_STATUS Status,
1825  IN NDIS_HANDLE ProtocolBindingContext,
1826  IN NDIS_HANDLE UnbindContext);
1827
1828typedef NDIS_STATUS
1829(NTAPI *PNP_EVENT_HANDLER)(
1830  IN NDIS_HANDLE ProtocolBindingContext,
1831  IN PNET_PNP_EVENT NetPnPEvent);
1832
1833typedef VOID
1834(NTAPI *UNLOAD_PROTOCOL_HANDLER)(
1835  VOID);
1836
1837/* Protocol characteristics for NDIS 4.0 protocols */
1838
1839typedef struct _NDIS40_PROTOCOL_CHARACTERISTICS {
1840  UCHAR MajorNdisVersion;
1841  UCHAR MinorNdisVersion;
1842  USHORT Filler;
1843  __MINGW_EXTENSION union {
1844    UINT Reserved;
1845    UINT Flags;
1846  };
1847  OPEN_ADAPTER_COMPLETE_HANDLER OpenAdapterCompleteHandler;
1848  CLOSE_ADAPTER_COMPLETE_HANDLER CloseAdapterCompleteHandler;
1849  __MINGW_EXTENSION union {
1850    SEND_COMPLETE_HANDLER SendCompleteHandler;
1851    WAN_SEND_COMPLETE_HANDLER WanSendCompleteHandler;
1852  };
1853  __MINGW_EXTENSION union {
1854    TRANSFER_DATA_COMPLETE_HANDLER TransferDataCompleteHandler;
1855    WAN_TRANSFER_DATA_COMPLETE_HANDLER WanTransferDataCompleteHandler;
1856  };
1857  RESET_COMPLETE_HANDLER ResetCompleteHandler;
1858  REQUEST_COMPLETE_HANDLER RequestCompleteHandler;
1859  __MINGW_EXTENSION union {
1860    RECEIVE_HANDLER ReceiveHandler;
1861    WAN_RECEIVE_HANDLER WanReceiveHandler;
1862  };
1863  RECEIVE_COMPLETE_HANDLER ReceiveCompleteHandler;
1864  STATUS_HANDLER StatusHandler;
1865  STATUS_COMPLETE_HANDLER StatusCompleteHandler;
1866  NDIS_STRING Name;
1867  RECEIVE_PACKET_HANDLER ReceivePacketHandler;
1868  BIND_HANDLER BindAdapterHandler;
1869  UNBIND_HANDLER UnbindAdapterHandler;
1870  PNP_EVENT_HANDLER PnPEventHandler;
1871  UNLOAD_PROTOCOL_HANDLER UnloadHandler;
1872} NDIS40_PROTOCOL_CHARACTERISTICS;
1873
1874typedef VOID
1875(NTAPI PROTCOL_CO_AF_REGISTER_NOTIFY)(
1876  IN NDIS_HANDLE ProtocolBindingContext,
1877  IN PCO_ADDRESS_FAMILY AddressFamily);
1878typedef PROTCOL_CO_AF_REGISTER_NOTIFY *CO_AF_REGISTER_NOTIFY_HANDLER;
1879
1880#if NDIS_LEGACY_PROTOCOL
1881
1882typedef struct _NDIS50_PROTOCOL_CHARACTERISTICS {
1883#ifdef __cplusplus
1884  NDIS40_PROTOCOL_CHARACTERISTICS Ndis40Chars;
1885#else
1886  NDIS40_PROTOCOL_CHARACTERISTICS;
1887#endif
1888  PVOID ReservedHandlers[4];
1889  CO_SEND_COMPLETE_HANDLER CoSendCompleteHandler;
1890  CO_STATUS_HANDLER CoStatusHandler;
1891  CO_RECEIVE_PACKET_HANDLER CoReceivePacketHandler;
1892  CO_AF_REGISTER_NOTIFY_HANDLER CoAfRegisterNotifyHandler;
1893} NDIS50_PROTOCOL_CHARACTERISTICS;
1894
1895#if (defined(NDIS50) || defined(NDIS51))
1896typedef NDIS50_PROTOCOL_CHARACTERISTICS NDIS_PROTOCOL_CHARACTERISTICS;
1897#else
1898typedef NDIS40_PROTOCOL_CHARACTERISTICS NDIS_PROTOCOL_CHARACTERISTICS;
1899#endif
1900
1901typedef NDIS_PROTOCOL_CHARACTERISTICS *PNDIS_PROTOCOL_CHARACTERISTICS;
1902
1903#endif /* NDIS_LEGACY_PROTOCOL */
1904
1905/* Prototypes for NDIS_MINIPORT_CHARACTERISTICS */
1906
1907typedef BOOLEAN
1908(NTAPI *W_CHECK_FOR_HANG_HANDLER)(
1909  IN NDIS_HANDLE MiniportAdapterContext);
1910
1911typedef VOID
1912(NTAPI *W_DISABLE_INTERRUPT_HANDLER)(
1913  IN NDIS_HANDLE MiniportAdapterContext);
1914
1915typedef VOID
1916(NTAPI *W_ENABLE_INTERRUPT_HANDLER)(
1917  IN NDIS_HANDLE MiniportAdapterContext);
1918
1919typedef VOID
1920(NTAPI *W_HALT_HANDLER)(
1921  IN NDIS_HANDLE MiniportAdapterContext);
1922
1923typedef VOID
1924(NTAPI *W_HANDLE_INTERRUPT_HANDLER)(
1925  IN NDIS_HANDLE MiniportAdapterContext);
1926
1927typedef NDIS_STATUS
1928(NTAPI *W_INITIALIZE_HANDLER)(
1929  OUT PNDIS_STATUS OpenErrorStatus,
1930  OUT PUINT SelectedMediumIndex,
1931  IN PNDIS_MEDIUM MediumArray,
1932  IN UINT MediumArraySize,
1933  IN NDIS_HANDLE MiniportAdapterContext,
1934  IN NDIS_HANDLE WrapperConfigurationContext);
1935
1936typedef VOID
1937(NTAPI *W_ISR_HANDLER)(
1938  OUT PBOOLEAN InterruptRecognized,
1939  OUT PBOOLEAN QueueMiniportHandleInterrupt,
1940  IN NDIS_HANDLE MiniportAdapterContext);
1941
1942typedef NDIS_STATUS
1943(NTAPI *W_QUERY_INFORMATION_HANDLER)(
1944  IN NDIS_HANDLE MiniportAdapterContext,
1945  IN NDIS_OID Oid,
1946  IN PVOID InformationBuffer,
1947  IN ULONG InformationBufferLength,
1948  OUT PULONG BytesWritten,
1949  OUT PULONG BytesNeeded);
1950
1951typedef NDIS_STATUS
1952(NTAPI *W_RECONFIGURE_HANDLER)(
1953  OUT PNDIS_STATUS OpenErrorStatus,
1954  IN NDIS_HANDLE MiniportAdapterContext,
1955  IN NDIS_HANDLE WrapperConfigurationContext);
1956
1957typedef NDIS_STATUS
1958(NTAPI *W_RESET_HANDLER)(
1959  OUT PBOOLEAN AddressingReset,
1960  IN NDIS_HANDLE MiniportAdapterContext);
1961
1962typedef NDIS_STATUS
1963(NTAPI *W_SEND_HANDLER)(
1964  IN NDIS_HANDLE MiniportAdapterContext,
1965  IN PNDIS_PACKET Packet,
1966  IN UINT Flags);
1967
1968typedef NDIS_STATUS
1969(NTAPI *WM_SEND_HANDLER)(
1970  IN NDIS_HANDLE MiniportAdapterContext,
1971  IN NDIS_HANDLE NdisLinkHandle,
1972  IN PNDIS_WAN_PACKET Packet);
1973
1974typedef NDIS_STATUS
1975(NTAPI *W_SET_INFORMATION_HANDLER)(
1976  IN NDIS_HANDLE MiniportAdapterContext,
1977  IN NDIS_OID Oid,
1978  IN PVOID InformationBuffer,
1979  IN ULONG InformationBufferLength,
1980  OUT PULONG BytesRead,
1981  OUT PULONG BytesNeeded);
1982
1983typedef NDIS_STATUS
1984(NTAPI *W_TRANSFER_DATA_HANDLER)(
1985  OUT PNDIS_PACKET Packet,
1986  OUT PUINT BytesTransferred,
1987  IN NDIS_HANDLE MiniportAdapterContext,
1988  IN NDIS_HANDLE MiniportReceiveContext,
1989  IN UINT ByteOffset,
1990  IN UINT BytesToTransfer);
1991
1992typedef NDIS_STATUS
1993(NTAPI *WM_TRANSFER_DATA_HANDLER)(
1994  VOID);
1995
1996typedef VOID
1997(NTAPI *ADAPTER_SHUTDOWN_HANDLER)(
1998  IN PVOID ShutdownContext);
1999
2000typedef VOID
2001(NTAPI *W_RETURN_PACKET_HANDLER)(
2002  IN NDIS_HANDLE MiniportAdapterContext,
2003  IN PNDIS_PACKET Packet);
2004
2005typedef VOID
2006(NTAPI *W_SEND_PACKETS_HANDLER)(
2007  IN NDIS_HANDLE MiniportAdapterContext,
2008  IN PPNDIS_PACKET PacketArray,
2009  IN UINT NumberOfPackets);
2010
2011typedef VOID
2012(NTAPI *W_ALLOCATE_COMPLETE_HANDLER)(
2013  IN NDIS_HANDLE MiniportAdapterContext,
2014  IN PVOID VirtualAddress,
2015  IN PNDIS_PHYSICAL_ADDRESS PhysicalAddress,
2016  IN ULONG Length,
2017  IN PVOID Context);
2018
2019/* NDIS structures available only to miniport drivers */
2020
2021#define NDIS30_MINIPORT_CHARACTERISTICS_S \
2022  UCHAR  MajorNdisVersion; \
2023  UCHAR  MinorNdisVersion; \
2024  UINT  Reserved; \
2025  W_CHECK_FOR_HANG_HANDLER  CheckForHangHandler; \
2026  W_DISABLE_INTERRUPT_HANDLER  DisableInterruptHandler; \
2027  W_ENABLE_INTERRUPT_HANDLER  EnableInterruptHandler; \
2028  W_HALT_HANDLER  HaltHandler; \
2029  W_HANDLE_INTERRUPT_HANDLER  HandleInterruptHandler; \
2030  W_INITIALIZE_HANDLER  InitializeHandler; \
2031  W_ISR_HANDLER  ISRHandler; \
2032  W_QUERY_INFORMATION_HANDLER  QueryInformationHandler; \
2033  W_RECONFIGURE_HANDLER  ReconfigureHandler; \
2034  W_RESET_HANDLER  ResetHandler; \
2035  W_SEND_HANDLER  SendHandler; \
2036  W_SET_INFORMATION_HANDLER  SetInformationHandler; \
2037  W_TRANSFER_DATA_HANDLER  TransferDataHandler;
2038
2039typedef struct _NDIS30_MINIPORT_CHARACTERISTICS {
2040  NDIS30_MINIPORT_CHARACTERISTICS_S
2041} NDIS30_MINIPORT_CHARACTERISTICS, *PSNDIS30_MINIPORT_CHARACTERISTICS;
2042
2043#ifdef __cplusplus
2044
2045#define NDIS40_MINIPORT_CHARACTERISTICS_S \
2046  NDIS30_MINIPORT_CHARACTERISTICS  Ndis30Chars; \
2047  W_RETURN_PACKET_HANDLER  ReturnPacketHandler; \
2048  W_SEND_PACKETS_HANDLER  SendPacketsHandler; \
2049  W_ALLOCATE_COMPLETE_HANDLER  AllocateCompleteHandler;
2050
2051#else /* !__cplusplus */
2052
2053#define NDIS40_MINIPORT_CHARACTERISTICS_S \
2054  NDIS30_MINIPORT_CHARACTERISTICS_S \
2055  W_RETURN_PACKET_HANDLER  ReturnPacketHandler; \
2056  W_SEND_PACKETS_HANDLER  SendPacketsHandler; \
2057  W_ALLOCATE_COMPLETE_HANDLER  AllocateCompleteHandler;
2058
2059#endif /* !__cplusplus */
2060
2061typedef struct _NDIS40_MINIPORT_CHARACTERISTICS {
2062  NDIS40_MINIPORT_CHARACTERISTICS_S
2063} NDIS40_MINIPORT_CHARACTERISTICS, *PNDIS40_MINIPORT_CHARACTERISTICS;
2064
2065/* Extensions for NDIS 5.0 miniports */
2066
2067typedef NDIS_STATUS
2068(NTAPI MINIPORT_CO_CREATE_VC)(
2069  IN NDIS_HANDLE MiniportAdapterContext,
2070  IN NDIS_HANDLE NdisVcHandle,
2071  OUT PNDIS_HANDLE MiniportVcContext);
2072typedef MINIPORT_CO_CREATE_VC *W_CO_CREATE_VC_HANDLER;
2073
2074typedef NDIS_STATUS
2075(NTAPI MINIPORT_CO_DELETE_VC)(
2076  IN NDIS_HANDLE MiniportVcContext);
2077typedef MINIPORT_CO_DELETE_VC *W_CO_DELETE_VC_HANDLER;
2078
2079typedef NDIS_STATUS
2080(NTAPI MINIPORT_CO_ACTIVATE_VC)(
2081  IN NDIS_HANDLE MiniportVcContext,
2082  IN OUT PCO_CALL_PARAMETERS CallParameters);
2083typedef MINIPORT_CO_ACTIVATE_VC *W_CO_ACTIVATE_VC_HANDLER;
2084
2085typedef NDIS_STATUS
2086(NTAPI MINIPORT_CO_DEACTIVATE_VC)(
2087  IN NDIS_HANDLE MiniportVcContext);
2088typedef MINIPORT_CO_DEACTIVATE_VC *W_CO_DEACTIVATE_VC_HANDLER;
2089
2090typedef VOID
2091(NTAPI *W_CO_SEND_PACKETS_HANDLER)(
2092  IN NDIS_HANDLE MiniportVcContext,
2093  IN PPNDIS_PACKET PacketArray,
2094  IN UINT NumberOfPackets);
2095
2096typedef NDIS_STATUS
2097(NTAPI *W_CO_REQUEST_HANDLER)(
2098  IN NDIS_HANDLE MiniportAdapterContext,
2099  IN NDIS_HANDLE MiniportVcContext OPTIONAL,
2100  IN OUT PNDIS_REQUEST NdisRequest);
2101
2102#ifdef __cplusplus
2103
2104#define NDIS50_MINIPORT_CHARACTERISTICS_S \
2105  NDIS40_MINIPORT_CHARACTERISTICS  Ndis40Chars; \
2106  W_CO_CREATE_VC_HANDLER  CoCreateVcHandler; \
2107  W_CO_DELETE_VC_HANDLER  CoDeleteVcHandler; \
2108  W_CO_ACTIVATE_VC_HANDLER  CoActivateVcHandler; \
2109  W_CO_DEACTIVATE_VC_HANDLER  CoDeactivateVcHandler; \
2110  W_CO_SEND_PACKETS_HANDLER  CoSendPacketsHandler; \
2111  W_CO_REQUEST_HANDLER  CoRequestHandler;
2112
2113#else /* !__cplusplus */
2114
2115#define NDIS50_MINIPORT_CHARACTERISTICS_S \
2116  NDIS40_MINIPORT_CHARACTERISTICS_S \
2117  W_CO_CREATE_VC_HANDLER  CoCreateVcHandler; \
2118  W_CO_DELETE_VC_HANDLER  CoDeleteVcHandler; \
2119  W_CO_ACTIVATE_VC_HANDLER  CoActivateVcHandler; \
2120  W_CO_DEACTIVATE_VC_HANDLER  CoDeactivateVcHandler; \
2121  W_CO_SEND_PACKETS_HANDLER  CoSendPacketsHandler; \
2122  W_CO_REQUEST_HANDLER  CoRequestHandler;
2123
2124#endif /* !__cplusplus */
2125
2126typedef struct _NDIS50_MINIPORT_CHARACTERISTICS {
2127   NDIS50_MINIPORT_CHARACTERISTICS_S
2128} NDIS50_MINIPORT_CHARACTERISTICS, *PSNDIS50_MINIPORT_CHARACTERISTICS;
2129
2130/* Extensions for NDIS 5.1 miniports */
2131
2132typedef VOID
2133(NTAPI *W_CANCEL_SEND_PACKETS_HANDLER)(
2134  IN NDIS_HANDLE  MiniportAdapterContext,
2135  IN PVOID  CancelId);
2136
2137typedef VOID
2138(NTAPI *W_PNP_EVENT_NOTIFY_HANDLER)(
2139  IN NDIS_HANDLE  MiniportAdapterContext,
2140  IN NDIS_DEVICE_PNP_EVENT  PnPEvent,
2141  IN PVOID  InformationBuffer,
2142  IN ULONG  InformationBufferLength);
2143
2144typedef VOID
2145(NTAPI *W_MINIPORT_SHUTDOWN_HANDLER)(
2146  IN PVOID  ShutdownContext);
2147
2148#ifdef __cplusplus
2149
2150#define NDIS51_MINIPORT_CHARACTERISTICS_S \
2151  NDIS50_MINIPORT_CHARACTERISTICS  Ndis50Chars; \
2152  W_CANCEL_SEND_PACKETS_HANDLER  CancelSendPacketsHandler; \
2153  W_PNP_EVENT_NOTIFY_HANDLER  PnPEventNotifyHandler; \
2154  W_MINIPORT_SHUTDOWN_HANDLER  AdapterShutdownHandler;
2155
2156#else
2157
2158#define NDIS51_MINIPORT_CHARACTERISTICS_S \
2159  NDIS50_MINIPORT_CHARACTERISTICS_S \
2160  W_CANCEL_SEND_PACKETS_HANDLER  CancelSendPacketsHandler; \
2161  W_PNP_EVENT_NOTIFY_HANDLER  PnPEventNotifyHandler; \
2162  W_MINIPORT_SHUTDOWN_HANDLER  AdapterShutdownHandler;
2163
2164#endif
2165
2166typedef struct _NDIS51_MINIPORT_CHARACTERISTICS {
2167  NDIS51_MINIPORT_CHARACTERISTICS_S
2168} NDIS51_MINIPORT_CHARACTERISTICS, *PSNDIS51_MINIPORT_CHARACTERISTICS;
2169
2170#if defined(NDIS51_MINIPORT)
2171typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
2172  NDIS51_MINIPORT_CHARACTERISTICS_S
2173} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
2174#elif defined(NDIS50_MINIPORT)
2175typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
2176  NDIS50_MINIPORT_CHARACTERISTICS_S
2177} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
2178#elif defined(NDIS40_MINIPORT)
2179typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
2180  NDIS40_MINIPORT_CHARACTERISTICS_S
2181} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
2182#else /* NDIS30 */
2183typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
2184  NDIS30_MINIPORT_CHARACTERISTICS_S
2185} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
2186#endif
2187
2188typedef struct _NDIS_MINIPORT_INTERRUPT {
2189  PKINTERRUPT InterruptObject;
2190  KSPIN_LOCK DpcCountLock;
2191  PVOID Reserved;
2192  W_ISR_HANDLER MiniportIsr;
2193  W_HANDLE_INTERRUPT_HANDLER MiniportDpc;
2194  KDPC InterruptDpc;
2195  PNDIS_MINIPORT_BLOCK Miniport;
2196  UCHAR DpcCount;
2197  BOOLEAN Filler1;
2198  KEVENT DpcsCompletedEvent;
2199  BOOLEAN SharedInterrupt;
2200  BOOLEAN IsrRequested;
2201} NDIS_MINIPORT_INTERRUPT, *PNDIS_MINIPORT_INTERRUPT;
2202
2203/* Structures available only to full MAC drivers */
2204
2205typedef BOOLEAN
2206(NTAPI *PNDIS_INTERRUPT_SERVICE)(
2207  IN PVOID  InterruptContext);
2208
2209typedef VOID
2210(NTAPI *PNDIS_DEFERRED_PROCESSING)(
2211  IN PVOID  SystemSpecific1,
2212  IN PVOID  InterruptContext,
2213  IN PVOID  SystemSpecific2,
2214  IN PVOID  SystemSpecific3);
2215
2216typedef struct _NDIS_WRAPPER_HANDLE NDIS_WRAPPER_HANDLE, *PNDIS_WRAPPER_HANDLE;
2217typedef struct _NDIS_PROTOCOL_BLOCK NDIS_PROTOCOL_BLOCK, *PNDIS_PROTOCOL_BLOCK;
2218typedef struct _NDIS_OPEN_BLOCK NDIS_OPEN_BLOCK, *PNDIS_OPEN_BLOCK;
2219typedef struct _NDIS_M_DRIVER_BLOCK NDIS_M_DRIVER_BLOCK, *PNDIS_M_DRIVER_BLOCK;
2220typedef struct _NDIS_OFFLOAD NDIS_OFFLOAD, *PNDIS_OFFLOAD;
2221typedef struct _NDIS_AF_LIST NDIS_AF_LIST, *PNDIS_AF_LIST;
2222typedef struct _X_FILTER ETH_FILTER, *PETH_FILTER;
2223#if NDIS_SUPPORT_NDIS6
2224typedef USHORT NET_FRAME_TYPE, *PNET_FRAME_TYPE;
2225#endif
2226
2227typedef struct _NDIS_MINIPORT_TIMER {
2228  KTIMER  Timer;
2229  KDPC  Dpc;
2230  PNDIS_TIMER_FUNCTION  MiniportTimerFunction;
2231  PVOID  MiniportTimerContext;
2232  PNDIS_MINIPORT_BLOCK  Miniport;
2233  struct _NDIS_MINIPORT_TIMER  *NextDeferredTimer;
2234} NDIS_MINIPORT_TIMER, *PNDIS_MINIPORT_TIMER;
2235
2236typedef struct _NDIS_INTERRUPT {
2237  PKINTERRUPT  InterruptObject;
2238  KSPIN_LOCK  DpcCountLock;
2239  PNDIS_INTERRUPT_SERVICE  MacIsr;
2240  PNDIS_DEFERRED_PROCESSING  MacDpc;
2241  KDPC  InterruptDpc;
2242  PVOID  InterruptContext;
2243  UCHAR  DpcCount;
2244  BOOLEAN	 Removing;
2245  KEVENT  DpcsCompletedEvent;
2246} NDIS_INTERRUPT, *PNDIS_INTERRUPT;
2247
2248
2249typedef enum _NDIS_WORK_ITEM_TYPE {
2250  NdisWorkItemRequest,
2251  NdisWorkItemSend,
2252  NdisWorkItemReturnPackets,
2253  NdisWorkItemResetRequested,
2254  NdisWorkItemResetInProgress,
2255  NdisWorkItemHalt,
2256  NdisWorkItemSendLoopback,
2257  NdisWorkItemMiniportCallback,
2258  NdisMaxWorkItems
2259} NDIS_WORK_ITEM_TYPE, *PNDIS_WORK_ITEM_TYPE;
2260
2261#define	NUMBER_OF_WORK_ITEM_TYPES         NdisMaxWorkItems
2262#define	NUMBER_OF_SINGLE_WORK_ITEMS       6
2263
2264typedef struct _NDIS_MINIPORT_WORK_ITEM {
2265	SINGLE_LIST_ENTRY  Link;
2266	NDIS_WORK_ITEM_TYPE  WorkItemType;
2267	PVOID  WorkItemContext;
2268} NDIS_MINIPORT_WORK_ITEM, *PNDIS_MINIPORT_WORK_ITEM;
2269
2270struct _NDIS_WORK_ITEM;
2271typedef VOID (*NDIS_PROC)(struct _NDIS_WORK_ITEM *, PVOID);
2272
2273typedef struct _NDIS_WORK_ITEM {
2274  PVOID Context;
2275  NDIS_PROC Routine;
2276  UCHAR WrapperReserved[8*sizeof(PVOID)];
2277} NDIS_WORK_ITEM, *PNDIS_WORK_ITEM;
2278
2279typedef struct _NDIS_BIND_PATHS {
2280	UINT  Number;
2281	NDIS_STRING  Paths[1];
2282} NDIS_BIND_PATHS, *PNDIS_BIND_PATHS;
2283
2284
2285typedef VOID
2286(NTAPI *ETH_RCV_COMPLETE_HANDLER)(
2287  IN PETH_FILTER  Filter);
2288
2289typedef VOID
2290(NTAPI *ETH_RCV_INDICATE_HANDLER)(
2291  IN PETH_FILTER  Filter,
2292  IN NDIS_HANDLE  MacReceiveContext,
2293  IN PCHAR  Address,
2294  IN PVOID  HeaderBuffer,
2295  IN UINT  HeaderBufferSize,
2296  IN PVOID  LookaheadBuffer,
2297  IN UINT  LookaheadBufferSize,
2298  IN UINT  PacketSize);
2299
2300typedef VOID
2301(NTAPI *FDDI_RCV_COMPLETE_HANDLER)(
2302  IN PFDDI_FILTER  Filter);
2303
2304typedef VOID
2305(NTAPI *FDDI_RCV_INDICATE_HANDLER)(
2306  IN PFDDI_FILTER  Filter,
2307  IN NDIS_HANDLE  MacReceiveContext,
2308  IN PCHAR  Address,
2309  IN UINT  AddressLength,
2310  IN PVOID  HeaderBuffer,
2311  IN UINT  HeaderBufferSize,
2312  IN PVOID  LookaheadBuffer,
2313  IN UINT  LookaheadBufferSize,
2314  IN UINT  PacketSize);
2315
2316typedef VOID
2317(NTAPI *FILTER_PACKET_INDICATION_HANDLER)(
2318  IN NDIS_HANDLE  Miniport,
2319  IN PPNDIS_PACKET  PacketArray,
2320  IN UINT  NumberOfPackets);
2321
2322typedef VOID
2323(NTAPI *TR_RCV_COMPLETE_HANDLER)(
2324  IN PTR_FILTER  Filter);
2325
2326typedef VOID
2327(NTAPI *TR_RCV_INDICATE_HANDLER)(
2328  IN PTR_FILTER  Filter,
2329  IN NDIS_HANDLE  MacReceiveContext,
2330  IN PVOID  HeaderBuffer,
2331  IN UINT  HeaderBufferSize,
2332  IN PVOID  LookaheadBuffer,
2333  IN UINT  LookaheadBufferSize,
2334  IN UINT  PacketSize);
2335
2336typedef VOID
2337(NTAPI *WAN_RCV_COMPLETE_HANDLER)(
2338  IN NDIS_HANDLE  MiniportAdapterHandle,
2339  IN NDIS_HANDLE  NdisLinkContext);
2340
2341typedef VOID
2342(NTAPI *WAN_RCV_HANDLER)(
2343  OUT PNDIS_STATUS  Status,
2344  IN NDIS_HANDLE  MiniportAdapterHandle,
2345  IN NDIS_HANDLE  NdisLinkContext,
2346  IN PUCHAR  Packet,
2347  IN ULONG  PacketSize);
2348
2349typedef VOID
2350(FASTCALL *NDIS_M_DEQUEUE_WORK_ITEM)(
2351  IN PNDIS_MINIPORT_BLOCK  Miniport,
2352  IN NDIS_WORK_ITEM_TYPE  WorkItemType,
2353  OUT PVOID  *WorkItemContext);
2354
2355typedef NDIS_STATUS
2356(FASTCALL *NDIS_M_QUEUE_NEW_WORK_ITEM)(
2357  IN PNDIS_MINIPORT_BLOCK  Miniport,
2358  IN NDIS_WORK_ITEM_TYPE  WorkItemType,
2359  IN PVOID  WorkItemContext);
2360
2361typedef NDIS_STATUS
2362(FASTCALL *NDIS_M_QUEUE_WORK_ITEM)(
2363  IN PNDIS_MINIPORT_BLOCK  Miniport,
2364  IN NDIS_WORK_ITEM_TYPE  WorkItemType,
2365  IN PVOID  WorkItemContext);
2366
2367typedef VOID
2368(NTAPI *NDIS_M_REQ_COMPLETE_HANDLER)(
2369  IN NDIS_HANDLE  MiniportAdapterHandle,
2370  IN NDIS_STATUS  Status);
2371
2372typedef VOID
2373(NTAPI *NDIS_M_RESET_COMPLETE_HANDLER)(
2374  IN NDIS_HANDLE  MiniportAdapterHandle,
2375  IN NDIS_STATUS  Status,
2376  IN BOOLEAN  AddressingReset);
2377
2378typedef VOID
2379(NTAPI *NDIS_M_SEND_COMPLETE_HANDLER)(
2380  IN NDIS_HANDLE  MiniportAdapterHandle,
2381  IN PNDIS_PACKET  Packet,
2382  IN NDIS_STATUS  Status);
2383
2384typedef VOID
2385(NTAPI *NDIS_M_SEND_RESOURCES_HANDLER)(
2386  IN NDIS_HANDLE  MiniportAdapterHandle);
2387
2388typedef BOOLEAN
2389(FASTCALL *NDIS_M_START_SENDS)(
2390  IN PNDIS_MINIPORT_BLOCK  Miniport);
2391
2392typedef VOID
2393(NTAPI *NDIS_M_STATUS_HANDLER)(
2394  IN NDIS_HANDLE  MiniportHandle,
2395  IN NDIS_STATUS  GeneralStatus,
2396  IN PVOID  StatusBuffer,
2397  IN UINT  StatusBufferSize);
2398
2399typedef VOID
2400(NTAPI *NDIS_M_STS_COMPLETE_HANDLER)(
2401  IN NDIS_HANDLE  MiniportAdapterHandle);
2402
2403typedef VOID
2404(NTAPI *NDIS_M_TD_COMPLETE_HANDLER)(
2405  IN NDIS_HANDLE  MiniportAdapterHandle,
2406  IN PNDIS_PACKET  Packet,
2407  IN NDIS_STATUS  Status,
2408  IN UINT  BytesTransferred);
2409
2410typedef VOID (NTAPI *NDIS_WM_SEND_COMPLETE_HANDLER)(
2411  IN NDIS_HANDLE  MiniportAdapterHandle,
2412  IN PVOID  Packet,
2413  IN NDIS_STATUS  Status);
2414
2415
2416#if ARCNET
2417
2418#define ARC_SEND_BUFFERS                  8
2419#define ARC_HEADER_SIZE                   4
2420
2421typedef struct _NDIS_ARC_BUF {
2422  NDIS_HANDLE  ArcnetBufferPool;
2423  PUCHAR  ArcnetLookaheadBuffer;
2424  UINT  NumFree;
2425  ARC_BUFFER_LIST ArcnetBuffers[ARC_SEND_BUFFERS];
2426} NDIS_ARC_BUF, *PNDIS_ARC_BUF;
2427
2428#endif /* ARCNET */
2429
2430typedef struct _NDIS_LOG {
2431  PNDIS_MINIPORT_BLOCK  Miniport;
2432  KSPIN_LOCK  LogLock;
2433  PIRP  Irp;
2434  UINT  TotalSize;
2435  UINT  CurrentSize;
2436  UINT  InPtr;
2437  UINT  OutPtr;
2438  UCHAR  LogBuf[1];
2439} NDIS_LOG, *PNDIS_LOG;
2440
2441#if ARCNET
2442#define FILTERDBS_ARCNET_S \
2443  PARC_FILTER  ArcDB;
2444#else /* !ARCNET */
2445#define FILTERDBS_ARCNET_S \
2446  PVOID  XXXDB;
2447#endif /* !ARCNET */
2448
2449#define FILTERDBS_S \
2450  _ANONYMOUS_UNION union { \
2451    PETH_FILTER  EthDB; \
2452    PNULL_FILTER  NullDB; \
2453  } DUMMYUNIONNAME; \
2454  PTR_FILTER  TrDB; \
2455  PFDDI_FILTER  FddiDB; \
2456  FILTERDBS_ARCNET_S
2457
2458typedef struct _FILTERDBS {
2459  FILTERDBS_S
2460} FILTERDBS, *PFILTERDBS;
2461
2462struct _NDIS_MINIPORT_BLOCK {
2463  NDIS_OBJECT_HEADER Header;
2464  PNDIS_MINIPORT_BLOCK  NextMiniport;
2465  PNDIS_M_DRIVER_BLOCK  DriverHandle;
2466  NDIS_HANDLE  MiniportAdapterContext;
2467  UNICODE_STRING  MiniportName;
2468  PNDIS_BIND_PATHS  BindPaths;
2469  NDIS_HANDLE  OpenQueue;
2470  REFERENCE  ShortRef;
2471  NDIS_HANDLE  DeviceContext;
2472  UCHAR  Padding1;
2473  UCHAR  LockAcquired;
2474  UCHAR  PmodeOpens;
2475  UCHAR  AssignedProcessor;
2476  KSPIN_LOCK  Lock;
2477  PNDIS_REQUEST  MediaRequest;
2478  PNDIS_MINIPORT_INTERRUPT  Interrupt;
2479  ULONG  Flags;
2480  ULONG  PnPFlags;
2481  LIST_ENTRY  PacketList;
2482  PNDIS_PACKET  FirstPendingPacket;
2483  PNDIS_PACKET  ReturnPacketsQueue;
2484  ULONG  RequestBuffer;
2485  PVOID  SetMCastBuffer;
2486  PNDIS_MINIPORT_BLOCK  PrimaryMiniport;
2487  PVOID  WrapperContext;
2488  PVOID  BusDataContext;
2489  ULONG  PnPCapabilities;
2490  PCM_RESOURCE_LIST  Resources;
2491  NDIS_TIMER  WakeUpDpcTimer;
2492  UNICODE_STRING  BaseName;
2493  UNICODE_STRING  SymbolicLinkName;
2494  ULONG  CheckForHangSeconds;
2495  USHORT  CFHangTicks;
2496  USHORT  CFHangCurrentTick;
2497  NDIS_STATUS  ResetStatus;
2498  NDIS_HANDLE  ResetOpen;
2499  FILTERDBS_S
2500  FILTER_PACKET_INDICATION_HANDLER  PacketIndicateHandler;
2501  NDIS_M_SEND_COMPLETE_HANDLER  SendCompleteHandler;
2502  NDIS_M_SEND_RESOURCES_HANDLER  SendResourcesHandler;
2503  NDIS_M_RESET_COMPLETE_HANDLER  ResetCompleteHandler;
2504  NDIS_MEDIUM  MediaType;
2505  ULONG  BusNumber;
2506  NDIS_INTERFACE_TYPE  BusType;
2507  NDIS_INTERFACE_TYPE  AdapterType;
2508  PDEVICE_OBJECT  DeviceObject;
2509  PDEVICE_OBJECT  PhysicalDeviceObject;
2510  PDEVICE_OBJECT  NextDeviceObject;
2511  PMAP_REGISTER_ENTRY  MapRegisters;
2512  PNDIS_AF_LIST  CallMgrAfList;
2513  PVOID  MiniportThread;
2514  PVOID  SetInfoBuf;
2515  USHORT  SetInfoBufLen;
2516  USHORT  MaxSendPackets;
2517  NDIS_STATUS  FakeStatus;
2518  PVOID  LockHandler;
2519  PUNICODE_STRING  pAdapterInstanceName;
2520  PNDIS_MINIPORT_TIMER  TimerQueue;
2521  UINT  MacOptions;
2522  PNDIS_REQUEST  PendingRequest;
2523  UINT  MaximumLongAddresses;
2524  UINT  MaximumShortAddresses;
2525  UINT  CurrentLookahead;
2526  UINT  MaximumLookahead;
2527  W_HANDLE_INTERRUPT_HANDLER  HandleInterruptHandler;
2528  W_DISABLE_INTERRUPT_HANDLER  DisableInterruptHandler;
2529  W_ENABLE_INTERRUPT_HANDLER  EnableInterruptHandler;
2530  W_SEND_PACKETS_HANDLER  SendPacketsHandler;
2531  NDIS_M_START_SENDS  DeferredSendHandler;
2532  ETH_RCV_INDICATE_HANDLER  EthRxIndicateHandler;
2533  TR_RCV_INDICATE_HANDLER  TrRxIndicateHandler;
2534  FDDI_RCV_INDICATE_HANDLER  FddiRxIndicateHandler;
2535  ETH_RCV_COMPLETE_HANDLER  EthRxCompleteHandler;
2536  TR_RCV_COMPLETE_HANDLER  TrRxCompleteHandler;
2537  FDDI_RCV_COMPLETE_HANDLER  FddiRxCompleteHandler;
2538  NDIS_M_STATUS_HANDLER  StatusHandler;
2539  NDIS_M_STS_COMPLETE_HANDLER  StatusCompleteHandler;
2540  NDIS_M_TD_COMPLETE_HANDLER  TDCompleteHandler;
2541  NDIS_M_REQ_COMPLETE_HANDLER  QueryCompleteHandler;
2542  NDIS_M_REQ_COMPLETE_HANDLER  SetCompleteHandler;
2543  NDIS_WM_SEND_COMPLETE_HANDLER  WanSendCompleteHandler;
2544  WAN_RCV_HANDLER  WanRcvHandler;
2545  WAN_RCV_COMPLETE_HANDLER  WanRcvCompleteHandler;
2546#if defined(NDIS_WRAPPER)
2547  PNDIS_MINIPORT_BLOCK  NextGlobalMiniport;
2548  SINGLE_LIST_ENTRY  WorkQueue[NUMBER_OF_WORK_ITEM_TYPES];
2549  SINGLE_LIST_ENTRY  SingleWorkItems[NUMBER_OF_SINGLE_WORK_ITEMS];
2550  UCHAR  SendFlags;
2551  UCHAR  TrResetRing;
2552  UCHAR  ArcnetAddress;
2553  UCHAR  XState;
2554  _ANONYMOUS_UNION union {
2555#if ARCNET
2556    PNDIS_ARC_BUF  ArcBuf;
2557#endif
2558    PVOID  BusInterface;
2559  } DUMMYUNIONNAME;
2560  PNDIS_LOG  Log;
2561  ULONG  SlotNumber;
2562  PCM_RESOURCE_LIST  AllocatedResources;
2563  PCM_RESOURCE_LIST  AllocatedResourcesTranslated;
2564  SINGLE_LIST_ENTRY  PatternList;
2565  NDIS_PNP_CAPABILITIES  PMCapabilities;
2566  DEVICE_CAPABILITIES  DeviceCaps;
2567  ULONG  WakeUpEnable;
2568  DEVICE_POWER_STATE  CurrentDevicePowerState;
2569  PIRP  pIrpWaitWake;
2570  SYSTEM_POWER_STATE  WaitWakeSystemState;
2571  LARGE_INTEGER  VcIndex;
2572  KSPIN_LOCK  VcCountLock;
2573  LIST_ENTRY  WmiEnabledVcs;
2574  PNDIS_GUID  pNdisGuidMap;
2575  PNDIS_GUID  pCustomGuidMap;
2576  USHORT  VcCount;
2577  USHORT  cNdisGuidMap;
2578  USHORT  cCustomGuidMap;
2579  USHORT  CurrentMapRegister;
2580  PKEVENT  AllocationEvent;
2581  USHORT  BaseMapRegistersNeeded;
2582  USHORT  SGMapRegistersNeeded;
2583  ULONG  MaximumPhysicalMapping;
2584  NDIS_TIMER  MediaDisconnectTimer;
2585  USHORT  MediaDisconnectTimeOut;
2586  USHORT  InstanceNumber;
2587  NDIS_EVENT  OpenReadyEvent;
2588  NDIS_PNP_DEVICE_STATE  PnPDeviceState;
2589  NDIS_PNP_DEVICE_STATE  OldPnPDeviceState;
2590  PGET_SET_DEVICE_DATA  SetBusData;
2591  PGET_SET_DEVICE_DATA  GetBusData;
2592  KDPC  DeferredDpc;
2593#if 0
2594  /* FIXME: */
2595  NDIS_STATS  NdisStats;
2596#else
2597  ULONG  NdisStats;
2598#endif
2599  PNDIS_PACKET  IndicatedPacket[MAXIMUM_PROCESSORS];
2600  PKEVENT  RemoveReadyEvent;
2601  PKEVENT  AllOpensClosedEvent;
2602  PKEVENT  AllRequestsCompletedEvent;
2603  ULONG  InitTimeMs;
2604  NDIS_MINIPORT_WORK_ITEM  WorkItemBuffer[NUMBER_OF_SINGLE_WORK_ITEMS];
2605  PDMA_ADAPTER  SystemAdapterObject;
2606  ULONG  DriverVerifyFlags;
2607  POID_LIST  OidList;
2608  USHORT  InternalResetCount;
2609  USHORT  MiniportResetCount;
2610  USHORT  MediaSenseConnectCount;
2611  USHORT  MediaSenseDisconnectCount;
2612  PNDIS_PACKET  *xPackets;
2613  ULONG  UserModeOpenReferences;
2614  _ANONYMOUS_UNION union {
2615    PVOID  SavedSendHandler;
2616    PVOID  SavedWanSendHandler;
2617  } DUMMYUNIONNAME2;
2618  PVOID  SavedSendPacketsHandler;
2619  PVOID  SavedCancelSendPacketsHandler;
2620  W_SEND_PACKETS_HANDLER  WSendPacketsHandler;
2621  ULONG  MiniportAttributes;
2622  PDMA_ADAPTER  SavedSystemAdapterObject;
2623  USHORT  NumOpens;
2624  USHORT  CFHangXTicks;
2625  ULONG  RequestCount;
2626  ULONG  IndicatedPacketsCount;
2627  ULONG  PhysicalMediumType;
2628  PNDIS_REQUEST  LastRequest;
2629  LONG  DmaAdapterRefCount;
2630  PVOID  FakeMac;
2631  ULONG  LockDbg;
2632  ULONG  LockDbgX;
2633  PVOID  LockThread;
2634  ULONG  InfoFlags;
2635  KSPIN_LOCK  TimerQueueLock;
2636  PKEVENT  ResetCompletedEvent;
2637  PKEVENT  QueuedBindingCompletedEvent;
2638  PKEVENT  DmaResourcesReleasedEvent;
2639  FILTER_PACKET_INDICATION_HANDLER  SavedPacketIndicateHandler;
2640  ULONG  RegisteredInterrupts;
2641  PNPAGED_LOOKASIDE_LIST  SGListLookasideList;
2642  ULONG  ScatterGatherListSize;
2643#endif /* _NDIS_ */
2644};
2645
2646#if NDIS_LEGACY_DRIVER
2647
2648typedef NDIS_STATUS
2649(NTAPI *WAN_SEND_HANDLER)(
2650  IN NDIS_HANDLE MacBindingHandle,
2651  IN NDIS_HANDLE LinkHandle,
2652  IN PVOID Packet);
2653
2654typedef VOID
2655(NTAPI *SEND_PACKETS_HANDLER)(
2656  IN NDIS_HANDLE MiniportAdapterContext,
2657  IN PPNDIS_PACKET PacketArray,
2658  IN UINT NumberOfPackets);
2659
2660typedef NDIS_STATUS
2661(NTAPI *SEND_HANDLER)(
2662  IN NDIS_HANDLE NdisBindingHandle,
2663  IN PNDIS_PACKET Packet);
2664
2665typedef NDIS_STATUS
2666(NTAPI *TRANSFER_DATA_HANDLER)(
2667  IN NDIS_HANDLE NdisBindingHandle,
2668  IN NDIS_HANDLE MacReceiveContext,
2669  IN UINT ByteOffset,
2670  IN UINT BytesToTransfer,
2671  OUT PNDIS_PACKET Packet,
2672  OUT PUINT BytesTransferred);
2673
2674typedef NDIS_STATUS
2675(NTAPI *RESET_HANDLER)(
2676  IN NDIS_HANDLE NdisBindingHandle);
2677
2678typedef NDIS_STATUS
2679(NTAPI *REQUEST_HANDLER)(
2680  IN NDIS_HANDLE NdisBindingHandle,
2681  IN PNDIS_REQUEST NdisRequest);
2682
2683#endif /* NDIS_LEGACY_DRIVER */
2684
2685#if defined(NDIS_WRAPPER)
2686#define NDIS_COMMON_OPEN_BLOCK_WRAPPER_S \
2687  ULONG Flags; \
2688  ULONG References; \
2689  KSPIN_LOCK SpinLock; \
2690  NDIS_HANDLE  FilterHandle; \
2691  ULONG  ProtocolOptions; \
2692  USHORT  CurrentLookahead; \
2693  USHORT  ConnectDampTicks; \
2694  USHORT  DisconnectDampTicks; \
2695  W_SEND_HANDLER  WSendHandler; \
2696  W_TRANSFER_DATA_HANDLER  WTransferDataHandler; \
2697  W_SEND_PACKETS_HANDLER  WSendPacketsHandler; \
2698  W_CANCEL_SEND_PACKETS_HANDLER  CancelSendPacketsHandler; \
2699  ULONG  WakeUpEnable; \
2700  PKEVENT  CloseCompleteEvent; \
2701  QUEUED_CLOSE  QC; \
2702  ULONG  AfReferences; \
2703  PNDIS_OPEN_BLOCK  NextGlobalOpen;
2704#else
2705#define NDIS_COMMON_OPEN_BLOCK_WRAPPER_S
2706#endif
2707
2708#define NDIS_COMMON_OPEN_BLOCK_S \
2709  PVOID  MacHandle; \
2710  NDIS_HANDLE  BindingHandle; \
2711  PNDIS_MINIPORT_BLOCK  MiniportHandle; \
2712  PNDIS_PROTOCOL_BLOCK  ProtocolHandle; \
2713  NDIS_HANDLE  ProtocolBindingContext; \
2714  PNDIS_OPEN_BLOCK  MiniportNextOpen; \
2715  PNDIS_OPEN_BLOCK  ProtocolNextOpen; \
2716  NDIS_HANDLE  MiniportAdapterContext; \
2717  BOOLEAN  Reserved1; \
2718  BOOLEAN  Reserved2; \
2719  BOOLEAN  Reserved3; \
2720  BOOLEAN  Reserved4; \
2721  PNDIS_STRING  BindDeviceName; \
2722  KSPIN_LOCK  Reserved5; \
2723  PNDIS_STRING  RootDeviceName; \
2724  _ANONYMOUS_UNION union { \
2725    SEND_HANDLER  SendHandler; \
2726    WAN_SEND_HANDLER  WanSendHandler; \
2727  } DUMMYUNIONNAME; \
2728  TRANSFER_DATA_HANDLER  TransferDataHandler; \
2729  SEND_COMPLETE_HANDLER  SendCompleteHandler; \
2730  TRANSFER_DATA_COMPLETE_HANDLER  TransferDataCompleteHandler; \
2731  RECEIVE_HANDLER  ReceiveHandler; \
2732  RECEIVE_COMPLETE_HANDLER  ReceiveCompleteHandler; \
2733  WAN_RECEIVE_HANDLER  WanReceiveHandler; \
2734  REQUEST_COMPLETE_HANDLER  RequestCompleteHandler; \
2735  RECEIVE_PACKET_HANDLER  ReceivePacketHandler; \
2736  SEND_PACKETS_HANDLER  SendPacketsHandler; \
2737  RESET_HANDLER  ResetHandler; \
2738  REQUEST_HANDLER  RequestHandler; \
2739  RESET_COMPLETE_HANDLER  ResetCompleteHandler; \
2740  STATUS_HANDLER  StatusHandler; \
2741  STATUS_COMPLETE_HANDLER  StatusCompleteHandler; \
2742  NDIS_COMMON_OPEN_BLOCK_WRAPPER_S
2743
2744typedef struct _NDIS_COMMON_OPEN_BLOCK {
2745  NDIS_COMMON_OPEN_BLOCK_S
2746} NDIS_COMMON_OPEN_BLOCK;
2747
2748struct _NDIS_OPEN_BLOCK
2749{
2750#ifdef __cplusplus
2751  NDIS_COMMON_OPEN_BLOCK NdisCommonOpenBlock;
2752#else
2753  NDIS_COMMON_OPEN_BLOCK_S
2754#endif
2755};
2756
2757#include <xfilter.h>
2758
2759#define NDIS_M_MAX_LOOKAHEAD           526
2760
2761NDISAPI
2762VOID
2763NTAPI
2764NdisInitializeTimer(
2765  PNDIS_TIMER Timer,
2766  PNDIS_TIMER_FUNCTION TimerFunction,
2767  PVOID FunctionContext);
2768
2769NDISAPI
2770VOID
2771NTAPI
2772NdisCancelTimer(
2773  PNDIS_TIMER Timer,
2774  PBOOLEAN TimerCancelled);
2775
2776NDISAPI
2777VOID
2778NTAPI
2779NdisSetTimer(
2780  PNDIS_TIMER Timer,
2781  UINT MillisecondsToDelay);
2782
2783NDISAPI
2784VOID
2785NTAPI
2786NdisSetPeriodicTimer(
2787  PNDIS_TIMER NdisTimer,
2788  UINT MillisecondsPeriod);
2789
2790NDISAPI
2791VOID
2792NTAPI
2793NdisSetTimerEx(
2794  PNDIS_TIMER NdisTimer,
2795  UINT MillisecondsToDelay,
2796  PVOID FunctionContext);
2797
2798NDISAPI
2799PVOID
2800NTAPI
2801NdisGetRoutineAddress(
2802  PNDIS_STRING NdisRoutineName);
2803
2804NDISAPI
2805UINT
2806NTAPI
2807NdisGetVersion(VOID);
2808
2809#if NDIS_LEGACY_DRIVER
2810
2811NDISAPI
2812VOID
2813NTAPI
2814NdisAllocateBuffer(
2815  OUT PNDIS_STATUS Status,
2816  OUT PNDIS_BUFFER *Buffer,
2817  IN NDIS_HANDLE PoolHandle OPTIONAL,
2818  IN PVOID VirtualAddress,
2819  IN UINT Length);
2820
2821NDISAPI
2822VOID
2823NTAPI
2824NdisAllocateBufferPool(
2825  OUT PNDIS_STATUS Status,
2826  OUT PNDIS_HANDLE PoolHandle,
2827  IN UINT NumberOfDescriptors);
2828
2829NDISAPI
2830VOID
2831NTAPI
2832NdisFreeBufferPool(
2833  IN NDIS_HANDLE PoolHandle);
2834
2835/*
2836NDISAPI
2837VOID
2838NTAPI
2839NdisFreeBuffer(
2840  IN PNDIS_BUFFER Buffer);
2841*/
2842#define NdisFreeBuffer IoFreeMdl
2843
2844NDISAPI
2845VOID
2846NTAPI
2847NdisAllocatePacketPool(
2848  OUT PNDIS_STATUS Status,
2849  OUT PNDIS_HANDLE PoolHandle,
2850  IN UINT NumberOfDescriptors,
2851  IN UINT ProtocolReservedLength);
2852
2853NDISAPI
2854VOID
2855NTAPI
2856NdisAllocatePacketPoolEx(
2857  OUT PNDIS_STATUS Status,
2858  OUT PNDIS_HANDLE PoolHandle,
2859  IN UINT NumberOfDescriptors,
2860  IN UINT NumberOfOverflowDescriptors,
2861  IN UINT ProtocolReservedLength);
2862
2863NDISAPI
2864VOID
2865NTAPI
2866NdisSetPacketPoolProtocolId(
2867  IN NDIS_HANDLE PacketPoolHandle,
2868  IN UINT ProtocolId);
2869
2870NDISAPI
2871UINT
2872NTAPI
2873NdisPacketPoolUsage(
2874  IN NDIS_HANDLE PoolHandle);
2875
2876NDISAPI
2877UINT
2878NTAPI
2879NdisPacketSize(
2880  IN UINT ProtocolReservedSize);
2881
2882NDISAPI
2883NDIS_HANDLE
2884NTAPI
2885NdisGetPoolFromPacket(
2886  IN PNDIS_PACKET Packet);
2887
2888NDISAPI
2889PNDIS_PACKET_STACK
2890NTAPI
2891NdisIMGetCurrentPacketStack(
2892  IN PNDIS_PACKET Packet,
2893  OUT BOOLEAN * StacksRemaining);
2894
2895NDISAPI
2896VOID
2897NTAPI
2898NdisFreePacketPool(
2899  IN NDIS_HANDLE PoolHandle);
2900
2901NDISAPI
2902VOID
2903NTAPI
2904NdisFreePacket(
2905  IN PNDIS_PACKET Packet);
2906
2907NDISAPI
2908VOID
2909NTAPI
2910NdisDprFreePacket(
2911  IN PNDIS_PACKET Packet);
2912
2913NDISAPI
2914VOID
2915NTAPI
2916NdisDprFreePacketNonInterlocked(
2917  IN PNDIS_PACKET Packet);
2918
2919NDISAPI
2920VOID
2921NTAPI
2922NdisAllocatePacket(
2923  OUT PNDIS_STATUS Status,
2924  OUT PNDIS_PACKET *Packet,
2925  IN NDIS_HANDLE PoolHandle);
2926
2927NDISAPI
2928VOID
2929NTAPI
2930NdisDprAllocatePacket(
2931  OUT PNDIS_STATUS Status,
2932  OUT PNDIS_PACKET *Packet,
2933  IN NDIS_HANDLE PoolHandle);
2934
2935NDISAPI
2936VOID
2937NTAPI
2938NdisDprAllocatePacketNonInterlocked(
2939  OUT PNDIS_STATUS Status,
2940  OUT PNDIS_PACKET *Packet,
2941  IN NDIS_HANDLE PoolHandle);
2942
2943/*
2944 * VOID
2945 * NdisReinitializePacket(
2946 *   IN OUT  PNDIS_PACKET  Packet);
2947 */
2948#define NdisReinitializePacket(Packet) {        \
2949  (Packet)->Private.Head = (PNDIS_BUFFER)NULL;  \
2950  (Packet)->Private.ValidCounts = FALSE;        \
2951}
2952
2953/*
2954NDISAPI
2955VOID
2956NTAPI
2957NdisQueryBuffer(
2958  IN PNDIS_BUFFER Buffer,
2959  OUT PVOID *VirtualAddress OPTIONAL,
2960  OUT PUINT Length);
2961*/
2962#define NdisQueryBuffer(_Buffer, _VirtualAddress, _Length) {         \
2963  if (ARGUMENT_PRESENT(_VirtualAddress)) {                           \
2964    *(PVOID *)(_VirtualAddress) = MmGetSystemAddressForMdl(_Buffer); \
2965  }                                                                  \
2966  *(_Length) = MmGetMdlByteCount(_Buffer);                           \
2967}
2968
2969NDISAPI
2970VOID
2971NTAPI
2972NdisGetFirstBufferFromPacket(
2973  IN PNDIS_PACKET _Packet,
2974  OUT PNDIS_BUFFER *_FirstBuffer,
2975  OUT PVOID *_FirstBufferVA,
2976  OUT PUINT _FirstBufferLength,
2977  OUT PUINT _TotalBufferLength);
2978
2979/*
2980 * VOID
2981 * NdisGetFirstBufferFromPacketSafe(
2982 * IN PNDIS_PACKET _Packet,
2983 * OUT PNDIS_BUFFER * _FirstBuffer,
2984 * OUT PVOID * _FirstBufferVA,
2985 * OUT PUINT _FirstBufferLength,
2986 * OUT PUINT _TotalBufferLength),
2987 * IN MM_PAGE_PRIORITY _Priority)
2988 */
2989#define NdisGetFirstBufferFromPacketSafe(_Packet,                             \
2990                                     _FirstBuffer,                            \
2991                                     _FirstBufferVA,                          \
2992                                     _FirstBufferLength,                      \
2993                                     _TotalBufferLength,                      \
2994                                     _Priority)                               \
2995{                                                                             \
2996  PNDIS_BUFFER _Buffer;                                                       \
2997                                                                              \
2998  _Buffer         = (_Packet)->Private.Head;                                  \
2999  *(_FirstBuffer) = _Buffer;                                                  \
3000  if (_Buffer != NULL) {                                                      \
3001    *(_FirstBufferVA)     = MmGetSystemAddressForMdlSafe(_Buffer, _Priority); \
3002    *(_FirstBufferLength) = MmGetMdlByteCount(_Buffer);                       \
3003    _Buffer = _Buffer->Next;                                                  \
3004    *(_TotalBufferLength) = *(_FirstBufferLength);                            \
3005    while (_Buffer != NULL) {                                                 \
3006      *(_TotalBufferLength) += MmGetMdlByteCount(_Buffer);                    \
3007      _Buffer = _Buffer->Next;                                                \
3008    }                                                                         \
3009  }                                                                           \
3010  else {                                                                      \
3011    *(_FirstBufferVA) = 0;                                                    \
3012    *(_FirstBufferLength) = 0;                                                \
3013    *(_TotalBufferLength) = 0;                                                \
3014  }                                                                           \
3015}
3016
3017/*
3018 * VOID
3019 * NdisRecalculatePacketCounts(
3020 *   IN OUT PNDIS_PACKET Packet);
3021 */
3022#define NdisRecalculatePacketCounts(Packet) {     \
3023  PNDIS_BUFFER _Buffer = (Packet)->Private.Head;  \
3024  if (_Buffer != NULL) {                          \
3025    while (_Buffer->Next != NULL) {               \
3026      _Buffer = _Buffer->Next;                    \
3027    }                                             \
3028    (Packet)->Private.Tail = _Buffer;             \
3029  }                                               \
3030  (Packet)->Private.ValidCounts = FALSE;          \
3031}
3032
3033/*
3034 * VOID
3035 * NdisChainBufferAtFront(
3036 *   IN OUT PNDIS_PACKET Packet,
3037 *   IN OUT PNDIS_BUFFER Buffer)
3038 */
3039#define NdisChainBufferAtFront(Packet,        \
3040                               Buffer)        \
3041{                                             \
3042  PNDIS_BUFFER _NdisBuffer = (Buffer);        \
3043                                              \
3044  while (_NdisBuffer->Next != NULL)           \
3045    _NdisBuffer = _NdisBuffer->Next;          \
3046                                              \
3047  if ((Packet)->Private.Head == NULL)         \
3048    (Packet)->Private.Tail = _NdisBuffer;     \
3049                                              \
3050  _NdisBuffer->Next = (Packet)->Private.Head; \
3051  (Packet)->Private.Head = (Buffer);          \
3052  (Packet)->Private.ValidCounts = FALSE;      \
3053}
3054
3055/*
3056 * VOID
3057 * NdisChainBufferAtBack(
3058 *   IN OUT PNDIS_PACKET Packet,
3059 *   IN OUT PNDIS_BUFFER Buffer)
3060 */
3061#define NdisChainBufferAtBack(Packet,           \
3062                              Buffer)           \
3063{                                               \
3064  PNDIS_BUFFER _NdisBuffer = (Buffer);          \
3065                                                \
3066  while (_NdisBuffer->Next != NULL)             \
3067    _NdisBuffer = _NdisBuffer->Next;            \
3068                                                \
3069  _NdisBuffer->Next = NULL;                     \
3070                                                \
3071  if ((Packet)->Private.Head != NULL)           \
3072    (Packet)->Private.Tail->Next = (Buffer);    \
3073  else                                          \
3074    (Packet)->Private.Head = (Buffer);          \
3075                                                \
3076  (Packet)->Private.Tail = _NdisBuffer;         \
3077  (Packet)->Private.ValidCounts = FALSE;        \
3078}
3079
3080NDISAPI
3081VOID
3082NTAPI
3083NdisUnchainBufferAtFront(
3084  IN OUT PNDIS_PACKET Packet,
3085  OUT PNDIS_BUFFER *Buffer);
3086
3087NDISAPI
3088VOID
3089NTAPI
3090NdisUnchainBufferAtBack(
3091  IN OUT PNDIS_PACKET Packet,
3092  OUT PNDIS_BUFFER *Buffer);
3093
3094NDISAPI
3095VOID
3096NTAPI
3097NdisCopyFromPacketToPacket(
3098  IN PNDIS_PACKET Destination,
3099  IN UINT DestinationOffset,
3100  IN UINT BytesToCopy,
3101  IN PNDIS_PACKET Source,
3102  IN UINT SourceOffset,
3103  OUT PUINT BytesCopied);
3104
3105NDISAPI
3106VOID
3107NTAPI
3108NdisCopyFromPacketToPacketSafe(
3109  IN PNDIS_PACKET Destination,
3110  IN UINT DestinationOffset,
3111  IN UINT BytesToCopy,
3112  IN PNDIS_PACKET Source,
3113  IN UINT SourceOffset,
3114  OUT PUINT BytesCopied,
3115  IN MM_PAGE_PRIORITY Priority);
3116
3117NDISAPI
3118NDIS_STATUS
3119NTAPI
3120NdisAllocateMemory(
3121  OUT PVOID *VirtualAddress,
3122  IN UINT Length,
3123  IN UINT MemoryFlags,
3124  IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress);
3125
3126#define NdisInitializeWorkItem(_WI_, _R_, _C_) { \
3127  (_WI_)->Context = _C_;                         \
3128  (_WI_)->Routine = _R_;                         \
3129}
3130
3131NDISAPI
3132NDIS_STATUS
3133NTAPI
3134NdisScheduleWorkItem(
3135  IN PNDIS_WORK_ITEM WorkItem);
3136
3137NDISAPI
3138VOID
3139NTAPI
3140NdisSetPacketStatus(
3141  IN PNDIS_PACKET Packet,
3142  IN NDIS_STATUS Status,
3143  IN NDIS_HANDLE Handle,
3144  IN ULONG Code);
3145
3146#endif /* NDIS_LEGACY_DRIVER */
3147
3148NDISAPI
3149VOID
3150NTAPI
3151NdisOpenFile(
3152  OUT PNDIS_STATUS Status,
3153  OUT PNDIS_HANDLE FileHandle,
3154  OUT PUINT FileLength,
3155  IN PNDIS_STRING FileName,
3156  IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress);
3157
3158NDISAPI
3159VOID
3160NTAPI
3161NdisCloseFile(
3162  IN NDIS_HANDLE FileHandle);
3163
3164NDISAPI
3165VOID
3166NTAPI
3167NdisMapFile(
3168  OUT PNDIS_STATUS Status,
3169  OUT PVOID *MappedBuffer,
3170  IN NDIS_HANDLE FileHandle);
3171
3172NDISAPI
3173VOID
3174NTAPI
3175NdisUnmapFile(
3176  IN NDIS_HANDLE FileHandle);
3177
3178NDISAPI
3179ULONG
3180NTAPI
3181NdisGetSharedDataAlignment(VOID);
3182
3183#define NdisFlushBuffer(Buffer,WriteToDevice) \
3184  KeFlushIoBuffers((Buffer),!(WriteToDevice), TRUE)
3185
3186NDISAPI
3187VOID
3188NTAPI
3189NdisCopyBuffer(
3190  OUT PNDIS_STATUS Status,
3191  OUT PNDIS_BUFFER *Buffer,
3192  IN NDIS_HANDLE PoolHandle,
3193  IN PVOID MemoryDescriptor,
3194  IN UINT Offset,
3195  IN UINT Length);
3196
3197/*
3198 * VOID
3199 * NdisCopyLookaheadData(
3200 *   IN PVOID Destination,
3201 *   IN PVOID Source,
3202 *   IN ULONG Length,
3203 *   IN ULONG ReceiveFlags);
3204 */
3205
3206#if defined(_M_IX86) || defined(_M_AMD64)
3207#define NdisCopyLookaheadData(Destination, Source, Length, MacOptions) \
3208  RtlCopyMemory(Destination, Source, Length)
3209#else
3210#define NdisCopyLookaheadData(Destination, Source, Length, MacOptions) \
3211  { \
3212    if ((MacOptions) & NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA) \
3213    { \
3214      RtlCopyMemory(_Destination, _Source, _Length); \
3215    } \
3216    else \
3217    { \
3218      PUCHAR _Src = (PUCHAR)(Source); \
3219      PUCHAR _Dest = (PUCHAR)(Destination); \
3220      PUCHAR _End = _Dest + (Length); \
3221      while (_Dest < _End) \
3222        *_Dest++ = *_Src++; \
3223    } \
3224  }
3225#endif
3226
3227/*
3228NDISAPI
3229VOID
3230NTAPI
3231NdisAdjustBufferLength(
3232  IN PNDIS_BUFFER Buffer,
3233  IN UINT Length);
3234*/
3235#define NdisAdjustBufferLength(Buffer, Length) \
3236  (((Buffer)->ByteCount) = (Length))
3237
3238#if NDIS_SUPPORT_NDIS6
3239#define NdisAdjustMdlLength(_Mdl, _Length) \
3240  (((_Mdl)->ByteCount) = (_Length))
3241#endif
3242
3243/*
3244NDISAPI
3245ULONG
3246NTAPI
3247NdisBufferLength(
3248  IN PNDIS_BUFFER Buffer);
3249*/
3250#define NdisBufferLength MmGetMdlByteCount
3251
3252/*
3253NDISAPI
3254PVOID
3255NTAPI
3256NdisBufferVirtualAddress(
3257  IN PNDIS_BUFFER Buffer);
3258*/
3259#define NdisBufferVirtualAddress MmGetSystemAddressForMdl
3260
3261#define NdisBufferVirtualAddressSafe MmGetSystemAddressForMdlSafe
3262
3263NDISAPI
3264ULONG
3265NTAPI
3266NDIS_BUFFER_TO_SPAN_PAGES(
3267  IN PNDIS_BUFFER Buffer);
3268
3269/*
3270NDISAPI
3271VOID
3272NTAPI
3273NdisGetBufferPhysicalArraySize(
3274  IN PNDIS_BUFFER Buffer,
3275  OUT PUINT ArraySize);
3276*/
3277#define NdisGetBufferPhysicalArraySize(Buffer, ArraySize) \
3278  (*(ArraySize) = NDIS_BUFFER_TO_SPAN_PAGES(Buffer))
3279
3280/*
3281NDISAPI
3282VOID
3283NTAPI
3284NdisQueryBufferOffset(
3285  IN PNDIS_BUFFER Buffer,
3286  OUT PUINT Offset,
3287  OUT PUINT Length);
3288*/
3289#define NdisQueryBufferOffset(_Buffer, _Offset, _Length) { \
3290  *(_Offset) = MmGetMdlByteOffset(_Buffer);                \
3291  *(_Length) = MmGetMdlByteCount(_Buffer);                 \
3292}
3293
3294/*
3295 * PVOID
3296 * NDIS_BUFFER_LINKAGE(
3297 *   IN PNDIS_BUFFER Buffer);
3298 */
3299#define NDIS_BUFFER_LINKAGE(Buffer) (Buffer)->Next
3300
3301/*
3302 * VOID
3303 * NdisGetNextBuffer(
3304 *   IN PNDIS_BUFFER CurrentBuffer,
3305 *   OUT PNDIS_BUFFER * NextBuffer)
3306 */
3307#define NdisGetNextBuffer(CurrentBuffer,  \
3308                          NextBuffer)     \
3309{                                         \
3310  *(NextBuffer) = (CurrentBuffer)->Next;  \
3311}
3312
3313#if NDIS_LEGACY_DRIVER
3314
3315#define NDIS_PACKET_FIRST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Head)
3316#define NDIS_PACKET_LAST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Tail)
3317#define NDIS_PACKET_VALID_COUNTS(_Packet) ((_Packet)->Private.ValidCounts)
3318
3319/*
3320 * UINT
3321 * NdisGetPacketFlags(
3322 *   IN PNDIS_PACKET  Packet);
3323 */
3324#define NdisGetPacketFlags(Packet) (Packet)->Private.Flags
3325
3326/*
3327 * ULONG
3328 * NDIS_GET_PACKET_PROTOCOL_TYPE(
3329 *   IN PNDIS_PACKET Packet);
3330 */
3331#define NDIS_GET_PACKET_PROTOCOL_TYPE(_Packet) \
3332  ((_Packet)->Private.Flags & NDIS_PROTOCOL_ID_MASK)
3333
3334/*
3335 * PNDIS_PACKET_OOB_DATA
3336 * NDIS_OOB_DATA_FROM_PACKET(
3337 *   IN PNDIS_PACKET Packet);
3338 */
3339#define NDIS_OOB_DATA_FROM_PACKET(_Packet)    \
3340  (PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
3341  (_Packet)->Private.NdisPacketOobOffset)
3342
3343/*
3344 * ULONG
3345 * NDIS_GET_PACKET_HEADER_SIZE(
3346 *   IN PNDIS_PACKET Packet);
3347 */
3348#define NDIS_GET_PACKET_HEADER_SIZE(_Packet)   \
3349  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
3350  (_Packet)->Private.NdisPacketOobOffset))->HeaderSize
3351
3352/*
3353 * NDIS_STATUS
3354 * NDIS_GET_PACKET_STATUS(
3355 *   IN PNDIS_PACKET Packet);
3356 */
3357#define NDIS_GET_PACKET_STATUS(_Packet)        \
3358  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
3359  (_Packet)->Private.NdisPacketOobOffset))->Status
3360
3361/*
3362 * ULONGLONG
3363 * NDIS_GET_PACKET_TIME_TO_SEND(
3364 *   IN PNDIS_PACKET Packet);
3365 */
3366#define NDIS_GET_PACKET_TIME_TO_SEND(_Packet)   \
3367  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +  \
3368  (_Packet)->Private.NdisPacketOobOffset))->TimeToSend
3369
3370/*
3371 * ULONGLONG
3372 * NDIS_GET_PACKET_TIME_SENT(
3373 *   IN PNDIS_PACKET Packet);
3374 */
3375#define NDIS_GET_PACKET_TIME_SENT(_Packet)      \
3376  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +  \
3377  (_Packet)->Private.NdisPacketOobOffset))->TimeSent
3378
3379/*
3380 * ULONGLONG
3381 * NDIS_GET_PACKET_TIME_RECEIVED(
3382 *   IN PNDIS_PACKET Packet);
3383 */
3384#define NDIS_GET_PACKET_TIME_RECEIVED(_Packet)  \
3385  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +  \
3386  (_Packet)->Private.NdisPacketOobOffset))->TimeReceived
3387
3388/*
3389 * VOID
3390 * NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(
3391 *   IN PNDIS_PACKET Packet,
3392 *   IN PPVOID pMediaSpecificInfo,
3393 *   IN PUINT pSizeMediaSpecificInfo);
3394 */
3395#define NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(_Packet,                                  \
3396                                            _pMediaSpecificInfo,                      \
3397                                            _pSizeMediaSpecificInfo)                  \
3398{                                                                                     \
3399  if (!((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS) ||            \
3400      !((_Packet)->Private.NdisPacketFlags & fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO))   \
3401    {                                                                                 \
3402      *(_pMediaSpecificInfo) = NULL;                                                  \
3403      *(_pSizeMediaSpecificInfo) = 0;                                                 \
3404    }                                                                                 \
3405  else                                                                                \
3406    {                                                                                 \
3407      *(_pMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +           \
3408        (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation;           \
3409      *(_pSizeMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +       \
3410        (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo;              \
3411    }                                                                                 \
3412}
3413
3414/*
3415 * VOID
3416 * NDIS_SET_PACKET_HEADER_SIZE(
3417 *   IN PNDIS_PACKET Packet,
3418 *   IN UINT HdrSize);
3419 */
3420#define NDIS_SET_PACKET_HEADER_SIZE(_Packet, _HdrSize)              \
3421  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +                      \
3422  (_Packet)->Private.NdisPacketOobOffset))->HeaderSize = (_HdrSize)
3423
3424/*
3425 * VOID
3426 * NDIS_SET_PACKET_STATUS(
3427 *   IN PNDIS_PACKET Packet,
3428 *   IN NDIS_STATUS Status);
3429 */
3430#define NDIS_SET_PACKET_STATUS(_Packet, _Status)  \
3431  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +    \
3432  (_Packet)->Private.NdisPacketOobOffset))->Status = (_Status)
3433
3434/*
3435 * VOID
3436 * NDIS_SET_PACKET_TIME_TO_SEND(
3437 *   IN PNDIS_PACKET Packet,
3438 *   IN ULONGLONG TimeToSend);
3439 */
3440#define NDIS_SET_PACKET_TIME_TO_SEND(_Packet, _TimeToSend)  \
3441  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +              \
3442  (_Packet)->Private.NdisPacketOobOffset))->TimeToSend = (_TimeToSend)
3443
3444/*
3445 * VOID
3446 * NDIS_SET_PACKET_TIME_SENT(
3447 *   IN PNDIS_PACKET Packet,
3448 *   IN ULONGLONG TimeSent);
3449 */
3450#define NDIS_SET_PACKET_TIME_SENT(_Packet, _TimeSent) \
3451  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +        \
3452  (_Packet)->Private.NdisPacketOobOffset))->TimeSent = (_TimeSent)
3453
3454/*
3455 * VOID
3456 * NDIS_SET_PACKET_TIME_RECEIVED(
3457 *   IN PNDIS_PACKET Packet,
3458 *   IN ULONGLONG TimeReceived);
3459 */
3460#define NDIS_SET_PACKET_TIME_RECEIVED(_Packet, _TimeReceived) \
3461  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +                \
3462  (_Packet)->Private.NdisPacketOobOffset))->TimeReceived = (_TimeReceived)
3463
3464/*
3465 * VOID
3466 * NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(
3467 *   IN PNDIS_PACKET Packet,
3468 *   IN PVOID MediaSpecificInfo,
3469 *   IN UINT SizeMediaSpecificInfo);
3470 */
3471#define NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(_Packet,                      \
3472                                            _MediaSpecificInfo,           \
3473                                            _SizeMediaSpecificInfo)       \
3474{                                                                         \
3475  if ((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS)     \
3476    {                                                                     \
3477      (_Packet)->Private.NdisPacketFlags |= fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO; \
3478      ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +                        \
3479        (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation = \
3480          (_MediaSpecificInfo);                                           \
3481      ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +                        \
3482        (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo = \
3483          (_SizeMediaSpecificInfo);                                       \
3484    }                                                                     \
3485}
3486
3487/*
3488 * VOID
3489 * NdisSetPacketFlags(
3490 *   IN PNDIS_PACKET  Packet,
3491 *   IN UINT  Flags);
3492 */
3493#define NdisSetPacketFlags(Packet, Flags) (Packet)->Private.Flags |= (Flags)
3494
3495/*
3496 * VOID
3497 * NdisClearPacketFlags(
3498 *   IN PNDIS_PACKET  Packet,
3499 *   IN UINT  Flags);
3500 */
3501#define NdisClearPacketFlags(Packet, Flags) (Packet)->Private.Flags &= ~(Flags)
3502
3503/*
3504 * VOID
3505 * NdisQueryPacket(
3506 *   IN PNDIS_PACKET Packet,
3507 *   OUT PUINT PhysicalBufferCount OPTIONAL,
3508 *   OUT PUINT BufferCount OPTIONAL,
3509 *   OUT PNDIS_BUFFER *FirstBuffer OPTIONAL,
3510 *   OUT PUINT TotalPacketLength OPTIONAL);
3511 */
3512static __inline
3513VOID
3514NdisQueryPacket(
3515  IN PNDIS_PACKET Packet,
3516  OUT PUINT PhysicalBufferCount OPTIONAL,
3517  OUT PUINT BufferCount OPTIONAL,
3518  OUT PNDIS_BUFFER *FirstBuffer OPTIONAL,
3519  OUT PUINT TotalPacketLength OPTIONAL)
3520{
3521  if (FirstBuffer)
3522    *FirstBuffer = Packet->Private.Head;
3523  if (TotalPacketLength || BufferCount || PhysicalBufferCount) {
3524    if (!Packet->Private.ValidCounts) {
3525      UINT Offset;
3526      UINT PacketLength;
3527      PNDIS_BUFFER NdisBuffer;
3528      UINT PhysicalBufferCount = 0;
3529      UINT TotalPacketLength = 0;
3530      UINT Count = 0;
3531
3532      for (NdisBuffer = Packet->Private.Head;
3533           NdisBuffer != (PNDIS_BUFFER)NULL;
3534           NdisBuffer = NdisBuffer->Next) {
3535        PhysicalBufferCount += NDIS_BUFFER_TO_SPAN_PAGES(NdisBuffer);
3536        NdisQueryBufferOffset(NdisBuffer, &Offset, &PacketLength);
3537        TotalPacketLength += PacketLength;
3538        Count++;
3539      }
3540      Packet->Private.PhysicalCount = PhysicalBufferCount;
3541      Packet->Private.TotalLength = TotalPacketLength;
3542      Packet->Private.Count = Count;
3543      Packet->Private.ValidCounts = TRUE;
3544    }
3545
3546    if (PhysicalBufferCount)
3547      *PhysicalBufferCount = Packet->Private.PhysicalCount;
3548
3549    if (BufferCount)
3550      *BufferCount = Packet->Private.Count;
3551
3552    if (TotalPacketLength)
3553      *TotalPacketLength = Packet->Private.TotalLength;
3554  }
3555}
3556
3557/*
3558 * VOID
3559 * NdisQueryPacketLength(
3560 *   IN PNDIS_PACKET Packet,
3561 *   OUT PUINT PhysicalBufferCount OPTIONAL,
3562 *   OUT PUINT BufferCount OPTIONAL,
3563 *   OUT PNDIS_BUFFER *FirstBuffer OPTIONAL,
3564 *   OUT PUINT TotalPacketLength OPTIONAL);
3565 */
3566#define NdisQueryPacketLength(_Packet,                              \
3567                              _TotalPacketLength)                   \
3568{                                                                   \
3569  if (!(_Packet)->Private.ValidCounts) {                            \
3570    NdisQueryPacket(_Packet, NULL, NULL, NULL, _TotalPacketLength); \
3571  }                                                                 \
3572  else *(_TotalPacketLength) = (_Packet)->Private.TotalLength;      \
3573}
3574
3575#endif /* NDIS_LEGACY_DRIVER */
3576
3577/* Memory management routines */
3578
3579/*
3580NDISAPI
3581VOID
3582NTAPI
3583NdisCreateLookaheadBufferFromSharedMemory(
3584  IN PVOID pSharedMemory,
3585  IN UINT LookaheadLength,
3586  OUT PVOID *pLookaheadBuffer);
3587*/
3588#define NdisCreateLookaheadBufferFromSharedMemory(_S, _L, _B) ((*(_B)) = (_S))
3589
3590NDISAPI
3591VOID
3592NTAPI
3593NdisDestroyLookaheadBufferFromSharedMemory(
3594  IN PVOID pLookaheadBuffer);
3595
3596#if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_ARM) || defined(_M_PPC)
3597
3598/*
3599 * VOID
3600 * NdisMoveMappedMemory(
3601 *   OUT PVOID  Destination,
3602 *   IN PVOID  Source,
3603 *   IN ULONG  Length);
3604 */
3605#define NdisMoveMappedMemory(Destination, Source, Length) \
3606  RtlCopyMemory(Destination, Source, Length)
3607
3608/*
3609 * VOID
3610 * NdisZeroMappedMemory(
3611 *   IN PVOID  Destination,
3612 *   IN ULONG  Length);
3613 */
3614#define NdisZeroMappedMemory(Destination, Length) \
3615  RtlZeroMemory(Destination, Length)
3616
3617#else
3618
3619#define NdisMoveMappedMemory(Destination, Source, Length) \
3620{ \
3621  PUCHAR _Dest = Destination, _Src = Source, _End = _Dest + Length; \
3622  while (_Dest < _End) \
3623    *_Dest++ = _Src++; \
3624}
3625
3626#define NdisZeroMappedMemory(Destination, Length) \
3627{ \
3628  PUCHAR _Dest = Destination, _End = _Dest + Length; \
3629  while (_Dest < _End) \
3630    *_Dest++ = 0; \
3631}
3632
3633#endif /* _M_IX86 or _M_AMD64 */
3634
3635/*
3636 * VOID
3637 * NdisMoveFromMappedMemory(
3638 *   OUT PVOID  Destination,
3639 *   IN PVOID  Source,
3640 *   IN ULONG  Length);
3641 */
3642#define NdisMoveFromMappedMemory(Destination, Source, Length) \
3643  NdisMoveMappedMemory(Destination, Source, Length)
3644
3645/*
3646 * VOID
3647 * NdisMoveToMappedMemory(
3648 *   OUT PVOID  Destination,
3649 *   IN PVOID  Source,
3650 *   IN ULONG  Length);
3651 */
3652#define NdisMoveToMappedMemory(Destination, Source, Length) \
3653  NdisMoveMappedMemory(Destination, Source, Length)
3654
3655/*
3656 * VOID
3657 * NdisMUpdateSharedMemory(
3658 *   IN NDIS_HANDLE  MiniportAdapterHandle,
3659 *   IN ULONG  Length,
3660 *   IN PVOID  VirtualAddress,
3661 *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);
3662 */
3663#define NdisMUpdateSharedMemory(_H, _L, _V, _P) \
3664  NdisUpdateSharedMemory(_H, _L, _V, _P)
3665
3666NDISAPI
3667VOID
3668NTAPI
3669NdisFreeMemory(
3670  IN PVOID VirtualAddress,
3671  IN UINT Length,
3672  IN UINT MemoryFlags);
3673
3674NDISAPI
3675VOID
3676NTAPI
3677NdisFreeMemoryWithTag(
3678  IN PVOID VirtualAddress,
3679  IN ULONG Tag);
3680
3681NDISAPI
3682VOID
3683NTAPI
3684NdisImmediateReadSharedMemory(
3685  IN NDIS_HANDLE WrapperConfigurationContext,
3686  IN ULONG       SharedMemoryAddress,
3687  OUT PUCHAR      Buffer,
3688  IN ULONG       Length);
3689
3690NDISAPI
3691VOID
3692NTAPI
3693NdisImmediateWriteSharedMemory(
3694  IN NDIS_HANDLE WrapperConfigurationContext,
3695  IN ULONG       SharedMemoryAddress,
3696  IN PUCHAR      Buffer,
3697  IN ULONG       Length);
3698
3699NDISAPI
3700VOID
3701NTAPI
3702NdisMAllocateSharedMemory(
3703  IN	NDIS_HANDLE  MiniportAdapterHandle,
3704  IN	ULONG  Length,
3705  IN	BOOLEAN  Cached,
3706  OUT	 PVOID  *VirtualAddress,
3707  OUT	 PNDIS_PHYSICAL_ADDRESS  PhysicalAddress);
3708
3709NDISAPI
3710NDIS_STATUS
3711NTAPI
3712NdisMAllocateSharedMemoryAsync(
3713  IN NDIS_HANDLE  MiniportAdapterHandle,
3714  IN ULONG  Length,
3715  IN BOOLEAN  Cached,
3716  IN PVOID  Context);
3717
3718#if defined(NDIS50)
3719
3720#define NdisUpdateSharedMemory(NdisAdapterHandle, \
3721                               Length,            \
3722                               VirtualAddress,    \
3723                               PhysicalAddress)
3724
3725#else
3726
3727NDISAPI
3728VOID
3729NTAPI
3730NdisUpdateSharedMemory(
3731  IN NDIS_HANDLE             NdisAdapterHandle,
3732  IN ULONG                   Length,
3733  IN PVOID                   VirtualAddress,
3734  IN NDIS_PHYSICAL_ADDRESS   PhysicalAddress);
3735
3736#endif /* defined(NDIS50) */
3737
3738/*
3739 * ULONG
3740 * NdisGetPhysicalAddressHigh(
3741 *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);
3742 */
3743#define NdisGetPhysicalAddressHigh(PhysicalAddress) \
3744  ((PhysicalAddress).HighPart)
3745
3746/*
3747 * VOID
3748 * NdisSetPhysicalAddressHigh(
3749 *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress,
3750 *   IN ULONG  Value);
3751 */
3752#define NdisSetPhysicalAddressHigh(PhysicalAddress, Value) \
3753  ((PhysicalAddress).HighPart) = (Value)
3754
3755/*
3756 * ULONG
3757 * NdisGetPhysicalAddressLow(
3758 *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);
3759 */
3760#define NdisGetPhysicalAddressLow(PhysicalAddress) \
3761  ((PhysicalAddress).LowPart)
3762
3763
3764/*
3765 * VOID
3766 * NdisSetPhysicalAddressLow(
3767 *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress,
3768 *   IN ULONG  Value);
3769 */
3770#define NdisSetPhysicalAddressLow(PhysicalAddress, Value) \
3771  ((PhysicalAddress).LowPart) = (Value)
3772
3773/*
3774 * VOID
3775 * NDIS_PHYSICAL_ADDRESS_CONST(
3776 *   IN ULONG  Low,
3777 *   IN LONG  High);
3778 */
3779#define NDIS_PHYSICAL_ADDRESS_CONST(Low, High)  \
3780    { {(ULONG)(Low), (LONG)(High)} }
3781
3782/*
3783 * ULONG
3784 * NdisEqualMemory(
3785 *  IN CONST VOID  *Source1,
3786 *  IN CONST VOID  *Source2,
3787 *  IN ULONG  Length);
3788 */
3789#define NdisEqualMemory(Source1, Source2, Length) \
3790  RtlEqualMemory(Source1, Source2, Length)
3791
3792/*
3793 * VOID
3794 * NdisFillMemory(
3795 *   IN PVOID  Destination,
3796 *   IN ULONG  Length,
3797 *   IN UCHAR  Fill);
3798 */
3799#define NdisFillMemory(Destination, Length, Fill) \
3800  RtlFillMemory(Destination, Length, Fill)
3801
3802/*
3803 * VOID
3804 * NdisMoveMemory(
3805 *   OUT  PVOID  Destination,
3806 *   IN PVOID  Source,
3807 *   IN ULONG  Length);
3808 */
3809#define NdisMoveMemory(Destination, Source, Length) \
3810  RtlCopyMemory(Destination, Source, Length)
3811
3812
3813/*
3814 * VOID
3815 * NdisRetrieveUlong(
3816 *   IN PULONG  DestinationAddress,
3817 *   IN PULONG  SourceAddress);
3818 */
3819#define NdisRetrieveUlong(DestinationAddress, SourceAddress) \
3820  RtlRetrieveUlong(DestinationAddress, SourceAddress)
3821
3822
3823/*
3824 * VOID
3825 * NdisStoreUlong(
3826 *   IN PULONG  DestinationAddress,
3827 *   IN ULONG  Value);
3828 */
3829#define NdisStoreUlong(DestinationAddress, Value) \
3830  RtlStoreUlong(DestinationAddress, Value)
3831
3832
3833/*
3834 * VOID
3835 * NdisZeroMemory(
3836 *   IN PVOID  Destination,
3837 *   IN ULONG  Length)
3838 */
3839#define NdisZeroMemory(Destination, Length) \
3840  RtlZeroMemory(Destination, Length)
3841
3842typedef VOID
3843(NTAPI *NDIS_BLOCK_INITIALIZER) (
3844    IN  PUCHAR  Block,
3845    IN  SIZE_T  NumberOfBytes
3846    );
3847
3848/* Configuration routines */
3849
3850#if NDIS_LEGACY_DRIVER
3851NDISAPI
3852VOID
3853NTAPI
3854NdisOpenConfiguration(
3855  OUT PNDIS_STATUS Status,
3856  OUT PNDIS_HANDLE ConfigurationHandle,
3857  IN NDIS_HANDLE WrapperConfigurationContext);
3858#endif
3859
3860NDISAPI
3861VOID
3862NTAPI
3863NdisReadNetworkAddress(
3864  OUT PNDIS_STATUS Status,
3865  OUT PVOID *NetworkAddress,
3866  OUT PUINT NetworkAddressLength,
3867  IN NDIS_HANDLE ConfigurationHandle);
3868
3869NDISAPI
3870VOID
3871NTAPI
3872NdisReadEisaSlotInformation(
3873  OUT PNDIS_STATUS  Status,
3874  IN NDIS_HANDLE  WrapperConfigurationContext,
3875  OUT PUINT  SlotNumber,
3876  OUT PNDIS_EISA_FUNCTION_INFORMATION  EisaData);
3877
3878NDISAPI
3879VOID
3880NTAPI
3881NdisReadEisaSlotInformationEx(
3882  OUT PNDIS_STATUS  Status,
3883  IN NDIS_HANDLE  WrapperConfigurationContext,
3884  OUT PUINT  SlotNumber,
3885  OUT PNDIS_EISA_FUNCTION_INFORMATION  *EisaData,
3886  OUT PUINT  NumberOfFunctions);
3887
3888#if NDIS_LEGACY_MINIPORT
3889
3890NDISAPI
3891ULONG
3892NTAPI
3893NdisReadPciSlotInformation(
3894  IN NDIS_HANDLE NdisAdapterHandle,
3895  IN ULONG SlotNumber,
3896  IN ULONG Offset,
3897  OUT PVOID Buffer,
3898  IN ULONG Length);
3899
3900NDISAPI
3901ULONG
3902NTAPI
3903NdisWritePciSlotInformation(
3904  IN NDIS_HANDLE NdisAdapterHandle,
3905  IN ULONG SlotNumber,
3906  IN ULONG Offset,
3907  IN PVOID Buffer,
3908  IN ULONG Length);
3909
3910NDISAPI
3911ULONG
3912NTAPI
3913NdisReadPcmciaAttributeMemory(
3914  IN NDIS_HANDLE NdisAdapterHandle,
3915  IN ULONG Offset,
3916  OUT PVOID Buffer,
3917  IN ULONG Length);
3918
3919NDISAPI
3920ULONG
3921NTAPI
3922NdisWritePcmciaAttributeMemory(
3923  IN NDIS_HANDLE NdisAdapterHandle,
3924  IN ULONG Offset,
3925  IN PVOID Buffer,
3926  IN ULONG Length);
3927
3928#endif /* NDIS_LEGACY_MINIPORT */
3929
3930/* String management routines */
3931
3932/*
3933NDISAPI
3934NDIS_STATUS
3935NTAPI
3936NdisAnsiStringToUnicodeString(
3937  IN OUT PNDIS_STRING DestinationString,
3938  IN PNDIS_ANSI_STRING SourceString);
3939*/
3940#define NdisAnsiStringToUnicodeString(_us, _as) RtlAnsiStringToUnicodeString(_us, _as, FALSE)
3941
3942/*
3943 * BOOLEAN
3944 * NdisEqualString(
3945 *   IN PNDIS_STRING String1,
3946 *   IN PNDIS_STRING String2,
3947 *   IN BOOLEAN CaseInsensitive);
3948 */
3949#define NdisEqualString RtlEqualString
3950
3951#define NdisEqualUnicodeString RtlEqualUnicodeString
3952
3953/*
3954NDISAPI
3955VOID
3956NTAPI
3957NdisInitAnsiString(
3958  IN OUT PNDIS_ANSI_STRING DestinationString,
3959  IN PCSTR SourceString);
3960*/
3961#define NdisInitAnsiString RtlInitString
3962
3963NDISAPI
3964VOID
3965NTAPI
3966NdisInitUnicodeString(
3967  IN OUT PNDIS_STRING  DestinationString,
3968  IN PCWSTR  SourceString);
3969
3970/*
3971NDISAPI
3972NDIS_STATUS
3973NTAPI
3974NdisUnicodeStringToAnsiString(
3975  IN OUT PNDIS_ANSI_STRING DestinationString,
3976  IN PNDIS_STRING SourceString);
3977*/
3978#define NdisUnicodeStringToAnsiString(_as, _us) RtlUnicodeStringToAnsiString(_as, _us, FALSE)
3979
3980#define NdisFreeString(_s) NdisFreeMemory((_s).Buffer, (_s).MaximumLength, 0)
3981#define NdisPrintString(_s) DbgPrint("%ls", (_s).Buffer)
3982
3983/* Spin lock reoutines */
3984
3985/*
3986NDISAPI
3987VOID
3988NTAPI
3989NdisAllocateSpinLock(
3990  IN PNDIS_SPIN_LOCK SpinLock);
3991*/
3992#define NdisAllocateSpinLock(_SpinLock) KeInitializeSpinLock(&(_SpinLock)->SpinLock)
3993
3994/*
3995NDISAPI
3996VOID
3997NTAPI
3998NdisFreeSpinLock(
3999  IN PNDIS_SPIN_LOCK  SpinLock);
4000*/
4001#define NdisFreeSpinLock(_SpinLock)
4002
4003/*
4004NDISAPI
4005VOID
4006NTAPI
4007NdisAcquireSpinLock(
4008  IN PNDIS_SPIN_LOCK  SpinLock);
4009*/
4010#define NdisAcquireSpinLock(_SpinLock) KeAcquireSpinLock(&(_SpinLock)->SpinLock, &(_SpinLock)->OldIrql)
4011
4012/*
4013NDISAPI
4014VOID
4015NTAPI
4016NdisReleaseSpinLock(
4017  IN PNDIS_SPIN_LOCK  SpinLock);
4018*/
4019#define NdisReleaseSpinLock(_SpinLock) KeReleaseSpinLock(&(_SpinLock)->SpinLock,(_SpinLock)->OldIrql)
4020
4021/*
4022NDISAPI
4023VOID
4024NTAPI
4025NdisDprAcquireSpinLock(
4026  IN PNDIS_SPIN_LOCK  SpinLock);
4027*/
4028#define NdisDprAcquireSpinLock(_SpinLock) KeAcquireSpinLockAtDpcLevel(&(_SpinLock)->SpinLock)
4029
4030/*
4031NDISAPI
4032VOID
4033NTAPI
4034NdisDprReleaseSpinLock(
4035  IN PNDIS_SPIN_LOCK  SpinLock);
4036*/
4037#define NdisDprReleaseSpinLock(_SpinLock) KeReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock)
4038
4039/* I/O routines */
4040
4041/*
4042 * VOID
4043 * NdisRawReadPortBufferUchar(
4044 *   IN ULONG Port,
4045 *   OUT PUCHAR Buffer,
4046 *   IN ULONG Length);
4047 */
4048#define NdisRawReadPortBufferUchar(Port, Buffer, Length) \
4049  READ_PORT_BUFFER_UCHAR((PUCHAR)(Port), (PUCHAR)(Buffer), (Length))
4050
4051/*
4052 * VOID
4053 * NdisRawReadPortBufferUlong(
4054 *   IN ULONG Port,
4055 *   OUT PULONG Buffer,
4056 *   IN ULONG Length);
4057 */
4058#define NdisRawReadPortBufferUlong(Port, Buffer, Length) \
4059  READ_PORT_BUFFER_ULONG((PULONG)(Port), (PULONG)(Buffer), (Length))
4060
4061/*
4062 * VOID
4063 * NdisRawReadPortBufferUshort(
4064 *   IN ULONG Port,
4065 *   OUT PUSHORT Buffer,
4066 *   IN ULONG Length);
4067 */
4068#define NdisRawReadPortBufferUshort(Port, Buffer, Length) \
4069  READ_PORT_BUFFER_USHORT((PUSHORT)(Port), (PUSHORT)(Buffer), (Length))
4070
4071/*
4072 * VOID
4073 * NdisRawReadPortUchar(
4074 *   IN ULONG Port,
4075 *   OUT PUCHAR Data);
4076 */
4077#define NdisRawReadPortUchar(Port, Data) \
4078  *(Data) = READ_PORT_UCHAR((PUCHAR)(Port))
4079
4080/*
4081 * VOID
4082 * NdisRawReadPortUlong(
4083 *   IN ULONG Port,
4084 *   OUT PULONG Data);
4085 */
4086#define NdisRawReadPortUlong(Port, Data) \
4087  *(Data) = READ_PORT_ULONG((PULONG)(Port))
4088
4089/*
4090 * VOID
4091 * NdisRawReadPortUshort(
4092 *   IN ULONG Port,
4093 *   OUT PUSHORT Data);
4094 */
4095#define NdisRawReadPortUshort(Port, Data) \
4096  *(Data) = READ_PORT_USHORT((PUSHORT)(Port))
4097
4098/*
4099 * VOID
4100 * NdisRawWritePortBufferUchar(
4101 *   IN ULONG Port,
4102 *   IN PUCHAR Buffer,
4103 *   IN ULONG Length);
4104 */
4105#define NdisRawWritePortBufferUchar(Port, Buffer, Length) \
4106  WRITE_PORT_BUFFER_UCHAR((PUCHAR)(Port), (PUCHAR)(Buffer), (Length))
4107
4108/*
4109 * VOID
4110 * NdisRawWritePortBufferUlong(
4111 *   IN ULONG Port,
4112 *   IN PULONG Buffer,
4113 *   IN ULONG Length);
4114 */
4115#define NdisRawWritePortBufferUlong(Port, Buffer, Length) \
4116  WRITE_PORT_BUFFER_ULONG((PULONG)(Port), (PULONG)(Buffer), (Length))
4117
4118/*
4119 * VOID
4120 * NdisRawWritePortBufferUshort(
4121 *   IN ULONG Port,
4122 *   IN PUSHORT Buffer,
4123 *   IN ULONG Length);
4124 */
4125#define NdisRawWritePortBufferUshort(Port, Buffer, Length) \
4126  WRITE_PORT_BUFFER_USHORT((PUSHORT)(Port), (PUSHORT)(Buffer), (Length))
4127
4128/*
4129 * VOID
4130 * NdisRawWritePortUchar(
4131 *   IN ULONG Port,
4132 *   IN UCHAR Data);
4133 */
4134#define NdisRawWritePortUchar(Port, Data) \
4135  WRITE_PORT_UCHAR((PUCHAR)(Port), (UCHAR)(Data))
4136
4137/*
4138 * VOID
4139 * NdisRawWritePortUlong(
4140 *   IN ULONG Port,
4141 *   IN ULONG Data);
4142 */
4143#define NdisRawWritePortUlong(Port, Data) \
4144  WRITE_PORT_ULONG((PULONG)(Port), (ULONG)(Data))
4145
4146/*
4147 * VOID
4148 * NdisRawWritePortUshort(
4149 *   IN ULONG Port,
4150 *   IN USHORT Data);
4151 */
4152#define NdisRawWritePortUshort(Port, Data) \
4153  WRITE_PORT_USHORT((PUSHORT)(Port), (USHORT)(Data))
4154
4155
4156/*
4157 * VOID
4158 * NdisReadRegisterUchar(
4159 *   IN PUCHAR Register,
4160 *   OUT PUCHAR Data);
4161 */
4162#define NdisReadRegisterUchar(Register, Data) \
4163  *(Data) = *(Register)
4164
4165/*
4166 * VOID
4167 * NdisReadRegisterUlong(
4168 *   IN PULONG  Register,
4169 *   OUT PULONG  Data);
4170 */
4171#define NdisReadRegisterUlong(Register, Data)   \
4172  *(Data) = *(Register)
4173
4174/*
4175 * VOID
4176 * NdisReadRegisterUshort(
4177 *   IN PUSHORT Register,
4178 *   OUT PUSHORT Data);
4179 */
4180#define NdisReadRegisterUshort(Register, Data) \
4181    *(Data) = *(Register)
4182
4183/*
4184 * VOID
4185 * NdisReadRegisterUchar(
4186 *   IN PUCHAR Register,
4187 *   IN UCHAR Data);
4188 */
4189#define NdisWriteRegisterUchar(Register, Data) \
4190  WRITE_REGISTER_UCHAR((Register), (Data))
4191
4192/*
4193 * VOID
4194 * NdisReadRegisterUlong(
4195 *   IN PULONG Register,
4196 *   IN ULONG Data);
4197 */
4198#define NdisWriteRegisterUlong(Register, Data) \
4199  WRITE_REGISTER_ULONG((Register), (Data))
4200
4201/*
4202 * VOID
4203 * NdisReadRegisterUshort(
4204 *   IN PUSHORT Register,
4205 *   IN USHORT Data);
4206 */
4207#define NdisWriteRegisterUshort(Register, Data) \
4208  WRITE_REGISTER_USHORT((Register), (Data))
4209
4210
4211/* Linked lists */
4212
4213/*
4214 * VOID
4215 * NdisInitializeListHead(
4216 *   IN PLIST_ENTRY ListHead);
4217 */
4218#define NdisInitializeListHead InitializeListHead
4219
4220/*
4221 * PLIST_ENTRY
4222 * NdisInterlockedInsertHeadList(
4223 *   IN PLIST_ENTRY  ListHead,
4224 *   IN PLIST_ENTRY  ListEntry,
4225 *   IN PNDIS_SPIN_LOCK  SpinLock);
4226 */
4227#define NdisInterlockedInsertHeadList(_ListHead, _ListEntry, _SpinLock) \
4228  ExInterlockedInsertHeadList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock)
4229
4230/*
4231 * PLIST_ENTRY
4232 * NdisInterlockedInsertTailList(
4233 *   IN PLIST_ENTRY  ListHead,
4234 *   IN PLIST_ENTRY  ListEntry,
4235 *   IN PNDIS_SPIN_LOCK  SpinLock);
4236 */
4237#define NdisInterlockedInsertTailList(_ListHead, _ListEntry, _SpinLock) \
4238  ExInterlockedInsertTailList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock)
4239
4240/*
4241 * PLIST_ENTRY
4242 * NdisInterlockedRemoveHeadList(
4243 *   IN PLIST_ENTRY  ListHead,
4244 *   IN PNDIS_SPIN_LOCK  SpinLock);
4245*/
4246#define NdisInterlockedRemoveHeadList(_ListHead, _SpinLock) \
4247  ExInterlockedRemoveHeadList(_ListHead, &(_SpinLock)->SpinLock)
4248
4249/*
4250 * VOID
4251 * NdisInitializeSListHead(
4252 *   IN PSLIST_HEADER SListHead);
4253 */
4254#define NdisInitializeSListHead(SListHead) ExInitializeSListHead(SListHead)
4255
4256/*
4257 * USHORT NdisQueryDepthSList(
4258 *   IN PSLIST_HEADER SListHead);
4259 */
4260#define NdisQueryDepthSList(SListHead) ExQueryDepthSList(SListHead)
4261
4262#define NdisInterlockedPushEntryList(ListHead, ListEntry, Lock) \
4263  ExInterlockedPushEntryList(ListHead, ListEntry, &(Lock)->SpinLock)
4264
4265#define NdisInterlockedPopEntryList(ListHead, Lock) \
4266  ExInterlockedPopEntryList(ListHead, &(Lock)->SpinLock)
4267
4268/* Non-paged lookaside lists */
4269
4270#define NdisInitializeNPagedLookasideList(_L, _AR, _FR, _Fl, _S, _T, _D) \
4271  ExInitializeNPagedLookasideList(_L, _AR, _FR, _Fl, _S, _T, _D)
4272#define NdisDeleteNPagedLookasideList(_L) ExDeleteNPagedLookasideList(_L)
4273#define NdisAllocateFromNPagedLookasideList(_L) ExAllocateFromNPagedLookasideList(_L)
4274#define NdisFreeToNPagedLookasideList(_L, _E) ExFreeToNPagedLookasideList(_L, _E)
4275
4276/* Interlocked routines */
4277
4278/*
4279 * LONG
4280 * NdisInterlockedDecrement(
4281 *   IN PLONG  Addend);
4282 */
4283#define NdisInterlockedDecrement(Addend) InterlockedDecrement(Addend)
4284
4285/*
4286 * LONG
4287 * NdisInterlockedIncrement(
4288 *   IN PLONG  Addend);
4289 */
4290#define NdisInterlockedIncrement(Addend) InterlockedIncrement(Addend)
4291
4292/*
4293 * VOID
4294 * NdisInterlockedAddUlong(
4295 *   IN PULONG  Addend,
4296 *   IN ULONG  Increment,
4297 *   IN PNDIS_SPIN_LOCK  SpinLock);
4298 */
4299#define NdisInterlockedAddUlong(_Addend, _Increment, _SpinLock) \
4300  ExInterlockedAddUlong(_Addend, _Increment, &(_SpinLock)->SpinLock)
4301
4302/* Miscellaneous routines */
4303
4304NDISAPI
4305VOID
4306NTAPI
4307NdisCloseConfiguration(
4308  IN NDIS_HANDLE ConfigurationHandle);
4309
4310NDISAPI
4311VOID
4312NTAPI
4313NdisReadConfiguration(
4314  OUT PNDIS_STATUS Status,
4315  OUT PNDIS_CONFIGURATION_PARAMETER *ParameterValue,
4316  IN NDIS_HANDLE ConfigurationHandle,
4317  IN PNDIS_STRING Keyword,
4318  IN NDIS_PARAMETER_TYPE ParameterType);
4319
4320NDISAPI
4321VOID
4322NTAPI
4323NdisWriteConfiguration(
4324  OUT PNDIS_STATUS Status,
4325  IN NDIS_HANDLE WrapperConfigurationContext,
4326  IN PNDIS_STRING Keyword,
4327  IN PNDIS_CONFIGURATION_PARAMETER ParameterValue);
4328
4329NDISAPI
4330VOID
4331__cdecl
4332NdisWriteErrorLogEntry(
4333  IN NDIS_HANDLE NdisAdapterHandle,
4334  IN NDIS_ERROR_CODE ErrorCode,
4335  IN ULONG NumberOfErrorValues,
4336  IN ...);
4337
4338NDISAPI
4339VOID
4340NTAPI
4341NdisInitializeString(
4342  OUT PNDIS_STRING Destination,
4343  IN PUCHAR Source);
4344
4345/*
4346 * VOID
4347 * NdisStallExecution(
4348 *   IN UINT MicrosecondsToStall)
4349 */
4350#define NdisStallExecution KeStallExecutionProcessor
4351
4352/*
4353NDISAPI
4354VOID
4355NTAPI
4356NdisGetCurrentSystemTime(
4357  IN PLARGE_INTEGER  pSystemTime);
4358*/
4359#define NdisGetCurrentSystemTime KeQuerySystemTime
4360
4361#if NDIS_SUPPORT_60_COMPATIBLE_API
4362NDISAPI
4363CCHAR
4364NTAPI
4365NdisSystemProcessorCount(VOID);
4366#endif
4367
4368NDISAPI
4369VOID
4370NTAPI
4371NdisGetCurrentProcessorCpuUsage(
4372  OUT PULONG pCpuUsage);
4373
4374/* NDIS helper macros */
4375
4376/*
4377 * VOID
4378 * NDIS_INIT_FUNCTION(FunctionName)
4379 */
4380#define NDIS_INIT_FUNCTION(FunctionName)    \
4381  alloc_text(init, FunctionName)
4382
4383/*
4384 * VOID
4385 * NDIS_PAGABLE_FUNCTION(FunctionName)
4386 */
4387#define NDIS_PAGEABLE_FUNCTION(FunctionName) \
4388  alloc_text(page, FunctionName)
4389
4390#define NDIS_PAGABLE_FUNCTION NDIS_PAGEABLE_FUNCTION
4391
4392
4393/* NDIS 4.0 extensions */
4394
4395NDISAPI
4396VOID
4397NTAPI
4398NdisMFreeSharedMemory(
4399	IN NDIS_HANDLE  MiniportAdapterHandle,
4400	IN ULONG  Length,
4401	IN BOOLEAN  Cached,
4402	IN PVOID  VirtualAddress,
4403	IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);
4404
4405NDISAPI
4406VOID
4407NTAPI
4408NdisMWanIndicateReceive(
4409	OUT PNDIS_STATUS  Status,
4410	IN NDIS_HANDLE  MiniportAdapterHandle,
4411	IN NDIS_HANDLE  NdisLinkContext,
4412	IN PUCHAR  PacketBuffer,
4413	IN UINT  PacketSize);
4414
4415NDISAPI
4416VOID
4417NTAPI
4418NdisMWanIndicateReceiveComplete(
4419	IN NDIS_HANDLE  MiniportAdapterHandle
4420	IN NDIS_HANDLE  NdisLinkContext);
4421
4422NDISAPI
4423VOID
4424NTAPI
4425NdisMWanSendComplete(
4426	IN NDIS_HANDLE  MiniportAdapterHandle,
4427	IN PNDIS_WAN_PACKET  Packet,
4428	IN NDIS_STATUS  Status);
4429
4430NDISAPI
4431NDIS_STATUS
4432NTAPI
4433NdisPciAssignResources(
4434	IN NDIS_HANDLE  NdisMacHandle,
4435	IN NDIS_HANDLE  NdisWrapperHandle,
4436	IN NDIS_HANDLE  WrapperConfigurationContext,
4437	IN ULONG  SlotNumber,
4438	OUT PNDIS_RESOURCE_LIST  *AssignedResources);
4439
4440
4441/* NDIS 5.0 extensions */
4442
4443NDISAPI
4444NDIS_STATUS
4445NTAPI
4446NdisAllocateMemoryWithTag(
4447  OUT PVOID *VirtualAddress,
4448  IN UINT Length,
4449  IN ULONG Tag);
4450
4451NDISAPI
4452VOID
4453NTAPI
4454NdisGetCurrentProcessorCounts(
4455  OUT PULONG pIdleCount,
4456  OUT PULONG pKernelAndUser,
4457  OUT PULONG pIndex);
4458
4459#if NDIS_LEGACY_DRIVER
4460NDISAPI
4461VOID
4462NTAPI
4463NdisGetSystemUpTime(
4464  OUT PULONG pSystemUpTime);
4465#endif
4466
4467#if NDIS_SUPPORT_60_COMPATIBLE_API
4468
4469NDISAPI
4470VOID
4471NTAPI
4472NdisAcquireReadWriteLock(
4473  IN OUT PNDIS_RW_LOCK Lock,
4474  IN BOOLEAN fWrite,
4475  OUT PLOCK_STATE LockState);
4476
4477NDISAPI
4478VOID
4479NTAPI
4480NdisInitializeReadWriteLock(
4481  OUT PNDIS_RW_LOCK Lock);
4482
4483NDISAPI
4484VOID
4485NTAPI
4486NdisReleaseReadWriteLock(
4487  IN OUT PNDIS_RW_LOCK Lock,
4488  IN PLOCK_STATE LockState);
4489
4490#if NDIS_SUPPORT_NDIS6
4491
4492NDISAPI
4493VOID
4494NTAPI
4495NdisDprAcquireReadWriteLock(
4496  IN PNDIS_RW_LOCK Lock,
4497  IN BOOLEAN fWrite,
4498  IN PLOCK_STATE LockState);
4499
4500NDISAPI
4501VOID
4502NTAPI
4503NdisDprReleaseReadWriteLock(
4504  IN PNDIS_RW_LOCK Lock,
4505  IN PLOCK_STATE LockState);
4506
4507#endif /* NDIS_SUPPORT_NDIS6 */
4508
4509#endif /* NDIS_SUPPORT_60_COMPATIBLE_API */
4510
4511NDISAPI
4512NDIS_STATUS
4513NTAPI
4514NdisMDeregisterDevice(
4515  IN NDIS_HANDLE  NdisDeviceHandle);
4516
4517NDISAPI
4518VOID
4519NTAPI
4520NdisMGetDeviceProperty(
4521  IN NDIS_HANDLE  MiniportAdapterHandle,
4522  IN OUT PDEVICE_OBJECT  *PhysicalDeviceObject  OPTIONAL,
4523  IN OUT PDEVICE_OBJECT  *FunctionalDeviceObject  OPTIONAL,
4524  IN OUT PDEVICE_OBJECT  *NextDeviceObject  OPTIONAL,
4525  IN OUT PCM_RESOURCE_LIST  *AllocatedResources  OPTIONAL,
4526  IN OUT PCM_RESOURCE_LIST  *AllocatedResourcesTranslated  OPTIONAL);
4527
4528NDISAPI
4529NDIS_STATUS
4530NTAPI
4531NdisMInitializeScatterGatherDma(
4532  IN NDIS_HANDLE  MiniportAdapterHandle,
4533  IN BOOLEAN  Dma64BitAddresses,
4534  IN ULONG  MaximumPhysicalMapping);
4535
4536NDISAPI
4537NDIS_STATUS
4538NTAPI
4539NdisMPromoteMiniport(
4540  IN NDIS_HANDLE  MiniportAdapterHandle);
4541
4542NDISAPI
4543NDIS_STATUS
4544NTAPI
4545NdisMQueryAdapterInstanceName(
4546  OUT PNDIS_STRING  AdapterInstanceName,
4547  IN NDIS_HANDLE  MiniportAdapterHandle);
4548
4549NDISAPI
4550NDIS_STATUS
4551NTAPI
4552NdisMRegisterDevice(
4553  IN NDIS_HANDLE  NdisWrapperHandle,
4554  IN PNDIS_STRING  DeviceName,
4555  IN PNDIS_STRING  SymbolicName,
4556  IN PDRIVER_DISPATCH  MajorFunctions[],
4557  OUT PDEVICE_OBJECT  *pDeviceObject,
4558  OUT NDIS_HANDLE  *NdisDeviceHandle);
4559
4560NDISAPI
4561VOID
4562NTAPI
4563NdisMRegisterUnloadHandler(
4564  IN NDIS_HANDLE  NdisWrapperHandle,
4565  IN PDRIVER_UNLOAD  UnloadHandler);
4566
4567NDISAPI
4568NDIS_STATUS
4569NTAPI
4570NdisMRemoveMiniport(
4571  IN NDIS_HANDLE  MiniportAdapterHandle);
4572
4573NDISAPI
4574NDIS_STATUS
4575NTAPI
4576NdisMSetMiniportSecondary(
4577  IN NDIS_HANDLE  MiniportAdapterHandle,
4578  IN NDIS_HANDLE  PrimaryMiniportAdapterHandle);
4579
4580NDISAPI
4581VOID
4582NTAPI
4583NdisOpenConfigurationKeyByIndex(
4584  OUT PNDIS_STATUS Status,
4585  IN NDIS_HANDLE ConfigurationHandle,
4586  IN ULONG Index,
4587  OUT PNDIS_STRING KeyName,
4588  OUT PNDIS_HANDLE KeyHandle);
4589
4590NDISAPI
4591VOID
4592NTAPI
4593NdisOpenConfigurationKeyByName(
4594  OUT PNDIS_STATUS Status,
4595  IN NDIS_HANDLE ConfigurationHandle,
4596  IN PNDIS_STRING SubKeyName,
4597  OUT PNDIS_HANDLE SubKeyHandle);
4598
4599NDISAPI
4600NDIS_STATUS
4601NTAPI
4602NdisQueryAdapterInstanceName(
4603  OUT PNDIS_STRING AdapterInstanceName,
4604  IN NDIS_HANDLE NdisBindingHandle);
4605
4606NDISAPI
4607NDIS_STATUS
4608NTAPI
4609NdisQueryBindInstanceName(
4610  OUT PNDIS_STRING pAdapterInstanceName,
4611  IN NDIS_HANDLE BindingContext);
4612
4613NDISAPI
4614NDIS_STATUS
4615NTAPI
4616NdisWriteEventLogEntry(
4617  IN PVOID LogHandle,
4618  IN NDIS_STATUS EventCode,
4619  IN ULONG UniqueEventValue,
4620  IN USHORT NumStrings,
4621  IN PVOID StringsList OPTIONAL,
4622  IN ULONG DataSize,
4623  IN PVOID Data OPTIONAL);
4624
4625/* Connectionless services */
4626
4627NDISAPI
4628NDIS_STATUS
4629NTAPI
4630NdisClAddParty(
4631  IN NDIS_HANDLE  NdisVcHandle,
4632  IN NDIS_HANDLE  ProtocolPartyContext,
4633  IN OUT PCO_CALL_PARAMETERS  CallParameters,
4634  OUT PNDIS_HANDLE  NdisPartyHandle);
4635
4636NDISAPI
4637NDIS_STATUS
4638NTAPI
4639NdisClCloseAddressFamily(
4640  IN NDIS_HANDLE  NdisAfHandle);
4641
4642NDISAPI
4643NDIS_STATUS
4644NTAPI
4645NdisClCloseCall(
4646  IN NDIS_HANDLE NdisVcHandle,
4647  IN NDIS_HANDLE NdisPartyHandle  OPTIONAL,
4648  IN PVOID  Buffer  OPTIONAL,
4649  IN UINT  Size);
4650
4651NDISAPI
4652NDIS_STATUS
4653NTAPI
4654NdisClDeregisterSap(
4655  IN NDIS_HANDLE  NdisSapHandle);
4656
4657NDISAPI
4658NDIS_STATUS
4659NTAPI
4660NdisClDropParty(
4661  IN NDIS_HANDLE  NdisPartyHandle,
4662  IN PVOID  Buffer  OPTIONAL,
4663  IN UINT  Size);
4664
4665NDISAPI
4666VOID
4667NTAPI
4668NdisClIncomingCallComplete(
4669  IN NDIS_STATUS  Status,
4670  IN NDIS_HANDLE  NdisVcHandle,
4671  IN PCO_CALL_PARAMETERS  CallParameters);
4672
4673NDISAPI
4674NDIS_STATUS
4675NTAPI
4676NdisClMakeCall(
4677  IN NDIS_HANDLE  NdisVcHandle,
4678  IN OUT PCO_CALL_PARAMETERS  CallParameters,
4679  IN NDIS_HANDLE  ProtocolPartyContext  OPTIONAL,
4680  OUT PNDIS_HANDLE  NdisPartyHandle  OPTIONAL);
4681
4682NDISAPI
4683NDIS_STATUS
4684NTAPI
4685NdisClModifyCallQoS(
4686  IN NDIS_HANDLE  NdisVcHandle,
4687  IN PCO_CALL_PARAMETERS  CallParameters);
4688
4689
4690NDISAPI
4691NDIS_STATUS
4692NTAPI
4693NdisClOpenAddressFamily(
4694  IN NDIS_HANDLE  NdisBindingHandle,
4695  IN PCO_ADDRESS_FAMILY  AddressFamily,
4696  IN NDIS_HANDLE  ProtocolAfContext,
4697  IN PNDIS_CLIENT_CHARACTERISTICS  ClCharacteristics,
4698  IN UINT  SizeOfClCharacteristics,
4699  OUT PNDIS_HANDLE  NdisAfHandle);
4700
4701NDISAPI
4702NDIS_STATUS
4703NTAPI
4704NdisClRegisterSap(
4705  IN NDIS_HANDLE  NdisAfHandle,
4706  IN NDIS_HANDLE  ProtocolSapContext,
4707  IN PCO_SAP  Sap,
4708  OUT PNDIS_HANDLE  NdisSapHandle);
4709
4710
4711/* Call Manager services */
4712
4713NDISAPI
4714NDIS_STATUS
4715NTAPI
4716NdisCmActivateVc(
4717  IN NDIS_HANDLE  NdisVcHandle,
4718  IN OUT PCO_CALL_PARAMETERS  CallParameters);
4719
4720NDISAPI
4721VOID
4722NTAPI
4723NdisCmAddPartyComplete(
4724  IN NDIS_STATUS  Status,
4725  IN NDIS_HANDLE  NdisPartyHandle,
4726  IN NDIS_HANDLE  CallMgrPartyContext  OPTIONAL,
4727  IN PCO_CALL_PARAMETERS  CallParameters);
4728
4729NDISAPI
4730VOID
4731NTAPI
4732NdisCmCloseAddressFamilyComplete(
4733  IN NDIS_STATUS Status,
4734  IN NDIS_HANDLE NdisAfHandle);
4735
4736NDISAPI
4737VOID
4738NTAPI
4739NdisCmCloseCallComplete(
4740  IN NDIS_STATUS  Status,
4741  IN NDIS_HANDLE  NdisVcHandle,
4742  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL);
4743
4744NDISAPI
4745NDIS_STATUS
4746NTAPI
4747NdisCmDeactivateVc(
4748  IN NDIS_HANDLE  NdisVcHandle);
4749
4750NDISAPI
4751VOID
4752NTAPI
4753NdisCmDeregisterSapComplete(
4754  IN NDIS_STATUS  Status,
4755  IN NDIS_HANDLE  NdisSapHandle);
4756
4757NDISAPI
4758VOID
4759NTAPI
4760NdisCmDispatchCallConnected(
4761  IN NDIS_HANDLE  NdisVcHandle);
4762
4763NDISAPI
4764NDIS_STATUS
4765NTAPI
4766NdisCmDispatchIncomingCall(
4767  IN NDIS_HANDLE  NdisSapHandle,
4768  IN NDIS_HANDLE  NdisVcHandle,
4769  IN PCO_CALL_PARAMETERS  CallParameters);
4770
4771NDISAPI
4772VOID
4773NTAPI
4774NdisCmDispatchIncomingCallQoSChange(
4775  IN NDIS_HANDLE  NdisVcHandle,
4776  IN PCO_CALL_PARAMETERS  CallParameters);
4777
4778NDISAPI
4779VOID
4780NTAPI
4781NdisCmDispatchIncomingCloseCall(
4782  IN NDIS_STATUS  CloseStatus,
4783  IN NDIS_HANDLE  NdisVcHandle,
4784  IN PVOID  Buffer  OPTIONAL,
4785  IN UINT  Size);
4786
4787NDISAPI
4788VOID
4789NTAPI
4790NdisCmDispatchIncomingDropParty(
4791  IN NDIS_STATUS  DropStatus,
4792  IN NDIS_HANDLE  NdisPartyHandle,
4793  IN PVOID  Buffer  OPTIONAL,
4794  IN UINT  Size);
4795
4796NDISAPI
4797VOID
4798NTAPI
4799NdisCmDropPartyComplete(
4800  IN NDIS_STATUS  Status,
4801  IN NDIS_HANDLE  NdisPartyHandle);
4802
4803NDISAPI
4804VOID
4805NTAPI
4806NdisCmMakeCallComplete(
4807  IN NDIS_STATUS  Status,
4808  IN NDIS_HANDLE  NdisVcHandle,
4809  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL,
4810  IN NDIS_HANDLE  CallMgrPartyContext  OPTIONAL,
4811  IN PCO_CALL_PARAMETERS  CallParameters);
4812
4813NDISAPI
4814VOID
4815NTAPI
4816NdisCmModifyCallQoSComplete(
4817  IN NDIS_STATUS  Status,
4818  IN NDIS_HANDLE  NdisVcHandle,
4819  IN PCO_CALL_PARAMETERS  CallParameters);
4820
4821NDISAPI
4822VOID
4823NTAPI
4824NdisCmOpenAddressFamilyComplete(
4825  IN NDIS_STATUS Status,
4826  IN NDIS_HANDLE NdisAfHandle,
4827  IN NDIS_HANDLE CallMgrAfContext);
4828
4829NDISAPI
4830NDIS_STATUS
4831NTAPI
4832NdisCmRegisterAddressFamily(
4833  IN NDIS_HANDLE  NdisBindingHandle,
4834  IN PCO_ADDRESS_FAMILY  AddressFamily,
4835  IN PNDIS_CALL_MANAGER_CHARACTERISTICS  CmCharacteristics,
4836  IN UINT  SizeOfCmCharacteristics);
4837
4838NDISAPI
4839VOID
4840NTAPI
4841NdisCmRegisterSapComplete(
4842  IN NDIS_STATUS  Status,
4843  IN NDIS_HANDLE  NdisSapHandle,
4844  IN NDIS_HANDLE  CallMgrSapContext);
4845
4846
4847NDISAPI
4848NDIS_STATUS
4849NTAPI
4850NdisMCmActivateVc(
4851  IN NDIS_HANDLE  NdisVcHandle,
4852  IN PCO_CALL_PARAMETERS  CallParameters);
4853
4854NDISAPI
4855NDIS_STATUS
4856NTAPI
4857NdisMCmCreateVc(
4858  IN NDIS_HANDLE  MiniportAdapterHandle,
4859  IN NDIS_HANDLE  NdisAfHandle,
4860  IN NDIS_HANDLE  MiniportVcContext,
4861  OUT  PNDIS_HANDLE  NdisVcHandle);
4862
4863NDISAPI
4864NDIS_STATUS
4865NTAPI
4866NdisMCmDeactivateVc(
4867  IN NDIS_HANDLE  NdisVcHandle);
4868
4869NDISAPI
4870NDIS_STATUS
4871NTAPI
4872NdisMCmDeleteVc(
4873  IN NDIS_HANDLE  NdisVcHandle);
4874
4875NDISAPI
4876NDIS_STATUS
4877NTAPI
4878NdisMCmRegisterAddressFamily(
4879  IN NDIS_HANDLE  MiniportAdapterHandle,
4880  IN PCO_ADDRESS_FAMILY  AddressFamily,
4881  IN PNDIS_CALL_MANAGER_CHARACTERISTICS  CmCharacteristics,
4882  IN UINT  SizeOfCmCharacteristics);
4883
4884NDISAPI
4885NDIS_STATUS
4886NTAPI
4887NdisMCmRequest(
4888  IN NDIS_HANDLE  NdisAfHandle,
4889  IN NDIS_HANDLE  NdisVcHandle  OPTIONAL,
4890  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL,
4891  IN OUT  PNDIS_REQUEST  NdisRequest);
4892
4893
4894/* Connection-oriented services */
4895
4896NDISAPI
4897NDIS_STATUS
4898NTAPI
4899NdisCoCreateVc(
4900  IN NDIS_HANDLE  NdisBindingHandle,
4901  IN NDIS_HANDLE  NdisAfHandle  OPTIONAL,
4902  IN NDIS_HANDLE  ProtocolVcContext,
4903  IN OUT PNDIS_HANDLE  NdisVcHandle);
4904
4905NDISAPI
4906NDIS_STATUS
4907NTAPI
4908NdisCoDeleteVc(
4909  IN NDIS_HANDLE  NdisVcHandle);
4910
4911NDISAPI
4912NDIS_STATUS
4913NTAPI
4914NdisCoRequest(
4915  IN NDIS_HANDLE  NdisBindingHandle,
4916  IN NDIS_HANDLE  NdisAfHandle  OPTIONAL,
4917  IN NDIS_HANDLE  NdisVcHandle  OPTIONAL,
4918  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL,
4919  IN OUT  PNDIS_REQUEST  NdisRequest);
4920
4921NDISAPI
4922VOID
4923NTAPI
4924NdisCoRequestComplete(
4925  IN NDIS_STATUS  Status,
4926  IN NDIS_HANDLE  NdisAfHandle,
4927  IN NDIS_HANDLE  NdisVcHandle  OPTIONAL,
4928  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL,
4929  IN PNDIS_REQUEST  NdisRequest);
4930
4931NDISAPI
4932VOID
4933NTAPI
4934NdisCoSendPackets(
4935  IN NDIS_HANDLE  NdisVcHandle,
4936  IN PPNDIS_PACKET  PacketArray,
4937  IN UINT  NumberOfPackets);
4938
4939NDISAPI
4940VOID
4941NTAPI
4942NdisMCoActivateVcComplete(
4943  IN NDIS_STATUS  Status,
4944  IN NDIS_HANDLE  NdisVcHandle,
4945  IN PCO_CALL_PARAMETERS  CallParameters);
4946
4947NDISAPI
4948VOID
4949NTAPI
4950NdisMCoDeactivateVcComplete(
4951  IN NDIS_STATUS  Status,
4952  IN NDIS_HANDLE  NdisVcHandle);
4953
4954NDISAPI
4955VOID
4956NTAPI
4957NdisMCoIndicateReceivePacket(
4958  IN NDIS_HANDLE  NdisVcHandle,
4959  IN PPNDIS_PACKET  PacketArray,
4960  IN UINT  NumberOfPackets);
4961
4962NDISAPI
4963VOID
4964NTAPI
4965NdisMCoIndicateStatus(
4966  IN NDIS_HANDLE  MiniportAdapterHandle,
4967  IN NDIS_HANDLE  NdisVcHandle  OPTIONAL,
4968  IN NDIS_STATUS  GeneralStatus,
4969  IN PVOID  StatusBuffer  OPTIONAL,
4970  IN ULONG  StatusBufferSize);
4971
4972NDISAPI
4973VOID
4974NTAPI
4975NdisMCoReceiveComplete(
4976  IN NDIS_HANDLE  MiniportAdapterHandle);
4977
4978NDISAPI
4979VOID
4980NTAPI
4981NdisMCoRequestComplete(
4982  IN NDIS_STATUS  Status,
4983  IN NDIS_HANDLE  MiniportAdapterHandle,
4984  IN PNDIS_REQUEST  Request);
4985
4986NDISAPI
4987VOID
4988NTAPI
4989NdisMCoSendComplete(
4990  IN NDIS_STATUS  Status,
4991  IN NDIS_HANDLE  NdisVcHandle,
4992  IN PNDIS_PACKET  Packet);
4993
4994
4995/* NDIS 5.0 extensions for intermediate drivers */
4996
4997NDISAPI
4998VOID
4999NTAPI
5000NdisIMAssociateMiniport(
5001  IN NDIS_HANDLE  DriverHandle,
5002  IN NDIS_HANDLE  ProtocolHandle);
5003
5004NDISAPI
5005NDIS_STATUS
5006NTAPI
5007NdisIMCancelInitializeDeviceInstance(
5008  IN NDIS_HANDLE  DriverHandle,
5009  IN PNDIS_STRING  DeviceInstance);
5010
5011NDISAPI
5012VOID
5013NTAPI
5014NdisIMCopySendCompletePerPacketInfo(
5015  IN PNDIS_PACKET  DstPacket,
5016  IN PNDIS_PACKET  SrcPacket);
5017
5018NDISAPI
5019VOID
5020NTAPI
5021NdisIMCopySendPerPacketInfo(
5022  IN PNDIS_PACKET  DstPacket,
5023  IN PNDIS_PACKET  SrcPacket);
5024
5025NDISAPI
5026VOID
5027NTAPI
5028NdisIMDeregisterLayeredMiniport(
5029  IN NDIS_HANDLE  DriverHandle);
5030
5031NDISAPI
5032NDIS_HANDLE
5033NTAPI
5034NdisIMGetBindingContext(
5035  IN NDIS_HANDLE  NdisBindingHandle);
5036
5037NDISAPI
5038NDIS_HANDLE
5039NTAPI
5040NdisIMGetDeviceContext(
5041  IN NDIS_HANDLE  MiniportAdapterHandle);
5042
5043NDISAPI
5044NDIS_STATUS
5045NTAPI
5046NdisIMInitializeDeviceInstanceEx(
5047  IN NDIS_HANDLE  DriverHandle,
5048  IN PNDIS_STRING  DriverInstance,
5049  IN NDIS_HANDLE  DeviceContext  OPTIONAL);
5050
5051/*
5052NDISAPI
5053PSINGLE_LIST_ENTRY
5054NTAPI
5055NdisInterlockedPopEntrySList(
5056  IN PSLIST_HEADER ListHead,
5057  IN PKSPIN_LOCK Lock);
5058*/
5059#define NdisInterlockedPopEntrySList(SListHead, Lock) \
5060  ExInterlockedPopEntrySList(SListHead, &(Lock)->SpinLock)
5061
5062/*
5063NDISAPI
5064PSINGLE_LIST_ENTRY
5065NTAPI
5066NdisInterlockedPushEntrySList(
5067  IN PSLIST_HEADER ListHead,
5068  IN PSINGLE_LIST_ENTRY ListEntry,
5069  IN PKSPIN_LOCK Lock);
5070*/
5071#define NdisInterlockedPushEntrySList(SListHead, SListEntry, Lock) \
5072  ExInterlockedPushEntrySList(SListHead, SListEntry, &(Lock)->SpinLock)
5073
5074#define NdisInterlockedFlushSList(SListHead) ExInterlockedFlushSList(SListHead)
5075
5076/*
5077NDISAPI
5078VOID
5079NTAPI
5080NdisQueryBufferSafe(
5081  IN PNDIS_BUFFER Buffer,
5082  OUT PVOID *VirtualAddress OPTIONAL,
5083  OUT PUINT Length,
5084  IN UINT Priority);
5085*/
5086#define NdisQueryBufferSafe(_Buffer, _VirtualAddress, _Length, _Priority) {         \
5087  if (ARGUMENT_PRESENT(_VirtualAddress)) {                                          \
5088    *(PVOID *)(_VirtualAddress) = MmGetSystemAddressForMdlSafe(_Buffer, _Priority); \
5089  }                                                                                 \
5090  *(_Length) = MmGetMdlByteCount(_Buffer);                                          \
5091}
5092
5093/* Routines for NDIS miniport drivers */
5094
5095#if NDIS_SUPPORT_NDIS6
5096
5097NDISAPI
5098PNDIS_GENERIC_OBJECT
5099NTAPI
5100NdisAllocateGenericObject(
5101  PDRIVER_OBJECT DriverObject OPTIONAL,
5102  ULONG Tag,
5103  USHORT Size);
5104
5105NDISAPI
5106VOID
5107NTAPI
5108NdisFreeGenericObject(
5109  IN PNDIS_GENERIC_OBJECT NdisObject);
5110
5111#endif /* NDIS_SUPPORT_NDIS6 */
5112
5113NDISAPI
5114VOID
5115NTAPI
5116NdisInitializeWrapper(
5117  OUT PNDIS_HANDLE  NdisWrapperHandle,
5118  IN PVOID  SystemSpecific1,
5119  IN PVOID  SystemSpecific2,
5120  IN PVOID  SystemSpecific3);
5121
5122NDISAPI
5123NDIS_STATUS
5124NTAPI
5125NdisMAllocateMapRegisters(
5126  IN NDIS_HANDLE  MiniportAdapterHandle,
5127  IN UINT  DmaChannel,
5128  IN NDIS_DMA_SIZE  DmaSize,
5129  IN ULONG  PhysicalMapRegistersNeeded,
5130  IN ULONG  MaximumPhysicalMapping);
5131
5132/*
5133 * VOID
5134 * NdisMArcIndicateReceive(
5135 *   IN NDIS_HANDLE  MiniportAdapterHandle,
5136 *   IN PUCHAR  HeaderBuffer,
5137 *   IN PUCHAR  DataBuffer,
5138 *   IN UINT  Length);
5139 */
5140#define NdisMArcIndicateReceive(MiniportAdapterHandle, \
5141                                HeaderBuffer,          \
5142                                DataBuffer,            \
5143                                Length)                \
5144{                                                      \
5145    ArcFilterDprIndicateReceive(                       \
5146        (((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->ArcDB), \
5147        (HeaderBuffer), \
5148        (DataBuffer),   \
5149        (Length));      \
5150}
5151
5152/*
5153 * VOID
5154 * NdisMArcIndicateReceiveComplete(
5155 *   IN NDIS_HANDLE  MiniportAdapterHandle);
5156 */
5157#define NdisMArcIndicateReceiveComplete(MiniportAdapterHandle) \
5158{                                                              \
5159    if (((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->EthDB)  \
5160	    {                                                        \
5161	        NdisMEthIndicateReceiveComplete(_H);                 \
5162	    }                                                        \
5163                                                               \
5164    ArcFilterDprIndicateReceiveComplete(                       \
5165      ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->ArcDB);   \
5166}
5167
5168NDISAPI
5169VOID
5170NTAPI
5171NdisMCloseLog(
5172  IN NDIS_HANDLE  LogHandle);
5173
5174NDISAPI
5175NDIS_STATUS
5176NTAPI
5177NdisMCreateLog(
5178  IN NDIS_HANDLE  MiniportAdapterHandle,
5179  IN UINT  Size,
5180  OUT PNDIS_HANDLE  LogHandle);
5181
5182NDISAPI
5183VOID
5184NTAPI
5185NdisMDeregisterAdapterShutdownHandler(
5186  IN NDIS_HANDLE  MiniportHandle);
5187
5188#if NDIS_LEGACY_MINIPORT
5189
5190NDISAPI
5191VOID
5192NTAPI
5193NdisMDeregisterInterrupt(
5194  IN PNDIS_MINIPORT_INTERRUPT Interrupt);
5195
5196NDISAPI
5197VOID
5198NTAPI
5199NdisMRegisterAdapterShutdownHandler(
5200  IN NDIS_HANDLE MiniportHandle,
5201  IN PVOID ShutdownContext,
5202  IN ADAPTER_SHUTDOWN_HANDLER ShutdownHandler);
5203
5204NDISAPI
5205NDIS_STATUS
5206NTAPI
5207NdisMRegisterInterrupt(
5208  OUT PNDIS_MINIPORT_INTERRUPT Interrupt,
5209  IN NDIS_HANDLE MiniportAdapterHandle,
5210  IN UINT InterruptVector,
5211  IN UINT InterruptLevel,
5212  IN BOOLEAN RequestIsr,
5213  IN BOOLEAN SharedInterrupt,
5214  IN NDIS_INTERRUPT_MODE InterruptMode);
5215
5216NDISAPI
5217NDIS_STATUS
5218NTAPI
5219NdisMRegisterMiniport(
5220  IN NDIS_HANDLE NdisWrapperHandle,
5221  IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics,
5222  IN UINT CharacteristicsLength);
5223
5224NDISAPI
5225BOOLEAN
5226NTAPI
5227NdisMSynchronizeWithInterrupt(
5228  IN PNDIS_MINIPORT_INTERRUPT Interrupt,
5229  IN PVOID SynchronizeFunction,
5230  IN PVOID SynchronizeContext);
5231#endif /* NDIS_LEGACY_MINIPORT */
5232
5233NDISAPI
5234VOID
5235NTAPI
5236NdisMDeregisterIoPortRange(
5237  IN NDIS_HANDLE  MiniportAdapterHandle,
5238  IN UINT  InitialPort,
5239  IN UINT  NumberOfPorts,
5240  IN PVOID  PortOffset);
5241
5242/*
5243 * VOID
5244 * NdisMEthIndicateReceive(
5245 *   IN NDIS_HANDLE  MiniportAdapterHandle,
5246 *   IN NDIS_HANDLE  MiniportReceiveContext,
5247 *   IN PVOID  HeaderBuffer,
5248 *   IN UINT  HeaderBufferSize,
5249 *   IN PVOID  LookaheadBuffer,
5250 *   IN UINT  LookaheadBufferSize,
5251 *   IN UINT  PacketSize);
5252 */
5253#define NdisMEthIndicateReceive(MiniportAdapterHandle,  \
5254                                MiniportReceiveContext, \
5255                                HeaderBuffer,           \
5256                                HeaderBufferSize,       \
5257                                LookaheadBuffer,        \
5258                                LookaheadBufferSize,    \
5259                                PacketSize)             \
5260{                                                       \
5261    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->EthRxIndicateHandler)( \
5262		((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->EthDB,  \
5263		(MiniportReceiveContext), \
5264		(HeaderBuffer),           \
5265		(HeaderBuffer),           \
5266		(HeaderBufferSize),       \
5267		(LookaheadBuffer),        \
5268		(LookaheadBufferSize),    \
5269		(PacketSize));            \
5270}
5271
5272/*
5273 * VOID
5274 * NdisMEthIndicateReceiveComplete(
5275 *   IN NDIS_HANDLE MiniportAdapterHandle);
5276 */
5277#define NdisMEthIndicateReceiveComplete(MiniportAdapterHandle) \
5278{                                                              \
5279    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->EthRxCompleteHandler)( \
5280        ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->EthDB);    \
5281}
5282
5283/*
5284 * VOID
5285 * NdisMFddiIndicateReceive(
5286 *   IN NDIS_HANDLE  MiniportAdapterHandle,
5287 *   IN NDIS_HANDLE  MiniportReceiveContext,
5288 *   IN PVOID  HeaderBuffer,
5289 *   IN UINT  HeaderBufferSize,
5290 *   IN PVOID  LookaheadBuffer,
5291 *   IN UINT  LookaheadBufferSize,
5292 *   IN UINT  PacketSize);
5293 */
5294#define NdisMFddiIndicateReceive(MiniportAdapterHandle,  \
5295                                 MiniportReceiveContext, \
5296                                 HeaderBuffer,           \
5297                                 HeaderBufferSize,       \
5298                                 LookaheadBuffer,        \
5299                                 LookaheadBufferSize,    \
5300                                 PacketSize)             \
5301{                                                        \
5302    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FddiRxIndicateHandler)( \
5303        (((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FddiDB),   \
5304        (MiniportReceiveContext),              \
5305        (PUCHAR)(HeaderBuffer) + 1,            \
5306        (((*(PUCHAR*)(HeaderBuffer)) & 0x40) ? \
5307            FDDI_LENGTH_OF_LONG_ADDRESS :      \
5308		    FDDI_LENGTH_OF_SHORT_ADDRESS),     \
5309        (HeaderBuffer),                        \
5310        (HeaderBufferSize),                    \
5311        (LookaheadBuffer),                     \
5312        (LookaheadBufferSize),                 \
5313        (PacketSize));                         \
5314}
5315
5316
5317
5318/*
5319 * VOID
5320 * NdisMFddiIndicateReceiveComplete(
5321 *   IN NDIS_HANDLE  MiniportAdapterHandle);
5322 */
5323#define NdisMFddiIndicateReceiveComplete(MiniportAdapterHandle) \
5324{                                                               \
5325    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FddiRxCompleteHandler)( \
5326        ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->FddiDB);      \
5327}
5328
5329NDISAPI
5330VOID
5331NTAPI
5332NdisMFlushLog(
5333  IN NDIS_HANDLE  LogHandle);
5334
5335NDISAPI
5336VOID
5337NTAPI
5338NdisMFreeMapRegisters(
5339  IN NDIS_HANDLE  MiniportAdapterHandle);
5340
5341/*
5342 * VOID
5343 * EXPORT
5344 * NdisMIndicateReceivePacket(
5345 *  IN NDIS_HANDLE  MiniportAdapterHandle,
5346 *  IN PPNDIS_PACKET  ReceivePackets,
5347 *  IN UINT  NumberOfPackets);
5348 */
5349#define NdisMIndicateReceivePacket(MiniportAdapterHandle, \
5350  ReceivePackets, NumberOfPackets)                        \
5351  (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->PacketIndicateHandler)( \
5352  MiniportAdapterHandle, ReceivePackets, NumberOfPackets)
5353
5354/*
5355 * VOID
5356 * NdisMIndicateStatus(
5357 *  IN NDIS_HANDLE  MiniportAdapterHandle,
5358 *  IN NDIS_STATUS  GeneralStatus,
5359 *  IN PVOID  StatusBuffer,
5360 *  IN UINT  StatusBufferSize);
5361 */
5362
5363#define NdisMIndicateStatus(MiniportAdapterHandle,  \
5364   GeneralStatus, StatusBuffer, StatusBufferSize)   \
5365  (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->StatusHandler)(   \
5366  MiniportAdapterHandle, GeneralStatus, StatusBuffer, StatusBufferSize)
5367
5368/*
5369 * VOID
5370 * NdisMIndicateStatusComplete(
5371 *   IN NDIS_HANDLE  MiniportAdapterHandle);
5372 */
5373#define NdisMIndicateStatusComplete(MiniportAdapterHandle) \
5374  (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->StatusCompleteHandler)( \
5375    MiniportAdapterHandle)
5376
5377/*
5378 * VOID
5379 * NdisMInitializeWrapper(
5380 *   OUT PNDIS_HANDLE  NdisWrapperHandle,
5381 *   IN PVOID  SystemSpecific1,
5382 *   IN PVOID  SystemSpecific2,
5383 *   IN PVOID  SystemSpecific3);
5384 */
5385#define NdisMInitializeWrapper(NdisWrapperHandle, \
5386                               SystemSpecific1,   \
5387                               SystemSpecific2,   \
5388                               SystemSpecific3)   \
5389    NdisInitializeWrapper((NdisWrapperHandle),    \
5390                          (SystemSpecific1),      \
5391                          (SystemSpecific2),      \
5392                          (SystemSpecific3))
5393
5394NDISAPI
5395NDIS_STATUS
5396NTAPI
5397NdisMMapIoSpace(
5398  OUT PVOID  *VirtualAddress,
5399  IN NDIS_HANDLE  MiniportAdapterHandle,
5400  IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress,
5401  IN UINT  Length);
5402
5403/*
5404 * VOID
5405 * NdisMQueryInformationComplete(
5406 *  IN NDIS_HANDLE  MiniportAdapterHandle,
5407 *  IN NDIS_STATUS  Status);
5408 */
5409#define NdisMQueryInformationComplete(MiniportAdapterHandle, Status) \
5410  (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->QueryCompleteHandler)(MiniportAdapterHandle, Status)
5411
5412NDISAPI
5413NDIS_STATUS
5414NTAPI
5415NdisMRegisterIoPortRange(
5416  OUT PVOID  *PortOffset,
5417  IN NDIS_HANDLE  MiniportAdapterHandle,
5418  IN UINT  InitialPort,
5419  IN UINT  NumberOfPorts);
5420
5421NDISAPI
5422VOID
5423NTAPI
5424NdisMSetTimer(
5425  IN PNDIS_MINIPORT_TIMER  Timer,
5426  IN UINT  MillisecondsToDelay);
5427
5428NDISAPI
5429VOID
5430NTAPI
5431NdisMInitializeTimer(
5432  IN OUT PNDIS_MINIPORT_TIMER Timer,
5433  IN NDIS_HANDLE MiniportAdapterHandle,
5434  IN PNDIS_TIMER_FUNCTION TimerFunction,
5435  IN PVOID FunctionContext);
5436
5437NDISAPI
5438VOID
5439NTAPI
5440NdisMSetPeriodicTimer(
5441  IN PNDIS_MINIPORT_TIMER Timer,
5442  IN UINT MillisecondPeriod);
5443
5444NDISAPI
5445VOID
5446NTAPI
5447NdisMCancelTimer(
5448  IN PNDIS_MINIPORT_TIMER Timer,
5449  OUT PBOOLEAN TimerCancelled);
5450
5451#if !defined(NDIS_WRAPPER)
5452
5453/*
5454 * VOID
5455 * NdisMResetComplete(
5456 *   IN NDIS_HANDLE  MiniportAdapterHandle,
5457 *   IN NDIS_STATUS  Status,
5458 *   IN BOOLEAN  AddressingReset);
5459 */
5460#define	NdisMResetComplete(MiniportAdapterHandle, \
5461                           Status,                \
5462                           AddressingReset)       \
5463{                                                 \
5464    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->ResetCompleteHandler)( \
5465        MiniportAdapterHandle, Status, AddressingReset); \
5466}
5467
5468/*
5469 * VOID
5470 * NdisMSendComplete(
5471 *   IN NDIS_HANDLE  MiniportAdapterHandle,
5472 *   IN PNDIS_PACKET  Packet,
5473 *   IN NDIS_STATUS  Status);
5474 */
5475#define	NdisMSendComplete(MiniportAdapterHandle, \
5476                          Packet,                \
5477                          Status)                \
5478{                                                \
5479    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->SendCompleteHandler)( \
5480        MiniportAdapterHandle, Packet, Status);  \
5481}
5482
5483/*
5484 * VOID
5485 * NdisMSendResourcesAvailable(
5486 *   IN NDIS_HANDLE  MiniportAdapterHandle);
5487 */
5488#define	NdisMSendResourcesAvailable(MiniportAdapterHandle) \
5489{                                                \
5490    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->SendResourcesHandler)( \
5491        MiniportAdapterHandle); \
5492}
5493
5494/*
5495 * VOID
5496 * NdisMTransferDataComplete(
5497 *   IN NDIS_HANDLE  MiniportAdapterHandle,
5498 *   IN PNDIS_PACKET  Packet,
5499 *   IN NDIS_STATUS  Status,
5500 *   IN UINT  BytesTransferred);
5501 */
5502#define	NdisMTransferDataComplete(MiniportAdapterHandle, \
5503                                  Packet,                \
5504                                  Status,                \
5505                                  BytesTransferred)      \
5506{                                                        \
5507    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->TDCompleteHandler)( \
5508        MiniportAdapterHandle, Packet, Status, BytesTransferred)           \
5509}
5510
5511#endif /* !_NDIS_ */
5512
5513
5514/*
5515 * VOID
5516 * NdisMSetAttributes(
5517 *  IN NDIS_HANDLE  MiniportAdapterHandle,
5518 *  IN NDIS_HANDLE  MiniportAdapterContext,
5519 *  IN BOOLEAN  BusMaster,
5520 *  IN NDIS_INTERFACE_TYPE  AdapterType);
5521 */
5522#define NdisMSetAttributes(MiniportAdapterHandle,   \
5523                           MiniportAdapterContext,  \
5524                           BusMaster,               \
5525                           AdapterType)             \
5526  NdisMSetAttributesEx(MiniportAdapterHandle,       \
5527    MiniportAdapterContext,                         \
5528    0,                                              \
5529    (BusMaster) ? NDIS_ATTRIBUTE_BUS_MASTER : 0,    \
5530    AdapterType)
5531
5532NDISAPI
5533VOID
5534NTAPI
5535NdisMSetAttributesEx(
5536  IN NDIS_HANDLE  MiniportAdapterHandle,
5537  IN NDIS_HANDLE  MiniportAdapterContext,
5538  IN UINT  CheckForHangTimeInSeconds   OPTIONAL,
5539  IN ULONG  AttributeFlags,
5540  IN NDIS_INTERFACE_TYPE AdapterType);
5541
5542/*
5543 * VOID
5544 * NdisMSetInformationComplete(
5545 *   IN NDIS_HANDLE  MiniportAdapterHandle,
5546 *   IN NDIS_STATUS  Status);
5547 */
5548#define NdisMSetInformationComplete(MiniportAdapterHandle, \
5549                                    Status) \
5550  (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->SetCompleteHandler)( \
5551    MiniportAdapterHandle, Status)
5552
5553NDISAPI
5554VOID
5555NTAPI
5556NdisMSleep(
5557  IN ULONG  MicrosecondsToSleep);
5558
5559/*
5560 * VOID
5561 * NdisMTrIndicateReceive(
5562 *   IN NDIS_HANDLE  MiniportAdapterHandle,
5563 *   IN NDIS_HANDLE  MiniportReceiveContext,
5564 *   IN PVOID  HeaderBuffer,
5565 *   IN UINT  HeaderBufferSize,
5566 *   IN PVOID  LookaheadBuffer,
5567 *   IN UINT  LookaheadBufferSize,
5568 *   IN UINT  PacketSize);
5569 */
5570#define NdisMTrIndicateReceive(MiniportAdapterHandle,  \
5571                               MiniportReceiveContext, \
5572                               HeaderBuffer,           \
5573                               HeaderBufferSize,       \
5574                               LookaheadBuffer,        \
5575                               LookaheadBufferSize,    \
5576                               PacketSize)             \
5577{                                                      \
5578    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->TrRxIndicateHandler)( \
5579      (((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->TrDB),     \
5580		(MiniportReceiveContext), \
5581		(HeaderBuffer),           \
5582		(HeaderBuffer),           \
5583		(HeaderBufferSize),       \
5584		(LookaheadBuffer),        \
5585		(LookaheadBufferSize),    \
5586		(PacketSize));            \
5587}
5588
5589/*
5590 * VOID
5591 * NdisMTrIndicateReceiveComplete(
5592 *   IN NDIS_HANDLE  MiniportAdapterHandle);
5593 */
5594#define NdisMTrIndicateReceiveComplete(MiniportAdapterHandle) \
5595{                                                             \
5596	(*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->TrRxCompleteHandler)( \
5597    ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->TrDB);    \
5598}
5599
5600NDISAPI
5601NDIS_STATUS
5602NTAPI
5603NdisMWriteLogData(
5604  IN NDIS_HANDLE  LogHandle,
5605  IN PVOID  LogBuffer,
5606  IN UINT  LogBufferSize);
5607
5608NDISAPI
5609VOID
5610NTAPI
5611NdisMQueryAdapterResources(
5612  OUT PNDIS_STATUS  Status,
5613  IN NDIS_HANDLE  WrapperConfigurationContext,
5614  OUT PNDIS_RESOURCE_LIST  ResourceList,
5615  IN OUT PUINT  BufferSize);
5616
5617NDISAPI
5618VOID
5619NTAPI
5620NdisTerminateWrapper(
5621  IN NDIS_HANDLE  NdisWrapperHandle,
5622  IN PVOID  SystemSpecific);
5623
5624NDISAPI
5625VOID
5626NTAPI
5627NdisMUnmapIoSpace(
5628  IN NDIS_HANDLE  MiniportAdapterHandle,
5629  IN PVOID  VirtualAddress,
5630  IN UINT  Length);
5631
5632/* Event functions */
5633
5634NDISAPI
5635VOID
5636NTAPI
5637NdisInitializeEvent(
5638  OUT PNDIS_EVENT Event);
5639
5640NDISAPI
5641VOID
5642NTAPI
5643NdisSetEvent(
5644  IN PNDIS_EVENT Event);
5645
5646NDISAPI
5647VOID
5648NTAPI
5649NdisResetEvent(
5650  IN PNDIS_EVENT Event);
5651
5652NDISAPI
5653BOOLEAN
5654NTAPI
5655NdisWaitEvent(
5656  IN PNDIS_EVENT Event,
5657  IN UINT Timeout);
5658
5659/* NDIS intermediate miniport structures */
5660
5661typedef VOID (NTAPI *W_MINIPORT_CALLBACK)(
5662  IN NDIS_HANDLE  MiniportAdapterContext,
5663  IN PVOID  CallbackContext);
5664
5665/* Routines for intermediate miniport drivers */
5666
5667NDISAPI
5668NDIS_STATUS
5669NTAPI
5670NdisIMDeInitializeDeviceInstance(
5671  IN NDIS_HANDLE NdisMiniportHandle);
5672
5673/*
5674 * NDIS_STATUS
5675 * NdisIMInitializeDeviceInstance(
5676 *   IN NDIS_HANDLE  DriverHandle,
5677 *   IN PNDIS_STRING  DeviceInstance);
5678 */
5679#define NdisIMInitializeDeviceInstance(DriverHandle, DeviceInstance) \
5680  NdisIMInitializeDeviceInstanceEx(DriverHandle, DeviceInstance, NULL)
5681
5682/* Functions obsoleted by NDIS 5.0 */
5683
5684NDISAPI
5685VOID
5686NTAPI
5687NdisFreeDmaChannel(
5688  IN PNDIS_HANDLE  NdisDmaHandle);
5689
5690NDISAPI
5691VOID
5692NTAPI
5693NdisSetupDmaTransfer(
5694  OUT PNDIS_STATUS  Status,
5695  IN PNDIS_HANDLE  NdisDmaHandle,
5696  IN PNDIS_BUFFER  Buffer,
5697  IN ULONG  Offset,
5698  IN ULONG  Length,
5699  IN BOOLEAN  WriteToDevice);
5700
5701/*
5702NDISAPI
5703NTSTATUS
5704NTAPI
5705NdisUpcaseUnicodeString(
5706  OUT PUNICODE_STRING DestinationString,
5707  IN PUNICODE_STRING SourceString);
5708*/
5709#define NdisUpcaseUnicodeString(_d, _s) RtlUpcaseUnicodeString(_d, _s, FALSE)
5710
5711
5712/* Routines for NDIS protocol drivers */
5713
5714#if NDIS_LEGACY_PROTOCOL
5715
5716NDISAPI
5717NDIS_STATUS
5718NTAPI
5719NdisIMRegisterLayeredMiniport(
5720  IN NDIS_HANDLE NdisWrapperHandle,
5721  IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics,
5722  IN UINT CharacteristicsLength,
5723  OUT PNDIS_HANDLE DriverHandle);
5724
5725NDISAPI
5726VOID
5727NTAPI
5728NdisTransferData(
5729  OUT PNDIS_STATUS Status,
5730  IN NDIS_HANDLE NdisBindingHandle,
5731  IN NDIS_HANDLE MacReceiveContext,
5732  IN UINT ByteOffset,
5733  IN UINT BytesToTransfer,
5734  IN OUT PNDIS_PACKET Packet,
5735  OUT PUINT BytesTransferred);
5736
5737NDISAPI
5738VOID
5739NTAPI
5740NdisSend(
5741  OUT PNDIS_STATUS Status,
5742  IN NDIS_HANDLE NdisBindingHandle,
5743  IN PNDIS_PACKET Packet);
5744
5745NDISAPI
5746VOID
5747NTAPI
5748NdisSendPackets(
5749  IN NDIS_HANDLE NdisBindingHandle,
5750  IN PPNDIS_PACKET PacketArray,
5751  IN UINT NumberOfPackets);
5752
5753NDISAPI
5754VOID
5755NTAPI
5756NdisRequest(
5757  OUT PNDIS_STATUS Status,
5758  IN NDIS_HANDLE NdisBindingHandle,
5759  IN PNDIS_REQUEST NdisRequest);
5760
5761NDISAPI
5762VOID
5763NTAPI
5764NdisReset(
5765  OUT PNDIS_STATUS Status,
5766  IN NDIS_HANDLE NdisBindingHandle);
5767
5768NDISAPI
5769VOID
5770NTAPI
5771NdisDeregisterProtocol(
5772  OUT PNDIS_STATUS Status,
5773  IN NDIS_HANDLE NdisProtocolHandle);
5774
5775NDISAPI
5776VOID
5777NTAPI
5778NdisOpenAdapter(
5779  OUT PNDIS_STATUS Status,
5780  OUT PNDIS_STATUS OpenErrorStatus,
5781  OUT PNDIS_HANDLE NdisBindingHandle,
5782  OUT PUINT SelectedMediumIndex,
5783  IN PNDIS_MEDIUM MediumArray,
5784  IN UINT MediumArraySize,
5785  IN NDIS_HANDLE NdisProtocolHandle,
5786  IN NDIS_HANDLE ProtocolBindingContext,
5787  IN PNDIS_STRING AdapterName,
5788  IN UINT OpenOptions,
5789  IN PSTRING AddressingInformation OPTIONAL);
5790
5791NDISAPI
5792VOID
5793NTAPI
5794NdisCloseAdapter(
5795  OUT PNDIS_STATUS Status,
5796  IN NDIS_HANDLE NdisBindingHandle);
5797
5798NDISAPI
5799VOID
5800NTAPI
5801NdisCompleteBindAdapter(
5802  IN NDIS_HANDLE BindAdapterContext,
5803  IN NDIS_STATUS Status,
5804  IN NDIS_STATUS OpenStatus);
5805
5806NDISAPI
5807VOID
5808NTAPI
5809NdisCompleteUnbindAdapter(
5810  IN NDIS_HANDLE UnbindAdapterContext,
5811  IN NDIS_STATUS Status);
5812
5813NDISAPI
5814VOID
5815NTAPI
5816NdisSetProtocolFilter(
5817  OUT PNDIS_STATUS Status,
5818  IN NDIS_HANDLE NdisBindingHandle,
5819  IN RECEIVE_HANDLER ReceiveHandler,
5820  IN RECEIVE_PACKET_HANDLER ReceivePacketHandler,
5821  IN NDIS_MEDIUM Medium,
5822  IN UINT Offset,
5823  IN UINT Size,
5824  IN PUCHAR Pattern);
5825
5826NDISAPI
5827VOID
5828NTAPI
5829NdisGetDriverHandle(
5830  IN PNDIS_HANDLE NdisBindingHandle,
5831  OUT PNDIS_HANDLE NdisDriverHandle);
5832
5833NDISAPI
5834VOID
5835NTAPI
5836NdisOpenProtocolConfiguration(
5837  OUT PNDIS_STATUS Status,
5838  OUT PNDIS_HANDLE ConfigurationHandle,
5839  IN PNDIS_STRING ProtocolSection);
5840
5841NDISAPI
5842VOID
5843NTAPI
5844NdisCompletePnPEvent(
5845  IN NDIS_STATUS Status,
5846  IN NDIS_HANDLE NdisBindingHandle,
5847  IN PNET_PNP_EVENT NetPnPEvent);
5848
5849/*
5850 * VOID
5851 * NdisSetSendFlags(
5852 *   IN PNDIS_PACKET Packet,
5853 *   IN UINT Flags);
5854 */
5855#define NdisSetSendFlags(_Packet,_Flags)(_Packet)->Private.Flags = (_Flags)
5856
5857#define NdisQuerySendFlags(_Packet,_Flags) *(_Flags) = (_Packet)->Private.Flags
5858
5859NDISAPI
5860VOID
5861NTAPI
5862NdisReturnPackets(
5863  IN PNDIS_PACKET *PacketsToReturn,
5864  IN UINT NumberOfPackets);
5865
5866NDISAPI
5867PNDIS_PACKET
5868NTAPI
5869NdisGetReceivedPacket(
5870  IN PNDIS_HANDLE NdisBindingHandle,
5871  IN PNDIS_HANDLE MacContext);
5872
5873NDISAPI
5874VOID
5875NTAPI
5876NdisCancelSendPackets(
5877  IN NDIS_HANDLE NdisBindingHandle,
5878  IN PVOID CancelId);
5879
5880NDISAPI
5881NDIS_STATUS
5882NTAPI
5883NdisQueryPendingIOCount(
5884  IN PVOID NdisBindingHandle,
5885  OUT PULONG IoCount);
5886
5887NDISAPI
5888VOID
5889NTAPI
5890NdisRegisterProtocol(
5891  OUT PNDIS_STATUS Status,
5892  OUT PNDIS_HANDLE NdisProtocolHandle,
5893  IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics,
5894  IN UINT CharacteristicsLength);
5895
5896#endif /* NDIS_LEGACY_PROTOCOL */
5897
5898NDISAPI
5899UCHAR
5900NTAPI
5901NdisGeneratePartialCancelId(VOID);
5902
5903NDISAPI
5904VOID
5905NTAPI
5906NdisReEnumerateProtocolBindings(
5907  IN NDIS_HANDLE NdisProtocolHandle);
5908
5909NDISAPI
5910VOID
5911NTAPI
5912NdisRegisterTdiCallBack(
5913  IN TDI_REGISTER_CALLBACK RegisterCallback,
5914  IN TDI_PNP_HANDLER PnPHandler);
5915
5916NDISAPI
5917VOID
5918NTAPI
5919NdisDeregisterTdiCallBack(VOID);
5920
5921/* Obsoleted in Windows XP */
5922
5923/* Prototypes for NDIS_MAC_CHARACTERISTICS */
5924
5925typedef NDIS_STATUS (*OPEN_ADAPTER_HANDLER)(
5926  OUT PNDIS_STATUS  OpenErrorStatus,
5927  OUT NDIS_HANDLE  *MacBindingHandle,
5928  OUT PUINT  SelectedMediumIndex,
5929  IN PNDIS_MEDIUM  MediumArray,
5930  IN UINT  MediumArraySize,
5931  IN NDIS_HANDLE  NdisBindingContext,
5932  IN NDIS_HANDLE  MacAdapterContext,
5933  IN UINT  OpenOptions,
5934  IN PSTRING  AddressingInformation  OPTIONAL);
5935
5936typedef NDIS_STATUS (NTAPI *CLOSE_ADAPTER_HANDLER)(
5937  IN NDIS_HANDLE  MacBindingHandle);
5938
5939typedef NDIS_STATUS (NTAPI *WAN_TRANSFER_DATA_HANDLER)(
5940  VOID);
5941
5942typedef NDIS_STATUS (NTAPI *QUERY_GLOBAL_STATISTICS_HANDLER)(
5943  IN NDIS_HANDLE  MacAdapterContext,
5944  IN PNDIS_REQUEST  NdisRequest);
5945
5946typedef VOID (NTAPI *UNLOAD_MAC_HANDLER)(
5947  IN NDIS_HANDLE  MacMacContext);
5948
5949typedef NDIS_STATUS (NTAPI *ADD_ADAPTER_HANDLER)(
5950  IN NDIS_HANDLE  MacMacContext,
5951  IN NDIS_HANDLE  WrapperConfigurationContext,
5952  IN PNDIS_STRING  AdapterName);
5953
5954typedef VOID (*REMOVE_ADAPTER_HANDLER)(
5955  IN NDIS_HANDLE  MacAdapterContext);
5956
5957typedef struct _NDIS_MAC_CHARACTERISTICS {
5958  UCHAR  MajorNdisVersion;
5959  UCHAR  MinorNdisVersion;
5960  USHORT  Filler;
5961  UINT  Reserved;
5962  OPEN_ADAPTER_HANDLER  OpenAdapterHandler;
5963  CLOSE_ADAPTER_HANDLER  CloseAdapterHandler;
5964  SEND_HANDLER  SendHandler;
5965  TRANSFER_DATA_HANDLER  TransferDataHandler;
5966  RESET_HANDLER  ResetHandler;
5967  REQUEST_HANDLER  RequestHandler;
5968  QUERY_GLOBAL_STATISTICS_HANDLER  QueryGlobalStatisticsHandler;
5969  UNLOAD_MAC_HANDLER  UnloadMacHandler;
5970  ADD_ADAPTER_HANDLER  AddAdapterHandler;
5971  REMOVE_ADAPTER_HANDLER  RemoveAdapterHandler;
5972  NDIS_STRING  Name;
5973} NDIS_MAC_CHARACTERISTICS, *PNDIS_MAC_CHARACTERISTICS;
5974
5975typedef	NDIS_MAC_CHARACTERISTICS        NDIS_WAN_MAC_CHARACTERISTICS;
5976typedef	NDIS_WAN_MAC_CHARACTERISTICS    *PNDIS_WAN_MAC_CHARACTERISTICS;
5977
5978#ifdef __cplusplus
5979}
5980#endif
5981
5982#endif /* _NDIS_ */
5983
5984/* EOF */
5985