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  PVOID Reserved1; \
2156  PVOID Reserved2; \
2157  PVOID Reserved3; \
2158  PVOID Reserved4;
2159
2160#else
2161
2162#define NDIS51_MINIPORT_CHARACTERISTICS_S \
2163  NDIS50_MINIPORT_CHARACTERISTICS_S \
2164  W_CANCEL_SEND_PACKETS_HANDLER  CancelSendPacketsHandler; \
2165  W_PNP_EVENT_NOTIFY_HANDLER  PnPEventNotifyHandler; \
2166  W_MINIPORT_SHUTDOWN_HANDLER  AdapterShutdownHandler; \
2167  PVOID Reserved1; \
2168  PVOID Reserved2; \
2169  PVOID Reserved3; \
2170  PVOID Reserved4;
2171
2172#endif
2173
2174typedef struct _NDIS51_MINIPORT_CHARACTERISTICS {
2175  NDIS51_MINIPORT_CHARACTERISTICS_S
2176} NDIS51_MINIPORT_CHARACTERISTICS, *PSNDIS51_MINIPORT_CHARACTERISTICS;
2177
2178#if defined(NDIS51_MINIPORT)
2179typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
2180  NDIS51_MINIPORT_CHARACTERISTICS_S
2181} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
2182#elif defined(NDIS50_MINIPORT)
2183typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
2184  NDIS50_MINIPORT_CHARACTERISTICS_S
2185} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
2186#elif defined(NDIS40_MINIPORT)
2187typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
2188  NDIS40_MINIPORT_CHARACTERISTICS_S
2189} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
2190#else /* NDIS30 */
2191typedef struct _NDIS_MINIPORT_CHARACTERISTICS {
2192  NDIS30_MINIPORT_CHARACTERISTICS_S
2193} NDIS_MINIPORT_CHARACTERISTICS, *PNDIS_MINIPORT_CHARACTERISTICS;
2194#endif
2195
2196typedef struct _NDIS_MINIPORT_INTERRUPT {
2197  PKINTERRUPT InterruptObject;
2198  KSPIN_LOCK DpcCountLock;
2199  PVOID Reserved;
2200  W_ISR_HANDLER MiniportIsr;
2201  W_HANDLE_INTERRUPT_HANDLER MiniportDpc;
2202  KDPC InterruptDpc;
2203  PNDIS_MINIPORT_BLOCK Miniport;
2204  UCHAR DpcCount;
2205  BOOLEAN Filler1;
2206  KEVENT DpcsCompletedEvent;
2207  BOOLEAN SharedInterrupt;
2208  BOOLEAN IsrRequested;
2209} NDIS_MINIPORT_INTERRUPT, *PNDIS_MINIPORT_INTERRUPT;
2210
2211/* Structures available only to full MAC drivers */
2212
2213typedef BOOLEAN
2214(NTAPI *PNDIS_INTERRUPT_SERVICE)(
2215  IN PVOID  InterruptContext);
2216
2217typedef VOID
2218(NTAPI *PNDIS_DEFERRED_PROCESSING)(
2219  IN PVOID  SystemSpecific1,
2220  IN PVOID  InterruptContext,
2221  IN PVOID  SystemSpecific2,
2222  IN PVOID  SystemSpecific3);
2223
2224typedef struct _NDIS_WRAPPER_HANDLE NDIS_WRAPPER_HANDLE, *PNDIS_WRAPPER_HANDLE;
2225typedef struct _NDIS_PROTOCOL_BLOCK NDIS_PROTOCOL_BLOCK, *PNDIS_PROTOCOL_BLOCK;
2226typedef struct _NDIS_OPEN_BLOCK NDIS_OPEN_BLOCK, *PNDIS_OPEN_BLOCK;
2227typedef struct _NDIS_M_DRIVER_BLOCK NDIS_M_DRIVER_BLOCK, *PNDIS_M_DRIVER_BLOCK;
2228typedef struct _NDIS_OFFLOAD NDIS_OFFLOAD, *PNDIS_OFFLOAD;
2229typedef struct _NDIS_AF_LIST NDIS_AF_LIST, *PNDIS_AF_LIST;
2230typedef struct _X_FILTER ETH_FILTER, *PETH_FILTER;
2231#if NDIS_SUPPORT_NDIS6
2232typedef USHORT NET_FRAME_TYPE, *PNET_FRAME_TYPE;
2233#endif
2234
2235typedef struct _NDIS_MINIPORT_TIMER {
2236  KTIMER  Timer;
2237  KDPC  Dpc;
2238  PNDIS_TIMER_FUNCTION  MiniportTimerFunction;
2239  PVOID  MiniportTimerContext;
2240  PNDIS_MINIPORT_BLOCK  Miniport;
2241  struct _NDIS_MINIPORT_TIMER  *NextDeferredTimer;
2242} NDIS_MINIPORT_TIMER, *PNDIS_MINIPORT_TIMER;
2243
2244typedef struct _NDIS_INTERRUPT {
2245  PKINTERRUPT  InterruptObject;
2246  KSPIN_LOCK  DpcCountLock;
2247  PNDIS_INTERRUPT_SERVICE  MacIsr;
2248  PNDIS_DEFERRED_PROCESSING  MacDpc;
2249  KDPC  InterruptDpc;
2250  PVOID  InterruptContext;
2251  UCHAR  DpcCount;
2252  BOOLEAN	 Removing;
2253  KEVENT  DpcsCompletedEvent;
2254} NDIS_INTERRUPT, *PNDIS_INTERRUPT;
2255
2256
2257typedef enum _NDIS_WORK_ITEM_TYPE {
2258  NdisWorkItemRequest,
2259  NdisWorkItemSend,
2260  NdisWorkItemReturnPackets,
2261  NdisWorkItemResetRequested,
2262  NdisWorkItemResetInProgress,
2263  NdisWorkItemHalt,
2264  NdisWorkItemSendLoopback,
2265  NdisWorkItemMiniportCallback,
2266  NdisMaxWorkItems
2267} NDIS_WORK_ITEM_TYPE, *PNDIS_WORK_ITEM_TYPE;
2268
2269#define	NUMBER_OF_WORK_ITEM_TYPES         NdisMaxWorkItems
2270#define	NUMBER_OF_SINGLE_WORK_ITEMS       6
2271
2272typedef struct _NDIS_MINIPORT_WORK_ITEM {
2273	SINGLE_LIST_ENTRY  Link;
2274	NDIS_WORK_ITEM_TYPE  WorkItemType;
2275	PVOID  WorkItemContext;
2276} NDIS_MINIPORT_WORK_ITEM, *PNDIS_MINIPORT_WORK_ITEM;
2277
2278struct _NDIS_WORK_ITEM;
2279typedef VOID (*NDIS_PROC)(struct _NDIS_WORK_ITEM *, PVOID);
2280
2281typedef struct _NDIS_WORK_ITEM {
2282  PVOID Context;
2283  NDIS_PROC Routine;
2284  UCHAR WrapperReserved[8*sizeof(PVOID)];
2285} NDIS_WORK_ITEM, *PNDIS_WORK_ITEM;
2286
2287typedef struct _NDIS_BIND_PATHS {
2288	UINT  Number;
2289	NDIS_STRING  Paths[1];
2290} NDIS_BIND_PATHS, *PNDIS_BIND_PATHS;
2291
2292
2293typedef VOID
2294(NTAPI *ETH_RCV_COMPLETE_HANDLER)(
2295  IN PETH_FILTER  Filter);
2296
2297typedef VOID
2298(NTAPI *ETH_RCV_INDICATE_HANDLER)(
2299  IN PETH_FILTER  Filter,
2300  IN NDIS_HANDLE  MacReceiveContext,
2301  IN PCHAR  Address,
2302  IN PVOID  HeaderBuffer,
2303  IN UINT  HeaderBufferSize,
2304  IN PVOID  LookaheadBuffer,
2305  IN UINT  LookaheadBufferSize,
2306  IN UINT  PacketSize);
2307
2308typedef VOID
2309(NTAPI *FDDI_RCV_COMPLETE_HANDLER)(
2310  IN PFDDI_FILTER  Filter);
2311
2312typedef VOID
2313(NTAPI *FDDI_RCV_INDICATE_HANDLER)(
2314  IN PFDDI_FILTER  Filter,
2315  IN NDIS_HANDLE  MacReceiveContext,
2316  IN PCHAR  Address,
2317  IN UINT  AddressLength,
2318  IN PVOID  HeaderBuffer,
2319  IN UINT  HeaderBufferSize,
2320  IN PVOID  LookaheadBuffer,
2321  IN UINT  LookaheadBufferSize,
2322  IN UINT  PacketSize);
2323
2324typedef VOID
2325(NTAPI *FILTER_PACKET_INDICATION_HANDLER)(
2326  IN NDIS_HANDLE  Miniport,
2327  IN PPNDIS_PACKET  PacketArray,
2328  IN UINT  NumberOfPackets);
2329
2330typedef VOID
2331(NTAPI *TR_RCV_COMPLETE_HANDLER)(
2332  IN PTR_FILTER  Filter);
2333
2334typedef VOID
2335(NTAPI *TR_RCV_INDICATE_HANDLER)(
2336  IN PTR_FILTER  Filter,
2337  IN NDIS_HANDLE  MacReceiveContext,
2338  IN PVOID  HeaderBuffer,
2339  IN UINT  HeaderBufferSize,
2340  IN PVOID  LookaheadBuffer,
2341  IN UINT  LookaheadBufferSize,
2342  IN UINT  PacketSize);
2343
2344typedef VOID
2345(NTAPI *WAN_RCV_COMPLETE_HANDLER)(
2346  IN NDIS_HANDLE  MiniportAdapterHandle,
2347  IN NDIS_HANDLE  NdisLinkContext);
2348
2349typedef VOID
2350(NTAPI *WAN_RCV_HANDLER)(
2351  OUT PNDIS_STATUS  Status,
2352  IN NDIS_HANDLE  MiniportAdapterHandle,
2353  IN NDIS_HANDLE  NdisLinkContext,
2354  IN PUCHAR  Packet,
2355  IN ULONG  PacketSize);
2356
2357typedef VOID
2358(FASTCALL *NDIS_M_DEQUEUE_WORK_ITEM)(
2359  IN PNDIS_MINIPORT_BLOCK  Miniport,
2360  IN NDIS_WORK_ITEM_TYPE  WorkItemType,
2361  OUT PVOID  *WorkItemContext);
2362
2363typedef NDIS_STATUS
2364(FASTCALL *NDIS_M_QUEUE_NEW_WORK_ITEM)(
2365  IN PNDIS_MINIPORT_BLOCK  Miniport,
2366  IN NDIS_WORK_ITEM_TYPE  WorkItemType,
2367  IN PVOID  WorkItemContext);
2368
2369typedef NDIS_STATUS
2370(FASTCALL *NDIS_M_QUEUE_WORK_ITEM)(
2371  IN PNDIS_MINIPORT_BLOCK  Miniport,
2372  IN NDIS_WORK_ITEM_TYPE  WorkItemType,
2373  IN PVOID  WorkItemContext);
2374
2375typedef VOID
2376(NTAPI *NDIS_M_REQ_COMPLETE_HANDLER)(
2377  IN NDIS_HANDLE  MiniportAdapterHandle,
2378  IN NDIS_STATUS  Status);
2379
2380typedef VOID
2381(NTAPI *NDIS_M_RESET_COMPLETE_HANDLER)(
2382  IN NDIS_HANDLE  MiniportAdapterHandle,
2383  IN NDIS_STATUS  Status,
2384  IN BOOLEAN  AddressingReset);
2385
2386typedef VOID
2387(NTAPI *NDIS_M_SEND_COMPLETE_HANDLER)(
2388  IN NDIS_HANDLE  MiniportAdapterHandle,
2389  IN PNDIS_PACKET  Packet,
2390  IN NDIS_STATUS  Status);
2391
2392typedef VOID
2393(NTAPI *NDIS_M_SEND_RESOURCES_HANDLER)(
2394  IN NDIS_HANDLE  MiniportAdapterHandle);
2395
2396typedef BOOLEAN
2397(FASTCALL *NDIS_M_START_SENDS)(
2398  IN PNDIS_MINIPORT_BLOCK  Miniport);
2399
2400typedef VOID
2401(NTAPI *NDIS_M_STATUS_HANDLER)(
2402  IN NDIS_HANDLE  MiniportHandle,
2403  IN NDIS_STATUS  GeneralStatus,
2404  IN PVOID  StatusBuffer,
2405  IN UINT  StatusBufferSize);
2406
2407typedef VOID
2408(NTAPI *NDIS_M_STS_COMPLETE_HANDLER)(
2409  IN NDIS_HANDLE  MiniportAdapterHandle);
2410
2411typedef VOID
2412(NTAPI *NDIS_M_TD_COMPLETE_HANDLER)(
2413  IN NDIS_HANDLE  MiniportAdapterHandle,
2414  IN PNDIS_PACKET  Packet,
2415  IN NDIS_STATUS  Status,
2416  IN UINT  BytesTransferred);
2417
2418typedef VOID (NTAPI *NDIS_WM_SEND_COMPLETE_HANDLER)(
2419  IN NDIS_HANDLE  MiniportAdapterHandle,
2420  IN PVOID  Packet,
2421  IN NDIS_STATUS  Status);
2422
2423
2424#if ARCNET
2425
2426#define ARC_SEND_BUFFERS                  8
2427#define ARC_HEADER_SIZE                   4
2428
2429typedef struct _NDIS_ARC_BUF {
2430  NDIS_HANDLE  ArcnetBufferPool;
2431  PUCHAR  ArcnetLookaheadBuffer;
2432  UINT  NumFree;
2433  ARC_BUFFER_LIST ArcnetBuffers[ARC_SEND_BUFFERS];
2434} NDIS_ARC_BUF, *PNDIS_ARC_BUF;
2435
2436#endif /* ARCNET */
2437
2438typedef struct _NDIS_LOG {
2439  PNDIS_MINIPORT_BLOCK  Miniport;
2440  KSPIN_LOCK  LogLock;
2441  PIRP  Irp;
2442  UINT  TotalSize;
2443  UINT  CurrentSize;
2444  UINT  InPtr;
2445  UINT  OutPtr;
2446  UCHAR  LogBuf[1];
2447} NDIS_LOG, *PNDIS_LOG;
2448
2449#if ARCNET
2450#define FILTERDBS_ARCNET_S \
2451  PARC_FILTER  ArcDB;
2452#else /* !ARCNET */
2453#define FILTERDBS_ARCNET_S \
2454  PVOID  XXXDB;
2455#endif /* !ARCNET */
2456
2457#define FILTERDBS_S \
2458  _ANONYMOUS_UNION union { \
2459    PETH_FILTER  EthDB; \
2460    PNULL_FILTER  NullDB; \
2461  } DUMMYUNIONNAME; \
2462  PTR_FILTER  TrDB; \
2463  PFDDI_FILTER  FddiDB; \
2464  FILTERDBS_ARCNET_S
2465
2466typedef struct _FILTERDBS {
2467  FILTERDBS_S
2468} FILTERDBS, *PFILTERDBS;
2469
2470struct _NDIS_MINIPORT_BLOCK {
2471  NDIS_OBJECT_HEADER Header;
2472  PNDIS_MINIPORT_BLOCK  NextMiniport;
2473  PNDIS_M_DRIVER_BLOCK  DriverHandle;
2474  NDIS_HANDLE  MiniportAdapterContext;
2475  UNICODE_STRING  MiniportName;
2476  PNDIS_BIND_PATHS  BindPaths;
2477  NDIS_HANDLE  OpenQueue;
2478  REFERENCE  ShortRef;
2479  NDIS_HANDLE  DeviceContext;
2480  UCHAR  Padding1;
2481  UCHAR  LockAcquired;
2482  UCHAR  PmodeOpens;
2483  UCHAR  AssignedProcessor;
2484  KSPIN_LOCK  Lock;
2485  PNDIS_REQUEST  MediaRequest;
2486  PNDIS_MINIPORT_INTERRUPT  Interrupt;
2487  ULONG  Flags;
2488  ULONG  PnPFlags;
2489  LIST_ENTRY  PacketList;
2490  PNDIS_PACKET  FirstPendingPacket;
2491  PNDIS_PACKET  ReturnPacketsQueue;
2492  ULONG  RequestBuffer;
2493  PVOID  SetMCastBuffer;
2494  PNDIS_MINIPORT_BLOCK  PrimaryMiniport;
2495  PVOID  WrapperContext;
2496  PVOID  BusDataContext;
2497  ULONG  PnPCapabilities;
2498  PCM_RESOURCE_LIST  Resources;
2499  NDIS_TIMER  WakeUpDpcTimer;
2500  UNICODE_STRING  BaseName;
2501  UNICODE_STRING  SymbolicLinkName;
2502  ULONG  CheckForHangSeconds;
2503  USHORT  CFHangTicks;
2504  USHORT  CFHangCurrentTick;
2505  NDIS_STATUS  ResetStatus;
2506  NDIS_HANDLE  ResetOpen;
2507  FILTERDBS_S
2508  FILTER_PACKET_INDICATION_HANDLER  PacketIndicateHandler;
2509  NDIS_M_SEND_COMPLETE_HANDLER  SendCompleteHandler;
2510  NDIS_M_SEND_RESOURCES_HANDLER  SendResourcesHandler;
2511  NDIS_M_RESET_COMPLETE_HANDLER  ResetCompleteHandler;
2512  NDIS_MEDIUM  MediaType;
2513  ULONG  BusNumber;
2514  NDIS_INTERFACE_TYPE  BusType;
2515  NDIS_INTERFACE_TYPE  AdapterType;
2516  PDEVICE_OBJECT  DeviceObject;
2517  PDEVICE_OBJECT  PhysicalDeviceObject;
2518  PDEVICE_OBJECT  NextDeviceObject;
2519  PMAP_REGISTER_ENTRY  MapRegisters;
2520  PNDIS_AF_LIST  CallMgrAfList;
2521  PVOID  MiniportThread;
2522  PVOID  SetInfoBuf;
2523  USHORT  SetInfoBufLen;
2524  USHORT  MaxSendPackets;
2525  NDIS_STATUS  FakeStatus;
2526  PVOID  LockHandler;
2527  PUNICODE_STRING  pAdapterInstanceName;
2528  PNDIS_MINIPORT_TIMER  TimerQueue;
2529  UINT  MacOptions;
2530  PNDIS_REQUEST  PendingRequest;
2531  UINT  MaximumLongAddresses;
2532  UINT  MaximumShortAddresses;
2533  UINT  CurrentLookahead;
2534  UINT  MaximumLookahead;
2535  W_HANDLE_INTERRUPT_HANDLER  HandleInterruptHandler;
2536  W_DISABLE_INTERRUPT_HANDLER  DisableInterruptHandler;
2537  W_ENABLE_INTERRUPT_HANDLER  EnableInterruptHandler;
2538  W_SEND_PACKETS_HANDLER  SendPacketsHandler;
2539  NDIS_M_START_SENDS  DeferredSendHandler;
2540  ETH_RCV_INDICATE_HANDLER  EthRxIndicateHandler;
2541  TR_RCV_INDICATE_HANDLER  TrRxIndicateHandler;
2542  FDDI_RCV_INDICATE_HANDLER  FddiRxIndicateHandler;
2543  ETH_RCV_COMPLETE_HANDLER  EthRxCompleteHandler;
2544  TR_RCV_COMPLETE_HANDLER  TrRxCompleteHandler;
2545  FDDI_RCV_COMPLETE_HANDLER  FddiRxCompleteHandler;
2546  NDIS_M_STATUS_HANDLER  StatusHandler;
2547  NDIS_M_STS_COMPLETE_HANDLER  StatusCompleteHandler;
2548  NDIS_M_TD_COMPLETE_HANDLER  TDCompleteHandler;
2549  NDIS_M_REQ_COMPLETE_HANDLER  QueryCompleteHandler;
2550  NDIS_M_REQ_COMPLETE_HANDLER  SetCompleteHandler;
2551  NDIS_WM_SEND_COMPLETE_HANDLER  WanSendCompleteHandler;
2552  WAN_RCV_HANDLER  WanRcvHandler;
2553  WAN_RCV_COMPLETE_HANDLER  WanRcvCompleteHandler;
2554#if defined(NDIS_WRAPPER)
2555  PNDIS_MINIPORT_BLOCK  NextGlobalMiniport;
2556  SINGLE_LIST_ENTRY  WorkQueue[NUMBER_OF_WORK_ITEM_TYPES];
2557  SINGLE_LIST_ENTRY  SingleWorkItems[NUMBER_OF_SINGLE_WORK_ITEMS];
2558  UCHAR  SendFlags;
2559  UCHAR  TrResetRing;
2560  UCHAR  ArcnetAddress;
2561  UCHAR  XState;
2562  _ANONYMOUS_UNION union {
2563#if ARCNET
2564    PNDIS_ARC_BUF  ArcBuf;
2565#endif
2566    PVOID  BusInterface;
2567  } DUMMYUNIONNAME;
2568  PNDIS_LOG  Log;
2569  ULONG  SlotNumber;
2570  PCM_RESOURCE_LIST  AllocatedResources;
2571  PCM_RESOURCE_LIST  AllocatedResourcesTranslated;
2572  SINGLE_LIST_ENTRY  PatternList;
2573  NDIS_PNP_CAPABILITIES  PMCapabilities;
2574  DEVICE_CAPABILITIES  DeviceCaps;
2575  ULONG  WakeUpEnable;
2576  DEVICE_POWER_STATE  CurrentDevicePowerState;
2577  PIRP  pIrpWaitWake;
2578  SYSTEM_POWER_STATE  WaitWakeSystemState;
2579  LARGE_INTEGER  VcIndex;
2580  KSPIN_LOCK  VcCountLock;
2581  LIST_ENTRY  WmiEnabledVcs;
2582  PNDIS_GUID  pNdisGuidMap;
2583  PNDIS_GUID  pCustomGuidMap;
2584  USHORT  VcCount;
2585  USHORT  cNdisGuidMap;
2586  USHORT  cCustomGuidMap;
2587  USHORT  CurrentMapRegister;
2588  PKEVENT  AllocationEvent;
2589  USHORT  BaseMapRegistersNeeded;
2590  USHORT  SGMapRegistersNeeded;
2591  ULONG  MaximumPhysicalMapping;
2592  NDIS_TIMER  MediaDisconnectTimer;
2593  USHORT  MediaDisconnectTimeOut;
2594  USHORT  InstanceNumber;
2595  NDIS_EVENT  OpenReadyEvent;
2596  NDIS_PNP_DEVICE_STATE  PnPDeviceState;
2597  NDIS_PNP_DEVICE_STATE  OldPnPDeviceState;
2598  PGET_SET_DEVICE_DATA  SetBusData;
2599  PGET_SET_DEVICE_DATA  GetBusData;
2600  KDPC  DeferredDpc;
2601#if 0
2602  /* FIXME: */
2603  NDIS_STATS  NdisStats;
2604#else
2605  ULONG  NdisStats;
2606#endif
2607  PNDIS_PACKET  IndicatedPacket[MAXIMUM_PROCESSORS];
2608  PKEVENT  RemoveReadyEvent;
2609  PKEVENT  AllOpensClosedEvent;
2610  PKEVENT  AllRequestsCompletedEvent;
2611  ULONG  InitTimeMs;
2612  NDIS_MINIPORT_WORK_ITEM  WorkItemBuffer[NUMBER_OF_SINGLE_WORK_ITEMS];
2613  PDMA_ADAPTER  SystemAdapterObject;
2614  ULONG  DriverVerifyFlags;
2615  POID_LIST  OidList;
2616  USHORT  InternalResetCount;
2617  USHORT  MiniportResetCount;
2618  USHORT  MediaSenseConnectCount;
2619  USHORT  MediaSenseDisconnectCount;
2620  PNDIS_PACKET  *xPackets;
2621  ULONG  UserModeOpenReferences;
2622  _ANONYMOUS_UNION union {
2623    PVOID  SavedSendHandler;
2624    PVOID  SavedWanSendHandler;
2625  } DUMMYUNIONNAME2;
2626  PVOID  SavedSendPacketsHandler;
2627  PVOID  SavedCancelSendPacketsHandler;
2628  W_SEND_PACKETS_HANDLER  WSendPacketsHandler;
2629  ULONG  MiniportAttributes;
2630  PDMA_ADAPTER  SavedSystemAdapterObject;
2631  USHORT  NumOpens;
2632  USHORT  CFHangXTicks;
2633  ULONG  RequestCount;
2634  ULONG  IndicatedPacketsCount;
2635  ULONG  PhysicalMediumType;
2636  PNDIS_REQUEST  LastRequest;
2637  LONG  DmaAdapterRefCount;
2638  PVOID  FakeMac;
2639  ULONG  LockDbg;
2640  ULONG  LockDbgX;
2641  PVOID  LockThread;
2642  ULONG  InfoFlags;
2643  KSPIN_LOCK  TimerQueueLock;
2644  PKEVENT  ResetCompletedEvent;
2645  PKEVENT  QueuedBindingCompletedEvent;
2646  PKEVENT  DmaResourcesReleasedEvent;
2647  FILTER_PACKET_INDICATION_HANDLER  SavedPacketIndicateHandler;
2648  ULONG  RegisteredInterrupts;
2649  PNPAGED_LOOKASIDE_LIST  SGListLookasideList;
2650  ULONG  ScatterGatherListSize;
2651#endif /* _NDIS_ */
2652};
2653
2654#if NDIS_LEGACY_DRIVER
2655
2656typedef NDIS_STATUS
2657(NTAPI *WAN_SEND_HANDLER)(
2658  IN NDIS_HANDLE MacBindingHandle,
2659  IN NDIS_HANDLE LinkHandle,
2660  IN PVOID Packet);
2661
2662typedef VOID
2663(NTAPI *SEND_PACKETS_HANDLER)(
2664  IN NDIS_HANDLE MiniportAdapterContext,
2665  IN PPNDIS_PACKET PacketArray,
2666  IN UINT NumberOfPackets);
2667
2668typedef NDIS_STATUS
2669(NTAPI *SEND_HANDLER)(
2670  IN NDIS_HANDLE NdisBindingHandle,
2671  IN PNDIS_PACKET Packet);
2672
2673typedef NDIS_STATUS
2674(NTAPI *TRANSFER_DATA_HANDLER)(
2675  IN NDIS_HANDLE NdisBindingHandle,
2676  IN NDIS_HANDLE MacReceiveContext,
2677  IN UINT ByteOffset,
2678  IN UINT BytesToTransfer,
2679  OUT PNDIS_PACKET Packet,
2680  OUT PUINT BytesTransferred);
2681
2682typedef NDIS_STATUS
2683(NTAPI *RESET_HANDLER)(
2684  IN NDIS_HANDLE NdisBindingHandle);
2685
2686typedef NDIS_STATUS
2687(NTAPI *REQUEST_HANDLER)(
2688  IN NDIS_HANDLE NdisBindingHandle,
2689  IN PNDIS_REQUEST NdisRequest);
2690
2691#endif /* NDIS_LEGACY_DRIVER */
2692
2693#if defined(NDIS_WRAPPER)
2694#define NDIS_COMMON_OPEN_BLOCK_WRAPPER_S \
2695  ULONG Flags; \
2696  ULONG References; \
2697  KSPIN_LOCK SpinLock; \
2698  NDIS_HANDLE  FilterHandle; \
2699  ULONG  ProtocolOptions; \
2700  USHORT  CurrentLookahead; \
2701  USHORT  ConnectDampTicks; \
2702  USHORT  DisconnectDampTicks; \
2703  W_SEND_HANDLER  WSendHandler; \
2704  W_TRANSFER_DATA_HANDLER  WTransferDataHandler; \
2705  W_SEND_PACKETS_HANDLER  WSendPacketsHandler; \
2706  W_CANCEL_SEND_PACKETS_HANDLER  CancelSendPacketsHandler; \
2707  ULONG  WakeUpEnable; \
2708  PKEVENT  CloseCompleteEvent; \
2709  QUEUED_CLOSE  QC; \
2710  ULONG  AfReferences; \
2711  PNDIS_OPEN_BLOCK  NextGlobalOpen;
2712#else
2713#define NDIS_COMMON_OPEN_BLOCK_WRAPPER_S
2714#endif
2715
2716#define NDIS_COMMON_OPEN_BLOCK_S \
2717  PVOID  MacHandle; \
2718  NDIS_HANDLE  BindingHandle; \
2719  PNDIS_MINIPORT_BLOCK  MiniportHandle; \
2720  PNDIS_PROTOCOL_BLOCK  ProtocolHandle; \
2721  NDIS_HANDLE  ProtocolBindingContext; \
2722  PNDIS_OPEN_BLOCK  MiniportNextOpen; \
2723  PNDIS_OPEN_BLOCK  ProtocolNextOpen; \
2724  NDIS_HANDLE  MiniportAdapterContext; \
2725  BOOLEAN  Reserved1; \
2726  BOOLEAN  Reserved2; \
2727  BOOLEAN  Reserved3; \
2728  BOOLEAN  Reserved4; \
2729  PNDIS_STRING  BindDeviceName; \
2730  KSPIN_LOCK  Reserved5; \
2731  PNDIS_STRING  RootDeviceName; \
2732  _ANONYMOUS_UNION union { \
2733    SEND_HANDLER  SendHandler; \
2734    WAN_SEND_HANDLER  WanSendHandler; \
2735  } DUMMYUNIONNAME; \
2736  TRANSFER_DATA_HANDLER  TransferDataHandler; \
2737  SEND_COMPLETE_HANDLER  SendCompleteHandler; \
2738  TRANSFER_DATA_COMPLETE_HANDLER  TransferDataCompleteHandler; \
2739  RECEIVE_HANDLER  ReceiveHandler; \
2740  RECEIVE_COMPLETE_HANDLER  ReceiveCompleteHandler; \
2741  WAN_RECEIVE_HANDLER  WanReceiveHandler; \
2742  REQUEST_COMPLETE_HANDLER  RequestCompleteHandler; \
2743  RECEIVE_PACKET_HANDLER  ReceivePacketHandler; \
2744  SEND_PACKETS_HANDLER  SendPacketsHandler; \
2745  RESET_HANDLER  ResetHandler; \
2746  REQUEST_HANDLER  RequestHandler; \
2747  RESET_COMPLETE_HANDLER  ResetCompleteHandler; \
2748  STATUS_HANDLER  StatusHandler; \
2749  STATUS_COMPLETE_HANDLER  StatusCompleteHandler; \
2750  NDIS_COMMON_OPEN_BLOCK_WRAPPER_S
2751
2752typedef struct _NDIS_COMMON_OPEN_BLOCK {
2753  NDIS_COMMON_OPEN_BLOCK_S
2754} NDIS_COMMON_OPEN_BLOCK;
2755
2756struct _NDIS_OPEN_BLOCK
2757{
2758#ifdef __cplusplus
2759  NDIS_COMMON_OPEN_BLOCK NdisCommonOpenBlock;
2760#else
2761  NDIS_COMMON_OPEN_BLOCK_S
2762#endif
2763};
2764
2765#include <xfilter.h>
2766
2767#define NDIS_M_MAX_LOOKAHEAD           526
2768
2769NDISAPI
2770VOID
2771NTAPI
2772NdisInitializeTimer(
2773  PNDIS_TIMER Timer,
2774  PNDIS_TIMER_FUNCTION TimerFunction,
2775  PVOID FunctionContext);
2776
2777NDISAPI
2778VOID
2779NTAPI
2780NdisCancelTimer(
2781  PNDIS_TIMER Timer,
2782  PBOOLEAN TimerCancelled);
2783
2784NDISAPI
2785VOID
2786NTAPI
2787NdisSetTimer(
2788  PNDIS_TIMER Timer,
2789  UINT MillisecondsToDelay);
2790
2791NDISAPI
2792VOID
2793NTAPI
2794NdisSetPeriodicTimer(
2795  PNDIS_TIMER NdisTimer,
2796  UINT MillisecondsPeriod);
2797
2798NDISAPI
2799VOID
2800NTAPI
2801NdisSetTimerEx(
2802  PNDIS_TIMER NdisTimer,
2803  UINT MillisecondsToDelay,
2804  PVOID FunctionContext);
2805
2806NDISAPI
2807PVOID
2808NTAPI
2809NdisGetRoutineAddress(
2810  PNDIS_STRING NdisRoutineName);
2811
2812NDISAPI
2813UINT
2814NTAPI
2815NdisGetVersion(VOID);
2816
2817#if NDIS_LEGACY_DRIVER
2818
2819NDISAPI
2820VOID
2821NTAPI
2822NdisAllocateBuffer(
2823  OUT PNDIS_STATUS Status,
2824  OUT PNDIS_BUFFER *Buffer,
2825  IN NDIS_HANDLE PoolHandle OPTIONAL,
2826  IN PVOID VirtualAddress,
2827  IN UINT Length);
2828
2829NDISAPI
2830VOID
2831NTAPI
2832NdisAllocateBufferPool(
2833  OUT PNDIS_STATUS Status,
2834  OUT PNDIS_HANDLE PoolHandle,
2835  IN UINT NumberOfDescriptors);
2836
2837NDISAPI
2838VOID
2839NTAPI
2840NdisFreeBufferPool(
2841  IN NDIS_HANDLE PoolHandle);
2842
2843/*
2844NDISAPI
2845VOID
2846NTAPI
2847NdisFreeBuffer(
2848  IN PNDIS_BUFFER Buffer);
2849*/
2850#define NdisFreeBuffer IoFreeMdl
2851
2852NDISAPI
2853VOID
2854NTAPI
2855NdisAllocatePacketPool(
2856  OUT PNDIS_STATUS Status,
2857  OUT PNDIS_HANDLE PoolHandle,
2858  IN UINT NumberOfDescriptors,
2859  IN UINT ProtocolReservedLength);
2860
2861NDISAPI
2862VOID
2863NTAPI
2864NdisAllocatePacketPoolEx(
2865  OUT PNDIS_STATUS Status,
2866  OUT PNDIS_HANDLE PoolHandle,
2867  IN UINT NumberOfDescriptors,
2868  IN UINT NumberOfOverflowDescriptors,
2869  IN UINT ProtocolReservedLength);
2870
2871NDISAPI
2872VOID
2873NTAPI
2874NdisSetPacketPoolProtocolId(
2875  IN NDIS_HANDLE PacketPoolHandle,
2876  IN UINT ProtocolId);
2877
2878NDISAPI
2879UINT
2880NTAPI
2881NdisPacketPoolUsage(
2882  IN NDIS_HANDLE PoolHandle);
2883
2884NDISAPI
2885UINT
2886NTAPI
2887NdisPacketSize(
2888  IN UINT ProtocolReservedSize);
2889
2890NDISAPI
2891NDIS_HANDLE
2892NTAPI
2893NdisGetPoolFromPacket(
2894  IN PNDIS_PACKET Packet);
2895
2896NDISAPI
2897PNDIS_PACKET_STACK
2898NTAPI
2899NdisIMGetCurrentPacketStack(
2900  IN PNDIS_PACKET Packet,
2901  OUT BOOLEAN * StacksRemaining);
2902
2903NDISAPI
2904VOID
2905NTAPI
2906NdisFreePacketPool(
2907  IN NDIS_HANDLE PoolHandle);
2908
2909NDISAPI
2910VOID
2911NTAPI
2912NdisFreePacket(
2913  IN PNDIS_PACKET Packet);
2914
2915NDISAPI
2916VOID
2917NTAPI
2918NdisDprFreePacket(
2919  IN PNDIS_PACKET Packet);
2920
2921NDISAPI
2922VOID
2923NTAPI
2924NdisDprFreePacketNonInterlocked(
2925  IN PNDIS_PACKET Packet);
2926
2927NDISAPI
2928VOID
2929NTAPI
2930NdisAllocatePacket(
2931  OUT PNDIS_STATUS Status,
2932  OUT PNDIS_PACKET *Packet,
2933  IN NDIS_HANDLE PoolHandle);
2934
2935NDISAPI
2936VOID
2937NTAPI
2938NdisDprAllocatePacket(
2939  OUT PNDIS_STATUS Status,
2940  OUT PNDIS_PACKET *Packet,
2941  IN NDIS_HANDLE PoolHandle);
2942
2943NDISAPI
2944VOID
2945NTAPI
2946NdisDprAllocatePacketNonInterlocked(
2947  OUT PNDIS_STATUS Status,
2948  OUT PNDIS_PACKET *Packet,
2949  IN NDIS_HANDLE PoolHandle);
2950
2951/*
2952 * VOID
2953 * NdisReinitializePacket(
2954 *   IN OUT  PNDIS_PACKET  Packet);
2955 */
2956#define NdisReinitializePacket(Packet) {        \
2957  (Packet)->Private.Head = (PNDIS_BUFFER)NULL;  \
2958  (Packet)->Private.ValidCounts = FALSE;        \
2959}
2960
2961/*
2962NDISAPI
2963VOID
2964NTAPI
2965NdisQueryBuffer(
2966  IN PNDIS_BUFFER Buffer,
2967  OUT PVOID *VirtualAddress OPTIONAL,
2968  OUT PUINT Length);
2969*/
2970#define NdisQueryBuffer(_Buffer, _VirtualAddress, _Length) {         \
2971  if (ARGUMENT_PRESENT(_VirtualAddress)) {                           \
2972    *(PVOID *)(_VirtualAddress) = MmGetSystemAddressForMdl(_Buffer); \
2973  }                                                                  \
2974  *(_Length) = MmGetMdlByteCount(_Buffer);                           \
2975}
2976
2977NDISAPI
2978VOID
2979NTAPI
2980NdisGetFirstBufferFromPacket(
2981  IN PNDIS_PACKET _Packet,
2982  OUT PNDIS_BUFFER *_FirstBuffer,
2983  OUT PVOID *_FirstBufferVA,
2984  OUT PUINT _FirstBufferLength,
2985  OUT PUINT _TotalBufferLength);
2986
2987/*
2988 * VOID
2989 * NdisGetFirstBufferFromPacketSafe(
2990 * IN PNDIS_PACKET _Packet,
2991 * OUT PNDIS_BUFFER * _FirstBuffer,
2992 * OUT PVOID * _FirstBufferVA,
2993 * OUT PUINT _FirstBufferLength,
2994 * OUT PUINT _TotalBufferLength),
2995 * IN MM_PAGE_PRIORITY _Priority)
2996 */
2997#define NdisGetFirstBufferFromPacketSafe(_Packet,                             \
2998                                     _FirstBuffer,                            \
2999                                     _FirstBufferVA,                          \
3000                                     _FirstBufferLength,                      \
3001                                     _TotalBufferLength,                      \
3002                                     _Priority)                               \
3003{                                                                             \
3004  PNDIS_BUFFER _Buffer;                                                       \
3005                                                                              \
3006  _Buffer         = (_Packet)->Private.Head;                                  \
3007  *(_FirstBuffer) = _Buffer;                                                  \
3008  if (_Buffer != NULL) {                                                      \
3009    *(_FirstBufferVA)     = MmGetSystemAddressForMdlSafe(_Buffer, _Priority); \
3010    *(_FirstBufferLength) = MmGetMdlByteCount(_Buffer);                       \
3011    _Buffer = _Buffer->Next;                                                  \
3012    *(_TotalBufferLength) = *(_FirstBufferLength);                            \
3013    while (_Buffer != NULL) {                                                 \
3014      *(_TotalBufferLength) += MmGetMdlByteCount(_Buffer);                    \
3015      _Buffer = _Buffer->Next;                                                \
3016    }                                                                         \
3017  }                                                                           \
3018  else {                                                                      \
3019    *(_FirstBufferVA) = 0;                                                    \
3020    *(_FirstBufferLength) = 0;                                                \
3021    *(_TotalBufferLength) = 0;                                                \
3022  }                                                                           \
3023}
3024
3025/*
3026 * VOID
3027 * NdisRecalculatePacketCounts(
3028 *   IN OUT PNDIS_PACKET Packet);
3029 */
3030#define NdisRecalculatePacketCounts(Packet) {     \
3031  PNDIS_BUFFER _Buffer = (Packet)->Private.Head;  \
3032  if (_Buffer != NULL) {                          \
3033    while (_Buffer->Next != NULL) {               \
3034      _Buffer = _Buffer->Next;                    \
3035    }                                             \
3036    (Packet)->Private.Tail = _Buffer;             \
3037  }                                               \
3038  (Packet)->Private.ValidCounts = FALSE;          \
3039}
3040
3041/*
3042 * VOID
3043 * NdisChainBufferAtFront(
3044 *   IN OUT PNDIS_PACKET Packet,
3045 *   IN OUT PNDIS_BUFFER Buffer)
3046 */
3047#define NdisChainBufferAtFront(Packet,        \
3048                               Buffer)        \
3049{                                             \
3050  PNDIS_BUFFER _NdisBuffer = (Buffer);        \
3051                                              \
3052  while (_NdisBuffer->Next != NULL)           \
3053    _NdisBuffer = _NdisBuffer->Next;          \
3054                                              \
3055  if ((Packet)->Private.Head == NULL)         \
3056    (Packet)->Private.Tail = _NdisBuffer;     \
3057                                              \
3058  _NdisBuffer->Next = (Packet)->Private.Head; \
3059  (Packet)->Private.Head = (Buffer);          \
3060  (Packet)->Private.ValidCounts = FALSE;      \
3061}
3062
3063/*
3064 * VOID
3065 * NdisChainBufferAtBack(
3066 *   IN OUT PNDIS_PACKET Packet,
3067 *   IN OUT PNDIS_BUFFER Buffer)
3068 */
3069#define NdisChainBufferAtBack(Packet,           \
3070                              Buffer)           \
3071{                                               \
3072  PNDIS_BUFFER _NdisBuffer = (Buffer);          \
3073                                                \
3074  while (_NdisBuffer->Next != NULL)             \
3075    _NdisBuffer = _NdisBuffer->Next;            \
3076                                                \
3077  _NdisBuffer->Next = NULL;                     \
3078                                                \
3079  if ((Packet)->Private.Head != NULL)           \
3080    (Packet)->Private.Tail->Next = (Buffer);    \
3081  else                                          \
3082    (Packet)->Private.Head = (Buffer);          \
3083                                                \
3084  (Packet)->Private.Tail = _NdisBuffer;         \
3085  (Packet)->Private.ValidCounts = FALSE;        \
3086}
3087
3088NDISAPI
3089VOID
3090NTAPI
3091NdisUnchainBufferAtFront(
3092  IN OUT PNDIS_PACKET Packet,
3093  OUT PNDIS_BUFFER *Buffer);
3094
3095NDISAPI
3096VOID
3097NTAPI
3098NdisUnchainBufferAtBack(
3099  IN OUT PNDIS_PACKET Packet,
3100  OUT PNDIS_BUFFER *Buffer);
3101
3102NDISAPI
3103VOID
3104NTAPI
3105NdisCopyFromPacketToPacket(
3106  IN PNDIS_PACKET Destination,
3107  IN UINT DestinationOffset,
3108  IN UINT BytesToCopy,
3109  IN PNDIS_PACKET Source,
3110  IN UINT SourceOffset,
3111  OUT PUINT BytesCopied);
3112
3113NDISAPI
3114VOID
3115NTAPI
3116NdisCopyFromPacketToPacketSafe(
3117  IN PNDIS_PACKET Destination,
3118  IN UINT DestinationOffset,
3119  IN UINT BytesToCopy,
3120  IN PNDIS_PACKET Source,
3121  IN UINT SourceOffset,
3122  OUT PUINT BytesCopied,
3123  IN MM_PAGE_PRIORITY Priority);
3124
3125NDISAPI
3126NDIS_STATUS
3127NTAPI
3128NdisAllocateMemory(
3129  OUT PVOID *VirtualAddress,
3130  IN UINT Length,
3131  IN UINT MemoryFlags,
3132  IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress);
3133
3134#define NdisInitializeWorkItem(_WI_, _R_, _C_) { \
3135  (_WI_)->Context = _C_;                         \
3136  (_WI_)->Routine = _R_;                         \
3137}
3138
3139NDISAPI
3140NDIS_STATUS
3141NTAPI
3142NdisScheduleWorkItem(
3143  IN PNDIS_WORK_ITEM WorkItem);
3144
3145NDISAPI
3146VOID
3147NTAPI
3148NdisSetPacketStatus(
3149  IN PNDIS_PACKET Packet,
3150  IN NDIS_STATUS Status,
3151  IN NDIS_HANDLE Handle,
3152  IN ULONG Code);
3153
3154#endif /* NDIS_LEGACY_DRIVER */
3155
3156NDISAPI
3157VOID
3158NTAPI
3159NdisOpenFile(
3160  OUT PNDIS_STATUS Status,
3161  OUT PNDIS_HANDLE FileHandle,
3162  OUT PUINT FileLength,
3163  IN PNDIS_STRING FileName,
3164  IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress);
3165
3166NDISAPI
3167VOID
3168NTAPI
3169NdisCloseFile(
3170  IN NDIS_HANDLE FileHandle);
3171
3172NDISAPI
3173VOID
3174NTAPI
3175NdisMapFile(
3176  OUT PNDIS_STATUS Status,
3177  OUT PVOID *MappedBuffer,
3178  IN NDIS_HANDLE FileHandle);
3179
3180NDISAPI
3181VOID
3182NTAPI
3183NdisUnmapFile(
3184  IN NDIS_HANDLE FileHandle);
3185
3186NDISAPI
3187ULONG
3188NTAPI
3189NdisGetSharedDataAlignment(VOID);
3190
3191#define NdisFlushBuffer(Buffer,WriteToDevice) \
3192  KeFlushIoBuffers((Buffer),!(WriteToDevice), TRUE)
3193
3194NDISAPI
3195VOID
3196NTAPI
3197NdisCopyBuffer(
3198  OUT PNDIS_STATUS Status,
3199  OUT PNDIS_BUFFER *Buffer,
3200  IN NDIS_HANDLE PoolHandle,
3201  IN PVOID MemoryDescriptor,
3202  IN UINT Offset,
3203  IN UINT Length);
3204
3205/*
3206 * VOID
3207 * NdisCopyLookaheadData(
3208 *   IN PVOID Destination,
3209 *   IN PVOID Source,
3210 *   IN ULONG Length,
3211 *   IN ULONG ReceiveFlags);
3212 */
3213
3214#if defined(_M_IX86) || defined(_M_AMD64)
3215#define NdisCopyLookaheadData(Destination, Source, Length, MacOptions) \
3216  RtlCopyMemory(Destination, Source, Length)
3217#else
3218#define NdisCopyLookaheadData(Destination, Source, Length, MacOptions) \
3219  { \
3220    if ((MacOptions) & NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA) \
3221    { \
3222      RtlCopyMemory(_Destination, _Source, _Length); \
3223    } \
3224    else \
3225    { \
3226      PUCHAR _Src = (PUCHAR)(Source); \
3227      PUCHAR _Dest = (PUCHAR)(Destination); \
3228      PUCHAR _End = _Dest + (Length); \
3229      while (_Dest < _End) \
3230        *_Dest++ = *_Src++; \
3231    } \
3232  }
3233#endif
3234
3235/*
3236NDISAPI
3237VOID
3238NTAPI
3239NdisAdjustBufferLength(
3240  IN PNDIS_BUFFER Buffer,
3241  IN UINT Length);
3242*/
3243#define NdisAdjustBufferLength(Buffer, Length) \
3244  (((Buffer)->ByteCount) = (Length))
3245
3246#if NDIS_SUPPORT_NDIS6
3247#define NdisAdjustMdlLength(_Mdl, _Length) \
3248  (((_Mdl)->ByteCount) = (_Length))
3249#endif
3250
3251/*
3252NDISAPI
3253ULONG
3254NTAPI
3255NdisBufferLength(
3256  IN PNDIS_BUFFER Buffer);
3257*/
3258#define NdisBufferLength MmGetMdlByteCount
3259
3260/*
3261NDISAPI
3262PVOID
3263NTAPI
3264NdisBufferVirtualAddress(
3265  IN PNDIS_BUFFER Buffer);
3266*/
3267#define NdisBufferVirtualAddress MmGetSystemAddressForMdl
3268
3269#define NdisBufferVirtualAddressSafe MmGetSystemAddressForMdlSafe
3270
3271NDISAPI
3272ULONG
3273NTAPI
3274NDIS_BUFFER_TO_SPAN_PAGES(
3275  IN PNDIS_BUFFER Buffer);
3276
3277/*
3278NDISAPI
3279VOID
3280NTAPI
3281NdisGetBufferPhysicalArraySize(
3282  IN PNDIS_BUFFER Buffer,
3283  OUT PUINT ArraySize);
3284*/
3285#define NdisGetBufferPhysicalArraySize(Buffer, ArraySize) \
3286  (*(ArraySize) = NDIS_BUFFER_TO_SPAN_PAGES(Buffer))
3287
3288/*
3289NDISAPI
3290VOID
3291NTAPI
3292NdisQueryBufferOffset(
3293  IN PNDIS_BUFFER Buffer,
3294  OUT PUINT Offset,
3295  OUT PUINT Length);
3296*/
3297#define NdisQueryBufferOffset(_Buffer, _Offset, _Length) { \
3298  *(_Offset) = MmGetMdlByteOffset(_Buffer);                \
3299  *(_Length) = MmGetMdlByteCount(_Buffer);                 \
3300}
3301
3302/*
3303 * PVOID
3304 * NDIS_BUFFER_LINKAGE(
3305 *   IN PNDIS_BUFFER Buffer);
3306 */
3307#define NDIS_BUFFER_LINKAGE(Buffer) (Buffer)->Next
3308
3309/*
3310 * VOID
3311 * NdisGetNextBuffer(
3312 *   IN PNDIS_BUFFER CurrentBuffer,
3313 *   OUT PNDIS_BUFFER * NextBuffer)
3314 */
3315#define NdisGetNextBuffer(CurrentBuffer,  \
3316                          NextBuffer)     \
3317{                                         \
3318  *(NextBuffer) = (CurrentBuffer)->Next;  \
3319}
3320
3321#if NDIS_LEGACY_DRIVER
3322
3323#define NDIS_PACKET_FIRST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Head)
3324#define NDIS_PACKET_LAST_NDIS_BUFFER(_Packet) ((_Packet)->Private.Tail)
3325#define NDIS_PACKET_VALID_COUNTS(_Packet) ((_Packet)->Private.ValidCounts)
3326
3327/*
3328 * UINT
3329 * NdisGetPacketFlags(
3330 *   IN PNDIS_PACKET  Packet);
3331 */
3332#define NdisGetPacketFlags(Packet) (Packet)->Private.Flags
3333
3334/*
3335 * ULONG
3336 * NDIS_GET_PACKET_PROTOCOL_TYPE(
3337 *   IN PNDIS_PACKET Packet);
3338 */
3339#define NDIS_GET_PACKET_PROTOCOL_TYPE(_Packet) \
3340  ((_Packet)->Private.Flags & NDIS_PROTOCOL_ID_MASK)
3341
3342/*
3343 * PNDIS_PACKET_OOB_DATA
3344 * NDIS_OOB_DATA_FROM_PACKET(
3345 *   IN PNDIS_PACKET Packet);
3346 */
3347#define NDIS_OOB_DATA_FROM_PACKET(_Packet)    \
3348  (PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
3349  (_Packet)->Private.NdisPacketOobOffset)
3350
3351/*
3352 * ULONG
3353 * NDIS_GET_PACKET_HEADER_SIZE(
3354 *   IN PNDIS_PACKET Packet);
3355 */
3356#define NDIS_GET_PACKET_HEADER_SIZE(_Packet)   \
3357  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
3358  (_Packet)->Private.NdisPacketOobOffset))->HeaderSize
3359
3360/*
3361 * NDIS_STATUS
3362 * NDIS_GET_PACKET_STATUS(
3363 *   IN PNDIS_PACKET Packet);
3364 */
3365#define NDIS_GET_PACKET_STATUS(_Packet)        \
3366  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) + \
3367  (_Packet)->Private.NdisPacketOobOffset))->Status
3368
3369/*
3370 * ULONGLONG
3371 * NDIS_GET_PACKET_TIME_TO_SEND(
3372 *   IN PNDIS_PACKET Packet);
3373 */
3374#define NDIS_GET_PACKET_TIME_TO_SEND(_Packet)   \
3375  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +  \
3376  (_Packet)->Private.NdisPacketOobOffset))->TimeToSend
3377
3378/*
3379 * ULONGLONG
3380 * NDIS_GET_PACKET_TIME_SENT(
3381 *   IN PNDIS_PACKET Packet);
3382 */
3383#define NDIS_GET_PACKET_TIME_SENT(_Packet)      \
3384  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +  \
3385  (_Packet)->Private.NdisPacketOobOffset))->TimeSent
3386
3387/*
3388 * ULONGLONG
3389 * NDIS_GET_PACKET_TIME_RECEIVED(
3390 *   IN PNDIS_PACKET Packet);
3391 */
3392#define NDIS_GET_PACKET_TIME_RECEIVED(_Packet)  \
3393  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +  \
3394  (_Packet)->Private.NdisPacketOobOffset))->TimeReceived
3395
3396/*
3397 * VOID
3398 * NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(
3399 *   IN PNDIS_PACKET Packet,
3400 *   IN PPVOID pMediaSpecificInfo,
3401 *   IN PUINT pSizeMediaSpecificInfo);
3402 */
3403#define NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(_Packet,                                  \
3404                                            _pMediaSpecificInfo,                      \
3405                                            _pSizeMediaSpecificInfo)                  \
3406{                                                                                     \
3407  if (!((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS) ||            \
3408      !((_Packet)->Private.NdisPacketFlags & fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO))   \
3409    {                                                                                 \
3410      *(_pMediaSpecificInfo) = NULL;                                                  \
3411      *(_pSizeMediaSpecificInfo) = 0;                                                 \
3412    }                                                                                 \
3413  else                                                                                \
3414    {                                                                                 \
3415      *(_pMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +           \
3416        (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation;           \
3417      *(_pSizeMediaSpecificInfo) = ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +       \
3418        (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo;              \
3419    }                                                                                 \
3420}
3421
3422/*
3423 * VOID
3424 * NDIS_SET_PACKET_HEADER_SIZE(
3425 *   IN PNDIS_PACKET Packet,
3426 *   IN UINT HdrSize);
3427 */
3428#define NDIS_SET_PACKET_HEADER_SIZE(_Packet, _HdrSize)              \
3429  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +                      \
3430  (_Packet)->Private.NdisPacketOobOffset))->HeaderSize = (_HdrSize)
3431
3432/*
3433 * VOID
3434 * NDIS_SET_PACKET_STATUS(
3435 *   IN PNDIS_PACKET Packet,
3436 *   IN NDIS_STATUS Status);
3437 */
3438#define NDIS_SET_PACKET_STATUS(_Packet, _Status)  \
3439  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +    \
3440  (_Packet)->Private.NdisPacketOobOffset))->Status = (_Status)
3441
3442/*
3443 * VOID
3444 * NDIS_SET_PACKET_TIME_TO_SEND(
3445 *   IN PNDIS_PACKET Packet,
3446 *   IN ULONGLONG TimeToSend);
3447 */
3448#define NDIS_SET_PACKET_TIME_TO_SEND(_Packet, _TimeToSend)  \
3449  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +              \
3450  (_Packet)->Private.NdisPacketOobOffset))->TimeToSend = (_TimeToSend)
3451
3452/*
3453 * VOID
3454 * NDIS_SET_PACKET_TIME_SENT(
3455 *   IN PNDIS_PACKET Packet,
3456 *   IN ULONGLONG TimeSent);
3457 */
3458#define NDIS_SET_PACKET_TIME_SENT(_Packet, _TimeSent) \
3459  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +        \
3460  (_Packet)->Private.NdisPacketOobOffset))->TimeSent = (_TimeSent)
3461
3462/*
3463 * VOID
3464 * NDIS_SET_PACKET_TIME_RECEIVED(
3465 *   IN PNDIS_PACKET Packet,
3466 *   IN ULONGLONG TimeReceived);
3467 */
3468#define NDIS_SET_PACKET_TIME_RECEIVED(_Packet, _TimeReceived) \
3469  ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +                \
3470  (_Packet)->Private.NdisPacketOobOffset))->TimeReceived = (_TimeReceived)
3471
3472/*
3473 * VOID
3474 * NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(
3475 *   IN PNDIS_PACKET Packet,
3476 *   IN PVOID MediaSpecificInfo,
3477 *   IN UINT SizeMediaSpecificInfo);
3478 */
3479#define NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(_Packet,                      \
3480                                            _MediaSpecificInfo,           \
3481                                            _SizeMediaSpecificInfo)       \
3482{                                                                         \
3483  if ((_Packet)->Private.NdisPacketFlags & fPACKET_ALLOCATED_BY_NDIS)     \
3484    {                                                                     \
3485      (_Packet)->Private.NdisPacketFlags |= fPACKET_CONTAINS_MEDIA_SPECIFIC_INFO; \
3486      ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +                        \
3487        (_Packet)->Private.NdisPacketOobOffset))->MediaSpecificInformation = \
3488          (_MediaSpecificInfo);                                           \
3489      ((PNDIS_PACKET_OOB_DATA)((PUCHAR)(_Packet) +                        \
3490        (_Packet)->Private.NdisPacketOobOffset))->SizeMediaSpecificInfo = \
3491          (_SizeMediaSpecificInfo);                                       \
3492    }                                                                     \
3493}
3494
3495/*
3496 * VOID
3497 * NdisSetPacketFlags(
3498 *   IN PNDIS_PACKET  Packet,
3499 *   IN UINT  Flags);
3500 */
3501#define NdisSetPacketFlags(Packet, Flags) (Packet)->Private.Flags |= (Flags)
3502
3503/*
3504 * VOID
3505 * NdisClearPacketFlags(
3506 *   IN PNDIS_PACKET  Packet,
3507 *   IN UINT  Flags);
3508 */
3509#define NdisClearPacketFlags(Packet, Flags) (Packet)->Private.Flags &= ~(Flags)
3510
3511/*
3512 * VOID
3513 * NdisQueryPacket(
3514 *   IN PNDIS_PACKET Packet,
3515 *   OUT PUINT PhysicalBufferCount OPTIONAL,
3516 *   OUT PUINT BufferCount OPTIONAL,
3517 *   OUT PNDIS_BUFFER *FirstBuffer OPTIONAL,
3518 *   OUT PUINT TotalPacketLength OPTIONAL);
3519 */
3520static __inline
3521VOID
3522NdisQueryPacket(
3523  IN PNDIS_PACKET Packet,
3524  OUT PUINT PhysicalBufferCount OPTIONAL,
3525  OUT PUINT BufferCount OPTIONAL,
3526  OUT PNDIS_BUFFER *FirstBuffer OPTIONAL,
3527  OUT PUINT TotalPacketLength OPTIONAL)
3528{
3529  if (FirstBuffer)
3530    *FirstBuffer = Packet->Private.Head;
3531  if (TotalPacketLength || BufferCount || PhysicalBufferCount) {
3532    if (!Packet->Private.ValidCounts) {
3533      UINT Offset;
3534      UINT PacketLength;
3535      PNDIS_BUFFER NdisBuffer;
3536      UINT PhysicalBufferCount = 0;
3537      UINT TotalPacketLength = 0;
3538      UINT Count = 0;
3539
3540      for (NdisBuffer = Packet->Private.Head;
3541           NdisBuffer != (PNDIS_BUFFER)NULL;
3542           NdisBuffer = NdisBuffer->Next) {
3543        PhysicalBufferCount += NDIS_BUFFER_TO_SPAN_PAGES(NdisBuffer);
3544        NdisQueryBufferOffset(NdisBuffer, &Offset, &PacketLength);
3545        TotalPacketLength += PacketLength;
3546        Count++;
3547      }
3548      Packet->Private.PhysicalCount = PhysicalBufferCount;
3549      Packet->Private.TotalLength = TotalPacketLength;
3550      Packet->Private.Count = Count;
3551      Packet->Private.ValidCounts = TRUE;
3552    }
3553
3554    if (PhysicalBufferCount)
3555      *PhysicalBufferCount = Packet->Private.PhysicalCount;
3556
3557    if (BufferCount)
3558      *BufferCount = Packet->Private.Count;
3559
3560    if (TotalPacketLength)
3561      *TotalPacketLength = Packet->Private.TotalLength;
3562  }
3563}
3564
3565/*
3566 * VOID
3567 * NdisQueryPacketLength(
3568 *   IN PNDIS_PACKET Packet,
3569 *   OUT PUINT PhysicalBufferCount OPTIONAL,
3570 *   OUT PUINT BufferCount OPTIONAL,
3571 *   OUT PNDIS_BUFFER *FirstBuffer OPTIONAL,
3572 *   OUT PUINT TotalPacketLength OPTIONAL);
3573 */
3574#define NdisQueryPacketLength(_Packet,                              \
3575                              _TotalPacketLength)                   \
3576{                                                                   \
3577  if (!(_Packet)->Private.ValidCounts) {                            \
3578    NdisQueryPacket(_Packet, NULL, NULL, NULL, _TotalPacketLength); \
3579  }                                                                 \
3580  else *(_TotalPacketLength) = (_Packet)->Private.TotalLength;      \
3581}
3582
3583#endif /* NDIS_LEGACY_DRIVER */
3584
3585/* Memory management routines */
3586
3587/*
3588NDISAPI
3589VOID
3590NTAPI
3591NdisCreateLookaheadBufferFromSharedMemory(
3592  IN PVOID pSharedMemory,
3593  IN UINT LookaheadLength,
3594  OUT PVOID *pLookaheadBuffer);
3595*/
3596#define NdisCreateLookaheadBufferFromSharedMemory(_S, _L, _B) ((*(_B)) = (_S))
3597
3598NDISAPI
3599VOID
3600NTAPI
3601NdisDestroyLookaheadBufferFromSharedMemory(
3602  IN PVOID pLookaheadBuffer);
3603
3604#if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_ARM) || defined(_M_PPC)
3605
3606/*
3607 * VOID
3608 * NdisMoveMappedMemory(
3609 *   OUT PVOID  Destination,
3610 *   IN PVOID  Source,
3611 *   IN ULONG  Length);
3612 */
3613#define NdisMoveMappedMemory(Destination, Source, Length) \
3614  RtlCopyMemory(Destination, Source, Length)
3615
3616/*
3617 * VOID
3618 * NdisZeroMappedMemory(
3619 *   IN PVOID  Destination,
3620 *   IN ULONG  Length);
3621 */
3622#define NdisZeroMappedMemory(Destination, Length) \
3623  RtlZeroMemory(Destination, Length)
3624
3625#else
3626
3627#define NdisMoveMappedMemory(Destination, Source, Length) \
3628{ \
3629  PUCHAR _Dest = Destination, _Src = Source, _End = _Dest + Length; \
3630  while (_Dest < _End) \
3631    *_Dest++ = _Src++; \
3632}
3633
3634#define NdisZeroMappedMemory(Destination, Length) \
3635{ \
3636  PUCHAR _Dest = Destination, _End = _Dest + Length; \
3637  while (_Dest < _End) \
3638    *_Dest++ = 0; \
3639}
3640
3641#endif /* _M_IX86 or _M_AMD64 */
3642
3643/*
3644 * VOID
3645 * NdisMoveFromMappedMemory(
3646 *   OUT PVOID  Destination,
3647 *   IN PVOID  Source,
3648 *   IN ULONG  Length);
3649 */
3650#define NdisMoveFromMappedMemory(Destination, Source, Length) \
3651  NdisMoveMappedMemory(Destination, Source, Length)
3652
3653/*
3654 * VOID
3655 * NdisMoveToMappedMemory(
3656 *   OUT PVOID  Destination,
3657 *   IN PVOID  Source,
3658 *   IN ULONG  Length);
3659 */
3660#define NdisMoveToMappedMemory(Destination, Source, Length) \
3661  NdisMoveMappedMemory(Destination, Source, Length)
3662
3663/*
3664 * VOID
3665 * NdisMUpdateSharedMemory(
3666 *   IN NDIS_HANDLE  MiniportAdapterHandle,
3667 *   IN ULONG  Length,
3668 *   IN PVOID  VirtualAddress,
3669 *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);
3670 */
3671#define NdisMUpdateSharedMemory(_H, _L, _V, _P) \
3672  NdisUpdateSharedMemory(_H, _L, _V, _P)
3673
3674NDISAPI
3675VOID
3676NTAPI
3677NdisFreeMemory(
3678  IN PVOID VirtualAddress,
3679  IN UINT Length,
3680  IN UINT MemoryFlags);
3681
3682NDISAPI
3683VOID
3684NTAPI
3685NdisFreeMemoryWithTag(
3686  IN PVOID VirtualAddress,
3687  IN ULONG Tag);
3688
3689NDISAPI
3690VOID
3691NTAPI
3692NdisImmediateReadSharedMemory(
3693  IN NDIS_HANDLE WrapperConfigurationContext,
3694  IN ULONG       SharedMemoryAddress,
3695  OUT PUCHAR      Buffer,
3696  IN ULONG       Length);
3697
3698NDISAPI
3699VOID
3700NTAPI
3701NdisImmediateWriteSharedMemory(
3702  IN NDIS_HANDLE WrapperConfigurationContext,
3703  IN ULONG       SharedMemoryAddress,
3704  IN PUCHAR      Buffer,
3705  IN ULONG       Length);
3706
3707NDISAPI
3708VOID
3709NTAPI
3710NdisMAllocateSharedMemory(
3711  IN	NDIS_HANDLE  MiniportAdapterHandle,
3712  IN	ULONG  Length,
3713  IN	BOOLEAN  Cached,
3714  OUT	 PVOID  *VirtualAddress,
3715  OUT	 PNDIS_PHYSICAL_ADDRESS  PhysicalAddress);
3716
3717NDISAPI
3718NDIS_STATUS
3719NTAPI
3720NdisMAllocateSharedMemoryAsync(
3721  IN NDIS_HANDLE  MiniportAdapterHandle,
3722  IN ULONG  Length,
3723  IN BOOLEAN  Cached,
3724  IN PVOID  Context);
3725
3726#if defined(NDIS50)
3727
3728#define NdisUpdateSharedMemory(NdisAdapterHandle, \
3729                               Length,            \
3730                               VirtualAddress,    \
3731                               PhysicalAddress)
3732
3733#else
3734
3735NDISAPI
3736VOID
3737NTAPI
3738NdisUpdateSharedMemory(
3739  IN NDIS_HANDLE             NdisAdapterHandle,
3740  IN ULONG                   Length,
3741  IN PVOID                   VirtualAddress,
3742  IN NDIS_PHYSICAL_ADDRESS   PhysicalAddress);
3743
3744#endif /* defined(NDIS50) */
3745
3746/*
3747 * ULONG
3748 * NdisGetPhysicalAddressHigh(
3749 *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);
3750 */
3751#define NdisGetPhysicalAddressHigh(PhysicalAddress) \
3752  ((PhysicalAddress).HighPart)
3753
3754/*
3755 * VOID
3756 * NdisSetPhysicalAddressHigh(
3757 *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress,
3758 *   IN ULONG  Value);
3759 */
3760#define NdisSetPhysicalAddressHigh(PhysicalAddress, Value) \
3761  ((PhysicalAddress).HighPart) = (Value)
3762
3763/*
3764 * ULONG
3765 * NdisGetPhysicalAddressLow(
3766 *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);
3767 */
3768#define NdisGetPhysicalAddressLow(PhysicalAddress) \
3769  ((PhysicalAddress).LowPart)
3770
3771
3772/*
3773 * VOID
3774 * NdisSetPhysicalAddressLow(
3775 *   IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress,
3776 *   IN ULONG  Value);
3777 */
3778#define NdisSetPhysicalAddressLow(PhysicalAddress, Value) \
3779  ((PhysicalAddress).LowPart) = (Value)
3780
3781/*
3782 * VOID
3783 * NDIS_PHYSICAL_ADDRESS_CONST(
3784 *   IN ULONG  Low,
3785 *   IN LONG  High);
3786 */
3787#define NDIS_PHYSICAL_ADDRESS_CONST(Low, High)  \
3788    { {(ULONG)(Low), (LONG)(High)} }
3789
3790/*
3791 * ULONG
3792 * NdisEqualMemory(
3793 *  IN CONST VOID  *Source1,
3794 *  IN CONST VOID  *Source2,
3795 *  IN ULONG  Length);
3796 */
3797#define NdisEqualMemory(Source1, Source2, Length) \
3798  RtlEqualMemory(Source1, Source2, Length)
3799
3800/*
3801 * VOID
3802 * NdisFillMemory(
3803 *   IN PVOID  Destination,
3804 *   IN ULONG  Length,
3805 *   IN UCHAR  Fill);
3806 */
3807#define NdisFillMemory(Destination, Length, Fill) \
3808  RtlFillMemory(Destination, Length, Fill)
3809
3810/*
3811 * VOID
3812 * NdisMoveMemory(
3813 *   OUT  PVOID  Destination,
3814 *   IN PVOID  Source,
3815 *   IN ULONG  Length);
3816 */
3817#define NdisMoveMemory(Destination, Source, Length) \
3818  RtlCopyMemory(Destination, Source, Length)
3819
3820
3821/*
3822 * VOID
3823 * NdisRetrieveUlong(
3824 *   IN PULONG  DestinationAddress,
3825 *   IN PULONG  SourceAddress);
3826 */
3827#define NdisRetrieveUlong(DestinationAddress, SourceAddress) \
3828  RtlRetrieveUlong(DestinationAddress, SourceAddress)
3829
3830
3831/*
3832 * VOID
3833 * NdisStoreUlong(
3834 *   IN PULONG  DestinationAddress,
3835 *   IN ULONG  Value);
3836 */
3837#define NdisStoreUlong(DestinationAddress, Value) \
3838  RtlStoreUlong(DestinationAddress, Value)
3839
3840
3841/*
3842 * VOID
3843 * NdisZeroMemory(
3844 *   IN PVOID  Destination,
3845 *   IN ULONG  Length)
3846 */
3847#define NdisZeroMemory(Destination, Length) \
3848  RtlZeroMemory(Destination, Length)
3849
3850typedef VOID
3851(NTAPI *NDIS_BLOCK_INITIALIZER) (
3852    IN  PUCHAR  Block,
3853    IN  SIZE_T  NumberOfBytes
3854    );
3855
3856/* Configuration routines */
3857
3858#if NDIS_LEGACY_DRIVER
3859NDISAPI
3860VOID
3861NTAPI
3862NdisOpenConfiguration(
3863  OUT PNDIS_STATUS Status,
3864  OUT PNDIS_HANDLE ConfigurationHandle,
3865  IN NDIS_HANDLE WrapperConfigurationContext);
3866#endif
3867
3868NDISAPI
3869VOID
3870NTAPI
3871NdisReadNetworkAddress(
3872  OUT PNDIS_STATUS Status,
3873  OUT PVOID *NetworkAddress,
3874  OUT PUINT NetworkAddressLength,
3875  IN NDIS_HANDLE ConfigurationHandle);
3876
3877NDISAPI
3878VOID
3879NTAPI
3880NdisReadEisaSlotInformation(
3881  OUT PNDIS_STATUS  Status,
3882  IN NDIS_HANDLE  WrapperConfigurationContext,
3883  OUT PUINT  SlotNumber,
3884  OUT PNDIS_EISA_FUNCTION_INFORMATION  EisaData);
3885
3886NDISAPI
3887VOID
3888NTAPI
3889NdisReadEisaSlotInformationEx(
3890  OUT PNDIS_STATUS  Status,
3891  IN NDIS_HANDLE  WrapperConfigurationContext,
3892  OUT PUINT  SlotNumber,
3893  OUT PNDIS_EISA_FUNCTION_INFORMATION  *EisaData,
3894  OUT PUINT  NumberOfFunctions);
3895
3896#if NDIS_LEGACY_MINIPORT
3897
3898NDISAPI
3899ULONG
3900NTAPI
3901NdisReadPciSlotInformation(
3902  IN NDIS_HANDLE NdisAdapterHandle,
3903  IN ULONG SlotNumber,
3904  IN ULONG Offset,
3905  OUT PVOID Buffer,
3906  IN ULONG Length);
3907
3908NDISAPI
3909ULONG
3910NTAPI
3911NdisWritePciSlotInformation(
3912  IN NDIS_HANDLE NdisAdapterHandle,
3913  IN ULONG SlotNumber,
3914  IN ULONG Offset,
3915  IN PVOID Buffer,
3916  IN ULONG Length);
3917
3918NDISAPI
3919ULONG
3920NTAPI
3921NdisReadPcmciaAttributeMemory(
3922  IN NDIS_HANDLE NdisAdapterHandle,
3923  IN ULONG Offset,
3924  OUT PVOID Buffer,
3925  IN ULONG Length);
3926
3927NDISAPI
3928ULONG
3929NTAPI
3930NdisWritePcmciaAttributeMemory(
3931  IN NDIS_HANDLE NdisAdapterHandle,
3932  IN ULONG Offset,
3933  IN PVOID Buffer,
3934  IN ULONG Length);
3935
3936#endif /* NDIS_LEGACY_MINIPORT */
3937
3938/* String management routines */
3939
3940/*
3941NDISAPI
3942NDIS_STATUS
3943NTAPI
3944NdisAnsiStringToUnicodeString(
3945  IN OUT PNDIS_STRING DestinationString,
3946  IN PNDIS_ANSI_STRING SourceString);
3947*/
3948#define NdisAnsiStringToUnicodeString(_us, _as) RtlAnsiStringToUnicodeString(_us, _as, FALSE)
3949
3950/*
3951 * BOOLEAN
3952 * NdisEqualString(
3953 *   IN PNDIS_STRING String1,
3954 *   IN PNDIS_STRING String2,
3955 *   IN BOOLEAN CaseInsensitive);
3956 */
3957#define NdisEqualString RtlEqualString
3958
3959#define NdisEqualUnicodeString RtlEqualUnicodeString
3960
3961/*
3962NDISAPI
3963VOID
3964NTAPI
3965NdisInitAnsiString(
3966  IN OUT PNDIS_ANSI_STRING DestinationString,
3967  IN PCSTR SourceString);
3968*/
3969#define NdisInitAnsiString RtlInitString
3970
3971NDISAPI
3972VOID
3973NTAPI
3974NdisInitUnicodeString(
3975  IN OUT PNDIS_STRING  DestinationString,
3976  IN PCWSTR  SourceString);
3977
3978/*
3979NDISAPI
3980NDIS_STATUS
3981NTAPI
3982NdisUnicodeStringToAnsiString(
3983  IN OUT PNDIS_ANSI_STRING DestinationString,
3984  IN PNDIS_STRING SourceString);
3985*/
3986#define NdisUnicodeStringToAnsiString(_as, _us) RtlUnicodeStringToAnsiString(_as, _us, FALSE)
3987
3988#define NdisFreeString(_s) NdisFreeMemory((_s).Buffer, (_s).MaximumLength, 0)
3989#define NdisPrintString(_s) DbgPrint("%ls", (_s).Buffer)
3990
3991/* Spin lock reoutines */
3992
3993/*
3994NDISAPI
3995VOID
3996NTAPI
3997NdisAllocateSpinLock(
3998  IN PNDIS_SPIN_LOCK SpinLock);
3999*/
4000#define NdisAllocateSpinLock(_SpinLock) KeInitializeSpinLock(&(_SpinLock)->SpinLock)
4001
4002/*
4003NDISAPI
4004VOID
4005NTAPI
4006NdisFreeSpinLock(
4007  IN PNDIS_SPIN_LOCK  SpinLock);
4008*/
4009#define NdisFreeSpinLock(_SpinLock)
4010
4011/*
4012NDISAPI
4013VOID
4014NTAPI
4015NdisAcquireSpinLock(
4016  IN PNDIS_SPIN_LOCK  SpinLock);
4017*/
4018#define NdisAcquireSpinLock(_SpinLock) KeAcquireSpinLock(&(_SpinLock)->SpinLock, &(_SpinLock)->OldIrql)
4019
4020/*
4021NDISAPI
4022VOID
4023NTAPI
4024NdisReleaseSpinLock(
4025  IN PNDIS_SPIN_LOCK  SpinLock);
4026*/
4027#define NdisReleaseSpinLock(_SpinLock) KeReleaseSpinLock(&(_SpinLock)->SpinLock,(_SpinLock)->OldIrql)
4028
4029/*
4030NDISAPI
4031VOID
4032NTAPI
4033NdisDprAcquireSpinLock(
4034  IN PNDIS_SPIN_LOCK  SpinLock);
4035*/
4036#define NdisDprAcquireSpinLock(_SpinLock) KeAcquireSpinLockAtDpcLevel(&(_SpinLock)->SpinLock)
4037
4038/*
4039NDISAPI
4040VOID
4041NTAPI
4042NdisDprReleaseSpinLock(
4043  IN PNDIS_SPIN_LOCK  SpinLock);
4044*/
4045#define NdisDprReleaseSpinLock(_SpinLock) KeReleaseSpinLockFromDpcLevel(&(_SpinLock)->SpinLock)
4046
4047/* I/O routines */
4048
4049/*
4050 * VOID
4051 * NdisRawReadPortBufferUchar(
4052 *   IN ULONG Port,
4053 *   OUT PUCHAR Buffer,
4054 *   IN ULONG Length);
4055 */
4056#define NdisRawReadPortBufferUchar(Port, Buffer, Length) \
4057  READ_PORT_BUFFER_UCHAR((PUCHAR)(Port), (PUCHAR)(Buffer), (Length))
4058
4059/*
4060 * VOID
4061 * NdisRawReadPortBufferUlong(
4062 *   IN ULONG Port,
4063 *   OUT PULONG Buffer,
4064 *   IN ULONG Length);
4065 */
4066#define NdisRawReadPortBufferUlong(Port, Buffer, Length) \
4067  READ_PORT_BUFFER_ULONG((PULONG)(Port), (PULONG)(Buffer), (Length))
4068
4069/*
4070 * VOID
4071 * NdisRawReadPortBufferUshort(
4072 *   IN ULONG Port,
4073 *   OUT PUSHORT Buffer,
4074 *   IN ULONG Length);
4075 */
4076#define NdisRawReadPortBufferUshort(Port, Buffer, Length) \
4077  READ_PORT_BUFFER_USHORT((PUSHORT)(Port), (PUSHORT)(Buffer), (Length))
4078
4079/*
4080 * VOID
4081 * NdisRawReadPortUchar(
4082 *   IN ULONG Port,
4083 *   OUT PUCHAR Data);
4084 */
4085#define NdisRawReadPortUchar(Port, Data) \
4086  *(Data) = READ_PORT_UCHAR((PUCHAR)(Port))
4087
4088/*
4089 * VOID
4090 * NdisRawReadPortUlong(
4091 *   IN ULONG Port,
4092 *   OUT PULONG Data);
4093 */
4094#define NdisRawReadPortUlong(Port, Data) \
4095  *(Data) = READ_PORT_ULONG((PULONG)(Port))
4096
4097/*
4098 * VOID
4099 * NdisRawReadPortUshort(
4100 *   IN ULONG Port,
4101 *   OUT PUSHORT Data);
4102 */
4103#define NdisRawReadPortUshort(Port, Data) \
4104  *(Data) = READ_PORT_USHORT((PUSHORT)(Port))
4105
4106/*
4107 * VOID
4108 * NdisRawWritePortBufferUchar(
4109 *   IN ULONG Port,
4110 *   IN PUCHAR Buffer,
4111 *   IN ULONG Length);
4112 */
4113#define NdisRawWritePortBufferUchar(Port, Buffer, Length) \
4114  WRITE_PORT_BUFFER_UCHAR((PUCHAR)(Port), (PUCHAR)(Buffer), (Length))
4115
4116/*
4117 * VOID
4118 * NdisRawWritePortBufferUlong(
4119 *   IN ULONG Port,
4120 *   IN PULONG Buffer,
4121 *   IN ULONG Length);
4122 */
4123#define NdisRawWritePortBufferUlong(Port, Buffer, Length) \
4124  WRITE_PORT_BUFFER_ULONG((PULONG)(Port), (PULONG)(Buffer), (Length))
4125
4126/*
4127 * VOID
4128 * NdisRawWritePortBufferUshort(
4129 *   IN ULONG Port,
4130 *   IN PUSHORT Buffer,
4131 *   IN ULONG Length);
4132 */
4133#define NdisRawWritePortBufferUshort(Port, Buffer, Length) \
4134  WRITE_PORT_BUFFER_USHORT((PUSHORT)(Port), (PUSHORT)(Buffer), (Length))
4135
4136/*
4137 * VOID
4138 * NdisRawWritePortUchar(
4139 *   IN ULONG Port,
4140 *   IN UCHAR Data);
4141 */
4142#define NdisRawWritePortUchar(Port, Data) \
4143  WRITE_PORT_UCHAR((PUCHAR)(Port), (UCHAR)(Data))
4144
4145/*
4146 * VOID
4147 * NdisRawWritePortUlong(
4148 *   IN ULONG Port,
4149 *   IN ULONG Data);
4150 */
4151#define NdisRawWritePortUlong(Port, Data) \
4152  WRITE_PORT_ULONG((PULONG)(Port), (ULONG)(Data))
4153
4154/*
4155 * VOID
4156 * NdisRawWritePortUshort(
4157 *   IN ULONG Port,
4158 *   IN USHORT Data);
4159 */
4160#define NdisRawWritePortUshort(Port, Data) \
4161  WRITE_PORT_USHORT((PUSHORT)(Port), (USHORT)(Data))
4162
4163
4164/*
4165 * VOID
4166 * NdisReadRegisterUchar(
4167 *   IN PUCHAR Register,
4168 *   OUT PUCHAR Data);
4169 */
4170#define NdisReadRegisterUchar(Register, Data) \
4171  *(Data) = *(Register)
4172
4173/*
4174 * VOID
4175 * NdisReadRegisterUlong(
4176 *   IN PULONG  Register,
4177 *   OUT PULONG  Data);
4178 */
4179#define NdisReadRegisterUlong(Register, Data)   \
4180  *(Data) = *(Register)
4181
4182/*
4183 * VOID
4184 * NdisReadRegisterUshort(
4185 *   IN PUSHORT Register,
4186 *   OUT PUSHORT Data);
4187 */
4188#define NdisReadRegisterUshort(Register, Data) \
4189    *(Data) = *(Register)
4190
4191/*
4192 * VOID
4193 * NdisReadRegisterUchar(
4194 *   IN PUCHAR Register,
4195 *   IN UCHAR Data);
4196 */
4197#define NdisWriteRegisterUchar(Register, Data) \
4198  WRITE_REGISTER_UCHAR((Register), (Data))
4199
4200/*
4201 * VOID
4202 * NdisReadRegisterUlong(
4203 *   IN PULONG Register,
4204 *   IN ULONG Data);
4205 */
4206#define NdisWriteRegisterUlong(Register, Data) \
4207  WRITE_REGISTER_ULONG((Register), (Data))
4208
4209/*
4210 * VOID
4211 * NdisReadRegisterUshort(
4212 *   IN PUSHORT Register,
4213 *   IN USHORT Data);
4214 */
4215#define NdisWriteRegisterUshort(Register, Data) \
4216  WRITE_REGISTER_USHORT((Register), (Data))
4217
4218
4219/* Linked lists */
4220
4221/*
4222 * VOID
4223 * NdisInitializeListHead(
4224 *   IN PLIST_ENTRY ListHead);
4225 */
4226#define NdisInitializeListHead InitializeListHead
4227
4228/*
4229 * PLIST_ENTRY
4230 * NdisInterlockedInsertHeadList(
4231 *   IN PLIST_ENTRY  ListHead,
4232 *   IN PLIST_ENTRY  ListEntry,
4233 *   IN PNDIS_SPIN_LOCK  SpinLock);
4234 */
4235#define NdisInterlockedInsertHeadList(_ListHead, _ListEntry, _SpinLock) \
4236  ExInterlockedInsertHeadList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock)
4237
4238/*
4239 * PLIST_ENTRY
4240 * NdisInterlockedInsertTailList(
4241 *   IN PLIST_ENTRY  ListHead,
4242 *   IN PLIST_ENTRY  ListEntry,
4243 *   IN PNDIS_SPIN_LOCK  SpinLock);
4244 */
4245#define NdisInterlockedInsertTailList(_ListHead, _ListEntry, _SpinLock) \
4246  ExInterlockedInsertTailList(_ListHead, _ListEntry, &(_SpinLock)->SpinLock)
4247
4248/*
4249 * PLIST_ENTRY
4250 * NdisInterlockedRemoveHeadList(
4251 *   IN PLIST_ENTRY  ListHead,
4252 *   IN PNDIS_SPIN_LOCK  SpinLock);
4253*/
4254#define NdisInterlockedRemoveHeadList(_ListHead, _SpinLock) \
4255  ExInterlockedRemoveHeadList(_ListHead, &(_SpinLock)->SpinLock)
4256
4257/*
4258 * VOID
4259 * NdisInitializeSListHead(
4260 *   IN PSLIST_HEADER SListHead);
4261 */
4262#define NdisInitializeSListHead(SListHead) ExInitializeSListHead(SListHead)
4263
4264/*
4265 * USHORT NdisQueryDepthSList(
4266 *   IN PSLIST_HEADER SListHead);
4267 */
4268#define NdisQueryDepthSList(SListHead) ExQueryDepthSList(SListHead)
4269
4270#define NdisInterlockedPushEntryList(ListHead, ListEntry, Lock) \
4271  ExInterlockedPushEntryList(ListHead, ListEntry, &(Lock)->SpinLock)
4272
4273#define NdisInterlockedPopEntryList(ListHead, Lock) \
4274  ExInterlockedPopEntryList(ListHead, &(Lock)->SpinLock)
4275
4276/* Non-paged lookaside lists */
4277
4278#define NdisInitializeNPagedLookasideList(_L, _AR, _FR, _Fl, _S, _T, _D) \
4279  ExInitializeNPagedLookasideList(_L, _AR, _FR, _Fl, _S, _T, _D)
4280#define NdisDeleteNPagedLookasideList(_L) ExDeleteNPagedLookasideList(_L)
4281#define NdisAllocateFromNPagedLookasideList(_L) ExAllocateFromNPagedLookasideList(_L)
4282#define NdisFreeToNPagedLookasideList(_L, _E) ExFreeToNPagedLookasideList(_L, _E)
4283
4284/* Interlocked routines */
4285
4286/*
4287 * LONG
4288 * NdisInterlockedDecrement(
4289 *   IN PLONG  Addend);
4290 */
4291#define NdisInterlockedDecrement(Addend) InterlockedDecrement(Addend)
4292
4293/*
4294 * LONG
4295 * NdisInterlockedIncrement(
4296 *   IN PLONG  Addend);
4297 */
4298#define NdisInterlockedIncrement(Addend) InterlockedIncrement(Addend)
4299
4300/*
4301 * VOID
4302 * NdisInterlockedAddUlong(
4303 *   IN PULONG  Addend,
4304 *   IN ULONG  Increment,
4305 *   IN PNDIS_SPIN_LOCK  SpinLock);
4306 */
4307#define NdisInterlockedAddUlong(_Addend, _Increment, _SpinLock) \
4308  ExInterlockedAddUlong(_Addend, _Increment, &(_SpinLock)->SpinLock)
4309
4310/* Miscellaneous routines */
4311
4312NDISAPI
4313VOID
4314NTAPI
4315NdisCloseConfiguration(
4316  IN NDIS_HANDLE ConfigurationHandle);
4317
4318NDISAPI
4319VOID
4320NTAPI
4321NdisReadConfiguration(
4322  OUT PNDIS_STATUS Status,
4323  OUT PNDIS_CONFIGURATION_PARAMETER *ParameterValue,
4324  IN NDIS_HANDLE ConfigurationHandle,
4325  IN PNDIS_STRING Keyword,
4326  IN NDIS_PARAMETER_TYPE ParameterType);
4327
4328NDISAPI
4329VOID
4330NTAPI
4331NdisWriteConfiguration(
4332  OUT PNDIS_STATUS Status,
4333  IN NDIS_HANDLE WrapperConfigurationContext,
4334  IN PNDIS_STRING Keyword,
4335  IN PNDIS_CONFIGURATION_PARAMETER ParameterValue);
4336
4337NDISAPI
4338VOID
4339__cdecl
4340NdisWriteErrorLogEntry(
4341  IN NDIS_HANDLE NdisAdapterHandle,
4342  IN NDIS_ERROR_CODE ErrorCode,
4343  IN ULONG NumberOfErrorValues,
4344  IN ...);
4345
4346NDISAPI
4347VOID
4348NTAPI
4349NdisInitializeString(
4350  OUT PNDIS_STRING Destination,
4351  IN PUCHAR Source);
4352
4353/*
4354 * VOID
4355 * NdisStallExecution(
4356 *   IN UINT MicrosecondsToStall)
4357 */
4358#define NdisStallExecution KeStallExecutionProcessor
4359
4360/*
4361NDISAPI
4362VOID
4363NTAPI
4364NdisGetCurrentSystemTime(
4365  IN PLARGE_INTEGER  pSystemTime);
4366*/
4367#define NdisGetCurrentSystemTime KeQuerySystemTime
4368
4369#if NDIS_SUPPORT_60_COMPATIBLE_API
4370NDISAPI
4371CCHAR
4372NTAPI
4373NdisSystemProcessorCount(VOID);
4374#endif
4375
4376NDISAPI
4377VOID
4378NTAPI
4379NdisGetCurrentProcessorCpuUsage(
4380  OUT PULONG pCpuUsage);
4381
4382/* NDIS helper macros */
4383
4384/*
4385 * VOID
4386 * NDIS_INIT_FUNCTION(FunctionName)
4387 */
4388#define NDIS_INIT_FUNCTION(FunctionName)    \
4389  alloc_text(init, FunctionName)
4390
4391/*
4392 * VOID
4393 * NDIS_PAGABLE_FUNCTION(FunctionName)
4394 */
4395#define NDIS_PAGEABLE_FUNCTION(FunctionName) \
4396  alloc_text(page, FunctionName)
4397
4398#define NDIS_PAGABLE_FUNCTION NDIS_PAGEABLE_FUNCTION
4399
4400
4401/* NDIS 4.0 extensions */
4402
4403NDISAPI
4404VOID
4405NTAPI
4406NdisMFreeSharedMemory(
4407	IN NDIS_HANDLE  MiniportAdapterHandle,
4408	IN ULONG  Length,
4409	IN BOOLEAN  Cached,
4410	IN PVOID  VirtualAddress,
4411	IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress);
4412
4413NDISAPI
4414VOID
4415NTAPI
4416NdisMWanIndicateReceive(
4417	OUT PNDIS_STATUS  Status,
4418	IN NDIS_HANDLE  MiniportAdapterHandle,
4419	IN NDIS_HANDLE  NdisLinkContext,
4420	IN PUCHAR  PacketBuffer,
4421	IN UINT  PacketSize);
4422
4423NDISAPI
4424VOID
4425NTAPI
4426NdisMWanIndicateReceiveComplete(
4427	IN NDIS_HANDLE  MiniportAdapterHandle
4428	IN NDIS_HANDLE  NdisLinkContext);
4429
4430NDISAPI
4431VOID
4432NTAPI
4433NdisMWanSendComplete(
4434	IN NDIS_HANDLE  MiniportAdapterHandle,
4435	IN PNDIS_WAN_PACKET  Packet,
4436	IN NDIS_STATUS  Status);
4437
4438NDISAPI
4439NDIS_STATUS
4440NTAPI
4441NdisPciAssignResources(
4442	IN NDIS_HANDLE  NdisMacHandle,
4443	IN NDIS_HANDLE  NdisWrapperHandle,
4444	IN NDIS_HANDLE  WrapperConfigurationContext,
4445	IN ULONG  SlotNumber,
4446	OUT PNDIS_RESOURCE_LIST  *AssignedResources);
4447
4448
4449/* NDIS 5.0 extensions */
4450
4451NDISAPI
4452NDIS_STATUS
4453NTAPI
4454NdisAllocateMemoryWithTag(
4455  OUT PVOID *VirtualAddress,
4456  IN UINT Length,
4457  IN ULONG Tag);
4458
4459NDISAPI
4460VOID
4461NTAPI
4462NdisGetCurrentProcessorCounts(
4463  OUT PULONG pIdleCount,
4464  OUT PULONG pKernelAndUser,
4465  OUT PULONG pIndex);
4466
4467#if NDIS_LEGACY_DRIVER
4468NDISAPI
4469VOID
4470NTAPI
4471NdisGetSystemUpTime(
4472  OUT PULONG pSystemUpTime);
4473#endif
4474
4475#if NDIS_SUPPORT_60_COMPATIBLE_API
4476
4477NDISAPI
4478VOID
4479NTAPI
4480NdisAcquireReadWriteLock(
4481  IN OUT PNDIS_RW_LOCK Lock,
4482  IN BOOLEAN fWrite,
4483  OUT PLOCK_STATE LockState);
4484
4485NDISAPI
4486VOID
4487NTAPI
4488NdisInitializeReadWriteLock(
4489  OUT PNDIS_RW_LOCK Lock);
4490
4491NDISAPI
4492VOID
4493NTAPI
4494NdisReleaseReadWriteLock(
4495  IN OUT PNDIS_RW_LOCK Lock,
4496  IN PLOCK_STATE LockState);
4497
4498#if NDIS_SUPPORT_NDIS6
4499
4500NDISAPI
4501VOID
4502NTAPI
4503NdisDprAcquireReadWriteLock(
4504  IN PNDIS_RW_LOCK Lock,
4505  IN BOOLEAN fWrite,
4506  IN PLOCK_STATE LockState);
4507
4508NDISAPI
4509VOID
4510NTAPI
4511NdisDprReleaseReadWriteLock(
4512  IN PNDIS_RW_LOCK Lock,
4513  IN PLOCK_STATE LockState);
4514
4515#endif /* NDIS_SUPPORT_NDIS6 */
4516
4517#endif /* NDIS_SUPPORT_60_COMPATIBLE_API */
4518
4519NDISAPI
4520NDIS_STATUS
4521NTAPI
4522NdisMDeregisterDevice(
4523  IN NDIS_HANDLE  NdisDeviceHandle);
4524
4525NDISAPI
4526VOID
4527NTAPI
4528NdisMGetDeviceProperty(
4529  IN NDIS_HANDLE  MiniportAdapterHandle,
4530  IN OUT PDEVICE_OBJECT  *PhysicalDeviceObject  OPTIONAL,
4531  IN OUT PDEVICE_OBJECT  *FunctionalDeviceObject  OPTIONAL,
4532  IN OUT PDEVICE_OBJECT  *NextDeviceObject  OPTIONAL,
4533  IN OUT PCM_RESOURCE_LIST  *AllocatedResources  OPTIONAL,
4534  IN OUT PCM_RESOURCE_LIST  *AllocatedResourcesTranslated  OPTIONAL);
4535
4536NDISAPI
4537NDIS_STATUS
4538NTAPI
4539NdisMInitializeScatterGatherDma(
4540  IN NDIS_HANDLE  MiniportAdapterHandle,
4541  IN BOOLEAN  Dma64BitAddresses,
4542  IN ULONG  MaximumPhysicalMapping);
4543
4544NDISAPI
4545NDIS_STATUS
4546NTAPI
4547NdisMPromoteMiniport(
4548  IN NDIS_HANDLE  MiniportAdapterHandle);
4549
4550NDISAPI
4551NDIS_STATUS
4552NTAPI
4553NdisMQueryAdapterInstanceName(
4554  OUT PNDIS_STRING  AdapterInstanceName,
4555  IN NDIS_HANDLE  MiniportAdapterHandle);
4556
4557NDISAPI
4558NDIS_STATUS
4559NTAPI
4560NdisMRegisterDevice(
4561  IN NDIS_HANDLE  NdisWrapperHandle,
4562  IN PNDIS_STRING  DeviceName,
4563  IN PNDIS_STRING  SymbolicName,
4564  IN PDRIVER_DISPATCH  MajorFunctions[],
4565  OUT PDEVICE_OBJECT  *pDeviceObject,
4566  OUT NDIS_HANDLE  *NdisDeviceHandle);
4567
4568NDISAPI
4569VOID
4570NTAPI
4571NdisMRegisterUnloadHandler(
4572  IN NDIS_HANDLE  NdisWrapperHandle,
4573  IN PDRIVER_UNLOAD  UnloadHandler);
4574
4575NDISAPI
4576NDIS_STATUS
4577NTAPI
4578NdisMRemoveMiniport(
4579  IN NDIS_HANDLE  MiniportAdapterHandle);
4580
4581NDISAPI
4582NDIS_STATUS
4583NTAPI
4584NdisMSetMiniportSecondary(
4585  IN NDIS_HANDLE  MiniportAdapterHandle,
4586  IN NDIS_HANDLE  PrimaryMiniportAdapterHandle);
4587
4588NDISAPI
4589VOID
4590NTAPI
4591NdisOpenConfigurationKeyByIndex(
4592  OUT PNDIS_STATUS Status,
4593  IN NDIS_HANDLE ConfigurationHandle,
4594  IN ULONG Index,
4595  OUT PNDIS_STRING KeyName,
4596  OUT PNDIS_HANDLE KeyHandle);
4597
4598NDISAPI
4599VOID
4600NTAPI
4601NdisOpenConfigurationKeyByName(
4602  OUT PNDIS_STATUS Status,
4603  IN NDIS_HANDLE ConfigurationHandle,
4604  IN PNDIS_STRING SubKeyName,
4605  OUT PNDIS_HANDLE SubKeyHandle);
4606
4607NDISAPI
4608NDIS_STATUS
4609NTAPI
4610NdisQueryAdapterInstanceName(
4611  OUT PNDIS_STRING AdapterInstanceName,
4612  IN NDIS_HANDLE NdisBindingHandle);
4613
4614NDISAPI
4615NDIS_STATUS
4616NTAPI
4617NdisQueryBindInstanceName(
4618  OUT PNDIS_STRING pAdapterInstanceName,
4619  IN NDIS_HANDLE BindingContext);
4620
4621NDISAPI
4622NDIS_STATUS
4623NTAPI
4624NdisWriteEventLogEntry(
4625  IN PVOID LogHandle,
4626  IN NDIS_STATUS EventCode,
4627  IN ULONG UniqueEventValue,
4628  IN USHORT NumStrings,
4629  IN PVOID StringsList OPTIONAL,
4630  IN ULONG DataSize,
4631  IN PVOID Data OPTIONAL);
4632
4633/* Connectionless services */
4634
4635NDISAPI
4636NDIS_STATUS
4637NTAPI
4638NdisClAddParty(
4639  IN NDIS_HANDLE  NdisVcHandle,
4640  IN NDIS_HANDLE  ProtocolPartyContext,
4641  IN OUT PCO_CALL_PARAMETERS  CallParameters,
4642  OUT PNDIS_HANDLE  NdisPartyHandle);
4643
4644NDISAPI
4645NDIS_STATUS
4646NTAPI
4647NdisClCloseAddressFamily(
4648  IN NDIS_HANDLE  NdisAfHandle);
4649
4650NDISAPI
4651NDIS_STATUS
4652NTAPI
4653NdisClCloseCall(
4654  IN NDIS_HANDLE NdisVcHandle,
4655  IN NDIS_HANDLE NdisPartyHandle  OPTIONAL,
4656  IN PVOID  Buffer  OPTIONAL,
4657  IN UINT  Size);
4658
4659NDISAPI
4660NDIS_STATUS
4661NTAPI
4662NdisClDeregisterSap(
4663  IN NDIS_HANDLE  NdisSapHandle);
4664
4665NDISAPI
4666NDIS_STATUS
4667NTAPI
4668NdisClDropParty(
4669  IN NDIS_HANDLE  NdisPartyHandle,
4670  IN PVOID  Buffer  OPTIONAL,
4671  IN UINT  Size);
4672
4673NDISAPI
4674VOID
4675NTAPI
4676NdisClIncomingCallComplete(
4677  IN NDIS_STATUS  Status,
4678  IN NDIS_HANDLE  NdisVcHandle,
4679  IN PCO_CALL_PARAMETERS  CallParameters);
4680
4681NDISAPI
4682NDIS_STATUS
4683NTAPI
4684NdisClMakeCall(
4685  IN NDIS_HANDLE  NdisVcHandle,
4686  IN OUT PCO_CALL_PARAMETERS  CallParameters,
4687  IN NDIS_HANDLE  ProtocolPartyContext  OPTIONAL,
4688  OUT PNDIS_HANDLE  NdisPartyHandle  OPTIONAL);
4689
4690NDISAPI
4691NDIS_STATUS
4692NTAPI
4693NdisClModifyCallQoS(
4694  IN NDIS_HANDLE  NdisVcHandle,
4695  IN PCO_CALL_PARAMETERS  CallParameters);
4696
4697
4698NDISAPI
4699NDIS_STATUS
4700NTAPI
4701NdisClOpenAddressFamily(
4702  IN NDIS_HANDLE  NdisBindingHandle,
4703  IN PCO_ADDRESS_FAMILY  AddressFamily,
4704  IN NDIS_HANDLE  ProtocolAfContext,
4705  IN PNDIS_CLIENT_CHARACTERISTICS  ClCharacteristics,
4706  IN UINT  SizeOfClCharacteristics,
4707  OUT PNDIS_HANDLE  NdisAfHandle);
4708
4709NDISAPI
4710NDIS_STATUS
4711NTAPI
4712NdisClRegisterSap(
4713  IN NDIS_HANDLE  NdisAfHandle,
4714  IN NDIS_HANDLE  ProtocolSapContext,
4715  IN PCO_SAP  Sap,
4716  OUT PNDIS_HANDLE  NdisSapHandle);
4717
4718
4719/* Call Manager services */
4720
4721NDISAPI
4722NDIS_STATUS
4723NTAPI
4724NdisCmActivateVc(
4725  IN NDIS_HANDLE  NdisVcHandle,
4726  IN OUT PCO_CALL_PARAMETERS  CallParameters);
4727
4728NDISAPI
4729VOID
4730NTAPI
4731NdisCmAddPartyComplete(
4732  IN NDIS_STATUS  Status,
4733  IN NDIS_HANDLE  NdisPartyHandle,
4734  IN NDIS_HANDLE  CallMgrPartyContext  OPTIONAL,
4735  IN PCO_CALL_PARAMETERS  CallParameters);
4736
4737NDISAPI
4738VOID
4739NTAPI
4740NdisCmCloseAddressFamilyComplete(
4741  IN NDIS_STATUS Status,
4742  IN NDIS_HANDLE NdisAfHandle);
4743
4744NDISAPI
4745VOID
4746NTAPI
4747NdisCmCloseCallComplete(
4748  IN NDIS_STATUS  Status,
4749  IN NDIS_HANDLE  NdisVcHandle,
4750  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL);
4751
4752NDISAPI
4753NDIS_STATUS
4754NTAPI
4755NdisCmDeactivateVc(
4756  IN NDIS_HANDLE  NdisVcHandle);
4757
4758NDISAPI
4759VOID
4760NTAPI
4761NdisCmDeregisterSapComplete(
4762  IN NDIS_STATUS  Status,
4763  IN NDIS_HANDLE  NdisSapHandle);
4764
4765NDISAPI
4766VOID
4767NTAPI
4768NdisCmDispatchCallConnected(
4769  IN NDIS_HANDLE  NdisVcHandle);
4770
4771NDISAPI
4772NDIS_STATUS
4773NTAPI
4774NdisCmDispatchIncomingCall(
4775  IN NDIS_HANDLE  NdisSapHandle,
4776  IN NDIS_HANDLE  NdisVcHandle,
4777  IN PCO_CALL_PARAMETERS  CallParameters);
4778
4779NDISAPI
4780VOID
4781NTAPI
4782NdisCmDispatchIncomingCallQoSChange(
4783  IN NDIS_HANDLE  NdisVcHandle,
4784  IN PCO_CALL_PARAMETERS  CallParameters);
4785
4786NDISAPI
4787VOID
4788NTAPI
4789NdisCmDispatchIncomingCloseCall(
4790  IN NDIS_STATUS  CloseStatus,
4791  IN NDIS_HANDLE  NdisVcHandle,
4792  IN PVOID  Buffer  OPTIONAL,
4793  IN UINT  Size);
4794
4795NDISAPI
4796VOID
4797NTAPI
4798NdisCmDispatchIncomingDropParty(
4799  IN NDIS_STATUS  DropStatus,
4800  IN NDIS_HANDLE  NdisPartyHandle,
4801  IN PVOID  Buffer  OPTIONAL,
4802  IN UINT  Size);
4803
4804NDISAPI
4805VOID
4806NTAPI
4807NdisCmDropPartyComplete(
4808  IN NDIS_STATUS  Status,
4809  IN NDIS_HANDLE  NdisPartyHandle);
4810
4811NDISAPI
4812VOID
4813NTAPI
4814NdisCmMakeCallComplete(
4815  IN NDIS_STATUS  Status,
4816  IN NDIS_HANDLE  NdisVcHandle,
4817  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL,
4818  IN NDIS_HANDLE  CallMgrPartyContext  OPTIONAL,
4819  IN PCO_CALL_PARAMETERS  CallParameters);
4820
4821NDISAPI
4822VOID
4823NTAPI
4824NdisCmModifyCallQoSComplete(
4825  IN NDIS_STATUS  Status,
4826  IN NDIS_HANDLE  NdisVcHandle,
4827  IN PCO_CALL_PARAMETERS  CallParameters);
4828
4829NDISAPI
4830VOID
4831NTAPI
4832NdisCmOpenAddressFamilyComplete(
4833  IN NDIS_STATUS Status,
4834  IN NDIS_HANDLE NdisAfHandle,
4835  IN NDIS_HANDLE CallMgrAfContext);
4836
4837NDISAPI
4838NDIS_STATUS
4839NTAPI
4840NdisCmRegisterAddressFamily(
4841  IN NDIS_HANDLE  NdisBindingHandle,
4842  IN PCO_ADDRESS_FAMILY  AddressFamily,
4843  IN PNDIS_CALL_MANAGER_CHARACTERISTICS  CmCharacteristics,
4844  IN UINT  SizeOfCmCharacteristics);
4845
4846NDISAPI
4847VOID
4848NTAPI
4849NdisCmRegisterSapComplete(
4850  IN NDIS_STATUS  Status,
4851  IN NDIS_HANDLE  NdisSapHandle,
4852  IN NDIS_HANDLE  CallMgrSapContext);
4853
4854
4855NDISAPI
4856NDIS_STATUS
4857NTAPI
4858NdisMCmActivateVc(
4859  IN NDIS_HANDLE  NdisVcHandle,
4860  IN PCO_CALL_PARAMETERS  CallParameters);
4861
4862NDISAPI
4863NDIS_STATUS
4864NTAPI
4865NdisMCmCreateVc(
4866  IN NDIS_HANDLE  MiniportAdapterHandle,
4867  IN NDIS_HANDLE  NdisAfHandle,
4868  IN NDIS_HANDLE  MiniportVcContext,
4869  OUT  PNDIS_HANDLE  NdisVcHandle);
4870
4871NDISAPI
4872NDIS_STATUS
4873NTAPI
4874NdisMCmDeactivateVc(
4875  IN NDIS_HANDLE  NdisVcHandle);
4876
4877NDISAPI
4878NDIS_STATUS
4879NTAPI
4880NdisMCmDeleteVc(
4881  IN NDIS_HANDLE  NdisVcHandle);
4882
4883NDISAPI
4884NDIS_STATUS
4885NTAPI
4886NdisMCmRegisterAddressFamily(
4887  IN NDIS_HANDLE  MiniportAdapterHandle,
4888  IN PCO_ADDRESS_FAMILY  AddressFamily,
4889  IN PNDIS_CALL_MANAGER_CHARACTERISTICS  CmCharacteristics,
4890  IN UINT  SizeOfCmCharacteristics);
4891
4892NDISAPI
4893NDIS_STATUS
4894NTAPI
4895NdisMCmRequest(
4896  IN NDIS_HANDLE  NdisAfHandle,
4897  IN NDIS_HANDLE  NdisVcHandle  OPTIONAL,
4898  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL,
4899  IN OUT  PNDIS_REQUEST  NdisRequest);
4900
4901
4902/* Connection-oriented services */
4903
4904NDISAPI
4905NDIS_STATUS
4906NTAPI
4907NdisCoCreateVc(
4908  IN NDIS_HANDLE  NdisBindingHandle,
4909  IN NDIS_HANDLE  NdisAfHandle  OPTIONAL,
4910  IN NDIS_HANDLE  ProtocolVcContext,
4911  IN OUT PNDIS_HANDLE  NdisVcHandle);
4912
4913NDISAPI
4914NDIS_STATUS
4915NTAPI
4916NdisCoDeleteVc(
4917  IN NDIS_HANDLE  NdisVcHandle);
4918
4919NDISAPI
4920NDIS_STATUS
4921NTAPI
4922NdisCoRequest(
4923  IN NDIS_HANDLE  NdisBindingHandle,
4924  IN NDIS_HANDLE  NdisAfHandle  OPTIONAL,
4925  IN NDIS_HANDLE  NdisVcHandle  OPTIONAL,
4926  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL,
4927  IN OUT  PNDIS_REQUEST  NdisRequest);
4928
4929NDISAPI
4930VOID
4931NTAPI
4932NdisCoRequestComplete(
4933  IN NDIS_STATUS  Status,
4934  IN NDIS_HANDLE  NdisAfHandle,
4935  IN NDIS_HANDLE  NdisVcHandle  OPTIONAL,
4936  IN NDIS_HANDLE  NdisPartyHandle  OPTIONAL,
4937  IN PNDIS_REQUEST  NdisRequest);
4938
4939NDISAPI
4940VOID
4941NTAPI
4942NdisCoSendPackets(
4943  IN NDIS_HANDLE  NdisVcHandle,
4944  IN PPNDIS_PACKET  PacketArray,
4945  IN UINT  NumberOfPackets);
4946
4947NDISAPI
4948VOID
4949NTAPI
4950NdisMCoActivateVcComplete(
4951  IN NDIS_STATUS  Status,
4952  IN NDIS_HANDLE  NdisVcHandle,
4953  IN PCO_CALL_PARAMETERS  CallParameters);
4954
4955NDISAPI
4956VOID
4957NTAPI
4958NdisMCoDeactivateVcComplete(
4959  IN NDIS_STATUS  Status,
4960  IN NDIS_HANDLE  NdisVcHandle);
4961
4962NDISAPI
4963VOID
4964NTAPI
4965NdisMCoIndicateReceivePacket(
4966  IN NDIS_HANDLE  NdisVcHandle,
4967  IN PPNDIS_PACKET  PacketArray,
4968  IN UINT  NumberOfPackets);
4969
4970NDISAPI
4971VOID
4972NTAPI
4973NdisMCoIndicateStatus(
4974  IN NDIS_HANDLE  MiniportAdapterHandle,
4975  IN NDIS_HANDLE  NdisVcHandle  OPTIONAL,
4976  IN NDIS_STATUS  GeneralStatus,
4977  IN PVOID  StatusBuffer  OPTIONAL,
4978  IN ULONG  StatusBufferSize);
4979
4980NDISAPI
4981VOID
4982NTAPI
4983NdisMCoReceiveComplete(
4984  IN NDIS_HANDLE  MiniportAdapterHandle);
4985
4986NDISAPI
4987VOID
4988NTAPI
4989NdisMCoRequestComplete(
4990  IN NDIS_STATUS  Status,
4991  IN NDIS_HANDLE  MiniportAdapterHandle,
4992  IN PNDIS_REQUEST  Request);
4993
4994NDISAPI
4995VOID
4996NTAPI
4997NdisMCoSendComplete(
4998  IN NDIS_STATUS  Status,
4999  IN NDIS_HANDLE  NdisVcHandle,
5000  IN PNDIS_PACKET  Packet);
5001
5002
5003/* NDIS 5.0 extensions for intermediate drivers */
5004
5005NDISAPI
5006VOID
5007NTAPI
5008NdisIMAssociateMiniport(
5009  IN NDIS_HANDLE  DriverHandle,
5010  IN NDIS_HANDLE  ProtocolHandle);
5011
5012NDISAPI
5013NDIS_STATUS
5014NTAPI
5015NdisIMCancelInitializeDeviceInstance(
5016  IN NDIS_HANDLE  DriverHandle,
5017  IN PNDIS_STRING  DeviceInstance);
5018
5019NDISAPI
5020VOID
5021NTAPI
5022NdisIMCopySendCompletePerPacketInfo(
5023  IN PNDIS_PACKET  DstPacket,
5024  IN PNDIS_PACKET  SrcPacket);
5025
5026NDISAPI
5027VOID
5028NTAPI
5029NdisIMCopySendPerPacketInfo(
5030  IN PNDIS_PACKET  DstPacket,
5031  IN PNDIS_PACKET  SrcPacket);
5032
5033NDISAPI
5034VOID
5035NTAPI
5036NdisIMDeregisterLayeredMiniport(
5037  IN NDIS_HANDLE  DriverHandle);
5038
5039NDISAPI
5040NDIS_HANDLE
5041NTAPI
5042NdisIMGetBindingContext(
5043  IN NDIS_HANDLE  NdisBindingHandle);
5044
5045NDISAPI
5046NDIS_HANDLE
5047NTAPI
5048NdisIMGetDeviceContext(
5049  IN NDIS_HANDLE  MiniportAdapterHandle);
5050
5051NDISAPI
5052NDIS_STATUS
5053NTAPI
5054NdisIMInitializeDeviceInstanceEx(
5055  IN NDIS_HANDLE  DriverHandle,
5056  IN PNDIS_STRING  DriverInstance,
5057  IN NDIS_HANDLE  DeviceContext  OPTIONAL);
5058
5059/*
5060NDISAPI
5061PSINGLE_LIST_ENTRY
5062NTAPI
5063NdisInterlockedPopEntrySList(
5064  IN PSLIST_HEADER ListHead,
5065  IN PKSPIN_LOCK Lock);
5066*/
5067#define NdisInterlockedPopEntrySList(SListHead, Lock) \
5068  ExInterlockedPopEntrySList(SListHead, &(Lock)->SpinLock)
5069
5070/*
5071NDISAPI
5072PSINGLE_LIST_ENTRY
5073NTAPI
5074NdisInterlockedPushEntrySList(
5075  IN PSLIST_HEADER ListHead,
5076  IN PSINGLE_LIST_ENTRY ListEntry,
5077  IN PKSPIN_LOCK Lock);
5078*/
5079#define NdisInterlockedPushEntrySList(SListHead, SListEntry, Lock) \
5080  ExInterlockedPushEntrySList(SListHead, SListEntry, &(Lock)->SpinLock)
5081
5082#define NdisInterlockedFlushSList(SListHead) ExInterlockedFlushSList(SListHead)
5083
5084/*
5085NDISAPI
5086VOID
5087NTAPI
5088NdisQueryBufferSafe(
5089  IN PNDIS_BUFFER Buffer,
5090  OUT PVOID *VirtualAddress OPTIONAL,
5091  OUT PUINT Length,
5092  IN UINT Priority);
5093*/
5094#define NdisQueryBufferSafe(_Buffer, _VirtualAddress, _Length, _Priority) {         \
5095  if (ARGUMENT_PRESENT(_VirtualAddress)) {                                          \
5096    *(PVOID *)(_VirtualAddress) = MmGetSystemAddressForMdlSafe(_Buffer, _Priority); \
5097  }                                                                                 \
5098  *(_Length) = MmGetMdlByteCount(_Buffer);                                          \
5099}
5100
5101/* Routines for NDIS miniport drivers */
5102
5103#if NDIS_SUPPORT_NDIS6
5104
5105NDISAPI
5106PNDIS_GENERIC_OBJECT
5107NTAPI
5108NdisAllocateGenericObject(
5109  PDRIVER_OBJECT DriverObject OPTIONAL,
5110  ULONG Tag,
5111  USHORT Size);
5112
5113NDISAPI
5114VOID
5115NTAPI
5116NdisFreeGenericObject(
5117  IN PNDIS_GENERIC_OBJECT NdisObject);
5118
5119#endif /* NDIS_SUPPORT_NDIS6 */
5120
5121NDISAPI
5122VOID
5123NTAPI
5124NdisInitializeWrapper(
5125  OUT PNDIS_HANDLE  NdisWrapperHandle,
5126  IN PVOID  SystemSpecific1,
5127  IN PVOID  SystemSpecific2,
5128  IN PVOID  SystemSpecific3);
5129
5130NDISAPI
5131NDIS_STATUS
5132NTAPI
5133NdisMAllocateMapRegisters(
5134  IN NDIS_HANDLE  MiniportAdapterHandle,
5135  IN UINT  DmaChannel,
5136  IN NDIS_DMA_SIZE  DmaSize,
5137  IN ULONG  PhysicalMapRegistersNeeded,
5138  IN ULONG  MaximumPhysicalMapping);
5139
5140/*
5141 * VOID
5142 * NdisMArcIndicateReceive(
5143 *   IN NDIS_HANDLE  MiniportAdapterHandle,
5144 *   IN PUCHAR  HeaderBuffer,
5145 *   IN PUCHAR  DataBuffer,
5146 *   IN UINT  Length);
5147 */
5148#define NdisMArcIndicateReceive(MiniportAdapterHandle, \
5149                                HeaderBuffer,          \
5150                                DataBuffer,            \
5151                                Length)                \
5152{                                                      \
5153    ArcFilterDprIndicateReceive(                       \
5154        (((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->ArcDB), \
5155        (HeaderBuffer), \
5156        (DataBuffer),   \
5157        (Length));      \
5158}
5159
5160/*
5161 * VOID
5162 * NdisMArcIndicateReceiveComplete(
5163 *   IN NDIS_HANDLE  MiniportAdapterHandle);
5164 */
5165#define NdisMArcIndicateReceiveComplete(MiniportAdapterHandle) \
5166{                                                              \
5167    if (((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->EthDB)  \
5168	    {                                                        \
5169	        NdisMEthIndicateReceiveComplete(_H);                 \
5170	    }                                                        \
5171                                                               \
5172    ArcFilterDprIndicateReceiveComplete(                       \
5173      ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->ArcDB);   \
5174}
5175
5176NDISAPI
5177VOID
5178NTAPI
5179NdisMCloseLog(
5180  IN NDIS_HANDLE  LogHandle);
5181
5182NDISAPI
5183NDIS_STATUS
5184NTAPI
5185NdisMCreateLog(
5186  IN NDIS_HANDLE  MiniportAdapterHandle,
5187  IN UINT  Size,
5188  OUT PNDIS_HANDLE  LogHandle);
5189
5190NDISAPI
5191VOID
5192NTAPI
5193NdisMDeregisterAdapterShutdownHandler(
5194  IN NDIS_HANDLE  MiniportHandle);
5195
5196#if NDIS_LEGACY_MINIPORT
5197
5198NDISAPI
5199VOID
5200NTAPI
5201NdisMDeregisterInterrupt(
5202  IN PNDIS_MINIPORT_INTERRUPT Interrupt);
5203
5204NDISAPI
5205VOID
5206NTAPI
5207NdisMRegisterAdapterShutdownHandler(
5208  IN NDIS_HANDLE MiniportHandle,
5209  IN PVOID ShutdownContext,
5210  IN ADAPTER_SHUTDOWN_HANDLER ShutdownHandler);
5211
5212NDISAPI
5213NDIS_STATUS
5214NTAPI
5215NdisMRegisterInterrupt(
5216  OUT PNDIS_MINIPORT_INTERRUPT Interrupt,
5217  IN NDIS_HANDLE MiniportAdapterHandle,
5218  IN UINT InterruptVector,
5219  IN UINT InterruptLevel,
5220  IN BOOLEAN RequestIsr,
5221  IN BOOLEAN SharedInterrupt,
5222  IN NDIS_INTERRUPT_MODE InterruptMode);
5223
5224NDISAPI
5225NDIS_STATUS
5226NTAPI
5227NdisMRegisterMiniport(
5228  IN NDIS_HANDLE NdisWrapperHandle,
5229  IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics,
5230  IN UINT CharacteristicsLength);
5231
5232NDISAPI
5233BOOLEAN
5234NTAPI
5235NdisMSynchronizeWithInterrupt(
5236  IN PNDIS_MINIPORT_INTERRUPT Interrupt,
5237  IN PVOID SynchronizeFunction,
5238  IN PVOID SynchronizeContext);
5239#endif /* NDIS_LEGACY_MINIPORT */
5240
5241NDISAPI
5242VOID
5243NTAPI
5244NdisMDeregisterIoPortRange(
5245  IN NDIS_HANDLE  MiniportAdapterHandle,
5246  IN UINT  InitialPort,
5247  IN UINT  NumberOfPorts,
5248  IN PVOID  PortOffset);
5249
5250/*
5251 * VOID
5252 * NdisMEthIndicateReceive(
5253 *   IN NDIS_HANDLE  MiniportAdapterHandle,
5254 *   IN NDIS_HANDLE  MiniportReceiveContext,
5255 *   IN PVOID  HeaderBuffer,
5256 *   IN UINT  HeaderBufferSize,
5257 *   IN PVOID  LookaheadBuffer,
5258 *   IN UINT  LookaheadBufferSize,
5259 *   IN UINT  PacketSize);
5260 */
5261#define NdisMEthIndicateReceive(MiniportAdapterHandle,  \
5262                                MiniportReceiveContext, \
5263                                HeaderBuffer,           \
5264                                HeaderBufferSize,       \
5265                                LookaheadBuffer,        \
5266                                LookaheadBufferSize,    \
5267                                PacketSize)             \
5268{                                                       \
5269    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->EthRxIndicateHandler)( \
5270		((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->EthDB,  \
5271		(MiniportReceiveContext), \
5272		(HeaderBuffer),           \
5273		(HeaderBuffer),           \
5274		(HeaderBufferSize),       \
5275		(LookaheadBuffer),        \
5276		(LookaheadBufferSize),    \
5277		(PacketSize));            \
5278}
5279
5280/*
5281 * VOID
5282 * NdisMEthIndicateReceiveComplete(
5283 *   IN NDIS_HANDLE MiniportAdapterHandle);
5284 */
5285#define NdisMEthIndicateReceiveComplete(MiniportAdapterHandle) \
5286{                                                              \
5287    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->EthRxCompleteHandler)( \
5288        ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->EthDB);    \
5289}
5290
5291/*
5292 * VOID
5293 * NdisMFddiIndicateReceive(
5294 *   IN NDIS_HANDLE  MiniportAdapterHandle,
5295 *   IN NDIS_HANDLE  MiniportReceiveContext,
5296 *   IN PVOID  HeaderBuffer,
5297 *   IN UINT  HeaderBufferSize,
5298 *   IN PVOID  LookaheadBuffer,
5299 *   IN UINT  LookaheadBufferSize,
5300 *   IN UINT  PacketSize);
5301 */
5302#define NdisMFddiIndicateReceive(MiniportAdapterHandle,  \
5303                                 MiniportReceiveContext, \
5304                                 HeaderBuffer,           \
5305                                 HeaderBufferSize,       \
5306                                 LookaheadBuffer,        \
5307                                 LookaheadBufferSize,    \
5308                                 PacketSize)             \
5309{                                                        \
5310    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FddiRxIndicateHandler)( \
5311        (((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FddiDB),   \
5312        (MiniportReceiveContext),              \
5313        (PUCHAR)(HeaderBuffer) + 1,            \
5314        (((*(PUCHAR*)(HeaderBuffer)) & 0x40) ? \
5315            FDDI_LENGTH_OF_LONG_ADDRESS :      \
5316		    FDDI_LENGTH_OF_SHORT_ADDRESS),     \
5317        (HeaderBuffer),                        \
5318        (HeaderBufferSize),                    \
5319        (LookaheadBuffer),                     \
5320        (LookaheadBufferSize),                 \
5321        (PacketSize));                         \
5322}
5323
5324
5325
5326/*
5327 * VOID
5328 * NdisMFddiIndicateReceiveComplete(
5329 *   IN NDIS_HANDLE  MiniportAdapterHandle);
5330 */
5331#define NdisMFddiIndicateReceiveComplete(MiniportAdapterHandle) \
5332{                                                               \
5333    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->FddiRxCompleteHandler)( \
5334        ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->FddiDB);      \
5335}
5336
5337NDISAPI
5338VOID
5339NTAPI
5340NdisMFlushLog(
5341  IN NDIS_HANDLE  LogHandle);
5342
5343NDISAPI
5344VOID
5345NTAPI
5346NdisMFreeMapRegisters(
5347  IN NDIS_HANDLE  MiniportAdapterHandle);
5348
5349/*
5350 * VOID
5351 * EXPORT
5352 * NdisMIndicateReceivePacket(
5353 *  IN NDIS_HANDLE  MiniportAdapterHandle,
5354 *  IN PPNDIS_PACKET  ReceivePackets,
5355 *  IN UINT  NumberOfPackets);
5356 */
5357#define NdisMIndicateReceivePacket(MiniportAdapterHandle, \
5358  ReceivePackets, NumberOfPackets)                        \
5359  (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->PacketIndicateHandler)( \
5360  MiniportAdapterHandle, ReceivePackets, NumberOfPackets)
5361
5362/*
5363 * VOID
5364 * NdisMIndicateStatus(
5365 *  IN NDIS_HANDLE  MiniportAdapterHandle,
5366 *  IN NDIS_STATUS  GeneralStatus,
5367 *  IN PVOID  StatusBuffer,
5368 *  IN UINT  StatusBufferSize);
5369 */
5370
5371#define NdisMIndicateStatus(MiniportAdapterHandle,  \
5372   GeneralStatus, StatusBuffer, StatusBufferSize)   \
5373  (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->StatusHandler)(   \
5374  MiniportAdapterHandle, GeneralStatus, StatusBuffer, StatusBufferSize)
5375
5376/*
5377 * VOID
5378 * NdisMIndicateStatusComplete(
5379 *   IN NDIS_HANDLE  MiniportAdapterHandle);
5380 */
5381#define NdisMIndicateStatusComplete(MiniportAdapterHandle) \
5382  (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->StatusCompleteHandler)( \
5383    MiniportAdapterHandle)
5384
5385/*
5386 * VOID
5387 * NdisMInitializeWrapper(
5388 *   OUT PNDIS_HANDLE  NdisWrapperHandle,
5389 *   IN PVOID  SystemSpecific1,
5390 *   IN PVOID  SystemSpecific2,
5391 *   IN PVOID  SystemSpecific3);
5392 */
5393#define NdisMInitializeWrapper(NdisWrapperHandle, \
5394                               SystemSpecific1,   \
5395                               SystemSpecific2,   \
5396                               SystemSpecific3)   \
5397    NdisInitializeWrapper((NdisWrapperHandle),    \
5398                          (SystemSpecific1),      \
5399                          (SystemSpecific2),      \
5400                          (SystemSpecific3))
5401
5402NDISAPI
5403NDIS_STATUS
5404NTAPI
5405NdisMMapIoSpace(
5406  OUT PVOID  *VirtualAddress,
5407  IN NDIS_HANDLE  MiniportAdapterHandle,
5408  IN NDIS_PHYSICAL_ADDRESS  PhysicalAddress,
5409  IN UINT  Length);
5410
5411/*
5412 * VOID
5413 * NdisMQueryInformationComplete(
5414 *  IN NDIS_HANDLE  MiniportAdapterHandle,
5415 *  IN NDIS_STATUS  Status);
5416 */
5417#define NdisMQueryInformationComplete(MiniportAdapterHandle, Status) \
5418  (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->QueryCompleteHandler)(MiniportAdapterHandle, Status)
5419
5420NDISAPI
5421NDIS_STATUS
5422NTAPI
5423NdisMRegisterIoPortRange(
5424  OUT PVOID  *PortOffset,
5425  IN NDIS_HANDLE  MiniportAdapterHandle,
5426  IN UINT  InitialPort,
5427  IN UINT  NumberOfPorts);
5428
5429NDISAPI
5430VOID
5431NTAPI
5432NdisMSetTimer(
5433  IN PNDIS_MINIPORT_TIMER  Timer,
5434  IN UINT  MillisecondsToDelay);
5435
5436NDISAPI
5437VOID
5438NTAPI
5439NdisMInitializeTimer(
5440  IN OUT PNDIS_MINIPORT_TIMER Timer,
5441  IN NDIS_HANDLE MiniportAdapterHandle,
5442  IN PNDIS_TIMER_FUNCTION TimerFunction,
5443  IN PVOID FunctionContext);
5444
5445NDISAPI
5446VOID
5447NTAPI
5448NdisMSetPeriodicTimer(
5449  IN PNDIS_MINIPORT_TIMER Timer,
5450  IN UINT MillisecondPeriod);
5451
5452NDISAPI
5453VOID
5454NTAPI
5455NdisMCancelTimer(
5456  IN PNDIS_MINIPORT_TIMER Timer,
5457  OUT PBOOLEAN TimerCancelled);
5458
5459#if !defined(NDIS_WRAPPER)
5460
5461/*
5462 * VOID
5463 * NdisMResetComplete(
5464 *   IN NDIS_HANDLE  MiniportAdapterHandle,
5465 *   IN NDIS_STATUS  Status,
5466 *   IN BOOLEAN  AddressingReset);
5467 */
5468#define	NdisMResetComplete(MiniportAdapterHandle, \
5469                           Status,                \
5470                           AddressingReset)       \
5471{                                                 \
5472    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->ResetCompleteHandler)( \
5473        MiniportAdapterHandle, Status, AddressingReset); \
5474}
5475
5476/*
5477 * VOID
5478 * NdisMSendComplete(
5479 *   IN NDIS_HANDLE  MiniportAdapterHandle,
5480 *   IN PNDIS_PACKET  Packet,
5481 *   IN NDIS_STATUS  Status);
5482 */
5483#define	NdisMSendComplete(MiniportAdapterHandle, \
5484                          Packet,                \
5485                          Status)                \
5486{                                                \
5487    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->SendCompleteHandler)( \
5488        MiniportAdapterHandle, Packet, Status);  \
5489}
5490
5491/*
5492 * VOID
5493 * NdisMSendResourcesAvailable(
5494 *   IN NDIS_HANDLE  MiniportAdapterHandle);
5495 */
5496#define	NdisMSendResourcesAvailable(MiniportAdapterHandle) \
5497{                                                \
5498    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->SendResourcesHandler)( \
5499        MiniportAdapterHandle); \
5500}
5501
5502/*
5503 * VOID
5504 * NdisMTransferDataComplete(
5505 *   IN NDIS_HANDLE  MiniportAdapterHandle,
5506 *   IN PNDIS_PACKET  Packet,
5507 *   IN NDIS_STATUS  Status,
5508 *   IN UINT  BytesTransferred);
5509 */
5510#define	NdisMTransferDataComplete(MiniportAdapterHandle, \
5511                                  Packet,                \
5512                                  Status,                \
5513                                  BytesTransferred)      \
5514{                                                        \
5515    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->TDCompleteHandler)( \
5516        MiniportAdapterHandle, Packet, Status, BytesTransferred)           \
5517}
5518
5519#endif /* !_NDIS_ */
5520
5521
5522/*
5523 * VOID
5524 * NdisMSetAttributes(
5525 *  IN NDIS_HANDLE  MiniportAdapterHandle,
5526 *  IN NDIS_HANDLE  MiniportAdapterContext,
5527 *  IN BOOLEAN  BusMaster,
5528 *  IN NDIS_INTERFACE_TYPE  AdapterType);
5529 */
5530#define NdisMSetAttributes(MiniportAdapterHandle,   \
5531                           MiniportAdapterContext,  \
5532                           BusMaster,               \
5533                           AdapterType)             \
5534  NdisMSetAttributesEx(MiniportAdapterHandle,       \
5535    MiniportAdapterContext,                         \
5536    0,                                              \
5537    (BusMaster) ? NDIS_ATTRIBUTE_BUS_MASTER : 0,    \
5538    AdapterType)
5539
5540NDISAPI
5541VOID
5542NTAPI
5543NdisMSetAttributesEx(
5544  IN NDIS_HANDLE  MiniportAdapterHandle,
5545  IN NDIS_HANDLE  MiniportAdapterContext,
5546  IN UINT  CheckForHangTimeInSeconds   OPTIONAL,
5547  IN ULONG  AttributeFlags,
5548  IN NDIS_INTERFACE_TYPE AdapterType);
5549
5550/*
5551 * VOID
5552 * NdisMSetInformationComplete(
5553 *   IN NDIS_HANDLE  MiniportAdapterHandle,
5554 *   IN NDIS_STATUS  Status);
5555 */
5556#define NdisMSetInformationComplete(MiniportAdapterHandle, \
5557                                    Status) \
5558  (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->SetCompleteHandler)( \
5559    MiniportAdapterHandle, Status)
5560
5561NDISAPI
5562VOID
5563NTAPI
5564NdisMSleep(
5565  IN ULONG  MicrosecondsToSleep);
5566
5567/*
5568 * VOID
5569 * NdisMTrIndicateReceive(
5570 *   IN NDIS_HANDLE  MiniportAdapterHandle,
5571 *   IN NDIS_HANDLE  MiniportReceiveContext,
5572 *   IN PVOID  HeaderBuffer,
5573 *   IN UINT  HeaderBufferSize,
5574 *   IN PVOID  LookaheadBuffer,
5575 *   IN UINT  LookaheadBufferSize,
5576 *   IN UINT  PacketSize);
5577 */
5578#define NdisMTrIndicateReceive(MiniportAdapterHandle,  \
5579                               MiniportReceiveContext, \
5580                               HeaderBuffer,           \
5581                               HeaderBufferSize,       \
5582                               LookaheadBuffer,        \
5583                               LookaheadBufferSize,    \
5584                               PacketSize)             \
5585{                                                      \
5586    (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->TrRxIndicateHandler)( \
5587      (((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->TrDB),     \
5588		(MiniportReceiveContext), \
5589		(HeaderBuffer),           \
5590		(HeaderBuffer),           \
5591		(HeaderBufferSize),       \
5592		(LookaheadBuffer),        \
5593		(LookaheadBufferSize),    \
5594		(PacketSize));            \
5595}
5596
5597/*
5598 * VOID
5599 * NdisMTrIndicateReceiveComplete(
5600 *   IN NDIS_HANDLE  MiniportAdapterHandle);
5601 */
5602#define NdisMTrIndicateReceiveComplete(MiniportAdapterHandle) \
5603{                                                             \
5604	(*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->TrRxCompleteHandler)( \
5605    ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->TrDB);    \
5606}
5607
5608NDISAPI
5609NDIS_STATUS
5610NTAPI
5611NdisMWriteLogData(
5612  IN NDIS_HANDLE  LogHandle,
5613  IN PVOID  LogBuffer,
5614  IN UINT  LogBufferSize);
5615
5616NDISAPI
5617VOID
5618NTAPI
5619NdisMQueryAdapterResources(
5620  OUT PNDIS_STATUS  Status,
5621  IN NDIS_HANDLE  WrapperConfigurationContext,
5622  OUT PNDIS_RESOURCE_LIST  ResourceList,
5623  IN OUT PUINT  BufferSize);
5624
5625NDISAPI
5626VOID
5627NTAPI
5628NdisTerminateWrapper(
5629  IN NDIS_HANDLE  NdisWrapperHandle,
5630  IN PVOID  SystemSpecific);
5631
5632NDISAPI
5633VOID
5634NTAPI
5635NdisMUnmapIoSpace(
5636  IN NDIS_HANDLE  MiniportAdapterHandle,
5637  IN PVOID  VirtualAddress,
5638  IN UINT  Length);
5639
5640/* Event functions */
5641
5642NDISAPI
5643VOID
5644NTAPI
5645NdisInitializeEvent(
5646  OUT PNDIS_EVENT Event);
5647
5648NDISAPI
5649VOID
5650NTAPI
5651NdisSetEvent(
5652  IN PNDIS_EVENT Event);
5653
5654NDISAPI
5655VOID
5656NTAPI
5657NdisResetEvent(
5658  IN PNDIS_EVENT Event);
5659
5660NDISAPI
5661BOOLEAN
5662NTAPI
5663NdisWaitEvent(
5664  IN PNDIS_EVENT Event,
5665  IN UINT MsToWait);
5666
5667/* NDIS intermediate miniport structures */
5668
5669typedef VOID (NTAPI *W_MINIPORT_CALLBACK)(
5670  IN NDIS_HANDLE  MiniportAdapterContext,
5671  IN PVOID  CallbackContext);
5672
5673/* Routines for intermediate miniport drivers */
5674
5675NDISAPI
5676NDIS_STATUS
5677NTAPI
5678NdisIMDeInitializeDeviceInstance(
5679  IN NDIS_HANDLE NdisMiniportHandle);
5680
5681/*
5682 * NDIS_STATUS
5683 * NdisIMInitializeDeviceInstance(
5684 *   IN NDIS_HANDLE  DriverHandle,
5685 *   IN PNDIS_STRING  DeviceInstance);
5686 */
5687#define NdisIMInitializeDeviceInstance(DriverHandle, DeviceInstance) \
5688  NdisIMInitializeDeviceInstanceEx(DriverHandle, DeviceInstance, NULL)
5689
5690/* Functions obsoleted by NDIS 5.0 */
5691
5692NDISAPI
5693VOID
5694NTAPI
5695NdisFreeDmaChannel(
5696  IN PNDIS_HANDLE  NdisDmaHandle);
5697
5698NDISAPI
5699VOID
5700NTAPI
5701NdisSetupDmaTransfer(
5702  OUT PNDIS_STATUS  Status,
5703  IN PNDIS_HANDLE  NdisDmaHandle,
5704  IN PNDIS_BUFFER  Buffer,
5705  IN ULONG  Offset,
5706  IN ULONG  Length,
5707  IN BOOLEAN  WriteToDevice);
5708
5709/*
5710NDISAPI
5711NTSTATUS
5712NTAPI
5713NdisUpcaseUnicodeString(
5714  OUT PUNICODE_STRING DestinationString,
5715  IN PUNICODE_STRING SourceString);
5716*/
5717#define NdisUpcaseUnicodeString(_d, _s) RtlUpcaseUnicodeString(_d, _s, FALSE)
5718
5719
5720/* Routines for NDIS protocol drivers */
5721
5722#if NDIS_LEGACY_PROTOCOL
5723
5724NDISAPI
5725NDIS_STATUS
5726NTAPI
5727NdisIMRegisterLayeredMiniport(
5728  IN NDIS_HANDLE NdisWrapperHandle,
5729  IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics,
5730  IN UINT CharacteristicsLength,
5731  OUT PNDIS_HANDLE DriverHandle);
5732
5733NDISAPI
5734VOID
5735NTAPI
5736NdisTransferData(
5737  OUT PNDIS_STATUS Status,
5738  IN NDIS_HANDLE NdisBindingHandle,
5739  IN NDIS_HANDLE MacReceiveContext,
5740  IN UINT ByteOffset,
5741  IN UINT BytesToTransfer,
5742  IN OUT PNDIS_PACKET Packet,
5743  OUT PUINT BytesTransferred);
5744
5745NDISAPI
5746VOID
5747NTAPI
5748NdisSend(
5749  OUT PNDIS_STATUS Status,
5750  IN NDIS_HANDLE NdisBindingHandle,
5751  IN PNDIS_PACKET Packet);
5752
5753NDISAPI
5754VOID
5755NTAPI
5756NdisSendPackets(
5757  IN NDIS_HANDLE NdisBindingHandle,
5758  IN PPNDIS_PACKET PacketArray,
5759  IN UINT NumberOfPackets);
5760
5761NDISAPI
5762VOID
5763NTAPI
5764NdisRequest(
5765  OUT PNDIS_STATUS Status,
5766  IN NDIS_HANDLE NdisBindingHandle,
5767  IN PNDIS_REQUEST NdisRequest);
5768
5769NDISAPI
5770VOID
5771NTAPI
5772NdisReset(
5773  OUT PNDIS_STATUS Status,
5774  IN NDIS_HANDLE NdisBindingHandle);
5775
5776NDISAPI
5777VOID
5778NTAPI
5779NdisDeregisterProtocol(
5780  OUT PNDIS_STATUS Status,
5781  IN NDIS_HANDLE NdisProtocolHandle);
5782
5783NDISAPI
5784VOID
5785NTAPI
5786NdisOpenAdapter(
5787  OUT PNDIS_STATUS Status,
5788  OUT PNDIS_STATUS OpenErrorStatus,
5789  OUT PNDIS_HANDLE NdisBindingHandle,
5790  OUT PUINT SelectedMediumIndex,
5791  IN PNDIS_MEDIUM MediumArray,
5792  IN UINT MediumArraySize,
5793  IN NDIS_HANDLE NdisProtocolHandle,
5794  IN NDIS_HANDLE ProtocolBindingContext,
5795  IN PNDIS_STRING AdapterName,
5796  IN UINT OpenOptions,
5797  IN PSTRING AddressingInformation OPTIONAL);
5798
5799NDISAPI
5800VOID
5801NTAPI
5802NdisCloseAdapter(
5803  OUT PNDIS_STATUS Status,
5804  IN NDIS_HANDLE NdisBindingHandle);
5805
5806NDISAPI
5807VOID
5808NTAPI
5809NdisCompleteBindAdapter(
5810  IN NDIS_HANDLE BindAdapterContext,
5811  IN NDIS_STATUS Status,
5812  IN NDIS_STATUS OpenStatus);
5813
5814NDISAPI
5815VOID
5816NTAPI
5817NdisCompleteUnbindAdapter(
5818  IN NDIS_HANDLE UnbindAdapterContext,
5819  IN NDIS_STATUS Status);
5820
5821NDISAPI
5822VOID
5823NTAPI
5824NdisSetProtocolFilter(
5825  OUT PNDIS_STATUS Status,
5826  IN NDIS_HANDLE NdisBindingHandle,
5827  IN RECEIVE_HANDLER ReceiveHandler,
5828  IN RECEIVE_PACKET_HANDLER ReceivePacketHandler,
5829  IN NDIS_MEDIUM Medium,
5830  IN UINT Offset,
5831  IN UINT Size,
5832  IN PUCHAR Pattern);
5833
5834NDISAPI
5835VOID
5836NTAPI
5837NdisGetDriverHandle(
5838  IN PNDIS_HANDLE NdisBindingHandle,
5839  OUT PNDIS_HANDLE NdisDriverHandle);
5840
5841NDISAPI
5842VOID
5843NTAPI
5844NdisOpenProtocolConfiguration(
5845  OUT PNDIS_STATUS Status,
5846  OUT PNDIS_HANDLE ConfigurationHandle,
5847  IN PNDIS_STRING ProtocolSection);
5848
5849NDISAPI
5850VOID
5851NTAPI
5852NdisCompletePnPEvent(
5853  IN NDIS_STATUS Status,
5854  IN NDIS_HANDLE NdisBindingHandle,
5855  IN PNET_PNP_EVENT NetPnPEvent);
5856
5857/*
5858 * VOID
5859 * NdisSetSendFlags(
5860 *   IN PNDIS_PACKET Packet,
5861 *   IN UINT Flags);
5862 */
5863#define NdisSetSendFlags(_Packet,_Flags)(_Packet)->Private.Flags = (_Flags)
5864
5865#define NdisQuerySendFlags(_Packet,_Flags) *(_Flags) = (_Packet)->Private.Flags
5866
5867NDISAPI
5868VOID
5869NTAPI
5870NdisReturnPackets(
5871  IN PNDIS_PACKET *PacketsToReturn,
5872  IN UINT NumberOfPackets);
5873
5874NDISAPI
5875PNDIS_PACKET
5876NTAPI
5877NdisGetReceivedPacket(
5878  IN PNDIS_HANDLE NdisBindingHandle,
5879  IN PNDIS_HANDLE MacContext);
5880
5881NDISAPI
5882VOID
5883NTAPI
5884NdisCancelSendPackets(
5885  IN NDIS_HANDLE NdisBindingHandle,
5886  IN PVOID CancelId);
5887
5888NDISAPI
5889NDIS_STATUS
5890NTAPI
5891NdisQueryPendingIOCount(
5892  IN PVOID NdisBindingHandle,
5893  OUT PULONG IoCount);
5894
5895NDISAPI
5896VOID
5897NTAPI
5898NdisRegisterProtocol(
5899  OUT PNDIS_STATUS Status,
5900  OUT PNDIS_HANDLE NdisProtocolHandle,
5901  IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics,
5902  IN UINT CharacteristicsLength);
5903
5904#endif /* NDIS_LEGACY_PROTOCOL */
5905
5906NDISAPI
5907UCHAR
5908NTAPI
5909NdisGeneratePartialCancelId(VOID);
5910
5911NDISAPI
5912VOID
5913NTAPI
5914NdisReEnumerateProtocolBindings(
5915  IN NDIS_HANDLE NdisProtocolHandle);
5916
5917NDISAPI
5918VOID
5919NTAPI
5920NdisRegisterTdiCallBack(
5921  IN TDI_REGISTER_CALLBACK RegisterCallback,
5922  IN TDI_PNP_HANDLER PnPHandler);
5923
5924NDISAPI
5925VOID
5926NTAPI
5927NdisDeregisterTdiCallBack(VOID);
5928
5929/* Obsoleted in Windows XP */
5930
5931/* Prototypes for NDIS_MAC_CHARACTERISTICS */
5932
5933typedef NDIS_STATUS (*OPEN_ADAPTER_HANDLER)(
5934  OUT PNDIS_STATUS  OpenErrorStatus,
5935  OUT NDIS_HANDLE  *MacBindingHandle,
5936  OUT PUINT  SelectedMediumIndex,
5937  IN PNDIS_MEDIUM  MediumArray,
5938  IN UINT  MediumArraySize,
5939  IN NDIS_HANDLE  NdisBindingContext,
5940  IN NDIS_HANDLE  MacAdapterContext,
5941  IN UINT  OpenOptions,
5942  IN PSTRING  AddressingInformation  OPTIONAL);
5943
5944typedef NDIS_STATUS (NTAPI *CLOSE_ADAPTER_HANDLER)(
5945  IN NDIS_HANDLE  MacBindingHandle);
5946
5947typedef NDIS_STATUS (NTAPI *WAN_TRANSFER_DATA_HANDLER)(
5948  VOID);
5949
5950typedef NDIS_STATUS (NTAPI *QUERY_GLOBAL_STATISTICS_HANDLER)(
5951  IN NDIS_HANDLE  MacAdapterContext,
5952  IN PNDIS_REQUEST  NdisRequest);
5953
5954typedef VOID (NTAPI *UNLOAD_MAC_HANDLER)(
5955  IN NDIS_HANDLE  MacMacContext);
5956
5957typedef NDIS_STATUS (NTAPI *ADD_ADAPTER_HANDLER)(
5958  IN NDIS_HANDLE  MacMacContext,
5959  IN NDIS_HANDLE  WrapperConfigurationContext,
5960  IN PNDIS_STRING  AdapterName);
5961
5962typedef VOID (*REMOVE_ADAPTER_HANDLER)(
5963  IN NDIS_HANDLE  MacAdapterContext);
5964
5965typedef struct _NDIS_MAC_CHARACTERISTICS {
5966  UCHAR  MajorNdisVersion;
5967  UCHAR  MinorNdisVersion;
5968  USHORT  Filler;
5969  UINT  Reserved;
5970  OPEN_ADAPTER_HANDLER  OpenAdapterHandler;
5971  CLOSE_ADAPTER_HANDLER  CloseAdapterHandler;
5972  SEND_HANDLER  SendHandler;
5973  TRANSFER_DATA_HANDLER  TransferDataHandler;
5974  RESET_HANDLER  ResetHandler;
5975  REQUEST_HANDLER  RequestHandler;
5976  QUERY_GLOBAL_STATISTICS_HANDLER  QueryGlobalStatisticsHandler;
5977  UNLOAD_MAC_HANDLER  UnloadMacHandler;
5978  ADD_ADAPTER_HANDLER  AddAdapterHandler;
5979  REMOVE_ADAPTER_HANDLER  RemoveAdapterHandler;
5980  NDIS_STRING  Name;
5981} NDIS_MAC_CHARACTERISTICS, *PNDIS_MAC_CHARACTERISTICS;
5982
5983typedef	NDIS_MAC_CHARACTERISTICS        NDIS_WAN_MAC_CHARACTERISTICS;
5984typedef	NDIS_WAN_MAC_CHARACTERISTICS    *PNDIS_WAN_MAC_CHARACTERISTICS;
5985
5986#ifdef __cplusplus
5987}
5988#endif
5989
5990#endif /* _NDIS_ */
5991
5992/* EOF */
5993