OSDN Git Service

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