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