OSDN Git Service

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