Annotation of ntddk/src/network/inc/tdi.h, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.