OSDN Git Service

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