TDI.H
上传用户:he75757
上传日期:2007-01-04
资源大小:36k
文件大小:33k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. /*++
  2. Copyright (c) 1989  Microsoft Corporation
  3. Module Name:
  4.     tdi.h
  5. Abstract:
  6.     This header file contains interface definitions for NT transport
  7.     providers.  This interface is documented in the NT Transport
  8.     Driver Interface (TDI) Specification, Version 2.
  9. Author:
  10.     Dave Beaver (dbeaver) 1 June 1991
  11. Revision History:
  12. --*/
  13. //
  14. // Include the types which are common to TDI and other network users
  15. //
  16. #ifndef _TDI_USER_
  17. #define _TDI_USER_
  18. #include <nettypes.h>
  19. //
  20. // Include Transport driver interface definitions
  21. // All of the following have two definitions; ones that correspond exactly to
  22. // the TDI spec, and those that correspond to the NT coding standards. They
  23. // should be equivalent.
  24. //
  25. typedef LONG TDI_STATUS;
  26. typedef PVOID CONNECTION_CONTEXT;       // connection context
  27. //
  28. // Basic type used to represent an address at the transport level. There may
  29. // be many addresses represented in a single address structure. If there are
  30. // multiple addresses, a given provider must understand all of them or it can
  31. // use none of them. Note that it is acceptible for the provider to not know
  32. // how to use the address, as long as it knows the address type. Thus, a
  33. // TCP/IP NetBIOS provider may know both NetBIOS and TCP/IP addresses, but
  34. // use only the NetBIOS address; the TCP/IP address would (likely) be passed on
  35. // to the TCP/IP provider.
  36. //
  37. typedef struct _TA_ADDRESS {
  38.     USHORT AddressLength;       // length in bytes of Address[] in this
  39.     USHORT AddressType;         // type of this address
  40.     UCHAR Address[1];           // actually AddressLength bytes long
  41. } TA_ADDRESS, *PTA_ADDRESS;
  42. typedef struct _TRANSPORT_ADDRESS {
  43.     LONG TAAddressCount;             // number of addresses following
  44.     TA_ADDRESS Address[1];          // actually TAAddressCount elements long
  45. } TRANSPORT_ADDRESS, *PTRANSPORT_ADDRESS;
  46. //
  47. // define some names for the EAs so people don't have to make them up.
  48. //
  49. #define TdiTransportAddress "TransportAddress"
  50. #define TdiConnectionContext "ConnectionContext"
  51. #define TDI_TRANSPORT_ADDRESS_LENGTH (sizeof (TdiTransportAddress) - 1)
  52. #define TDI_CONNECTION_CONTEXT_LENGTH (sizeof (TdiConnectionContext) - 1)
  53. //
  54. // Known Address types
  55. //
  56. #define TDI_ADDRESS_TYPE_UNSPEC    ((USHORT)0)  // unspecified
  57. #define TDI_ADDRESS_TYPE_UNIX      ((USHORT)1)  // local to host (pipes, portals)
  58. #define TDI_ADDRESS_TYPE_IP        ((USHORT)2)  // internetwork: UDP, TCP, etc.
  59. #define TDI_ADDRESS_TYPE_IMPLINK   ((USHORT)3)  // arpanet imp addresses
  60. #define TDI_ADDRESS_TYPE_PUP       ((USHORT)4)  // pup protocols: e.g. BSP
  61. #define TDI_ADDRESS_TYPE_CHAOS     ((USHORT)5)  // mit CHAOS protocols
  62. #define TDI_ADDRESS_TYPE_NS        ((USHORT)6)  // XEROX NS protocols
  63. #define TDI_ADDRESS_TYPE_IPX       ((USHORT)6)  // Netware IPX
  64. #define TDI_ADDRESS_TYPE_NBS       ((USHORT)7)  // nbs protocols
  65. #define TDI_ADDRESS_TYPE_ECMA      ((USHORT)8)  // european computer manufacturers
  66. #define TDI_ADDRESS_TYPE_DATAKIT   ((USHORT)9)  // datakit protocols
  67. #define TDI_ADDRESS_TYPE_CCITT     ((USHORT)10) // CCITT protocols, X.25 etc
  68. #define TDI_ADDRESS_TYPE_SNA       ((USHORT)11) // IBM SNA
  69. #define TDI_ADDRESS_TYPE_DECnet    ((USHORT)12) // DECnet
  70. #define TDI_ADDRESS_TYPE_DLI       ((USHORT)13) // Direct data link interface
  71. #define TDI_ADDRESS_TYPE_LAT       ((USHORT)14) // LAT
  72. #define TDI_ADDRESS_TYPE_HYLINK    ((USHORT)15) // NSC Hyperchannel
  73. #define TDI_ADDRESS_TYPE_APPLETALK ((USHORT)16) // AppleTalk
  74. #define TDI_ADDRESS_TYPE_NETBIOS   ((USHORT)17) // Netbios Addresses
  75. #define TDI_ADDRESS_TYPE_8022      ((USHORT)18) //
  76. #define TDI_ADDRESS_TYPE_OSI_TSAP  ((USHORT)19) //
  77. #define TDI_ADDRESS_TYPE_NETONE    ((USHORT)20) // for WzMail
  78. //
  79. // Definition of address structures. These need to be packed
  80. // and misaligned where necessary.
  81. //
  82. #include <packon.h>
  83. //
  84. // NetBIOS
  85. //
  86. typedef struct _TDI_ADDRESS_NETBIOS {
  87.     USHORT NetbiosNameType;
  88.     UCHAR NetbiosName[16];
  89. } TDI_ADDRESS_NETBIOS, *PTDI_ADDRESS_NETBIOS;
  90. #define TDI_ADDRESS_NETBIOS_TYPE_UNIQUE         ((USHORT)0x0000)
  91. #define TDI_ADDRESS_NETBIOS_TYPE_GROUP          ((USHORT)0x0001)
  92. #define TDI_ADDRESS_NETBIOS_TYPE_QUICK_UNIQUE   ((USHORT)0x0002)
  93. #define TDI_ADDRESS_NETBIOS_TYPE_QUICK_GROUP    ((USHORT)0x0003)
  94. #define TDI_ADDRESS_LENGTH_NETBIOS sizeof (TDI_ADDRESS_NETBIOS)
  95. //
  96. // Xns address for UB
  97. //
  98. typedef struct _TDI_ADDRESS_NETONE {
  99.     USHORT NetoneNameType;
  100.     UCHAR NetoneName[20];
  101. } TDI_ADDRESS_NETONE, *PTDI_ADDRESS_NETONE;
  102. #define TDI_ADDRESS_NETONE_TYPE_UNIQUE  ((USHORT)0x0000)
  103. #define TDI_ADDRESS_NETONE_TYPE_ROTORED ((USHORT)0x0001)
  104. #define TDI_ADDRESS_LENGTH_NETONE sizeof (TDI_ADDRESS_NETONE)
  105. //
  106. // AppleTalk
  107. //
  108. typedef struct _TDI_ADDRESS_APPLETALK {
  109.     USHORT  Network;
  110.     UCHAR   Node;
  111.     UCHAR   Socket;
  112. } TDI_ADDRESS_APPLETALK, *PTDI_ADDRESS_APPLETALK;
  113. #define TDI_ADDRESS_LENGTH_APPLETALK sizeof (TDI_ADDRESS_APPLETALK)
  114. //
  115. // 802.2 MAC addresses
  116. //
  117. typedef struct _TDI_ADDRESS_8022 {
  118.     UCHAR MACAddress[6];
  119. } TDI_ADDRESS_8022, *PTDI_ADDRESS_8022;
  120. #define TDI_ADDRESS_LENGTH_8022  sizeof (TDI_ADDRESS_8022);
  121. //
  122. // IP address
  123. //
  124. typedef struct _TDI_ADDRESS_IP {
  125.     USHORT sin_port;
  126.     ULONG  in_addr;
  127.     UCHAR  sin_zero[8];
  128. } TDI_ADDRESS_IP, *PTDI_ADDRESS_IP;
  129. #define TDI_ADDRESS_LENGTH_IP sizeof (TDI_ADDRESS_IP)
  130. //
  131. // IPX address
  132. //
  133. typedef struct _TDI_ADDRESS_IPX {
  134.     ULONG NetworkAddress;
  135.     UCHAR NodeAddress[6];
  136.     USHORT Socket;
  137. } TDI_ADDRESS_IPX, *PTDI_ADDRESS_IPX;
  138. #define TDI_ADDRESS_LENGTH_IPX sizeof (TDI_ADDRESS_IPX)
  139. //
  140. // XNS address (same as IPX)
  141. //
  142. typedef struct _TDI_ADDRESS_NS {
  143.     ULONG NetworkAddress;
  144.     UCHAR NodeAddress[6];
  145.     USHORT Socket;
  146. } TDI_ADDRESS_NS, *PTDI_ADDRESS_NS;
  147. #define TDI_ADDRESS_LENGTH_NS sizeof (TDI_ADDRESS_NS)
  148. // OSI TSAP
  149. // TBD
  150. #include <packoff.h>
  151. //
  152. // Some pre-defined structures to make life easier for
  153. // the 99.99% of us who use but one address.
  154. //
  155. typedef struct _TA_ADDRESS_NETBIOS {
  156.     LONG TAAddressCount;
  157.     struct _Addr {
  158.         USHORT AddressLength;       // length in bytes of this address == 18
  159.         USHORT AddressType;         // this will == TDI_ADDRESS_TYPE_NETBIOS
  160.         TDI_ADDRESS_NETBIOS Address[1];
  161.     } Address [1];
  162. } TA_NETBIOS_ADDRESS, *PTA_NETBIOS_ADDRESS;
  163. typedef struct _TA_APPLETALK_ADDR {
  164.     LONG TAAddressCount;
  165.     struct _AddrAtalk {
  166.         USHORT AddressLength;       // length in bytes of this address == 4
  167.         USHORT AddressType;         // this will == TDI_ADDRESS_TYPE_APPLETALK
  168.         TDI_ADDRESS_APPLETALK   Address[1];
  169.     } Address[1];
  170. } TA_APPLETALK_ADDRESS, *PTA_APPLETALK_ADDRESS;
  171. typedef struct _TA_ADDRESS_IP {
  172.     LONG TAAddressCount;
  173.     struct _AddrIp {
  174.         USHORT AddressLength;       // length in bytes of this address == 14
  175.         USHORT AddressType;         // this will == TDI_ADDRESS_TYPE_IP
  176.         TDI_ADDRESS_IP Address[1];
  177.     } Address [1];
  178. } TA_IP_ADDRESS, *PTA_IP_ADDRESS;
  179. typedef struct _TA_ADDRESS_IPX {
  180.     LONG TAAddressCount;
  181.     struct _AddrIpx {
  182.         USHORT AddressLength;       // length in bytes of this address == 12
  183.         USHORT AddressType;         // this will == TDI_ADDRESS_TYPE_IPX
  184.         TDI_ADDRESS_IPX Address[1];
  185.     } Address [1];
  186. } TA_IPX_ADDRESS, *PTA_IPX_ADDRESS;
  187. typedef struct _TA_ADDRESS_NS {
  188.     LONG TAAddressCount;
  189.     struct _AddrNs {
  190.         USHORT AddressLength;       // length in bytes of this address == 12
  191.         USHORT AddressType;         // this will == TDI_ADDRESS_TYPE_NS
  192.         TDI_ADDRESS_NS Address[1];
  193.     } Address [1];
  194. } TA_NS_ADDRESS, *PTA_NS_ADDRESS;
  195. //
  196. // This structure is passed with every request to TDI. It describes that
  197. // request and the parameters to it.
  198. //
  199. typedef struct _TDI_REQUEST {
  200.     union {
  201.         HANDLE AddressHandle;
  202.         CONNECTION_CONTEXT ConnectionContext;
  203.         HANDLE ControlChannel;
  204.     } Handle;
  205.     PVOID RequestNotifyObject;
  206.     PVOID RequestContext;
  207.     TDI_STATUS TdiStatus;
  208. } TDI_REQUEST, *PTDI_REQUEST;
  209. //
  210. // Structure for information returned by the TDI provider. This structure is
  211. // filled in upon request completion.
  212. //
  213. typedef struct _TDI_REQUEST_STATUS {
  214.     TDI_STATUS Status;              // status of request completion
  215.     PVOID RequestContext;           // the request Context
  216.     ULONG BytesTransferred;          // number of bytes transferred in the request
  217. } TDI_REQUEST_STATUS, *PTDI_REQUEST_STATUS;
  218. //
  219. // connection primitives information structure. This is passed to the TDI calls
  220. // (Accept, Connect, xxx) that do connecting sorts of things.
  221. //
  222. typedef struct _TDI_CONNECTION_INFORMATION {
  223.     LONG UserDataLength;         // length of user data buffer
  224.     PVOID UserData;             // pointer to user data buffer
  225.     LONG OptionsLength;          // length of follwoing buffer
  226.     PVOID Options;              // pointer to buffer containing options
  227.     LONG RemoteAddressLength;    // length of following buffer
  228.     PVOID RemoteAddress;        // buffer containing the remote address
  229. } TDI_CONNECTION_INFORMATION, *PTDI_CONNECTION_INFORMATION;
  230. //
  231. // structure defining a counted string is defined in
  232. // ntpublicsdkincntdefs.h as
  233. //  typedef struct _STRING {
  234. //    USHORT Length;
  235. //    USHORT MaximumLength;
  236. //    PCHAR Buffer;
  237. //  } STRING;
  238. //  typedef STRING *PSTRING;
  239. //  typedef STRING ANSI_STRING;
  240. //  typedef PSTRING PANSI_STRING;
  241. //
  242. //
  243. // Event types that are known
  244. //
  245. #define TDI_EVENT_CONNECT           ((USHORT)0) // TDI_IND_CONNECT event handler.
  246. #define TDI_EVENT_DISCONNECT        ((USHORT)1) // TDI_IND_DISCONNECT event handler.
  247. #define TDI_EVENT_ERROR             ((USHORT)2) // TDI_IND_ERROR event handler.
  248. #define TDI_EVENT_RECEIVE           ((USHORT)3) // TDI_IND_RECEIVE event handler.
  249. #define TDI_EVENT_RECEIVE_DATAGRAM  ((USHORT)4) // TDI_IND_RECEIVE_DATAGRAM event handler.
  250. #define TDI_EVENT_RECEIVE_EXPEDITED ((USHORT)5) // TDI_IND_RECEIVE_EXPEDITED event handler.
  251. #define TDI_EVENT_SEND_POSSIBLE     ((USHORT)6) // TDI_IND_SEND_POSSIBLE event handler
  252. //
  253. // Associate Address is done through NtDeviceIoControlFile, which passes this
  254. // structure as its input buffer. The Handle specified in the
  255. // NtDeviceIoControlFile is the handle of the connection returned in the
  256. // NtCreateFile call.
  257. //
  258. typedef struct _TDI_REQUEST_ASSOCIATE {
  259.     TDI_REQUEST Request;
  260.     HANDLE AddressHandle;
  261. } TDI_REQUEST_ASSOCIATE_ADDRESS, *PTDI_REQUEST_ASSOCIATE_ADDRESS;
  262. //
  263. // Disassociate Address passes no structure, uses the request code
  264. // IOCTL_TDI_DISASSOCIATE_ADDRESS. This call will never pend.
  265. //
  266. //
  267. // Connect is done through NtDeviceIoControlFile, which passes this
  268. // structure as its input buffer. The Handle specified in the
  269. // NtDeviceIoControlFile is the handle of the connection returned in the
  270. // NtCreateFile call.
  271. //
  272. typedef struct _TDI_CONNECT_REQUEST {
  273.     TDI_REQUEST Request;
  274.     PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
  275.     PTDI_CONNECTION_INFORMATION ReturnConnectionInformation;
  276.     LARGE_INTEGER Timeout;
  277. } TDI_REQUEST_CONNECT, *PTDI_REQUEST_CONNECT;
  278. //
  279. // Accept is done through NtDeviceIoControlFile, which passes this
  280. // structure as its input buffer. The Handle specified in the
  281. // NtDeviceIoControlFile is the handle of the connection returned in the
  282. // NtCreateFile call. Accept is called by the user when a listen completes,
  283. // before any activity can occur on a connection. AcceptConnectionId specifies
  284. // the connection on which the connection is accepted; in most cases, this
  285. // will be null, which that the connection is to be accepted on the
  286. // connection on which the listen completed. If the transport provider supports
  287. // "forwarding" of connections (the idea that a particular connection listens
  288. // all the time, and creates new connections as needed for incoming connection
  289. // requests and attaches them to the listen), this is the mechanism used to
  290. // associate connections with the listen.
  291. //
  292. typedef struct _TDI_REQUEST_ACCEPT {
  293.     TDI_REQUEST Request;
  294.     PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
  295.     PTDI_CONNECTION_INFORMATION ReturnConnectionInformation;
  296. } TDI_REQUEST_ACCEPT, *PTDI_REQUEST_ACCEPT;
  297. //
  298. // Listen is done through NtDeviceIoControlFile, which passes this
  299. // structure as its input buffer. The Handle specified in the
  300. // NtDeviceIoControlFile is the handle of the connection returned in the
  301. // NtCreateFile call. RequestConnectionInformation contains information about
  302. // the remote address to be listen for connections from; if NULL, any address
  303. // is accepted. ReturnConnectionInformation returns information about the
  304. // remote node that actually connected.
  305. //
  306. typedef struct _TDI_REQUEST_LISTEN {
  307.     TDI_REQUEST Request;
  308.     PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
  309.     PTDI_CONNECTION_INFORMATION ReturnConnectionInformation;
  310.     USHORT ListenFlags;
  311. } TDI_REQUEST_LISTEN, *PTDI_REQUEST_LISTEN;
  312. //
  313. // Disconnect is done through NtDeviceIoControlFile, which passes this
  314. // structure as its input buffer. The Handle specified in the
  315. // NtDeviceIoControlFile is the handle of the connection returned in the
  316. // NtCreateFile call. Disconnect differs from Close in offering more options.
  317. // For example, Close terminates all activity on a connection (immediately),
  318. // failing all outstanding requests, and tearing down the connection. With
  319. // some providers, Disconnect allows a "graceful" disconnect, causing new activity
  320. // to be rejected but allowing old activity to run down to completion.
  321. //
  322. typedef struct _TDI_DISCONNECT_REQUEST {
  323.     TDI_REQUEST Request;
  324.     LARGE_INTEGER Timeout;
  325. } TDI_REQUEST_DISCONNECT, *PTDI_REQUEST_DISCONNECT;
  326. //
  327. // Send is done through NtDeviceIoControlFile, which passes this
  328. // structure as its input buffer. The Handle specified in the
  329. // NtDeviceIoControlFile is the handle of the connection returned in the
  330. // NtCreateFile call. Note that it is possible to Send using the file system's
  331. // Write call. This will have the same effect as doing a Send with all flags
  332. // set to null.
  333. //
  334. typedef struct _TDI_REQUEST_SEND {
  335.     TDI_REQUEST Request;
  336.     USHORT SendFlags;
  337. } TDI_REQUEST_SEND, *PTDI_REQUEST_SEND;
  338. //
  339. // Receive is done through NtDeviceIoControlFile, which passes this
  340. // structure as its input buffer. The Handle specified in the
  341. // NtDeviceIoControlFile is the handle of the connection returned in the
  342. // NtCreateFile call. Note that it is possible to Receive using the file
  343. // system's Read call. Note further that receive returns a number of TDI_STATUS
  344. // values, which indicate things such as partial receives.
  345. //
  346. typedef struct _TDI_REQUEST_RECEIVE {
  347.     TDI_REQUEST Request;
  348.     USHORT ReceiveFlags;
  349. } TDI_REQUEST_RECEIVE, *PTDI_REQUEST_RECEIVE;
  350. //
  351. // SendDatagram is done through NtDeviceIoControlFile, which passes this
  352. // structure as its input buffer. The Handle specified in the
  353. // NtDeviceIoControlFile is the handle of the ADDRESS (note this is
  354. // different than above!!) returned in the NtCreateFile call. Send Datagram
  355. // specifies  the address of the receiver through the SendDatagramInformation
  356. // structure, using RemoteAddress to point to the transport address of the
  357. // destination of the datagram.
  358. //
  359. typedef struct _TDI_REQUEST_SEND_DATAGRAM {
  360.     TDI_REQUEST Request;
  361.     PTDI_CONNECTION_INFORMATION SendDatagramInformation;
  362. } TDI_REQUEST_SEND_DATAGRAM, *PTDI_REQUEST_SEND_DATAGRAM;
  363. //
  364. // ReceiveDatagram is done through NtDeviceIoControlFile, which passes this
  365. // structure as its input buffer. The Handle specified in the
  366. // NtDeviceIoControlFile is the handle of the ADDRESS (note this is
  367. // different than above!!) returned in the NtCreateFile call. Receive Datagram
  368. // specifies the address from which to receive a datagram through the
  369. // ReceiveDatagramInformation structure, using RemoteAddress to point to the
  370. // transport address of the origin of the datagram. (Broadcast datagrams are
  371. // received by making the pointer NULL.) The actual address of the sender of
  372. // the datagram is returned in ReturnInformation.
  373. //
  374. // for the receive datagram call
  375. //
  376. typedef struct _TDI_REQUEST_RECEIVE_DATAGRAM {
  377.     TDI_REQUEST Request;
  378.     PTDI_CONNECTION_INFORMATION ReceiveDatagramInformation;
  379.     PTDI_CONNECTION_INFORMATION ReturnInformation;
  380.     USHORT ReceiveFlags;
  381. } TDI_REQUEST_RECEIVE_DATAGRAM, *PTDI_REQUEST_RECEIVE_DATAGRAM;
  382. //
  383. // SetEventHandler is done through NtDeviceIoControlFile, which passes this
  384. // structure as its input buffer. The Handle specified in the
  385. // NtDeviceIoControlFile is the handle of the ADDRESS (note this is
  386. // different than above!!) returned in the NtCreateFile call.
  387. typedef struct _TDI_REQUEST_SET_EVENT {
  388.     TDI_REQUEST Request;
  389.     LONG EventType;
  390.     PVOID EventHandler;
  391.     PVOID EventContext;
  392. } TDI_REQUEST_SET_EVENT_HANDLER, *PTDI_REQUEST_SET_EVENT_HANDLER;
  393. //
  394. // ReceiveIndicator values (from TdiReceive and TdiReceiveDatagram requests,
  395. // and also presented at TDI_IND_RECEIVE and TDI_IND_RECEIVE_DATAGRAM time).
  396. //
  397. // The TDI_RECEIVE_PARTIAL bit is no longer used at the kernel level
  398. // interface.  TDI_RECEIVE_ENTIRE_MESSAGE has replaced it.  Providers
  399. // may continue to set TDI_RECEIVE_PARTIAL when appropriate if they so
  400. // desire, but the TDI_RECEIVE_ENTIRE_MESSAGE bit must be set or
  401. // cleared as appropriate on all receive indications.
  402. //
  403. #if 0
  404. #define TDI_RECEIVE_TRUNCATED           0x00000001 // received TSDU was truncated.
  405. #define TDI_RECEIVE_FRAGMENT            0x00000002 // received TSDU was fragmented.
  406. #endif
  407. #define TDI_RECEIVE_BROADCAST           0x00000004 // received TSDU was broadcast.
  408. #define TDI_RECEIVE_MULTICAST           0x00000008 // received TSDU was multicast.
  409. #define TDI_RECEIVE_PARTIAL             0x00000010 // received TSDU is not fully presented.
  410. #define TDI_RECEIVE_NORMAL              0x00000020 // received TSDU is normal data
  411. #define TDI_RECEIVE_EXPEDITED           0x00000040 // received TSDU is expedited data
  412. #define TDI_RECEIVE_PEEK                0x00000080 // received TSDU is not released
  413. #define TDI_RECEIVE_NO_RESPONSE_EXP     0x00000100 // HINT: no back-traffic expected
  414. #define TDI_RECEIVE_COPY_LOOKAHEAD      0x00000200 // for kernel-mode indications
  415. #define TDI_RECEIVE_ENTIRE_MESSAGE      0x00000400 // opposite of RECEIVE_PARTIAL
  416.                                                    //  (for kernel-mode indications)
  417. #define TDI_RECEIVE_AT_DISPATCH_LEVEL   0x00000800 // receive indication called
  418.                                                    //  at dispatch level
  419. //
  420. // Listen Flags
  421. //
  422. #define TDI_QUERY_ACCEPT                0x00000001     // complete TdiListen
  423.                                                        //   without accepting
  424.                                                        //   connection
  425. //
  426. // Options which are used for both SendOptions and ReceiveIndicators.
  427. //
  428. #define TDI_SEND_EXPEDITED            ((USHORT)0x0020) // TSDU is/was urgent/expedited.
  429. #define TDI_SEND_PARTIAL              ((USHORT)0x0040) // TSDU is/was terminated by an EOR.
  430. #define TDI_SEND_NO_RESPONSE_EXPECTED ((USHORT)0x0080) // HINT: no back traffic expected.
  431. #define TDI_SEND_NON_BLOCKING         ((USHORT)0x0100) // don't block if no buffer space in protocol
  432. //
  433. // Disconnect Flags
  434. //
  435. #define TDI_DISCONNECT_WAIT           ((USHORT)0x0001) // used for disconnect
  436.                                                        //   notification
  437. #define TDI_DISCONNECT_ABORT          ((USHORT)0x0002) // immediately terminate
  438.                                                        //   connection
  439. #define TDI_DISCONNECT_RELEASE        ((USHORT)0x0004) // initiate graceful
  440.                                                        //   disconnect
  441. #define TDI_DISCONNECT_CONFIRM        ((USHORT)0x0008) // confirm a graceful
  442.                                                        //   close
  443. #define TDI_DISCONNECT_ASYNC          ((USHORT)0x0010) // asynchronous
  444.                                                        //   graceful disconnect
  445. //
  446. // TdiRequest structure for TdiQueryInformation request.
  447. //
  448. typedef struct _TDI_REQUEST_QUERY_INFORMATION {
  449.     TDI_REQUEST Request;
  450.     ULONG QueryType;                          // class of information to be queried.
  451.     PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
  452. } TDI_REQUEST_QUERY_INFORMATION, *PTDI_REQUEST_QUERY_INFORMATION;
  453. //
  454. // TdiRequest structure for TdiSetInformation request.
  455. //
  456. typedef struct _TDI_REQUEST_SET_INFORMATION {
  457.     TDI_REQUEST Request;
  458.     ULONG SetType;                          // class of information to be set.
  459.     PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
  460. } TDI_REQUEST_SET_INFORMATION, *PTDI_REQUEST_SET_INFORMATION;
  461. //
  462. // This is the old name, do not use it.
  463. //
  464. typedef TDI_REQUEST_SET_INFORMATION  TDI_REQ_SET_INFORMATION, *PTDI_REQ_SET_INFORMATION;
  465. //
  466. // Convenient universal request type.
  467. //
  468. typedef union _TDI_REQUEST_TYPE {
  469.     TDI_REQUEST_ACCEPT TdiAccept;
  470.     TDI_REQUEST_CONNECT TdiConnect;
  471.     TDI_REQUEST_DISCONNECT TdiDisconnect;
  472.     TDI_REQUEST_LISTEN TdiListen;
  473.     TDI_REQUEST_QUERY_INFORMATION TdiQueryInformation;
  474.     TDI_REQUEST_RECEIVE TdiReceive;
  475.     TDI_REQUEST_RECEIVE_DATAGRAM TdiReceiveDatagram;
  476.     TDI_REQUEST_SEND TdiSend;
  477.     TDI_REQUEST_SEND_DATAGRAM TdiSendDatagram;
  478.     TDI_REQUEST_SET_EVENT_HANDLER TdiSetEventHandler;
  479.     TDI_REQUEST_SET_INFORMATION TdiSetInformation;
  480. } TDI_REQUEST_TYPE, *PTDI_REQUEST_TYPE;
  481. //
  482. // Query information types
  483. //
  484. //
  485. // Generic query info types, must be supported by all transports.
  486. //
  487. #define TDI_QUERY_BROADCAST_ADDRESS      0x00000001
  488. #define TDI_QUERY_PROVIDER_INFORMATION   0x00000002   // temp, renamed ...
  489. #define TDI_QUERY_PROVIDER_INFO          0x00000002   // ... to this
  490. #define TDI_QUERY_ADDRESS_INFO           0x00000003
  491. #define TDI_QUERY_CONNECTION_INFO        0x00000004
  492. #define TDI_QUERY_PROVIDER_STATISTICS    0x00000005
  493. #define TDI_QUERY_DATAGRAM_INFO          0x00000006
  494. #define TDI_QUERY_DATA_LINK_ADDRESS      0x00000007
  495. #define TDI_QUERY_NETWORK_ADDRESS        0x00000008
  496. //
  497. // netbios specific query information types, must be supported by netbios
  498. // providers. Query adapter status returns the ADAPTER_STATUS struture defined
  499. // in the file NB30.H. Query session status returns the SESSION_HEADER/
  500. // SESSION_BUFFER structures defined in NB30.H. Query find name returns
  501. // the FIND_NAME_HEADER/FIND_NAME_BUFFER structures defined in NB30.H.
  502. //
  503. #define TDI_QUERY_ADAPTER_STATUS         0x00000100
  504. #define TDI_QUERY_SESSION_STATUS         0x00000200
  505. #define TDI_QUERY_FIND_NAME              0x00000300
  506. //
  507. // The following structures are returned by TdiQueryInformation and are read
  508. // by TdiSetInformation. Note that a provider with netbios support will also
  509. // return the adapter status
  510. //
  511. typedef struct _TDI_ENDPOINT_INFO {
  512.     ULONG State;                        // current state of the endpoint.
  513.     ULONG Event;                        // last event at the endpoint.
  514.     ULONG TransmittedTsdus;             // TSDUs sent from this endpoint.
  515.     ULONG ReceivedTsdus;                // TSDUs received at this endpoint.
  516.     ULONG TransmissionErrors;           // TSDUs transmitted in error.
  517.     ULONG ReceiveErrors;                // TSDUs received in error.
  518.     ULONG MinimumLookaheadData;         // guaranteed min size of lookahead data.
  519.     ULONG MaximumLookaheadData;         // maximum size of lookahead data.
  520.     ULONG PriorityLevel;                // priority class assigned to outgoing data.
  521.     ULONG SecurityLevel;                // security level assigned to outgoing data.
  522.     ULONG SecurityCompartment;          // security compartment assigned to outgoing data.
  523. } TDI_ENDPOINT_INFO, *PTDI_ENDPOINT_INFO;
  524. typedef struct _TDI_CONNECTION_INFO {
  525.     ULONG State;                        // current state of the connection.
  526.     ULONG Event;                        // last event on the connection.
  527.     ULONG TransmittedTsdus;             // TSDUs sent on this connection.
  528.     ULONG ReceivedTsdus;                // TSDUs received on this connection.
  529.     ULONG TransmissionErrors;           // TSDUs transmitted in error/this connection.
  530.     ULONG ReceiveErrors;                // TSDUs received in error/this connection.
  531.     LARGE_INTEGER Throughput;           // estimated throughput on this connection.
  532.     LARGE_INTEGER Delay;                // estimated delay on this connection.
  533.     ULONG SendBufferSize;               // size of buffer for sends - only
  534.                                         // meaningful for internal buffering
  535.                                         // protocols like tcp
  536.     ULONG ReceiveBufferSize;            // size of buffer for receives - only
  537.                                         // meaningful for internal buffering
  538.                                         // protocols like tcp
  539.     BOOLEAN Unreliable;                 // is this connection "unreliable".
  540. } TDI_CONNECTION_INFO, *PTDI_CONNECTION_INFO;
  541. typedef struct _TDI_ADDRESS_INFO {
  542.     ULONG ActivityCount;                // outstanding open file objects/this address.
  543.     TRANSPORT_ADDRESS Address;          // the actual address & its components.
  544. } TDI_ADDRESS_INFO, *PTDI_ADDRESS_INFO;
  545. typedef struct _TDI_DATAGRAM_INFO {
  546.     ULONG MaximumDatagramBytes;
  547.     ULONG MaximumDatagramCount;
  548. } TDI_DATAGRAM_INFO, *PTDI_DATAGRAM_INFO;
  549. typedef struct _TDI_PROVIDER_INFO {
  550.     ULONG Version;                      // TDI version: 0xaabb, aa=major, bb=minor
  551.     ULONG MaxSendSize;                  // max size of user send.
  552.     ULONG MaxConnectionUserData;        // max size of user-specified connect data.
  553.     ULONG MaxDatagramSize;              // max datagram length in bytes.
  554.     ULONG ServiceFlags;                 // service options, defined below.
  555.     ULONG MinimumLookaheadData;         // guaranteed min size of lookahead data.
  556.     ULONG MaximumLookaheadData;         // maximum size of lookahead data.
  557.     ULONG NumberOfResources;            // how many TDI_RESOURCE_STATS for provider.
  558.     LARGE_INTEGER StartTime;            // when the provider became active.
  559. } TDI_PROVIDER_INFO, *PTDI_PROVIDER_INFO;
  560. #define TDI_SERVICE_CONNECTION_MODE     0x00000001 // connection mode supported.
  561. #define TDI_SERVICE_ORDERLY_RELEASE     0x00000002 // orderly release supported.
  562. #define TDI_SERVICE_CONNECTIONLESS_MODE 0x00000004 // connectionless mode supported.
  563. #define TDI_SERVICE_ERROR_FREE_DELIVERY 0x00000008 // error free delivery supported.
  564. #define TDI_SERVICE_SECURITY_LEVEL      0x00000010 // security wrapper supported.
  565. #define TDI_SERVICE_BROADCAST_SUPPORTED 0x00000020 // broadcast datagrams supported.
  566. #define TDI_SERVICE_MULTICAST_SUPPORTED 0x00000040 // multicast datagrams supported.
  567. #define TDI_SERVICE_DELAYED_ACCEPTANCE  0x00000080 // use of TDI_ACCEPT_OR_REJECT is supported.
  568. #define TDI_SERVICE_EXPEDITED_DATA      0x00000100 // expedited data supported.
  569. #define TDI_SERVICE_INTERNAL_BUFFERING  0x00000200 // protocol does internal buffering
  570. #define TDI_SERVICE_ROUTE_DIRECTED      0x00000400 // directed packets may go further than MC.
  571. #define TDI_SERVICE_NO_ZERO_LENGTH      0x00000800 // zero-length sends NOT supported
  572. #define TDI_SERVICE_POINT_TO_POINT      0x00001000 // transport is functioning as a RAS gateway
  573. typedef struct _TDI_PROVIDER_RESOURCE_STATS {
  574.     ULONG ResourceId;                   // identifies resource in question.
  575.     ULONG MaximumResourceUsed;          // maximum number in use at once.
  576.     ULONG AverageResourceUsed;          // average number in use.
  577.     ULONG ResourceExhausted;            // number of times resource not available.
  578. } TDI_PROVIDER_RESOURCE_STATS, *PTDI_PROVIDER_RESOURCE_STATS;
  579. typedef struct _TDI_PROVIDER_STATISTICS {
  580.     ULONG Version;                      // TDI version: 0xaabb, aa=major, bb=minor
  581.     ULONG OpenConnections;              // currently active connections.
  582.     ULONG ConnectionsAfterNoRetry;      // successful connections, no retries.
  583.     ULONG ConnectionsAfterRetry;        // successful connections after retry.
  584.     ULONG LocalDisconnects;             // connection disconnected locally.
  585.     ULONG RemoteDisconnects;            // connection disconnected by remote.
  586.     ULONG LinkFailures;                 // connections dropped, link failure.
  587.     ULONG AdapterFailures;              // connections dropped, adapter failure.
  588.     ULONG SessionTimeouts;              // connections dropped, session timeout.
  589.     ULONG CancelledConnections;         // connect attempts cancelled.
  590.     ULONG RemoteResourceFailures;       // connections failed, remote resource problems.
  591.     ULONG LocalResourceFailures;        // connections failed, local resource problems.
  592.     ULONG NotFoundFailures;             // connections failed, remote not found.
  593.     ULONG NoListenFailures;             // connections rejected, we had no listens.
  594.     ULONG DatagramsSent;
  595.     LARGE_INTEGER DatagramBytesSent;
  596.     ULONG DatagramsReceived;
  597.     LARGE_INTEGER DatagramBytesReceived;
  598.     ULONG PacketsSent;                  // total packets given to NDIS.
  599.     ULONG PacketsReceived;              // total packets received from NDIS.
  600.     ULONG DataFramesSent;
  601.     LARGE_INTEGER DataFrameBytesSent;
  602.     ULONG DataFramesReceived;
  603.     LARGE_INTEGER DataFrameBytesReceived;
  604.     ULONG DataFramesResent;
  605.     LARGE_INTEGER DataFrameBytesResent;
  606.     ULONG DataFramesRejected;
  607.     LARGE_INTEGER DataFrameBytesRejected;
  608.     ULONG ResponseTimerExpirations;     // e.g. T1 for Netbios
  609.     ULONG AckTimerExpirations;          // e.g. T2 for Netbios
  610.     ULONG MaximumSendWindow;            // in bytes
  611.     ULONG AverageSendWindow;            // in bytes
  612.     ULONG PiggybackAckQueued;           // attempts to wait to piggyback ack.
  613.     ULONG PiggybackAckTimeouts;         // times that wait timed out.
  614.     LARGE_INTEGER WastedPacketSpace;    // total amount of "wasted" packet space.
  615.     ULONG WastedSpacePackets;           // how many packets contributed to that.
  616.     ULONG NumberOfResources;            // how many TDI_RESOURCE_STATS follow.
  617.     TDI_PROVIDER_RESOURCE_STATS ResourceStats[1];    // variable array of them.
  618. } TDI_PROVIDER_STATISTICS, *PTDI_PROVIDER_STATISTICS;
  619. #if 0
  620. typedef struct _TDI_NETMAN_INFO {
  621.     OFFSET VariableName;                // name of variable (a FLAT_STRING).
  622.     OFFSET VariableValue;               // value of variable (a TDI_NETMAN_VARIABLE).
  623. } TDI_NETMAN_INFO, *PTDI_NETMAN_INFO;
  624. typedef struct _TDI_NETMAN_VARIABLE {
  625.     ULONG VariableType;                 // selector for union, below.
  626.     union {
  627.         ULONG LongValue;
  628.         HARDWARE_ADDRESS HardwareAddressValue;
  629.         FLAT_STRING StringValue;
  630.     } Value;
  631. } TDI_NETMAN_VARIABLE, *PTDI_NETMAN_VARIABLE;
  632. #define NETMAN_VARTYPE_ULONG            0       // type is a ULONG.
  633. #define NETMAN_VARTYPE_HARDWARE_ADDRESS 1       // type is a HARDWARE_ADDRESS.
  634. #define NETMAN_VARTYPE_STRING           2       // type is a FLAT_STRING.
  635. typedef union _TDI_INFO_BUFFER {
  636.     TDI_ENDPOINT_INFO EndpointInfo;
  637.     TDI_CONNECTION_INFO ConnectionInfo;
  638.     TDI_ADDRESS_INFO AddressInfo;
  639.     TDI_PROVIDER_INFO ProviderInfo;
  640.     TDI_NETMAN_INFO NetmanVariable;
  641. } TDI_INFO_BUFFER, *PTDI_INFO_BUFFER;
  642. #define TDI_INFO_CLASS_ENDPOINT         0       // endpoint information class.
  643. #define TDI_INFO_CLASS_CONNECTION       1       // connection information class.
  644. #define TDI_INFO_CLASS_ADDRESS          2       // address information class.
  645. #define TDI_INFO_CLASS_PROVIDER         3       // provider information class.
  646. #define TDI_INFO_CLASS_NETMAN           4       // network management info class.
  647. #endif
  648. NTSTATUS
  649. TdiOpenNetbiosAddress (
  650.     IN OUT PHANDLE FileHandle,
  651.     IN PUCHAR Buffer,
  652.     IN PVOID DeviceName,
  653.     IN PVOID Name
  654.     );
  655. #define IOCTL_TDI_MAGIC_BULLET          _TDI_CONTROL_CODE( 0x7f, METHOD_NEITHER )
  656. //
  657. // NtDeviceIoControlFile InputBuffer/OutputBuffer record structures for
  658. // this device.
  659. //
  660. #if 0
  661. //
  662. // These are the old definitions
  663. //
  664. typedef struct _TDI_REQUEST_USER_ASSOCIATE {
  665.     HANDLE AddressHandle;
  666. } TDI_REQUEST_USER_ASSOCIATE, *PTDI_REQUEST_USER_ASSOCIATE;
  667. typedef struct _TDI_REQUEST_USER_CONNECT {
  668.     TDI_CONNECTION_INFORMATION CallInformation;
  669.     //CHAR UserData[CallInformation.UserDataLength];
  670.     //CHAR Options[CallInformation.OptionsLength];
  671.     //CHAR RemoteAddress[CallInformation.RemoteAddressLength];
  672. } TDI_REQUEST_USER_CONNECT, *PTDI_REQUEST_USER_CONNECT;
  673. typedef struct _TDI_REQUEST_USER_QUERY_INFO {
  674.     LONG QueryType;
  675. } TDI_REQUEST_USER_QUERY_INFO, *PTDI_REQUEST_USER_QUERY_INFO;
  676. #else
  677. //
  678. // Define these to match the kernel ones for compatibility; eventually
  679. // these will be removed.
  680. //
  681. typedef TDI_REQUEST_ASSOCIATE_ADDRESS TDI_REQUEST_USER_ASSOCIATE, *PTDI_REQUEST_USER_ASSOCIATE;
  682. typedef TDI_REQUEST_CONNECT TDI_REQUEST_USER_CONNECT, *PTDI_REQUEST_USER_CONNECT;
  683. typedef TDI_REQUEST_QUERY_INFORMATION TDI_REQUEST_USER_QUERY_INFO, *PTDI_REQUEST_USER_QUERY_INFO;
  684. #endif
  685. //
  686. // The header in the OutputBuffer passed to TdiAction
  687. //
  688. typedef struct _TDI_ACTION_HEADER {
  689.     ULONG   TransportId;
  690.     USHORT  ActionCode;
  691.     USHORT  Reserved;
  692. } TDI_ACTION_HEADER, *PTDI_ACTION_HEADER;
  693. typedef struct _STREAMS_TDI_ACTION {
  694.     TDI_ACTION_HEADER Header;
  695.     BOOLEAN DatagramOption;
  696.     ULONG BufferLength;
  697.     CHAR Buffer[1];
  698. } STREAMS_TDI_ACTION, *PSTREAMS_TDI_ACTION;
  699. #endif // ndef _TDI_USER_