Annotation of ntddk/src/network/streams/inc/sys/stream.h, revision 1.1.1.1

1.1       root        1: /*++
                      2: 
                      3: Copyright (c) 1991  Microsoft Corporation
                      4: 
                      5: Module Name:
                      6: 
                      7:     stream.h
                      8: 
                      9: Abstract:
                     10: 
                     11:     This module declares the data types and functions available to
                     12:     STREAMS drivers and modules.
                     13: 
                     14: Author:
                     15: 
                     16:     Eric Chin (ericc)           August 9, 1991
                     17: 
                     18: Revision History:
                     19: 
                     20:     Who          When          What
                     21:     --------   --------   -----------------------------------------------------
                     22:     sampa      09-19-91   pulled kernel level stuff from stream.h
                     23:     mikemas    01-18-92   removed redefinition of STREAMS functions and
                     24:                           reorganized file.
                     25:     mikemas    01-20-92   integrated private\inc\stream.h into this file.
                     26:                           moved to streams\inc\stream.h from ntstream.h
                     27: 
                     28: --*/
                     29: 
                     30: /******************************************************************
                     31:  *
                     32:  *  SpiderSTREAMS - STREAMS Package
                     33:  *
                     34:  *  Copyright 1987  Spider Systems Limited
                     35:  *
                     36:  *  STREAM.H
                     37:  *
                     38:  *    Main STREAMS definitions
                     39:  *
                     40:  ******************************************************************/
                     41: 
                     42: /*
                     43:  *   /usr/projects/spare/PBRAIN/SCCS/pbrainG/dev/stremul/include/sys/114/s.stream.h
                     44:  *  @(#)stream.h    1.36
                     45:  *
                     46:  *  Last delta created  12:37:24 12/4/91
                     47:  *  This file extracted 16:45:56 12/23/91
                     48:  *
                     49:  *  Modifications:
                     50:  *
                     51:  */
                     52: 
                     53: 
                     54: #ifndef _SYS_STREAM_INCLUDED
                     55: #define _SYS_STREAM_INCLUDED
                     56: 
                     57: 
                     58: 
                     59: /********************************************************/
                     60: /*          Streams message and queue types     */
                     61: /********************************************************/
                     62: 
                     63: /*
                     64:  * Message block descriptor
                     65:  */
                     66: struct msgb {
                     67:     struct msgb    *b_next;     /* next message on queue */
                     68:     struct msgb    *b_prev;     /* previous message on queue */
                     69:     struct msgb    *b_cont;     /* next message block of message */
                     70:     unsigned char  *b_rptr;     /* first unread data byte in buffer */
                     71:     unsigned char  *b_wptr;     /* first unwritten data byte in buffer */
                     72:     struct datab   *b_datap;    /* data block */
                     73:     unsigned char   b_rsvd;     /* in SVR4, this is b_band */
                     74:     unsigned char   b_pad1;
                     75:     unsigned short  b_flag;     /* message flag field */
                     76:     long            b_pad2;
                     77: };
                     78: 
                     79: 
                     80: /*
                     81:  * Message flags.  These are interpreted by the Stream Head.
                     82:  */
                     83: #define MSGMARK     0x01        /* marked block - for I_ATMARK */
                     84: #define MSGNLOOP    0x02        /* don't loop message to write queue */
                     85: #define MSGDELIM    0x04        /* message is delimited */
                     86: 
                     87: 
                     88: /*
                     89:  * structure containing function to call and argument when freeing
                     90:  * an extended buffer
                     91:  */
                     92: struct free_rtn {
                     93:     void (*free_func)(char *);  /* free routine of user */
                     94:     char *free_arg;             /* argument to free routine */
                     95: };
                     96: 
                     97: 
                     98: /*
                     99:  *  Data block descriptor
                    100:  *
                    101:  */
                    102: struct datab {
                    103:     struct datab   *db_freep;   /* used internally */
                    104:     unsigned char  *db_base;    /* first byte of buffer */
                    105:     unsigned char  *db_lim;     /* last byte + 1 of buffer */
                    106:     unsigned long   db_ref;     /* count of msgs pointing to block */
                    107:     unsigned char   db_type;    /* message type */
                    108:     unsigned char   db_class;   /* used internally. In SVR4, is db_iswhat */
                    109:     KSPIN_LOCK      db_lock;    /* protects db_ref */
                    110: 
                    111:                                 /* unused SVR4 fields, for future expansion */
                    112:     unsigned int    db_rsvd1;   /* db_size */
                    113:     char           *db_rsvd2;   /* db_msgaddr */
                    114:     long            db_filler;  /* reserved for future use */
                    115: 
                    116:                                 /* unique to SpiderSTREAMS */
                    117:     struct free_rtn db_discard; /* call routine & arg to free buffer */
                    118: };
                    119: 
                    120: 
                    121: struct queue;    // define queue name so the MIPS compiler will recognize it
                    122:                  // in the following definition as being the same as the
                    123:                  // queue structure definition that will follow later.
                    124: 
                    125: 
                    126: /*
                    127:  * Queue Information Structure
                    128:  *
                    129:  */
                    130: struct qinit {                                  /* declares a queue */
                    131:     int               (*qi_putp)(               /*  put procedure */
                    132:                             struct queue *q,
                    133:                             struct msgb *mp
                    134:                         );
                    135:     int               (*qi_srvp)(               /*  service procedure */
                    136:                             struct queue *
                    137:                         );
                    138:     int               (*qi_qopen)(              /*  open procedure */
                    139:                             struct queue *,
                    140:                             dev_t *,
                    141:                             int,
                    142:                             int,
                    143:                             void *
                    144:                         );
                    145:     int               (*qi_qclose)(             /*  close procedure */
                    146:                             struct queue *,
                    147:                             int,
                    148:                             void *
                    149:                         );
                    150:     int               (*qi_qadmin)();           /*  unused */
                    151:     struct module_info *qi_minfo;               /*  module information */
                    152:     struct module_stat *qi_mstat;               /*  module statistics */
                    153:     int                 qi_mplevel;             /*  level of parallelism */
                    154: };
                    155: 
                    156: 
                    157: #define FULL_PARALLEL   -1      /* fully parallelised */
                    158: #define STREAM_PARALLEL -2      /* streams parallel: NOT SUPPORTED */
                    159: 
                    160: 
                    161: /*
                    162:  * Module information structure
                    163:  */
                    164: struct module_info {
                    165:     unsigned short  mi_idnum;   /* module id number */
                    166:     char           *mi_idname;  /* module name */
                    167:     long            mi_minpsz;  /* min packet size accepted */
                    168:     long            mi_maxpsz;  /* max packet size accepted */
                    169:     unsigned long   mi_hiwat;   /* hi-water mark */
                    170:     unsigned long   mi_lowat;   /* lo-water mark */
                    171: };
                    172: 
                    173: 
                    174: /*
                    175:  * Module statistics structure (not used in current implementation)
                    176:  */
                    177: struct module_stat {
                    178:     long    ms_pcnt;      /* count of calls to put proc */
                    179:     long    ms_scnt;      /* count of calls to service proc */
                    180:     long    ms_ocnt;      /* count of calls to open proc */
                    181:     long    ms_ccnt;      /* count of calls to close proc */
                    182:     long    ms_acnt;      /* count of calls to admin proc */
                    183:     char   *ms_xptr;      /* pointer to private statistics */
                    184:     short   ms_xsize;     /* length of private statistics buffer */
                    185: };
                    186: 
                    187: 
                    188: /*
                    189:  * Streamtab (used in cdevsw and fmodsw to point to module or driver)
                    190:  */
                    191: struct streamtab {
                    192:     struct qinit *st_rdinit;   /* defines read QUEUE */
                    193:     struct qinit *st_wrinit;   /* defines write QUEUE */
                    194:     struct qinit *st_muxrinit; /* for multiplexing drivers only */
                    195:     struct qinit *st_muxwinit; /* for multiplexing drivers only */
                    196: };
                    197: 
                    198: 
                    199: struct mpctl;                                   /* for ANSI c */
                    200: 
                    201: 
                    202: /*
                    203:  * data queue
                    204:  */
                    205: struct queue {                                  /* internal representation */
                    206:     struct queue       *q_next;                 /*  next in stream */
                    207:     struct qinit       *q_qinfo;                /*  queue procedures, limits */
                    208:     struct msgb        *q_first;                /*  first data block */
                    209:     struct msgb        *q_last;                 /*  last data block */
                    210:     struct queue       *q_link;                 /*  next queue for scheduling */
                    211:     char               *q_ptr;                  /*  private data */
                    212:     unsigned long       q_count;                /*  bytes of data on queue */
                    213:     unsigned long       q_flag;                 /*  queue state */
                    214:     long                q_minpsz;               /*  min packet size accepted */
                    215:     long                q_maxpsz;               /*  max packet size accepted */
                    216:     unsigned long       q_hiwat;                /*  queue high water mark */
                    217:     unsigned long       q_lowat;                /*  queue low water mark */
                    218: 
                    219:                                                 /*  unique to SpiderSTREAMS */
                    220:     struct queue       *q_other;                /*  other queue of pair */
                    221:     struct queue       *q_can;                  /*  queue canput() looks at */
                    222:     struct queue       *q_back;                 /*  queue to back-enable */
                    223:     struct mpctl       *q_mpctl;                /*  multiprocessor queue info */
                    224:     int                 q_active;               /*  # srv/put procs running */
                    225:     KEVENT              q_disableproc;          /*  for disable_procs() */
                    226:     char               *q_strmptr;              /*  at stream head only */
                    227: 
                    228:                                                 /*  unused SVR4 fields */
                    229:     void               *q_rsvd1;                /*  q_bandp */
                    230:     unsigned char       q_rsvd2;                /*  q_nband */
                    231:     unsigned char       q_pad1[3];              /*  reserved for future use */
                    232:     long                q_pad2[2];              /*  reserved for future use */
                    233: };
                    234: 
                    235: 
                    236: /*
                    237:  * Typedefs for important structures
                    238:  */
                    239: typedef struct msgb   mblk_t;
                    240: typedef struct datab  dblk_t;
                    241: typedef struct free_rtn frtn_t;
                    242: typedef struct queue  queue_t;
                    243: 
                    244: 
                    245: /*
                    246:  * Priority definitions for block allocation.
                    247:  */
                    248: #define NPRI        3   /* Number of priority values */
                    249: 
                    250: #define BPRI_LO     0
                    251: #define BPRI_MED    1
                    252: #define BPRI_HI     2
                    253: 
                    254: 
                    255: /*
                    256:  * Queue flags
                    257:  */
                    258: #define QSTATE      0x000F    /* Queue state mask (see below for values) */
                    259: #define QREADR      0x0010    /* This is the reader (first) Q */
                    260: #define QSERV       0x0020    /* This queue has a service proc */
                    261: #define QEND        0x0040    /* This queue is this stream side end */
                    262: #define QENABL      0x0100    /* Queue is already enabled to run */
                    263: #define QNOENB      0x0200    /* Don't enable Q via putq */
                    264: #define QUSE        0x0400    /* Queue is used */
                    265: #define QDISABL     0x0800    /* Disable procs can be called */
                    266: 
                    267: /*
                    268:  * Queue state values (in LS 4 bits of flags)
                    269:  */
                    270: #define QPRIMED     0x0000    /* Queue was read when empty */
                    271: #define QEMPTY      0x0001    /* Queue empty but not primed */
                    272: #define QACTIVE     0x0002    /* Queue not empty and not blocked */
                    273: #define QBLOCKED    0x0003    /* Queue blocked (canput failed) */
                    274: #define QFULL       QBLOCKED  /* Just so it's defined */
                    275: 
                    276: /*
                    277:  * Finding related queues
                    278:  */
                    279: #define OTHERQ(Q)   ((Q)->q_other)
                    280: #define WR(Q)       ((Q)->q_other)
                    281: #define RD(Q)       ((Q)->q_other)
                    282: 
                    283: 
                    284: /*
                    285:  *  IOCTL structure - this structure is the format of the M_IOCTL message type.
                    286:  *
                    287:  */
                    288: struct iocblk {
                    289:     int             ioc_cmd;        /* ioctl command type */
                    290:     unsigned short  ioc_uid;        /* effective uid of user { *ioc_cr } */
                    291:     unsigned short  ioc_gid;        /* effective gid of user { in SVR4 } */
                    292:     unsigned int    ioc_id;         /* ioctl id */
                    293:     unsigned int    ioc_count;      /* count of bytes in data field */
                    294:     int             ioc_error;      /* error code */
                    295:     int             ioc_rval;       /* return value  */
                    296: };
                    297:                                     /* unprovided SVR4 fields */
                    298:                                     /* ioc_filler[4] */
                    299: 
                    300: 
                    301: /*
                    302:  * Link structure for I_LINK and I_UNLINK ioctl's
                    303:  *
                    304:  */
                    305: struct linkblk {
                    306:     queue_t *l_qtop;   /* lowest level write queue of upper stream */
                    307:     queue_t *l_qbot;   /* highest level write queue of lower stream */
                    308:     int      l_index;  /* link index for lower stream */
                    309: };
                    310:                        /* unprovided SVR4 fields */
                    311:                        /* l_pad[5] */
                    312: 
                    313: 
                    314: /*
                    315:  * Options structure for M_SETOPTS message.  This is sent upstream
                    316:  * by driver to set stream head options.
                    317:  */
                    318: struct stroptions {
                    319:     unsigned long   so_flags;      /* options to set */
                    320:     short           so_readopt;    /* read option */
                    321:     unsigned short  so_wroff;      /* write offset */
                    322:     long            so_minpsz;     /* minimum read packet size */
                    323:     long            so_maxpsz;     /* maximum read packet size */
                    324:     unsigned long   so_hiwat;      /* read queue high water mark */
                    325:     unsigned long   so_lowat;      /* read queue low water mark */
                    326:     unsigned char   so_band;       /* update water marks for this band */
                    327: };
                    328: 
                    329: 
                    330: /*
                    331:  * enumeration for strqset/strqget
                    332:  */
                    333: typedef enum qfields {
                    334:     QHIWAT = 0,         /* q_hiwat or qb_hiwat */
                    335:     QLOWAT = 1,         /* q_lowat or qb_lowat */
                    336:     QMAXPSZ = 2,        /* q_maxpsz */
                    337:     QMINPSZ = 3,        /* q_minpsz */
                    338:     QCOUNT = 4,         /* q_count or qb_count */
                    339:     QFIRST = 5,         /* q_first or qb_first */
                    340:     QLAST = 6,          /* q_last or qb_last */
                    341:     QFLAG = 7,          /* q_flag or qb_flag */
                    342:     QBAD = 8
                    343: } qfields_t;
                    344: 
                    345: 
                    346: /*
                    347:  * Flags for stream options set message
                    348:  */
                    349: #define SO_ALL      077     /* set all options */
                    350: #define SO_READOPT  01      /* set read option */
                    351: #define SO_WROFF    02      /* set write offset */
                    352: #define SO_MINPSZ   04      /* set min packet size */
                    353: #define SO_MAXPSZ   010     /* set max packet size */
                    354: #define SO_HIWAT    020     /* set high water mark */
                    355: #define SO_LOWAT    040     /* set low water mark */
                    356: #define SO_MREADON  0100    /* enable M_READ generation */
                    357: #define SO_MREADOFF 0200    /* disable M_READ generation */
                    358: #define SO_NDELON   0400    /* select non-STREAMS tty O_NDELAY semantics */
                    359: #define SO_NDELOFF  01000   /* select STREAMS O_NDELAY semantics */
                    360: #define SO_BAND     02000   /* set water marks in a band (unsupported) */
                    361: #define SO_ISTTY    04000   /* acting as a controlling terminal */
                    362: #define SO_ISNTTY   010000  /* not acting as a controlling terminal */
                    363: #define SO_TOSTOP   020000  /* stop on background writes (unsupported) */
                    364: #define SO_TONSTOP  040000  /* no stop on background writes (unsupported) */
                    365: 
                    366: 
                    367: /*
                    368:  * SpiderStreams Specific flag - to enable the sending down of an
                    369:  * I_CLOSE ioctl just before calling a drivers close routine
                    370:  */
                    371: #define SO_I_CLOSE  0100000 /* send I_CLOSE */
                    372: 
                    373: 
                    374: /*
                    375:  * Data and protocol messages (regular priority)
                    376:  */
                    377: #define M_DATA      00  /* regular data */
                    378: #define M_PROTO     01  /* protocol control */
                    379: #define M_DELAY     014 /* real-time xmit delay (1 param) */
                    380: 
                    381: 
                    382: /*
                    383:  * Control messages (regular priority)
                    384:  */
                    385: #define M_BREAK     010 /* line break */
                    386: #define M_PASSFP    011 /* pass file pointer */
                    387: #define M_SIG       013 /* generate process signal */
                    388: #define M_CTL       015 /* device-specific control message */
                    389: #define M_IOCTL     016 /* ioctl; set/get params */
                    390: #define M_SETOPTS   020 /* set various stream head options */
                    391: #define M_RSE       021 /* reserved for internal use */
                    392: 
                    393: 
                    394: /*
                    395:  * Control messages (high priority; go to head of queue)
                    396:  */
                    397: #define M_IOCACK    0201    /* acknowledge ioctl */
                    398: #define M_IOCNAK    0202    /* negative ioctl acknowledge */
                    399: #define M_PCPROTO   0203    /* priority proto message */
                    400: #define M_PCSIG     0204    /* generate process signal */
                    401: #define M_FLUSH     0206    /* flush your queues */
                    402: #define M_STOP      0207    /* stop transmission immediately */
                    403: #define M_START     0210    /* restart transmission after stop */
                    404: #define M_HANGUP    0211    /* line disconnect */
                    405: #define M_ERROR     0212    /* fatal error used to set u.u_error */
                    406: #define M_READ      0213    /* sent on read call, if no messages waiting */
                    407: #define M_STOPI     0214    /* stop input request */
                    408: #define M_STARTI    0215    /* start input request */
                    409: #define M_PCRSE     0216    /* reserved for internel use */
                    410: 
                    411: 
                    412: /*
                    413:  * Queue message class definitions.
                    414:  */
                    415: #define QNORM       0       /* normal messages */
                    416: #define QPCTL       0200    /* priority cntrl messages */
                    417: 
                    418: 
                    419: /*
                    420:  * Define for 2-byte M_ERROR message
                    421:  */
                    422: #define NOERROR     255
                    423: 
                    424: /************************************************************/
                    425: /*        Miscellaneous parameters and flags            */
                    426: /************************************************************/
                    427: 
                    428: /*
                    429:  * Stream head default high/low water marks
                    430:  */
                    431: 
                    432: #define STRHIGH     5120
                    433: #define STRLOW      1024
                    434: 
                    435: 
                    436: /*
                    437:  * Block allocation parameters
                    438:  */
                    439: #define QBSIZE      65      /* min size for block allocation retries */
                    440: #define MAXBSIZE    4096    /* max block size */
                    441: #define MAXIOCBSZ   1024    /* max ioctl data block size */
                    442: 
                    443: 
                    444: /*
                    445:  * Values for stream flag in open to indicate module open, clone open;
                    446:  * return value for failure.
                    447:  */
                    448: #define MODOPEN     1   /* open as a module */
                    449: #define CLONEOPEN   2   /* open for clone, pick own minor device */
                    450: #define OPENFAIL    -1  /* returned for open failure */
                    451: 
                    452: 
                    453: /*
                    454:  * Value for packet size that denotes infinity
                    455:  */
                    456: #define INFPSZ      -1
                    457: 
                    458: 
                    459: /*
                    460:  * Flags for flushq()
                    461:  */
                    462: #define FLUSHALL    1   /* flush all messages */
                    463: #define FLUSHDATA   0   /* don't flush control messages */
                    464: 
                    465: 
                    466: /*
                    467:  * Default ioctl/close timeout (seconds)
                    468:  */
                    469: 
                    470: #define STRTIMOUT   15
                    471: 
                    472: 
                    473: /************************************************************************/
                    474: /*    Definitions of Streams macros and function interfaces.            */
                    475: /************************************************************************/
                    476: 
                    477: /*
                    478:  * extract queue class of message block
                    479:  */
                    480: #define queclass(bp)    (bp->b_datap->db_type & QPCTL)
                    481: 
                    482: 
                    483: /*
                    484:  * Align address on next lower word boundary
                    485:  */
                    486: #define straln(a)   (char *)((long)(a) & ~(sizeof(int)-1))
                    487: 
                    488: 
                    489: 
                    490: /*
                    491:  * NT-specific definitions for STREAMS Drivers
                    492:  */
                    493: typedef struct {
                    494:     KSPIN_LOCK    spinlock;
                    495:     KIRQL         oldlevel;
                    496: } lock_t;
                    497: 
                    498: 
                    499: /*
                    500:  *  STREAMS <-> TDI interface variable types
                    501:  */
                    502: 
                    503: #define SHTDI_ADDRESS_COMPARE_BIND    0
                    504: #define SHTDI_ADDRESS_COMPARE_RECEIVE 1
                    505: 
                    506: typedef struct {
                    507:     long ADDR_length;           // length of broadcast address for this type
                    508:     USHORT AddressType;         // Tdi address type
                    509:     BOOLEAN DirectedRouted;     // TRUE if a directed message will go farther
                    510:                                 // than a broadcast or multicast message.
                    511:     PVOID ADDR_ptr;             // pointer to broadcast address.  NULL if there
                    512:                                 // isn't one.
                    513:     BOOLEAN (*AddressCompare)(char *, int, char *, int, int);
                    514:                                 // Function to call to compare two addresses to
                    515:                                 // see if the provider treats them as equal.
                    516:                                 // returns TRUE if the addresses are equal.
                    517: } STREAMS_TDI_ADDRESS_INFO, *PSTREAMS_TDI_ADDRESS_INFO;
                    518: 
                    519: typedef struct {
                    520:     long SERV_type;
                    521:     struct streamtab * Partner;
                    522:     long PSERV_type;
                    523:     long OPT_length;            // length of option string to pass to turn
                    524:                                 // on TO_REUSE_ADDR
                    525:     PVOID OPT_ptr;              // ptr to option string
                    526:     BOOLEAN ReuseAddr;          // TRUE if TO_REUSE_ADDR is on by default
                    527:     int AddressInfoCount;       // Number of address info structures in the
                    528:                                 // AddressInfo array.
                    529: 
                    530:     PSTREAMS_TDI_ADDRESS_INFO AddressInfo;
                    531:                                 // Pointer to the AddressInfo array.  There is
                    532:                                 // one for each address type the provider
                    533:                                 // supports.
                    534: 
                    535: } STREAMS_TDI_INFO, *PSTREAMS_TDI_INFO;
                    536: 
                    537: 
                    538: 
                    539: /*
                    540:  * Definitions for Unix system call and kernel variable emulation
                    541:  *
                    542:  */
                    543: 
                    544: //
                    545: // In SVR4, HZ is defined in <sys/param.h> and lbolt declared in <sys\systm.h>.
                    546: //
                    547: // However, on NT, we define it here since the value of HZ is intimately tied
                    548: // to the function, StrmQuerySecondsSince1970Time().
                    549: //
                    550: #define HZ        100
                    551: #define lbolt     StrmQueryLbolt()
                    552: 
                    553: 
                    554: 
                    555: #define bcopy(src, dest, bcount)    RtlMoveMemory(          \
                    556:                                         (PVOID) (dest),     \
                    557:                                         (PVOID) (src),      \
                    558:                                         (ULONG) (bcount)    \
                    559:                                         )
                    560: 
                    561: #define bzero(addr, bcount)         RtlZeroMemory(          \
                    562:                                         (PVOID) (addr),     \
                    563:                                         (ULONG) (bcount)    \
                    564:                                         )
                    565: 
                    566: 
                    567: //
                    568: // SAMESTR() is not defined in the SVR4 STREAMS Programmer's Guide, but is
                    569: // a macro in SVR4's <sys/streams.h>.  In SpiderSTREAMS it is a function.
                    570: //
                    571: int
                    572: SAMESTR(
                    573:     IN queue_t *q
                    574:     );
                    575: 
                    576: 
                    577: /*
                    578:  *  Definitions for the STREAMS error logging facility
                    579:  */
                    580: #include <ntiologc.h>
                    581: 
                    582:     /*
                    583:      *  Maximum amount of data (binary dump data plus insertion strings) that
                    584:      *  can be added to an error log entry.
                    585:      */
                    586: #define STRM_MAX_ERROR_LOG_DATA_SIZE     \
                    587:     ( (ERROR_LOG_MAXIMUM_SIZE - sizeof(IO_ERROR_LOG_PACKET) + 4) & 0xFFFFFFFC )
                    588: 
                    589: 
                    590: 
                    591: //
                    592: // NT STREAMS Extensions to the Regular SVR4 STREAMS Utilities
                    593: //
                    594: 
                    595: typedef struct _U_UERROR {
                    596:     LIST_ENTRY p_list;
                    597:     struct _KTHREAD * ThreadHandle;
                    598:     char u_error;
                    599: 
                    600: } U_UERROR, *PU_UERROR;
                    601: 
                    602: 
                    603: LARGE_INTEGER
                    604: StrmConvertCentisecondsToRelativeTimeout(
                    605:     unsigned long Centiseconds
                    606:     );
                    607: 
                    608: 
                    609: NTSTATUS
                    610: StrmDeregisterDriver(
                    611:     IN PDRIVER_OBJECT driverobject,
                    612:     IN struct streamtab *streamtab
                    613:     );
                    614: 
                    615: NTSTATUS
                    616: StrmDeregisterModule(
                    617:     IN PDRIVER_OBJECT driverobject,
                    618:     IN struct streamtab *streamtab
                    619:     );
                    620: 
                    621: dev_t
                    622: StrmFindDevno(
                    623:     IN struct streamtab *stab
                    624:     );
                    625: 
                    626: char
                    627: StrmGetError(
                    628:     void
                    629:     );
                    630: 
                    631: time_t
                    632: StrmQueryLbolt(
                    633:     void
                    634:     );
                    635: 
                    636: time_t
                    637: StrmQuerySecondsSince1970Time(
                    638:     void
                    639:     );
                    640: 
                    641: NTSTATUS
                    642: StrmRegisterDriver(
                    643:     IN PDRIVER_OBJECT driverobject,
                    644:     IN struct streamtab *streamtab,
                    645:     IN char *subysname OPTIONAL,
                    646:     IN PSTREAMS_TDI_INFO ptdiinfo OPTIONAL
                    647:     );
                    648: 
                    649: NTSTATUS
                    650: StrmRegisterModule(
                    651:     IN PDRIVER_OBJECT driverobject,
                    652:     IN struct streamtab *streamtab,
                    653:     IN char *subysname OPTIONAL
                    654:     );
                    655: 
                    656: VOID
                    657: StrmSetError(
                    658:     char
                    659:     );
                    660: 
                    661: int
                    662: suser(
                    663:     void
                    664:     );
                    665: 
                    666: NTSTATUS
                    667: StrmLogEvent(
                    668:     IN PDRIVER_OBJECT DriverObject OPTIONAL,
                    669:     IN NTSTATUS EventCode,
                    670:     IN ULONG UniqueEventValue,
                    671:     IN USHORT NumStrings,
                    672:     IN PCHAR *Strings OPTIONAL,
                    673:     IN ULONG DataSize,
                    674:     IN PVOID Data OPTIONAL
                    675:     );
                    676: 
                    677: NTSTATUS
                    678: StrmWaitForMultipleObjects(
                    679:     IN queue_t *Queue,
                    680:     IN CCHAR Count,
                    681:     IN PVOID Object[],
                    682:     IN WAIT_TYPE WaitType,
                    683:     IN KWAIT_REASON WaitReason,
                    684:     IN KPROCESSOR_MODE WaitMode,
                    685:     IN BOOLEAN Alertable,
                    686:     IN PLARGE_INTEGER Timeout OPTIONAL,
                    687:     IN PKWAIT_BLOCK WaitBlockArray OPTIONAL
                    688:     );
                    689: 
                    690: NTSTATUS
                    691: StrmWaitForMutexObject(
                    692:     IN queue_t *Queue,
                    693:     IN PKMUTEX Mutex,
                    694:     IN KWAIT_REASON WaitReason,
                    695:     IN KPROCESSOR_MODE WaitMode,
                    696:     IN BOOLEAN Alertable,
                    697:     IN PLARGE_INTEGER Timeout OPTIONAL
                    698:     );
                    699: 
                    700: NTSTATUS
                    701: StrmWaitForSingleObject(
                    702:     IN queue_t *Queue,
                    703:     IN PVOID Object,
                    704:     IN KWAIT_REASON WaitReason,
                    705:     IN KPROCESSOR_MODE WaitMode,
                    706:     IN BOOLEAN Alertable,
                    707:     IN PLARGE_INTEGER Timeout OPTIONAL
                    708:     );
                    709: 
                    710: 
                    711: NTSTATUS
                    712: StrmOpenRegKey(
                    713:     PHANDLE HandlePtr,
                    714:     PUCHAR KeyName
                    715:     );
                    716: 
                    717: NTSTATUS
                    718: StrmGetRegValue(
                    719:     HANDLE KeyHandle,
                    720:     PUCHAR ValueName,
                    721:     PUCHAR ValueData,
                    722:     ULONG ValueLength,
                    723:     PULONG ValueType
                    724:     );
                    725: 
                    726: 
                    727: 
                    728: /*
                    729:  * General STREAMS functions exported for use by drivers.
                    730:  *
                    731:  *     Some of these functions have been renamed and redefined with additional
                    732:  *     parameters for debugging purposes. Macros which call the new functions
                    733:  *     appear in place of the old ones.
                    734:  */
                    735: 
                    736: int
                    737: adjmsg(
                    738:     IN mblk_t *mp,
                    739:     IN int len
                    740:     );
                    741: 
                    742: mblk_t *
                    743: allocb(
                    744:     IN int size,
                    745:     IN unsigned int pri
                    746:     );
                    747: 
                    748: queue_t *
                    749: backq(
                    750:     IN queue_t *q
                    751:     );
                    752: 
                    753: int
                    754: bufcall(
                    755:     IN int size,
                    756:     IN int pri,
                    757:     IN int (*func)(long),
                    758:     IN long arg
                    759:     );
                    760: 
                    761: int
                    762: canput(
                    763:     IN queue_t *q
                    764:     );
                    765: 
                    766: int
                    767: canputnext(
                    768:     IN queue_t *q
                    769:     );
                    770: 
                    771: mblk_t *
                    772: copyb(
                    773:     IN mblk_t *bp
                    774:     );
                    775: 
                    776: mblk_t *
                    777: copymsg(
                    778:     IN mblk_t *bp
                    779:     );
                    780: 
                    781: //
                    782: // Test if data block type is one of the data messages (i.e. not a
                    783: // control message).
                    784: //
                    785: #define datamsg(type)   ((type) == M_DATA || (type) == M_PROTO || \
                    786:                          (type) == M_PCPROTO || (type) == M_DELAY)
                    787: 
                    788: int
                    789: disable_procs(
                    790:     IN queue_t *q
                    791:     );
                    792: 
                    793: mblk_t *
                    794: dupb(
                    795:     IN mblk_t *bp
                    796:     );
                    797: 
                    798: mblk_t *
                    799: dupmsg(
                    800:     IN mblk_t *bp
                    801:     );
                    802: 
                    803: int
                    804: enable_procs(
                    805:     IN queue_t *q
                    806:     );
                    807: 
                    808: void
                    809: enableok(
                    810:     IN queue_t *q
                    811:     );
                    812: 
                    813: mblk_t *
                    814: esballoc(
                    815:     IN unsigned char *base,
                    816:     IN int size,
                    817:     IN int pri,
                    818:     IN frtn_t *fr_rtn
                    819:     );
                    820: 
                    821: int
                    822: esbbcall(
                    823:     IN int pri,
                    824:     IN int (*func)(long),
                    825:     IN long arg
                    826:     );
                    827: 
                    828: void
                    829: flushq(
                    830:     IN queue_t *q,
                    831:     IN int flag
                    832:     );
                    833: 
                    834: void
                    835: freeb(
                    836:     IN mblk_t *bp
                    837:     );
                    838: 
                    839: void
                    840: freemsg(
                    841:     IN mblk_t *bp
                    842:     );
                    843: 
                    844: int (*
                    845: getadmin(
                    846:     IN unsigned short mid
                    847:     ))();
                    848: 
                    849: unsigned short
                    850: getmid(
                    851:     IN char *name
                    852:     );
                    853: 
                    854: mblk_t *
                    855: getq(
                    856:     IN queue_t *q
                    857:     );
                    858: 
                    859: /*
                    860:  * void
                    861:  * init_lock(
                    862:  *    IN lock_t *lockp
                    863:  *    );
                    864:  */
                    865: 
                    866: #define init_lock(lockp)    KeInitializeSpinLock(&((lockp)->spinlock))
                    867: 
                    868: 
                    869: int
                    870: insq(
                    871:     IN queue_t *q,
                    872:     IN mblk_t *emp,
                    873:     IN mblk_t *mp
                    874:     );
                    875: 
                    876: void
                    877: linkb(
                    878:     IN mblk_t *mp,
                    879:     IN mblk_t *bp
                    880:     );
                    881: 
                    882: int
                    883: msgdsize(
                    884:     IN mblk_t *bp
                    885:     );
                    886: 
                    887: void
                    888: noenable(
                    889:     IN queue_t *q
                    890:     );
                    891: 
                    892: /*
                    893:  * int
                    894:  * p_lock (
                    895:  *    IN lock_t *lockp,
                    896:  *    IN int level
                    897:  *    );
                    898:  */
                    899: 
                    900: #define p_lock(lockp, ignored)              \
                    901:             ( KeAcquireSpinLock(            \
                    902:                  &((lockp)->spinlock),     \
                    903:                  &((lockp)->oldlevel)      \
                    904:                  ),                        \
                    905:              ((int) (lockp)->oldlevel)     \
                    906:            )
                    907: 
                    908: int
                    909: pullupmsg(
                    910:     IN mblk_t *mp,
                    911:     IN int len
                    912:     );
                    913: 
                    914: int
                    915: put(
                    916:     IN queue_t *q,
                    917:     IN mblk_t *mp
                    918:     );
                    919: 
                    920: int
                    921: putbq(
                    922:     IN queue_t *q,
                    923:     IN mblk_t *bp
                    924:     );
                    925: 
                    926: int
                    927: putctl(
                    928:     IN queue_t *q,
                    929:     IN int type
                    930:     );
                    931: 
                    932: int
                    933: putctl1(
                    934:     IN queue_t *q,
                    935:     IN int type,
                    936:     IN int param
                    937:     );
                    938: 
                    939: int
                    940: putnext(
                    941:     IN queue_t *q,
                    942:     IN mblk_t *mp
                    943:     );
                    944: 
                    945: int
                    946: putnextctl(
                    947:     IN queue_t *q,
                    948:     IN int type
                    949:     );
                    950: 
                    951: int
                    952: putnextctl1(
                    953:     IN queue_t *q,
                    954:     IN int type,
                    955:     IN int p
                    956:     );
                    957: 
                    958: int
                    959: putq(
                    960:     IN queue_t *q,
                    961:     IN mblk_t *bp
                    962:     );
                    963: 
                    964: void
                    965: qenable(
                    966:     IN queue_t *q
                    967:     );
                    968: 
                    969: void
                    970: qreply(
                    971:     IN queue_t *q,
                    972:     IN mblk_t *bp
                    973:     );
                    974: 
                    975: int
                    976: qsize(
                    977:     IN queue_t *qp
                    978:     );
                    979: 
                    980: mblk_t *
                    981: rmvb(
                    982:     IN mblk_t *mp,
                    983:     IN mblk_t *bp
                    984:     );
                    985: 
                    986: void
                    987: rmvq(
                    988:     IN queue_t *q,
                    989:     IN mblk_t *mp
                    990:     );
                    991: 
                    992: int
                    993: strlog(
                    994:     IN short mid,
                    995:     IN short sid,
                    996:     IN char level,
                    997:     IN unsigned short  flags,
                    998:     IN char *fmt,
                    999:     ...
                   1000:     );
                   1001: 
                   1002: int
                   1003: strqget(
                   1004:     IN queue_t *q,
                   1005:     IN qfields_t what,
                   1006:     IN unsigned char band,
                   1007:     IN long *valp
                   1008:     );
                   1009: 
                   1010: int
                   1011: strqset(
                   1012:     IN queue_t *q,
                   1013:     IN qfields_t what,
                   1014:     IN unsigned char band,
                   1015:     IN long *val
                   1016:     );
                   1017: 
                   1018: int
                   1019: testb(
                   1020:     IN int size,
                   1021:     IN unsigned int pri
                   1022:     );
                   1023: 
                   1024: int
                   1025: timeout(
                   1026:     IN int (*ftn)(char *),
                   1027:     IN char *arg,
                   1028:     IN long tim
                   1029:     );
                   1030: 
                   1031: int
                   1032: unbufcall(
                   1033:     IN int id
                   1034:     );
                   1035: 
                   1036: mblk_t *
                   1037: unlinkb(
                   1038:     IN mblk_t *mp
                   1039:     );
                   1040: 
                   1041: int
                   1042: untimeout(
                   1043:     IN int seq
                   1044:     );
                   1045: 
                   1046: /* void
                   1047:  * v_lock (
                   1048:  *     IN lock_t *lockp,
                   1049:  *     IN int level
                   1050:  *     );
                   1051:  *
                   1052:  */
                   1053: 
                   1054: #define v_lock(lockp, level)   \
                   1055:             KeReleaseSpinLock(&((lockp)->spinlock), (KIRQL) (level))
                   1056: 
                   1057: 
                   1058: 
                   1059: //
                   1060: // BUGBUG - this include needs to be removed for the final product.
                   1061: //
                   1062: #include <debugapi.h>
                   1063: 
                   1064: 
                   1065: 
                   1066: #endif  // _SYS_STREAM_INCLUDED
                   1067: 

unix.superglobalmegacorp.com

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