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