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

1.1       root        1: /*++
                      2: 
                      3: Copyright (c) 1989  Microsoft Corporation
                      4: 
                      5: Module Name:
                      6: 
                      7:     tdikrnl.h
                      8: 
                      9: Abstract:
                     10: 
                     11:     This header file contains interface definitions for NT transport
                     12:     providers running in kernel mode.  This interface is documented in the
                     13:     NT Transport Driver Interface (TDI) Specification, Version 2.
                     14: 
                     15: Author:
                     16: 
                     17:     Dave Beaver (dbeaver) 20 June 1991
                     18: 
                     19: Revision History:
                     20: 
                     21: --*/
                     22: 
                     23: #ifndef _TDI_KRNL_
                     24: #define _TDI_KRNL_
                     25: 
                     26: #include <tdi.h>   // get the user mode includes
                     27: 
                     28: //
                     29: // In this TDI, a kernel mode client calls TDI using IoCallDriver with the
                     30: // current Irp stack pointer set to 16 bytes of pointers to other structures.
                     31: // each of the supported NtDeviceIoControlFile analogs has a somehat different
                     32: // structure, laid out below.
                     33: //
                     34: // The IrpSP information passed by kernel mode clients looks like:
                     35: //
                     36: 
                     37: typedef struct _TDI_REQUEST_KERNEL {
                     38:     ULONG RequestFlags;
                     39:     PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
                     40:     PTDI_CONNECTION_INFORMATION ReturnConnectionInformation;
                     41:     PVOID RequestSpecific;
                     42: } TDI_REQUEST_KERNEL, *PTDI_REQUEST_KERNEL;
                     43: 
                     44: //
                     45: // defined request codes for the kernel clients. We make these the same
                     46: // as the IOCTL codes mostly for convenience; either can be used with
                     47: // the same results.
                     48: //
                     49: 
                     50: #define TDI_ASSOCIATE_ADDRESS    (0x01)
                     51: #define TDI_DISASSOCIATE_ADDRESS (0x02)
                     52: #define TDI_CONNECT              (0x03)
                     53: #define TDI_LISTEN               (0x04)
                     54: #define TDI_ACCEPT               (0x05)
                     55: #define TDI_DISCONNECT           (0x06)
                     56: #define TDI_SEND                 (0x07)
                     57: #define TDI_RECEIVE              (0x08)
                     58: #define TDI_SEND_DATAGRAM        (0x09)
                     59: #define TDI_RECEIVE_DATAGRAM     (0x0A)
                     60: #define TDI_SET_EVENT_HANDLER    (0x0B)
                     61: #define TDI_QUERY_INFORMATION    (0x0C)
                     62: #define TDI_SET_INFORMATION      (0x0D)
                     63: #define TDI_ACTION               (0x0E)
                     64: 
                     65: //
                     66: // TdiOpenAddress (Not Used)
                     67: // TdiCloseAddress (Not Used)
                     68: // TdiOpenConnection (Not Used)
                     69: // TdiCloseConnection (Not Used)
                     70: //
                     71: 
                     72: //
                     73: // some useful constants for comparison when determining the file type;
                     74: // not required.
                     75: //
                     76: 
                     77: #define TDI_TRANSPORT_ADDRESS_FILE  1
                     78: #define TDI_CONNECTION_FILE 2
                     79: #define TDI_CONTROL_CHANNEL_FILE 3
                     80: 
                     81: //
                     82: // TdiAssociateAddress
                     83: //
                     84: 
                     85: typedef struct _TDI_REQUEST_KERNEL_ASSOCIATE {
                     86:     HANDLE AddressHandle;
                     87: } TDI_REQUEST_KERNEL_ASSOCIATE, *PTDI_REQUEST_KERNEL_ASSOCIATE;
                     88: 
                     89: //
                     90: // TdiDisassociateAddress -- None supplied
                     91: //
                     92: 
                     93: typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISASSOCIATE,
                     94:     *PTDI_REQUEST_KERNEL_DISASSOCIATE;
                     95: 
                     96: //
                     97: // TdiConnect uses the structure given above (TDI_REQUEST_KERNEL); it's
                     98: // defined again below for convenience
                     99: //
                    100: 
                    101: typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_CONNECT,
                    102:     *PTDI_REQUEST_KERNEL_CONNECT;
                    103: 
                    104: //
                    105: // TdiDisconnect uses the structure given above (TDI_REQUEST_KERNEL); it's
                    106: // defined again below for convenience
                    107: //
                    108: 
                    109: typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_DISCONNECT,
                    110:     *PTDI_REQUEST_KERNEL_DISCONNECT;
                    111: 
                    112: //
                    113: // TdiListen uses the structure given above (TDI_REQUEST_KERNEL); it's
                    114: // defined again below for convenience
                    115: //
                    116: 
                    117: typedef TDI_REQUEST_KERNEL TDI_REQUEST_KERNEL_LISTEN,
                    118:     *PTDI_REQUEST_KERNEL_LISTEN;
                    119: 
                    120: //
                    121: // TdiAccept
                    122: //
                    123: 
                    124: typedef struct _TDI_REQUEST_KERNEL_ACCEPT {
                    125:     PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
                    126:     PTDI_CONNECTION_INFORMATION ReturnConnectionInformation;
                    127: } TDI_REQUEST_KERNEL_ACCEPT, *PTDI_REQUEST_KERNEL_ACCEPT;
                    128: 
                    129: //
                    130: // TdiSend
                    131: //
                    132: 
                    133: typedef struct _TDI_REQUEST_KERNEL_SEND {
                    134:     ULONG SendLength;
                    135:     ULONG SendFlags;
                    136: } TDI_REQUEST_KERNEL_SEND, *PTDI_REQUEST_KERNEL_SEND;
                    137: 
                    138: //
                    139: // TdiReceive
                    140: //
                    141: 
                    142: typedef struct _TDI_REQUEST_KERNEL_RECEIVE {
                    143:     ULONG ReceiveLength;
                    144:     ULONG ReceiveFlags;
                    145: } TDI_REQUEST_KERNEL_RECEIVE, *PTDI_REQUEST_KERNEL_RECEIVE;
                    146: 
                    147: //
                    148: // TdiSendDatagram
                    149: //
                    150: 
                    151: typedef struct _TDI_REQUEST_KERNEL_SENDDG {
                    152:     ULONG SendLength;
                    153:     PTDI_CONNECTION_INFORMATION SendDatagramInformation;
                    154: } TDI_REQUEST_KERNEL_SENDDG, *PTDI_REQUEST_KERNEL_SENDDG;
                    155: 
                    156: //
                    157: // TdiReceiveDatagram
                    158: //
                    159: 
                    160: typedef struct _TDI_REQUEST_KERNEL_RECEIVEDG {
                    161:     ULONG ReceiveLength;
                    162:     PTDI_CONNECTION_INFORMATION ReceiveDatagramInformation;
                    163:     PTDI_CONNECTION_INFORMATION ReturnDatagramInformation;
                    164:     ULONG ReceiveFlags;
                    165: } TDI_REQUEST_KERNEL_RECEIVEDG, *PTDI_REQUEST_KERNEL_RECEIVEDG;
                    166: 
                    167: //
                    168: // TdiSetEventHandler
                    169: //
                    170: 
                    171: typedef struct _TDI_REQUEST_KERNEL_SET_EVENT {
                    172:     int EventType;
                    173:     PVOID EventHandler;
                    174:     PVOID EventContext;
                    175: } TDI_REQUEST_KERNEL_SET_EVENT, *PTDI_REQUEST_KERNEL_SET_EVENT;
                    176: 
                    177: //
                    178: // TdiQueryInformation
                    179: //
                    180: 
                    181: typedef struct _TDI_REQUEST_KERNEL_QUERY_INFO {
                    182:     int QueryType;
                    183:     PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
                    184: } TDI_REQUEST_KERNEL_QUERY_INFORMATION, *PTDI_REQUEST_KERNEL_QUERY_INFORMATION;
                    185: 
                    186: //
                    187: // TdiSetInformation
                    188: //
                    189: 
                    190: typedef struct _TDI_REQUEST_KERNEL_SET_INFO {
                    191:     int SetType;
                    192:     PTDI_CONNECTION_INFORMATION RequestConnectionInformation;
                    193: } TDI_REQUEST_KERNEL_SET_INFORMATION, *PTDI_REQUEST_KERNEL_SET_INFORMATION;
                    194: 
                    195: //
                    196: // Event types that are known
                    197: //
                    198: 
                    199: #define TDI_EVENT_CONNECT           ((USHORT)0) // TDI_IND_CONNECT event handler.
                    200: #define TDI_EVENT_DISCONNECT        ((USHORT)1) // TDI_IND_DISCONNECT event handler.
                    201: #define TDI_EVENT_ERROR             ((USHORT)2) // TDI_IND_ERROR event handler.
                    202: #define TDI_EVENT_RECEIVE           ((USHORT)3) // TDI_IND_RECEIVE event handler.
                    203: #define TDI_EVENT_RECEIVE_DATAGRAM  ((USHORT)4) // TDI_IND_RECEIVE_DATAGRAM event handler.
                    204: #define TDI_EVENT_RECEIVE_EXPEDITED ((USHORT)5) // TDI_IND_RECEIVE_EXPEDITED event handler.
                    205: #define TDI_EVENT_SEND_POSSIBLE     ((USHORT)6) // TDI_IND_SEND_POSSIBLE event handler
                    206: 
                    207: //
                    208: // indicate connection event prototype. This is invoked when a request for
                    209: // connection has been received by the provider and the user wishes to either
                    210: // accept or reject that request.
                    211: //
                    212: 
                    213: typedef
                    214: NTSTATUS
                    215: (*PTDI_IND_CONNECT)(
                    216:     IN PVOID TdiEventContext,
                    217:     IN int RemoteAddressLength,
                    218:     IN PVOID RemoteAddress,
                    219:     IN int UserDataLength,
                    220:     IN PVOID UserData,
                    221:     IN int OptionsLength,
                    222:     IN PVOID Options,
                    223:     OUT CONNECTION_CONTEXT *ConnectionContext,
                    224:     OUT PIRP *AcceptIrp
                    225:     )
                    226:     ;
                    227: 
                    228: NTSTATUS
                    229: TdiDefaultConnectHandler (
                    230:     IN PVOID TdiEventContext,
                    231:     IN int RemoteAddressLength,
                    232:     IN PVOID RemoteAddress,
                    233:     IN int UserDataLength,
                    234:     IN PVOID UserData,
                    235:     IN int OptionsLength,
                    236:     IN PVOID Options,
                    237:     OUT CONNECTION_CONTEXT *ConnectionContext,
                    238:     OUT PIRP *AcceptIrp
                    239:     );
                    240: 
                    241: //
                    242: // Disconnection indication prototype. This is invoked when a connection is
                    243: // being disconnected for a reason other than the user requesting it. Note that
                    244: // this is a change from TDI V1, which indicated only when the remote caused
                    245: // a disconnection. Any non-directed disconnection will cause this indication.
                    246: //
                    247: 
                    248: typedef
                    249: NTSTATUS
                    250: (*PTDI_IND_DISCONNECT)(
                    251:     IN PVOID TdiEventContext,
                    252:     IN CONNECTION_CONTEXT ConnectionContext,
                    253:     IN int DisconnectDataLength,
                    254:     IN PVOID DisconnectData,
                    255:     IN int DisconnectInformationLength,
                    256:     IN PVOID DisconnectInformation,
                    257:     IN ULONG DisconnectFlags
                    258:     );
                    259: 
                    260: NTSTATUS
                    261: TdiDefaultDisconnectHandler (
                    262:     IN PVOID TdiEventContext,
                    263:     IN CONNECTION_CONTEXT ConnectionContext,
                    264:     IN int DisconnectDataLength,
                    265:     IN PVOID DisconnectData,
                    266:     IN int DisconnectInformationLength,
                    267:     IN PVOID DisconnectInformation,
                    268:     IN ULONG DisconnectFlags
                    269:     );
                    270: 
                    271: //
                    272: // A protocol error has occurred when this indication happens. This indication
                    273: // occurs only for errors of the worst type; the address this indication is
                    274: // delivered to is no longer usable for protocol-related operations, and
                    275: // should not be used for operations henceforth. All connections associated
                    276: // it are invalid.
                    277: // For NetBIOS-type providers, this indication is also delivered when a name
                    278: // in conflict or duplicate name occurs.
                    279: //
                    280: 
                    281: typedef
                    282: NTSTATUS
                    283: (*PTDI_IND_ERROR)(
                    284:     IN PVOID TdiEventContext,           // the endpoint's file object.
                    285:     IN NTSTATUS Status                // status code indicating error type.
                    286:     );
                    287: 
                    288: NTSTATUS
                    289: TdiDefaultErrorHandler (
                    290:     IN PVOID TdiEventContext,           // the endpoint's file object.
                    291:     IN NTSTATUS Status                // status code indicating error type.
                    292:     );
                    293: 
                    294: //
                    295: // TDI_IND_RECEIVE indication handler definition.  This client routine is
                    296: // called by the transport provider when a connection-oriented TSDU is received
                    297: // that should be presented to the client.
                    298: //
                    299: 
                    300: typedef
                    301: NTSTATUS
                    302: (*PTDI_IND_RECEIVE)(
                    303:     IN PVOID TdiEventContext,
                    304:     IN CONNECTION_CONTEXT ConnectionContext,
                    305:     IN ULONG ReceiveFlags,
                    306:     IN ULONG BytesIndicated,
                    307:     IN ULONG BytesAvailable,
                    308:     OUT ULONG *BytesTaken,
                    309:     IN PVOID Tsdu,                      // pointer describing this TSDU, typically a lump of bytes
                    310:     OUT PIRP *IoRequestPacket            // TdiReceive IRP if MORE_PROCESSING_REQUIRED.
                    311:     );
                    312: 
                    313: NTSTATUS
                    314: TdiDefaultReceiveHandler (
                    315:     IN PVOID TdiEventContext,
                    316:     IN CONNECTION_CONTEXT ConnectionContext,
                    317:     IN ULONG ReceiveFlags,
                    318:     IN ULONG BytesIndicated,
                    319:     IN ULONG BytesAvailable,
                    320:     OUT ULONG *BytesTaken,
                    321:     IN PVOID Tsdu,                      // pointer describing this TSDU, typically a lump of bytes
                    322:     OUT PIRP *IoRequestPacket            // TdiReceive IRP if MORE_PROCESSING_REQUIRED.
                    323:     );
                    324: 
                    325: //
                    326: // TDI_IND_RECEIVE_DATAGRAM indication handler definition.  This client routine
                    327: // is called by the transport provider when a connectionless TSDU is received
                    328: // that should be presented to the client.
                    329: //
                    330: 
                    331: typedef
                    332: NTSTATUS
                    333: (*PTDI_IND_RECEIVE_DATAGRAM)(
                    334:     IN PVOID TdiEventContext,       // the event context
                    335:     IN int SourceAddressLength,     // length of the originator of the datagram
                    336:     IN PVOID SourceAddress,         // string describing the originator of the datagram
                    337:     IN int OptionsLength,           // options for the receive
                    338:     IN PVOID Options,               //
                    339:     IN ULONG ReceiveDatagramFlags,  //
                    340:     IN ULONG BytesIndicated,        // number of bytes this indication
                    341:     IN ULONG BytesAvailable,        // number of bytes in complete Tsdu
                    342:     OUT ULONG *BytesTaken,          // number of bytes used
                    343:     IN PVOID Tsdu,                  // pointer describing this TSDU, typically a lump of bytes
                    344:     OUT PIRP *IoRequestPacket        // TdiReceive IRP if MORE_PROCESSING_REQUIRED.
                    345:     );
                    346: 
                    347: NTSTATUS
                    348: TdiDefaultRcvDatagramHandler (
                    349:     IN PVOID TdiEventContext,       // the event context
                    350:     IN int SourceAddressLength,     // length of the originator of the datagram
                    351:     IN PVOID SourceAddress,         // string describing the originator of the datagram
                    352:     IN int OptionsLength,           // options for the receive
                    353:     IN PVOID Options,               //
                    354:     IN ULONG ReceiveDatagramFlags,  //
                    355:     IN ULONG BytesIndicated,        // number of bytes this indication
                    356:     IN ULONG BytesAvailable,        // number of bytes in complete Tsdu
                    357:     OUT ULONG *BytesTaken,          // number of bytes used
                    358:     IN PVOID Tsdu,                  // pointer describing this TSDU, typically a lump of bytes
                    359:     OUT PIRP *IoRequestPacket        // TdiReceive IRP if MORE_PROCESSING_REQUIRED.
                    360:     );
                    361: 
                    362: //
                    363: // This indication is delivered if expedited data is received on the connection.
                    364: // This will only occur in providers that support expedited data.
                    365: //
                    366: 
                    367: typedef
                    368: NTSTATUS
                    369: (*PTDI_IND_RECEIVE_EXPEDITED)(
                    370:     IN PVOID TdiEventContext,
                    371:     IN CONNECTION_CONTEXT ConnectionContext,
                    372:     IN ULONG ReceiveFlags,          //
                    373:     IN ULONG BytesIndicated,        // number of bytes in this indication
                    374:     IN ULONG BytesAvailable,        // number of bytes in complete Tsdu
                    375:     OUT ULONG *BytesTaken,          // number of bytes used by indication routine
                    376:     IN PVOID Tsdu,                  // pointer describing this TSDU, typically a lump of bytes
                    377:     OUT PIRP *IoRequestPacket        // TdiReceive IRP if MORE_PROCESSING_REQUIRED.
                    378:     );
                    379: 
                    380: NTSTATUS
                    381: TdiDefaultRcvExpeditedHandler (
                    382:     IN PVOID TdiEventContext,
                    383:     IN CONNECTION_CONTEXT ConnectionContext,
                    384:     IN ULONG ReceiveFlags,          //
                    385:     IN ULONG BytesIndicated,        // number of bytes in this indication
                    386:     IN ULONG BytesAvailable,        // number of bytes in complete Tsdu
                    387:     OUT ULONG *BytesTaken,          // number of bytes used by indication routine
                    388:     IN PVOID Tsdu,                  // pointer describing this TSDU, typically a lump of bytes
                    389:     OUT PIRP *IoRequestPacket        // TdiReceive IRP if MORE_PROCESSING_REQUIRED.
                    390:     );
                    391: 
                    392: //
                    393: // This indication is delivered if there is room for a send in the buffer of
                    394: // a buffering protocol.
                    395: //
                    396: 
                    397: typedef
                    398: NTSTATUS
                    399: (*PTDI_IND_SEND_POSSIBLE)(
                    400:     IN PVOID TdiEventContext,
                    401:     IN PVOID ConnectionContext,
                    402:     IN ULONG BytesAvailable);
                    403: 
                    404: NTSTATUS
                    405: TdiDefaultSendPossibleHandler (
                    406:     IN PVOID TdiEventContext,
                    407:     IN PVOID ConnectionContext,
                    408:     IN ULONG BytesAvailable);
                    409: 
                    410: //
                    411: // defined MACROS to allow the kernel mode client to easily build an IRP for
                    412: // any function.
                    413: //
                    414: 
                    415: #define TdiBuildAssociateAddress(Irp, DevObj, FileObj, CompRoutine, Contxt, AddrHandle)                           \
                    416:     {                                                                        \
                    417:         PTDI_REQUEST_KERNEL_ASSOCIATE p;                                     \
                    418:         PIO_STACK_LOCATION _IRPSP;                                           \
                    419:         if ( CompRoutine != NULL) {                                          \
                    420:             IoSetCompletionRoutine( Irp, CompRoutine, Contxt, TRUE, TRUE, TRUE);\
                    421:         } else {                                                             \
                    422:             IoSetCompletionRoutine( Irp, NULL, NULL, FALSE, FALSE, FALSE);   \
                    423:         }                                                                    \
                    424:         _IRPSP = IoGetNextIrpStackLocation (Irp);                            \
                    425:         _IRPSP->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;              \
                    426:         _IRPSP->MinorFunction = TDI_ASSOCIATE_ADDRESS;                       \
                    427:         _IRPSP->DeviceObject = DevObj;                                       \
                    428:         _IRPSP->FileObject = FileObj;                                        \
                    429:         p = (PTDI_REQUEST_KERNEL_ASSOCIATE)&_IRPSP->Parameters;              \
                    430:         p->AddressHandle = (HANDLE)(AddrHandle);                             \
                    431:     }
                    432: 
                    433: #define TdiBuildDisassociateAddress(Irp, DevObj, FileObj, CompRoutine, Contxt)                                    \
                    434:     {                                                                        \
                    435:         PTDI_REQUEST_KERNEL_DISASSOCIATE p;                                  \
                    436:         PIO_STACK_LOCATION _IRPSP;                                           \
                    437:         if ( CompRoutine != NULL) {                                          \
                    438:             IoSetCompletionRoutine( Irp, CompRoutine, Contxt, TRUE, TRUE, TRUE);\
                    439:         } else {                                                             \
                    440:             IoSetCompletionRoutine( Irp, NULL, NULL, FALSE, FALSE, FALSE);   \
                    441:         }                                                                    \
                    442:         _IRPSP = IoGetNextIrpStackLocation (Irp);                            \
                    443:         _IRPSP->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;              \
                    444:         _IRPSP->MinorFunction = TDI_DISASSOCIATE_ADDRESS;                    \
                    445:         _IRPSP->DeviceObject = DevObj;                                       \
                    446:         _IRPSP->FileObject = FileObj;                                        \
                    447:         p = (PTDI_REQUEST_KERNEL_DISASSOCIATE)&_IRPSP->Parameters;           \
                    448:     }
                    449: 
                    450: #define TdiBuildConnect(Irp, DevObj, FileObj, CompRoutine, Contxt, Time, RequestConnectionInfo, ReturnConnectionInfo)\
                    451:     {                                                                        \
                    452:         PTDI_REQUEST_KERNEL p;                                               \
                    453:         PIO_STACK_LOCATION _IRPSP;                                           \
                    454:         if ( CompRoutine != NULL) {                                          \
                    455:             IoSetCompletionRoutine( Irp, CompRoutine, Contxt, TRUE, TRUE, TRUE);\
                    456:         } else {                                                             \
                    457:             IoSetCompletionRoutine( Irp, NULL, NULL, FALSE, FALSE, FALSE);   \
                    458:         }                                                                    \
                    459:         _IRPSP = IoGetNextIrpStackLocation (Irp);                            \
                    460:         _IRPSP->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;              \
                    461:         _IRPSP->MinorFunction = TDI_CONNECT;                                 \
                    462:         _IRPSP->DeviceObject = DevObj;                                       \
                    463:         _IRPSP->FileObject = FileObj;                                        \
                    464:         p = (PTDI_REQUEST_KERNEL)&_IRPSP->Parameters;                        \
                    465:         p->RequestConnectionInformation = RequestConnectionInfo;             \
                    466:         p->ReturnConnectionInformation = ReturnConnectionInfo;               \
                    467:         p->RequestSpecific = (PVOID)Time;                                    \
                    468:     }
                    469: 
                    470: #define TdiBuildListen(Irp, DevObj, FileObj, CompRoutine, Contxt, Flags, RequestConnectionInfo, ReturnConnectionInfo)\
                    471:     {                                                                        \
                    472:         PTDI_REQUEST_KERNEL p;                                               \
                    473:         PIO_STACK_LOCATION _IRPSP;                                           \
                    474:         if ( CompRoutine != NULL) {                                          \
                    475:             IoSetCompletionRoutine( Irp, CompRoutine, Contxt, TRUE, TRUE, TRUE);\
                    476:         } else {                                                             \
                    477:             IoSetCompletionRoutine( Irp, NULL, NULL, FALSE, FALSE, FALSE);   \
                    478:         }                                                                    \
                    479:         _IRPSP = IoGetNextIrpStackLocation (Irp);                            \
                    480:         _IRPSP->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;              \
                    481:         _IRPSP->MinorFunction = TDI_LISTEN;                                  \
                    482:         _IRPSP->DeviceObject = DevObj;                                       \
                    483:         _IRPSP->FileObject = FileObj;                                        \
                    484:         p = (PTDI_REQUEST_KERNEL)&_IRPSP->Parameters;                        \
                    485:         p->RequestFlags = Flags;                                             \
                    486:         p->RequestConnectionInformation = RequestConnectionInfo;             \
                    487:         p->ReturnConnectionInformation = ReturnConnectionInfo;               \
                    488:     }
                    489: 
                    490: #define TdiBuildAccept(Irp, DevObj, FileObj, CompRoutine, Contxt, RequestConnectionInfo, ReturnConnectionInfo)\
                    491:     {                                                                        \
                    492:         PTDI_REQUEST_KERNEL_ACCEPT p;                                        \
                    493:         PIO_STACK_LOCATION _IRPSP;                                           \
                    494:         if ( CompRoutine != NULL) {                                          \
                    495:             IoSetCompletionRoutine( Irp, CompRoutine, Contxt, TRUE, TRUE, TRUE);\
                    496:         } else {                                                             \
                    497:             IoSetCompletionRoutine( Irp, NULL, NULL, FALSE, FALSE, FALSE);   \
                    498:         }                                                                    \
                    499:         _IRPSP = IoGetNextIrpStackLocation (Irp);                            \
                    500:         _IRPSP->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;              \
                    501:         _IRPSP->MinorFunction = TDI_ACCEPT;                                  \
                    502:         _IRPSP->DeviceObject = DevObj;                                       \
                    503:         _IRPSP->FileObject = FileObj;                                        \
                    504:         p = (PTDI_REQUEST_KERNEL_ACCEPT)&_IRPSP->Parameters;                 \
                    505:         p->RequestConnectionInformation = RequestConnectionInfo;             \
                    506:         p->ReturnConnectionInformation = ReturnConnectionInfo;               \
                    507:     }
                    508: 
                    509: #define TdiBuildDisconnect(Irp, DevObj, FileObj, CompRoutine, Contxt, Time, Flags, RequestConnectionInfo, ReturnConnectionInfo)\
                    510:     {                                                                        \
                    511:         PTDI_REQUEST_KERNEL p;                                               \
                    512:         PIO_STACK_LOCATION _IRPSP;                                           \
                    513:         if ( CompRoutine != NULL) {                                          \
                    514:             IoSetCompletionRoutine( Irp, CompRoutine, Contxt, TRUE, TRUE, TRUE);\
                    515:         } else {                                                             \
                    516:             IoSetCompletionRoutine( Irp, NULL, NULL, FALSE, FALSE, FALSE);   \
                    517:         }                                                                    \
                    518:         _IRPSP = IoGetNextIrpStackLocation (Irp);                            \
                    519:         _IRPSP->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;              \
                    520:         _IRPSP->MinorFunction = TDI_DISCONNECT;                              \
                    521:         _IRPSP->DeviceObject = DevObj;                                       \
                    522:         _IRPSP->FileObject = FileObj;                                        \
                    523:         p = (PTDI_REQUEST_KERNEL)&_IRPSP->Parameters;                        \
                    524:         p->RequestFlags = Flags;                                             \
                    525:         p->RequestConnectionInformation = RequestConnectionInfo;             \
                    526:         p->ReturnConnectionInformation = ReturnConnectionInfo;               \
                    527:         p->RequestSpecific = (PVOID)Time;                                    \
                    528:     }
                    529: 
                    530: #define TdiBuildReceive(Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr, InFlags, ReceiveLen)\
                    531:     {                                                                        \
                    532:         PTDI_REQUEST_KERNEL_RECEIVE p;                                       \
                    533:         PIO_STACK_LOCATION _IRPSP;                                           \
                    534:         if ( CompRoutine != NULL) {                                          \
                    535:             IoSetCompletionRoutine( Irp, CompRoutine, Contxt, TRUE, TRUE, TRUE);\
                    536:         } else {                                                             \
                    537:             IoSetCompletionRoutine( Irp, NULL, NULL, FALSE, FALSE, FALSE);   \
                    538:         }                                                                    \
                    539:         _IRPSP = IoGetNextIrpStackLocation (Irp);                            \
                    540:         _IRPSP->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;              \
                    541:         _IRPSP->MinorFunction = TDI_RECEIVE;                                 \
                    542:         _IRPSP->DeviceObject = DevObj;                                       \
                    543:         _IRPSP->FileObject = FileObj;                                        \
                    544:         p = (PTDI_REQUEST_KERNEL_RECEIVE)&_IRPSP->Parameters;                \
                    545:         p->ReceiveFlags = InFlags;                                           \
                    546:         p->ReceiveLength = ReceiveLen;                                       \
                    547:         Irp->MdlAddress = MdlAddr;                                           \
                    548:     }
                    549: 
                    550: #define TdiBuildSend(Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr, InFlags, SendLen)\
                    551:     {                                                                        \
                    552:         PTDI_REQUEST_KERNEL_SEND p;                                          \
                    553:         PIO_STACK_LOCATION _IRPSP;                                           \
                    554:         if ( CompRoutine != NULL) {                                          \
                    555:             IoSetCompletionRoutine( Irp, CompRoutine, Contxt, TRUE, TRUE, TRUE);\
                    556:         } else {                                                             \
                    557:             IoSetCompletionRoutine( Irp, NULL, NULL, FALSE, FALSE, FALSE);   \
                    558:         }                                                                    \
                    559:         _IRPSP = IoGetNextIrpStackLocation (Irp);                            \
                    560:         _IRPSP->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;              \
                    561:         _IRPSP->MinorFunction = TDI_SEND;                                    \
                    562:         _IRPSP->DeviceObject = DevObj;                                       \
                    563:         _IRPSP->FileObject = FileObj;                                        \
                    564:         p = (PTDI_REQUEST_KERNEL_SEND)&_IRPSP->Parameters;                   \
                    565:         p->SendFlags = InFlags;                                              \
                    566:         p->SendLength = SendLen;                                             \
                    567:         Irp->MdlAddress = MdlAddr;                                           \
                    568:     }
                    569: 
                    570: #define TdiBuildSendDatagram(Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr, SendLen, SendDatagramInfo)\
                    571:     {                                                                        \
                    572:         PTDI_REQUEST_KERNEL_SENDDG p;                                        \
                    573:         PIO_STACK_LOCATION _IRPSP;                                           \
                    574:         if ( CompRoutine != NULL) {                                          \
                    575:             IoSetCompletionRoutine( Irp, CompRoutine, Contxt, TRUE, TRUE, TRUE);\
                    576:         } else {                                                             \
                    577:             IoSetCompletionRoutine( Irp, NULL, NULL, FALSE, FALSE, FALSE);   \
                    578:         }                                                                    \
                    579:         _IRPSP = IoGetNextIrpStackLocation (Irp);                            \
                    580:         _IRPSP->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;              \
                    581:         _IRPSP->MinorFunction = TDI_SEND_DATAGRAM;                           \
                    582:         _IRPSP->DeviceObject = DevObj;                                       \
                    583:         _IRPSP->FileObject = FileObj;                                        \
                    584:         p = (PTDI_REQUEST_KERNEL_SENDDG)&_IRPSP->Parameters;                 \
                    585:         p->SendLength = SendLen;                                             \
                    586:         p->SendDatagramInformation = SendDatagramInfo;                       \
                    587:         Irp->MdlAddress = MdlAddr;                                           \
                    588:     }
                    589: 
                    590: #define TdiBuildReceiveDatagram(Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr, ReceiveLen, ReceiveDatagramInfo, ReturnInfo, InFlags)\
                    591:     {                                                                        \
                    592:         PTDI_REQUEST_KERNEL_RECEIVEDG p;                                     \
                    593:         PIO_STACK_LOCATION _IRPSP;                                           \
                    594:         if ( CompRoutine != NULL) {                                          \
                    595:             IoSetCompletionRoutine( Irp, CompRoutine, Contxt, TRUE, TRUE, TRUE);\
                    596:         } else {                                                             \
                    597:             IoSetCompletionRoutine( Irp, NULL, NULL, FALSE, FALSE, FALSE);   \
                    598:         }                                                                    \
                    599:         _IRPSP = IoGetNextIrpStackLocation (Irp);                            \
                    600:         _IRPSP->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;              \
                    601:         _IRPSP->MinorFunction = TDI_RECEIVE_DATAGRAM;                        \
                    602:         _IRPSP->DeviceObject = DevObj;                                       \
                    603:         _IRPSP->FileObject = FileObj;                                        \
                    604:         p = (PTDI_REQUEST_KERNEL_RECEIVEDG)&_IRPSP->Parameters;              \
                    605:         p->ReceiveLength = ReceiveLen;                                       \
                    606:         p->ReceiveDatagramInformation = ReceiveDatagramInfo;                 \
                    607:         p->ReturnDatagramInformation = ReturnInfo;                           \
                    608:         p->ReceiveFlags = InFlags;                                           \
                    609:         Irp->MdlAddress = MdlAddr;                                           \
                    610:     }
                    611: 
                    612: #define TdiBuildSetEventHandler(Irp, DevObj, FileObj, CompRoutine, Contxt, InEventType, InEventHandler, InEventContext) \
                    613:     {                                                                        \
                    614:         PTDI_REQUEST_KERNEL_SET_EVENT p;                                     \
                    615:         PIO_STACK_LOCATION _IRPSP;                                           \
                    616:         if ( CompRoutine != NULL) {                                          \
                    617:             IoSetCompletionRoutine( Irp, CompRoutine, Contxt, TRUE, TRUE, TRUE);\
                    618:         } else {                                                             \
                    619:             IoSetCompletionRoutine( Irp, NULL, NULL, FALSE, FALSE, FALSE);   \
                    620:         }                                                                    \
                    621:         _IRPSP = IoGetNextIrpStackLocation (Irp);                            \
                    622:         _IRPSP->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;              \
                    623:         _IRPSP->MinorFunction = TDI_SET_EVENT_HANDLER;                       \
                    624:         _IRPSP->DeviceObject = DevObj;                                       \
                    625:         _IRPSP->FileObject = FileObj;                                        \
                    626:         p = (PTDI_REQUEST_KERNEL_SET_EVENT)&_IRPSP->Parameters;              \
                    627:         p->EventType = InEventType;                                          \
                    628:         p->EventHandler = (PVOID)InEventHandler;                             \
                    629:         p->EventContext = (PVOID)InEventContext;                             \
                    630:     }
                    631: 
                    632: #define TdiBuildQueryInformation(Irp, DevObj, FileObj, CompRoutine, Contxt, QType, MdlAddr)\
                    633:     {                                                                        \
                    634:         PTDI_REQUEST_KERNEL_QUERY_INFORMATION p;                             \
                    635:         PIO_STACK_LOCATION _IRPSP;                                           \
                    636:         Irp->MdlAddress = MdlAddr;                                           \
                    637:         if ( CompRoutine != NULL) {                                          \
                    638:             IoSetCompletionRoutine( Irp, CompRoutine, Contxt, TRUE, TRUE, TRUE);\
                    639:         } else {                                                             \
                    640:             IoSetCompletionRoutine( Irp, NULL, NULL, FALSE, FALSE, FALSE);   \
                    641:         }                                                                    \
                    642:         _IRPSP = IoGetNextIrpStackLocation (Irp);                            \
                    643:         _IRPSP->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;              \
                    644:         _IRPSP->MinorFunction = TDI_QUERY_INFORMATION;                       \
                    645:         _IRPSP->DeviceObject = DevObj;                                       \
                    646:         _IRPSP->FileObject = FileObj;                                        \
                    647:         p = (PTDI_REQUEST_KERNEL_QUERY_INFORMATION)&_IRPSP->Parameters;      \
                    648:         p->QueryType = (ULONG)QType;                                         \
                    649:         p->RequestConnectionInformation = NULL;                              \
                    650:     }
                    651: 
                    652: 
                    653: #define TdiBuildSetInformation(Irp, DevObj, FileObj, CompRoutine, Contxt, SType, MdlAddr)\
                    654:     {                                                                        \
                    655:         PTDI_REQUEST_KERNEL_SET_INFORMATION p;                                          \
                    656:         PIO_STACK_LOCATION _IRPSP;                                           \
                    657:         Irp->MdlAddress = MdlAddr;                                           \
                    658:         if ( CompRoutine != NULL) {                                          \
                    659:             IoSetCompletionRoutine( Irp, CompRoutine, Contxt, TRUE, TRUE, TRUE);\
                    660:         } else {                                                             \
                    661:             IoSetCompletionRoutine( Irp, NULL, NULL, FALSE, FALSE, FALSE);   \
                    662:         }                                                                    \
                    663:         _IRPSP = IoGetNextIrpStackLocation (Irp);                            \
                    664:         _IRPSP->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;              \
                    665:         _IRPSP->MinorFunction = TDI_SET_INFORMATION;                         \
                    666:         _IRPSP->DeviceObject = DevObj;                                       \
                    667:         _IRPSP->FileObject = FileObj;                                        \
                    668:         p = (PTDI_REQUEST_KERNEL_SET_INFORMATION)&_IRPSP->Parameters;                   \
                    669:         p->SetType = (ULONG)SType;                                           \
                    670:         p->RequestConnectionInformation = NULL;                              \
                    671:     }
                    672: 
                    673: #define TdiBuildAction(Irp, DevObj, FileObj, CompRoutine, Contxt, MdlAddr)\
                    674:     {                                                                        \
                    675:         PIO_STACK_LOCATION _IRPSP;                                           \
                    676:         if ( CompRoutine != NULL) {                                          \
                    677:             IoSetCompletionRoutine( Irp, CompRoutine, Contxt, TRUE, TRUE, TRUE);\
                    678:         } else {                                                             \
                    679:             IoSetCompletionRoutine( Irp, NULL, NULL, FALSE, FALSE, FALSE);   \
                    680:         }                                                                    \
                    681:         _IRPSP = IoGetNextIrpStackLocation (Irp);                            \
                    682:         _IRPSP->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;              \
                    683:         _IRPSP->MinorFunction = TDI_ACTION;                                  \
                    684:         _IRPSP->DeviceObject = DevObj;                                       \
                    685:         _IRPSP->FileObject = FileObj;                                        \
                    686:         Irp->MdlAddress = MdlAddr;                                           \
                    687:     }
                    688: 
                    689: //
                    690: // definitions for the helper routines for TDI compliant transports and clients
                    691: //
                    692: // Note that the IOCTL used here for the Irp Function is not real; it is used
                    693: // to avoid this IO routine having to map buffers (which we don't want).
                    694: //
                    695: //PIRP
                    696: //TdiBuildInternalDeviceControlIrp (
                    697: //    IN CCHAR IrpSubFunction,
                    698: //    IN PDEVICE_OBJECT DeviceObject,
                    699: //    IN PFILE_OBJECT FileObject,
                    700: //    IN PKEVENT Event,
                    701: //    IN PIO_STATUS_BLOCK IoStatusBlock
                    702: //    );
                    703: 
                    704: #define TdiBuildInternalDeviceControlIrp(IrpSubFunction,DeviceObject,FileObject,Event,IoStatusBlock) \
                    705:     IoBuildDeviceIoControlRequest (\
                    706:         0x00000003,\
                    707:         DeviceObject, \
                    708:         NULL,   \
                    709:         0,      \
                    710:         NULL,   \
                    711:         0,      \
                    712:         TRUE,   \
                    713:         Event,  \
                    714:         IoStatusBlock)
                    715: 
                    716: 
                    717: //
                    718: // VOID
                    719: // TdiCopyLookaheadData(
                    720: //     IN PVOID Destination,
                    721: //     IN PVOID Source,
                    722: //     IN ULONG Length,
                    723: //     IN ULONG ReceiveFlags
                    724: //     );
                    725: //
                    726: 
                    727: #ifdef _M_IX86
                    728: #define TdiCopyLookaheadData(_Destination,_Source,_Length,_ReceiveFlags)   \
                    729:     RtlCopyMemory(_Destination,_Source,_Length)
                    730: #else
                    731: #define TdiCopyLookaheadData(_Destination,_Source,_Length,_ReceiveFlags) { \
                    732:     if ((_ReceiveFlags) & TDI_RECEIVE_COPY_LOOKAHEAD) {                    \
                    733:         RtlCopyMemory(_Destination,_Source,_Length);                       \
                    734:     } else {                                                               \
                    735:         PUCHAR _Src = (_Source);                                           \
                    736:         PUCHAR _Dest = (_Destination);                                     \
                    737:         PUCHAR _End = _Dest + (_Length);                                   \
                    738:         while (_Dest < _End) {                                             \
                    739:             *_Dest++ = *_Src++;                                            \
                    740:         }                                                                  \
                    741:     }                                                                      \
                    742: }
                    743: #endif
                    744: 
                    745: 
                    746: NTSTATUS
                    747: TdiMapUserRequest(
                    748:     IN PDEVICE_OBJECT DeviceObject,
                    749:     IN PIRP Irp,
                    750:     IN PIO_STACK_LOCATION IrpSp
                    751:     );
                    752: 
                    753: VOID
                    754: TdiMapBuffer (
                    755:     IN PMDL MdlChain
                    756:     );
                    757: 
                    758: VOID
                    759: TdiUnmapBuffer (
                    760:     IN PMDL MdlChain
                    761:     );
                    762: 
                    763: NTSTATUS
                    764: TdiCopyBufferToMdl (
                    765:     IN PVOID SourceBuffer,
                    766:     IN ULONG SourceOffset,
                    767:     IN ULONG SourceBytesToCopy,
                    768:     IN PMDL DestinationMdlChain,
                    769:     IN ULONG DestinationOffset,
                    770:     IN PULONG BytesCopied
                    771:     );
                    772: 
                    773: NTSTATUS
                    774: TdiCopyMdlToBuffer(
                    775:     IN PMDL SourceMdlChain,
                    776:     IN ULONG SourceOffset,
                    777:     IN PVOID DestinationBuffer,
                    778:     IN ULONG DestinationOffset,
                    779:     IN ULONG DestinationBufferSize,
                    780:     OUT PULONG BytesCopied
                    781:     );
                    782: 
                    783: VOID
                    784: TdiBuildNetbiosAddress (
                    785:     IN PUCHAR NetbiosName,
                    786:     IN BOOLEAN IsGroupName,
                    787:     IN OUT PTA_NETBIOS_ADDRESS NetworkName
                    788:     );
                    789: 
                    790: NTSTATUS
                    791: TdiBuildNetbiosAddressEa (
                    792:     IN PUCHAR Buffer,
                    793:     IN BOOLEAN IsGroupName,
                    794:     IN PUCHAR NetbiosName
                    795:     );
                    796: 
                    797: //++
                    798: //
                    799: //  VOID
                    800: //  TdiCompleteRequest (
                    801: //      IN PIRP Irp,
                    802: //      IN NTSTATUS Status
                    803: //      );
                    804: //
                    805: //  Routine Description:
                    806: //
                    807: //      This routine is used to complete an IRP with the indicated
                    808: //      status.
                    809: //
                    810: //  Arguments:
                    811: //
                    812: //      Irp - Supplies a pointer to the Irp to complete
                    813: //
                    814: //      Status - Supplies the completion status for the Irp
                    815: //
                    816: //  Return Value:
                    817: //
                    818: //      None.
                    819: //
                    820: //--
                    821: 
                    822: #define TdiCompleteRequest(IRP,STATUS) {              \
                    823:     (IRP)->IoStatus.Status = (STATUS);                \
                    824:     IoCompleteRequest( (IRP), IO_NETWORK_INCREMENT ); \
                    825: }
                    826: 
                    827: #endif // _TDI_KRNL_

unix.superglobalmegacorp.com

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