update for HEAD-2003091401
[reactos.git] / include / net / tdi.h
1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS TDI library
4  * FILE:        include/net/tdi.h
5  * PURPOSE:     TDI definitions for user mode clients
6  */
7 #ifndef __TDI_H
8 #define __TDI_H
9
10 /* FIXME: Missed some definitions in ntddk.h */
11
12 /* Could be defined elsewhere 
13  * #ifndef INT
14  * typedef signed int INT, *PINT;
15  * #endif
16  */
17
18
19 /* Basic types */
20
21 typedef LONG    TDI_STATUS;
22 typedef PVOID   CONNECTION_CONTEXT;
23
24
25
26 /* TDI status codes */
27
28 #define TDI_SUCCESS             STATUS_SUCCESS
29 #define TDI_NO_RESOURCES        STATUS_INSUFFICIENT_RESOURCES
30 #define TDI_ADDR_IN_USE         STATUS_ADDRESS_ALREADY_EXISTS
31 #define TDI_BAD_ADDR            STATUS_INVALID_ADDRESS_COMPONENT
32 #define TDI_NO_FREE_ADDR        STATUS_TOO_MANY_ADDRESSES
33 #define TDI_ADDR_INVALID        STATUS_INVALID_ADDRESS
34 #define TDI_ADDR_DELETED        STATUS_ADDRESS_CLOSED
35 #define TDI_BUFFER_OVERFLOW     STATUS_BUFFER_OVERFLOW
36 #define TDI_BAD_EVENT_TYPE      STATUS_INVALID_PARAMETER
37 #define TDI_BAD_OPTION          STATUS_INVALID_PARAMETER
38 #define TDI_CONN_REFUSED        STATUS_CONNECTION_REFUSED
39 #define TDI_INVALID_CONNECTION  STATUS_CONNECTION_INVALID
40 #define TDI_ALREADY_ASSOCIATED  STATUS_ADDRESS_ALREADY_ASSOCIATED
41 #define TDI_NOT_ASSOCIATED      STATUS_ADDRESS_NOT_ASSOCIATED
42 #define TDI_CONNECTION_ACTIVE   STATUS_CONNECTION_ACTIVE
43 #define TDI_CONNECTION_ABORTED  STATUS_CONNECTION_ABORTED
44 #define TDI_CONNECTION_RESET    STATUS_CONNECTION_RESET
45 #define TDI_TIMED_OUT           STATUS_IO_TIMEOUT
46 #define TDI_GRACEFUL_DISC       STATUS_GRACEFUL_DISCONNECT
47 #define TDI_NOT_ACCEPTED        STATUS_DATA_NOT_ACCEPTED
48 #define TDI_MORE_PROCESSING     STATUS_MORE_PROCESSING_REQUIRED
49 #define TDI_INVALID_STATE       STATUS_INVALID_DEVICE_STATE
50 #define TDI_INVALID_PARAMETER   STATUS_INVALID_PARAMETER
51 #define TDI_DEST_NET_UNREACH    STATUS_NETWORK_UNREACHABLE
52 #define TDI_DEST_HOST_UNREACH   STATUS_HOST_UNREACHABLE
53 #define TDI_DEST_UNREACHABLE    TDI_DEST_HOST_UNREACH
54 #define TDI_DEST_PROT_UNREACH   STATUS_PROTOCOL_UNREACHABLE
55 #define TDI_DEST_PORT_UNREACH   STATUS_PORT_UNREACHABLE
56 #define TDI_INVALID_QUERY       STATUS_INVALID_DEVICE_REQUEST
57 #define TDI_REQ_ABORTED         STATUS_REQUEST_ABORTED
58 #define TDI_BUFFER_TOO_SMALL    STATUS_BUFFER_TOO_SMALL
59 #define TDI_CANCELLED           STATUS_CANCELLED
60 #define TDI_BUFFER_TOO_BIG              STATUS_INVALID_BUFFER_SIZE
61 #define TDI_INVALID_REQUEST     STATUS_INVALID_DEVICE_REQUEST
62 #define TDI_PENDING             STATUS_PENDING
63 #define TDI_ITEM_NOT_FOUND      STATUS_OBJECT_NAME_NOT_FOUND
64
65 #define TDI_OPTION_EOL              0
66 #define TDI_ADDRESS_OPTION_REUSE    1
67 #define TDI_ADDRESS_OPTION_DHCP     2
68
69
70
71 /* TDI IOCTL codes */
72
73 #define TDI_CONTROL_CODE(Request, Method) \
74             CTL_CODE(FILE_DEVICE_TRANSPORT, Request, Method, FILE_ANY_ACCESS)
75
76 #define IOCTL_TDI_ACCEPT                TDI_CONTROL_CODE(0,  METHOD_BUFFERED)
77 #define IOCTL_TDI_CONNECT               TDI_CONTROL_CODE(1,  METHOD_BUFFERED)
78 #define IOCTL_TDI_DISCONNECT            TDI_CONTROL_CODE(2,  METHOD_BUFFERED)
79 #define IOCTL_TDI_LISTEN                TDI_CONTROL_CODE(3,  METHOD_BUFFERED)
80 #define IOCTL_TDI_QUERY_INFORMATION     TDI_CONTROL_CODE(4,  METHOD_OUT_DIRECT)
81 #define IOCTL_TDI_RECEIVE               TDI_CONTROL_CODE(5,  METHOD_OUT_DIRECT)
82 #define IOCTL_TDI_RECEIVE_DATAGRAM      TDI_CONTROL_CODE(6,  METHOD_OUT_DIRECT)
83 #define IOCTL_TDI_SEND                  TDI_CONTROL_CODE(7,  METHOD_IN_DIRECT)
84 #define IOCTL_TDI_SEND_DATAGRAM         TDI_CONTROL_CODE(8,  METHOD_IN_DIRECT)
85 #define IOCTL_TDI_SET_EVENT_HANDLER     TDI_CONTROL_CODE(9,  METHOD_BUFFERED)
86 #define IOCTL_TDI_SET_INFORMATION       TDI_CONTROL_CODE(10, METHOD_IN_DIRECT)
87 #define IOCTL_TDI_ASSOCIATE_ADDRESS     TDI_CONTROL_CODE(11, METHOD_BUFFERED)
88 #define IOCTL_TDI_DISASSOCIATE_ADDRESS  TDI_CONTROL_CODE(12, METHOD_BUFFERED)
89 #define IOCTL_TDI_ACTION                TDI_CONTROL_CODE(13, METHOD_OUT_DIRECT)
90
91
92
93 /* TDI transport driver dispatch routines */
94
95 NTSTATUS TdiDispatchCleanup(
96     IN PDEVICE_OBJECT  DeviceObject,
97     IN PIRP  Irp);
98
99 NTSTATUS TdiDispatchClose(
100     IN PDEVICE_OBJECT  DeviceObject,
101     IN PIRP  Irp);
102
103 NTSTATUS TdiDispatchCreate(
104     IN PDEVICE_OBJECT  DeviceObject,
105     IN PIRP  Irp);
106
107 NTSTATUS TdiDispatchDeviceControl(
108     IN PDEVICE_OBJECT  DeviceObject,
109     IN PIRP  Irp,
110     IN PIO_STACK_LOCATION  IrpSp);
111
112 BOOLEAN TdiDispatchFastDeviceControl(
113     IN PFILE_OBJECT  FileObject,
114     IN BOOLEAN  Wait,
115     IN PVOID  InputBuffer,
116     IN ULONG  InputBufferLength,
117     IN OUT PVOID  OutputBuffer,
118     IN ULONG  OutputBufferLength,
119     IN ULONG  IoControlCode,
120     OUT PIO_STATUS_BLOCK  IoStatus);
121
122 NTSTATUS TdiDispatchInternalDeviceControl(
123     IN PDEVICE_OBJECT  DeviceObject,
124     IN PIRP  Irp);
125
126
127
128 /* TDI structures */
129
130 typedef struct _TDI_CONNECTION_INFORMATION
131 {
132     LONG   UserDataLength;
133     PVOID  UserData;
134     LONG   OptionsLength;
135     PVOID  Options;
136     LONG   RemoteAddressLength;
137     PVOID  RemoteAddress;
138 } TDI_CONNECTION_INFORMATION, *PTDI_CONNECTION_INFORMATION;
139
140 typedef struct _TDI_REQUEST
141 {
142     union {
143         HANDLE              AddressHandle;
144         CONNECTION_CONTEXT  ConnectionContext;
145         HANDLE              ControlChannel;
146     } Handle;
147     PVOID      RequestNotifyObject;
148     PVOID      RequestContext;
149     TDI_STATUS TdiStatus;
150 } TDI_REQUEST, *PTDI_REQUEST;
151
152 typedef struct _TDI_REQUEST_STATUS
153 {
154     TDI_STATUS  Status;
155     PVOID  RequestContext;
156     ULONG  BytesTransferred;
157 } TDI_REQUEST_STATUS, *PTDI_REQUEST_STATUS;
158
159
160 typedef struct _TA_ADDRESS
161 {
162     USHORT  AddressLength;
163     USHORT  AddressType;
164     UCHAR   Address[1];
165 } TA_ADDRESS, *PTA_ADDRESS;
166
167 #define TDI_ADDRESS_TYPE_UNSPEC      0
168 #define TDI_ADDRESS_TYPE_UNIX        1
169 #define TDI_ADDRESS_TYPE_IP          2
170 #define TDI_ADDRESS_TYPE_IMPLINK     3
171 #define TDI_ADDRESS_TYPE_PUP         4
172 #define TDI_ADDRESS_TYPE_CHAOS       5
173 #define TDI_ADDRESS_TYPE_NS          6
174 #define TDI_ADDRESS_TYPE_IPX         6
175 #define TDI_ADDRESS_TYPE_NBS         7
176 #define TDI_ADDRESS_TYPE_ECMA        8
177 #define TDI_ADDRESS_TYPE_DATAKIT     9
178 #define TDI_ADDRESS_TYPE_CCITT      10
179 #define TDI_ADDRESS_TYPE_SNA        11
180 #define TDI_ADDRESS_TYPE_DECnet     12
181 #define TDI_ADDRESS_TYPE_DLI        13
182 #define TDI_ADDRESS_TYPE_LAT        14
183 #define TDI_ADDRESS_TYPE_HYLINK     15
184 #define TDI_ADDRESS_TYPE_APPLETALK  16
185 #define TDI_ADDRESS_TYPE_NETBIOS    17
186 #define TDI_ADDRESS_TYPE_8022       18
187 #define TDI_ADDRESS_TYPE_OSI_TSAP   19
188 #define TDI_ADDRESS_TYPE_NETONE     20
189 #define TDI_ADDRESS_TYPE_VNS        21
190 #define TDI_ADDRESS_TYPE_NETBIOS_EX 22
191
192
193 #define TdiTransportAddress             "TransportAddress"
194 #define TdiConnectionContext            "ConnectionContext"
195 #define TDI_TRANSPORT_ADDRESS_LENGTH    (sizeof(TdiTransportAddress) - 1)
196 #define TDI_CONNECTION_CONTEXT_LENGTH   (sizeof(TdiConnectionContext) - 1)
197
198
199 typedef struct _TRANSPORT_ADDRESS
200 {
201     LONG        TAAddressCount;
202     TA_ADDRESS  Address[1];
203 } TRANSPORT_ADDRESS, *PTRANSPORT_ADDRESS;
204
205 typedef struct _TDI_ADDRESS_INFO
206 {
207     ULONG              ActivityCount;
208     TRANSPORT_ADDRESS  Address;
209 } TDI_ADDRESS_INFO, *PTDI_ADDRESS_INFO;
210
211 typedef struct _TDI_ACTION_HEADER
212 {
213     ULONG   TransportId;
214     USHORT  ActionCode;
215     USHORT  Reserved;
216 } TDI_ACTION_HEADER, *PTDI_ACTION_HEADER;
217
218 typedef struct _TDI_ADDRESS_8022
219 {
220     UCHAR MACAddress[6];
221 } TDI_ADDRESS_8022, *PTDI_ADDRESS_8022;
222
223 typedef struct _TDI_ADDRESS_APPLETALK
224 {
225     USHORT  Network;
226     UCHAR   Node;
227     UCHAR   Socket;
228 } TDI_ADDRESS_APPLETALK, *PTDI_ADDRESS_APPLETALK;
229
230 #define TDI_ADDRESS_LENGTH_APPLETALK    sizeof(TDI_ADDRESS_APPLETALK)
231
232 typedef struct _TDI_ADDRESS_IP
233 {
234     USHORT  sin_port;
235     ULONG   in_addr;
236     UCHAR   sin_zero[8];
237 } TDI_ADDRESS_IP, *PTDI_ADDRESS_IP;
238
239 #define TDI_ADDRESS_LENGTH_IP   sizeof(TDI_ADDRESS_IP)
240
241 typedef struct _TDI_ADDRESS_IPX
242 {
243     ULONG   NetworkAddress;
244     UCHAR   NodeAddress[6];
245     USHORT  Socket;
246 } TDI_ADDRESS_IPX, *PTDI_ADDRESS_IPX;
247
248 #define TDI_ADDRESS_LENGTH_IPX  sizeof(TDI_ADDRESS_IPX)
249
250 typedef struct _TDI_ADDRESS_NETBIOS
251 {
252     USHORT  NetbiosNameType;
253     UCHAR   NetbiosName[16];
254 } TDI_ADDRESS_NETBIOS, *PTDI_ADDRESS_NETBIOS;
255
256 #define TDI_ADDRESS_NETBIOS_TYPE_UNIQUE         0x0000
257 #define TDI_ADDRESS_NETBIOS_TYPE_GROUP          0x0001
258 #define TDI_ADDRESS_NETBIOS_TYPE_QUICK_UNIQUE   0x0002
259 #define TDI_ADDRESS_NETBIOS_TYPE_QUICK_GROUP    0x0003
260
261 #define TDI_ADDRESS_LENGTH_NETBIOS  sizeof(TDI_ADDRESS_NETBIOS)
262
263 typedef struct _TDI_ADDRESS_NETBIOS_EX
264 {
265     UCHAR               EndpointName[16];
266     TDI_ADDRESS_NETBIOS NetbiosAddress;
267 } TDI_ADDRESS_NETBIOS_EX, *PTDI_ADDRESS_NETBIOS_EX;
268
269 #define TDI_ADDRESS_LENGTH_NETBIOS_EX   sizeof(TDI_ADDRESS_NETBIOS_EX)
270
271 typedef struct _TDI_ADDRESS_NETONE
272 {
273     USHORT  NetoneNameType;
274     UCHAR   NetoneName[20];
275 } TDI_ADDRESS_NETONE, *PTDI_ADDRESS_NETONE;
276
277 #define TDI_ADDRESS_NETONE_TYPE_UNIQUE  0x0000
278 #define TDI_ADDRESS_NETONE_TYPE_ROTORED 0x0001
279
280 #define TDI_ADDRESS_LENGTH_NETONE   sizeof(TDI_ADDRESS_NETONE)
281
282 typedef struct _TDI_ADDRESS_NS
283 {
284     ULONG   NetworkAddress;
285     UCHAR   NodeAddress[6];
286     USHORT  Socket;
287 } TDI_ADDRESS_NS, *PTDI_ADDRESS_NS;
288
289 #define TDI_ADDRESS_LENGTH_NS   sizeof(TDI_ADDRESS_NS)
290
291 #define ISO_MAX_ADDR_LENGTH 64
292
293 #define ISO_HIERARCHICAL        0
294 #define ISO_NON_HIERARCHICAL    1
295
296 typedef struct _TDI_ADDRESS_OSI_TSAP
297 {
298     USHORT  tp_addr_type;
299     USHORT  tp_taddr_len;
300     USHORT  tp_tsel_len;
301     UCHAR   tp_addr[ISO_MAX_ADDR_LENGTH];
302 } TDI_ADDRESS_OSI_TSAP, *PTDI_ADDRESS_OSI_TSAP;
303
304 #define TDI_ADDRESS_LENGTH_OSI_TSAP sizeof(TDI_ADDRESS_OSI_TSAP)
305
306 typedef struct _TDI_ADDRESS_VNS
307 {
308     UCHAR  net_address[4];
309     UCHAR  subnet_addr[2];
310     UCHAR  port[2];
311     UCHAR  hops;
312     UCHAR  filler[5];
313 } TDI_ADDRESS_VNS, *PTDI_ADDRESS_VNS;
314
315 #define TDI_ADDRESS_LENGTH_VNS  sizeof(TDI_ADDRESS_VNS)
316
317
318 /* TDI request structures */
319
320 typedef struct _TDI_CONNECT_REQUEST
321 {
322     TDI_REQUEST     Request;
323     PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
324     PTDI_CONNECTION_INFORMATION ReturnConnectionInformation;
325     LARGE_INTEGER   Timeout;
326 } TDI_REQUEST_CONNECT, *PTDI_REQUEST_CONNECT;
327
328 typedef struct _TDI_REQUEST_ACCEPT
329 {
330     TDI_REQUEST Request;
331     PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
332     PTDI_CONNECTION_INFORMATION ReturnConnectionInformation;
333 } TDI_REQUEST_ACCEPT, *PTDI_REQUEST_ACCEPT;
334
335 typedef struct _TDI_REQUEST_LISTEN
336 {
337     TDI_REQUEST Request;
338     PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
339     PTDI_CONNECTION_INFORMATION ReturnConnectionInformation;
340     USHORT      ListenFlags;
341 } TDI_REQUEST_LISTEN, *PTDI_REQUEST_LISTEN;
342
343 typedef struct _TDI_DISCONNECT_REQUEST
344 {
345     TDI_REQUEST     Request;
346     LARGE_INTEGER   Timeout;
347 } TDI_REQUEST_DISCONNECT, *PTDI_REQUEST_DISCONNECT;
348
349 typedef struct _TDI_REQUEST_SEND
350 {
351     TDI_REQUEST Request;
352     USHORT      SendFlags;
353 } TDI_REQUEST_SEND, *PTDI_REQUEST_SEND;
354
355 typedef struct _TDI_REQUEST_RECEIVE
356 {
357     TDI_REQUEST Request;
358     USHORT      ReceiveFlags;
359 } TDI_REQUEST_RECEIVE, *PTDI_REQUEST_RECEIVE;
360
361 typedef struct _TDI_REQUEST_SEND_DATAGRAM
362 {
363     TDI_REQUEST Request;
364     PTDI_CONNECTION_INFORMATION SendDatagramInformation;
365 } TDI_REQUEST_SEND_DATAGRAM, *PTDI_REQUEST_SEND_DATAGRAM;
366
367 typedef struct _TDI_REQUEST_RECEIVE_DATAGRAM
368 {
369     TDI_REQUEST Request;
370     PTDI_CONNECTION_INFORMATION ReceiveDatagramInformation;
371     PTDI_CONNECTION_INFORMATION ReturnInformation;
372     USHORT      ReceiveFlags;
373 } TDI_REQUEST_RECEIVE_DATAGRAM, *PTDI_REQUEST_RECEIVE_DATAGRAM;
374
375 typedef struct _TDI_REQUEST_SET_EVENT
376 {
377     TDI_REQUEST Request;
378     LONG        EventType;
379     PVOID       EventHandler;
380     PVOID       EventContext;
381 } TDI_REQUEST_SET_EVENT_HANDLER, *PTDI_REQUEST_SET_EVENT_HANDLER;
382
383 #define TDI_RECEIVE_BROADCAST           0x00000004
384 #define TDI_RECEIVE_MULTICAST           0x00000008
385 #define TDI_RECEIVE_PARTIAL             0x00000010
386 #define TDI_RECEIVE_NORMAL              0x00000020
387 #define TDI_RECEIVE_EXPEDITED           0x00000040
388 #define TDI_RECEIVE_PEEK                0x00000080
389 #define TDI_RECEIVE_NO_RESPONSE_EXP     0x00000100
390 #define TDI_RECEIVE_COPY_LOOKAHEAD      0x00000200
391 #define TDI_RECEIVE_ENTIRE_MESSAGE      0x00000400
392 #define TDI_RECEIVE_AT_DISPATCH_LEVEL   0x00000800
393
394 /* Listen flags */
395 #define TDI_QUERY_ACCEPT    0x00000001
396
397 /* Options used for both SendOptions and ReceiveIndicators */
398 #define TDI_SEND_EXPEDITED              0x0020
399 #define TDI_SEND_PARTIAL                0x0040
400 #define TDI_SEND_NO_RESPONSE_EXPECTED   0x0080
401 #define TDI_SEND_NON_BLOCKING           0x0100
402
403 /* Disconnect Flags */
404 #define TDI_DISCONNECT_WAIT     0x0001
405 #define TDI_DISCONNECT_ABORT    0x0002
406 #define TDI_DISCONNECT_RELEASE  0x0004
407
408 /* TdiRequest structure for TdiQueryInformation request */
409 typedef struct _TDI_REQUEST_QUERY_INFORMATION
410 {
411     TDI_REQUEST Request;
412     ULONG       QueryType;
413     PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
414 } TDI_REQUEST_QUERY_INFORMATION, *PTDI_REQUEST_QUERY_INFORMATION;
415
416 /* TdiRequest structure for TdiSetInformation request */
417 typedef struct _TDI_REQUEST_SET_INFORMATION
418 {
419     TDI_REQUEST Request;
420     ULONG       SetType;
421     PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
422 } TDI_REQUEST_SET_INFORMATION, *PTDI_REQUEST_SET_INFORMATION;
423
424 typedef union _TDI_REQUEST_TYPE
425 {
426     TDI_REQUEST_ACCEPT              TdiAccept;
427     TDI_REQUEST_CONNECT             TdiConnect;
428     TDI_REQUEST_DISCONNECT          TdiDisconnect;
429     TDI_REQUEST_LISTEN              TdiListen;
430     TDI_REQUEST_QUERY_INFORMATION   TdiQueryInformation;
431     TDI_REQUEST_RECEIVE             TdiReceive;
432     TDI_REQUEST_RECEIVE_DATAGRAM    TdiReceiveDatagram;
433     TDI_REQUEST_SEND                TdiSend;
434     TDI_REQUEST_SEND_DATAGRAM       TdiSendDatagram;
435     TDI_REQUEST_SET_EVENT_HANDLER   TdiSetEventHandler;
436     TDI_REQUEST_SET_INFORMATION     TdiSetInformation;
437 } TDI_REQUEST_TYPE, *PTDI_REQUEST_TYPE;
438
439
440
441 /* Query information types */
442
443 /* Generic query info types that must be supported by all transports */
444 #define TDI_QUERY_BROADCAST_ADDRESS     0x00000001
445 #define TDI_QUERY_PROVIDER_INFO         0x00000002
446 #define TDI_QUERY_ADDRESS_INFO          0x00000003
447 #define TDI_QUERY_CONNECTION_INFO       0x00000004
448 #define TDI_QUERY_PROVIDER_STATISTICS   0x00000005
449 #define TDI_QUERY_DATAGRAM_INFO         0x00000006
450 #define TDI_QUERY_DATA_LINK_ADDRESS     0x00000007
451 #define TDI_QUERY_NETWORK_ADDRESS       0x00000008
452 #define TDI_QUERY_MAX_DATAGRAM_INFO     0x00000009
453
454 /* Netbios specific query information types */
455 #define TDI_QUERY_ADAPTER_STATUS        0x00000100
456 #define TDI_QUERY_SESSION_STATUS        0x00000200
457 #define TDI_QUERY_FIND_NAME             0x00000300
458
459 typedef struct _TA_APPLETALK_ADDR
460 {
461     LONG    TAAddressCount;
462     struct  _AddrAtalk {
463         USHORT                  AddressLength;
464         USHORT                  AddressType;
465         TDI_ADDRESS_APPLETALK   Address[1];
466     } Address[1];
467 } TA_APPLETALK_ADDRESS, *PTA_APPLETALK_ADDRESS;
468
469 typedef struct _TA_ADDRESS_IP
470 {
471     LONG    TAAddressCount;
472     struct  _AddrIp {
473         USHORT          AddressLength;
474         USHORT          AddressType;
475         TDI_ADDRESS_IP  Address[1];
476     } Address[1];
477 } TA_ADDRESS_IP, *PTA_ADDRESS_IP;
478
479 typedef struct _TA_ADDRESS_IPX
480 {
481     LONG    TAAddressCount;
482     struct  _AddrIpx {
483         USHORT           AddressLength;
484         USHORT           AddressType;
485         TDI_ADDRESS_IPX Address[1];
486     } Address[1];
487 } TA_IPX_ADDRESS, *PTA_IPX_ADDRESS;
488
489 typedef struct _TA_NETBIOS_ADDRESS
490 {
491     LONG    TAAddressCount;
492     struct _Addr{
493         USHORT              AddressLength;
494         USHORT              AddressType;
495         TDI_ADDRESS_NETBIOS Address[1];
496     } Address[1];
497 } TA_NETBIOS_ADDRESS, *PTA_NETBIOS_ADDRESS;
498
499 typedef struct _TA_ADDRESS_NS
500 {
501     LONG    TAAddressCount;
502     struct  _AddrNs {
503         USHORT          AddressLength;
504         USHORT          AddressType;
505         TDI_ADDRESS_NS  Address[1];
506     } Address[1];
507 } TA_NS_ADDRESS, *PTA_NS_ADDRESS;
508
509 typedef struct _TA_ADDRESS_VNS
510 {
511     LONG    TAAddressCount;
512     struct  _AddrVns {
513         USHORT          AddressLength;
514         USHORT          AddressType;
515         TDI_ADDRESS_VNS Address[1];
516     } Address[1];
517 } TA_VNS_ADDRESS, *PTA_VNS_ADDRESS;
518
519
520 /* Structures used for TdiQueryInformation and TdiSetInformation */
521
522 typedef struct _TDI_ENDPOINT_INFO
523 {
524     ULONG   State;
525     ULONG   Event;
526     ULONG   TransmittedTsdus;
527     ULONG   ReceivedTsdus;
528     ULONG   TransmissionErrors;
529     ULONG   ReceiveErrors;
530     ULONG   MinimumLookaheadData;
531     ULONG   MaximumLookaheadData;
532     ULONG   PriorityLevel;
533     ULONG   SecurityLevel;
534     ULONG   SecurityCompartment;
535 } TDI_ENDPOINT_INFO, *PTDI_ENDPOINT_INFO;
536
537 typedef struct _TDI_CONNECTION_INFO
538 {
539     ULONG           State;
540     ULONG           Event; 
541     ULONG           TransmittedTsdus;
542     ULONG           ReceivedTsdus;
543     ULONG           TransmissionErrors;
544     ULONG           ReceiveErrors;
545     LARGE_INTEGER   Throughput;
546     LARGE_INTEGER   Delay;
547     ULONG           SendBufferSize;
548     ULONG           ReceiveBufferSize;
549     BOOLEAN         Unreliable;
550 } TDI_CONNECTION_INFO, *PTDI_CONNECTION_INFO;
551
552 typedef struct _TDI_DATAGRAM_INFO
553 {
554     ULONG   MaximumDatagramBytes;
555     ULONG   MaximumDatagramCount;
556 } TDI_DATAGRAM_INFO, *PTDI_DATAGRAM_INFO;
557
558 typedef struct _TDI_MAX_DATAGRAM_INFO
559 {
560     ULONG   MaxDatagramSize;
561 } TDI_MAX_DATAGRAM_INFO, *PTDI_MAX_DATAGRAM_INFO;
562
563 typedef struct _TDI_PROVIDER_INFO
564 {
565     ULONG           Version;
566     ULONG           MaxSendSize;
567     ULONG           MaxConnectionUserData;
568     ULONG           MaxDatagramSize;
569     ULONG           ServiceFlags;
570     ULONG           MinimumLookaheadData;
571     ULONG           MaximumLookaheadData;
572     ULONG           NumberOfResources;
573     LARGE_INTEGER   StartTime;
574 } TDI_PROVIDER_INFO, *PTDI_PROVIDER_INFO;
575
576 #define TDI_SERVICE_CONNECTION_MODE     0x00000001
577 #define TDI_SERVICE_ORDERLY_RELEASE     0x00000002
578 #define TDI_SERVICE_CONNECTIONLESS_MODE 0x00000004
579 #define TDI_SERVICE_ERROR_FREE_DELIVERY 0x00000008
580 #define TDI_SERVICE_SECURITY_LEVEL      0x00000010
581 #define TDI_SERVICE_BROADCAST_SUPPORTED 0x00000020
582 #define TDI_SERVICE_MULTICAST_SUPPORTED 0x00000040
583 #define TDI_SERVICE_DELAYED_ACCEPTANCE  0x00000080
584 #define TDI_SERVICE_EXPEDITED_DATA      0x00000100
585 #define TDI_SERVICE_INTERNAL_BUFFERING  0x00000200
586 #define TDI_SERVICE_ROUTE_DIRECTED      0x00000400
587 #define TDI_SERVICE_NO_ZERO_LENGTH      0x00000800
588 #define TDI_SERVICE_POINT_TO_POINT      0x00001000
589 #define TDI_SERVICE_MESSAGE_MODE        0x00002000
590 #define TDI_SERVICE_HALF_DUPLEX         0x00004000
591
592 typedef struct _TDI_PROVIDER_RESOURCE_STATS
593 {
594     ULONG   ResourceId;
595     ULONG   MaximumResourceUsed;
596     ULONG   AverageResourceUsed;
597     ULONG   ResourceExhausted;
598 } TDI_PROVIDER_RESOURCE_STATS, *PTDI_PROVIDER_RESOURCE_STATS;
599
600 typedef struct _TDI_PROVIDER_STATISTICS
601 {
602     ULONG           Version;
603     ULONG           OpenConnections;
604     ULONG           ConnectionsAfterNoRetry;
605     ULONG           ConnectionsAfterRetry;
606     ULONG           LocalDisconnects;
607     ULONG           RemoteDisconnects;
608     ULONG           LinkFailures;
609     ULONG           AdapterFailures;
610     ULONG           SessionTimeouts;
611     ULONG           CancelledConnections;
612     ULONG           RemoteResourceFailures;
613     ULONG           LocalResourceFailures;
614     ULONG           NotFoundFailures;
615     ULONG           NoListenFailures;
616     ULONG           DatagramsSent;
617     LARGE_INTEGER   DatagramBytesSent;
618     ULONG           DatagramsReceived;
619     LARGE_INTEGER   DatagramBytesReceived;
620     ULONG           PacketsSent;
621     ULONG           PacketsReceived;
622     ULONG           DataFramesSent;
623     LARGE_INTEGER   DataFrameBytesSent;
624     ULONG           DataFramesReceived;
625     LARGE_INTEGER   DataFrameBytesReceived;
626     ULONG           DataFramesResent;
627     LARGE_INTEGER   DataFrameBytesResent;
628     ULONG           DataFramesRejected;
629     LARGE_INTEGER   DataFrameBytesRejected;
630     ULONG           ResponseTimerExpirations;
631     ULONG           AckTimerExpirations;
632     ULONG           MaximumSendWindow;
633     ULONG           AverageSendWindow;
634     ULONG           PiggybackAckQueued;
635     ULONG           PiggybackAckTimeouts;
636     LARGE_INTEGER   WastedPacketSpace;
637     ULONG           WastedSpacePackets;
638     ULONG           NumberOfResources;
639     TDI_PROVIDER_RESOURCE_STATS Resources[1];
640 } TDI_PROVIDER_STATISTICS, *PTDI_PROVIDER_STATISTICS;
641
642 #endif /* __TDI_H */
643
644 /* EOF */