/****************************** Module Header ******************************\
*
* Module Name: BSEDOS.H
*
* OS/2 Base include file.
*
* Copyright (c) International Business Machines Corporation 1981, 1988-1992
*
* ===========================================================================
*
* The folowing symbols are used in this file for conditional sections.
*
* If INCL_BSE is defined, all subcomponents are included.
*
* Subcomponents marked with "+" are partially included by default:
*
*   #define:                To include:
*
* + INCL_DOSPROCESS         Process and thread support
* + INCL_DOSFILEMGR         File Management
* + INCL_DOSMEMMGR          Memory Management
* + INCL_DOSSEMAPHORES      Semaphore support
* + INCL_DOSDATETIME        Date/Time and Timer support
*   INCL_DOSMODULEMGR       Module manager
* + INCL_DOSRESOURCES       Resource support
*   INCL_DOSNLS             National Language Support
*   INCL_DOSEXCEPTIONS      Exception Management Support
*   INCL_DOSMISC            Miscellaneous
*   INCL_DOSMONITORS        Monitors
*   INCL_DOSQUEUES          Queues
*   INCL_DOSSESMGR          Session Manager Support
*   INCL_DOSDEVICES         Device specific, ring 2 support
*   INCL_DOSNMPIPES         Named Pipes Support
*   INCL_DOSPROFILE         DosProfile API
*   INCL_DOSMVDM            MVDM support
*
* ===========================================================================
*
* Comments at the end of each typedef line give the name tags used in
* the assembler include version of this file.
*
* The assembler include version of this file excludes lines between NOINC
* and INC comments.
*
\***************************************************************************/

/* NOINC */
   #pragma info( none )
   #ifndef __CHKHDR__
      #pragma info( none )
   #endif
   #pragma info( restore )
#ifdef __cplusplus
      extern "C" {
#endif
/* INC */

#ifndef __BSEDOS__
#define __BSEDOS__

#define INCL_DOSINCLUDED

#ifdef INCL_DOS
   #define INCL_DOSPROCESS
   #define INCL_DOSFILEMGR
   #define INCL_DOSMEMMGR
   #define INCL_DOSSEMAPHORES
   #define INCL_DOSDATETIME
   #define INCL_DOSMODULEMGR
   #define INCL_DOSRESOURCES
   #define INCL_DOSNLS
   #define INCL_DOSEXCEPTIONS
   #define INCL_DOSMISC
   #define INCL_DOSMONITORS
   #define INCL_DOSQUEUES
   #define INCL_DOSSESMGR
   #define INCL_DOSDEVICES
   #define INCL_DOSNMPIPES
   #define INCL_DOSPROFILE
   #define INCL_DOSMVDM
#endif /* INCL_DOS */

#ifdef INCL_ERRORS
   #define INCL_DOSERRORS
#endif /* INCL_ERRORS */

#if (defined(INCL_DOSPROCESS) || !defined(INCL_NOCOMMON))
   /*** General services */
   APIRET APIENTRY DosBeep(ULONG freq,
                           ULONG dur);

   /*** Process and Thread support */
   VOID APIENTRY DosExit(ULONG action,
                         ULONG result);

   /* DosExit codes */
   #define EXIT_THREAD        0
   #define EXIT_PROCESS       1
#endif /* common INCL_DOSPROCESS stuff */

#ifdef INCL_DOSPROCESS
   #define DosCwait           DosWaitChild
   #define DosSetPrty         DosSetPriority

   #include <bsetib.h>

   typedef  VOID APIENTRY FNTHREAD(ULONG);
   typedef FNTHREAD *PFNTHREAD;

   APIRET APIENTRY DosCreateThread(PTID ptid,
                                   PFNTHREAD pfn,
                                   ULONG param,
                                   ULONG flag,
                                   ULONG cbStack);

   APIRET APIENTRY DosResumeThread(TID tid);

   APIRET APIENTRY DosSuspendThread(TID tid);

   APIRET APIENTRY DosGetInfoBlocks(PTIB *pptib,
                                    PPIB *pppib);

   APIRET APIENTRY DosKillThread(TID tid);

   /* Action code values */

   #define DCWA_PROCESS       0
   #define DCWA_PROCESSTREE   1

   /* Wait option values */

   #define DCWW_WAIT          0
   #define DCWW_NOWAIT        1

/* Thread Flags for DosCreateThread options 59468 */

#define CREATE_READY        0                   /* defect 65437  */
#define CREATE_SUSPENDED    1
#define STACK_SPARSE        0
#define STACK_COMMITTED     2

   typedef struct _RESULTCODES       /* resc */
   {
      ULONG codeTerminate;
      ULONG codeResult;
   } RESULTCODES;
   typedef RESULTCODES *PRESULTCODES;

   APIRET APIENTRY DosWaitChild(ULONG action,
                                ULONG option,
                                PRESULTCODES pres,
                                PPID ppid,
                                PID pid);

   APIRET APIENTRY DosWaitThread(PTID ptid,
                                 ULONG option);

   APIRET APIENTRY DosSleep(ULONG msec);

/***ET+ uDB -   User's Debug Buffer structure
 *
 *      A pointer to a uDB is the sole parameter to DosDebug.  It
 *      contains all the information required for each DosDebug
 *      command.
 *
 */

typedef struct _uDB {           /* uDB */
        unsigned long   Pid;            /* Debuggee Process id          */
        unsigned long   Tid;            /* Debuggee Thread id           */
        long            Cmd;            /* Command or Notification      */
        long            Value;          /* Generic Data Value           */
        unsigned long   Addr;           /* Debuggee Address             */
        unsigned long   Buffer;         /* Debugger Buffer Address      */
        unsigned long   Len;            /* Length of Range              */
        unsigned long   Index;          /* Generic Identifier Index     */
        unsigned long   MTE;            /* Module Table Entry Handle    */
        unsigned long   EAX;            /* Register Set                 */
        unsigned long   ECX;
        unsigned long   EDX;
        unsigned long   EBX;
        unsigned long   ESP;
        unsigned long   EBP;
        unsigned long   ESI;
        unsigned long   EDI;
        unsigned long   EFlags;
        unsigned long   EIP;
        unsigned long   CSLim;
        unsigned long   CSBase;
        unsigned char   CSAcc;
        unsigned char   CSAtr;
        unsigned short  CS;
        unsigned long   DSLim;
        unsigned long   DSBase;
        unsigned char   DSAcc;
        unsigned char   DSAtr;
        unsigned short  DS;
        unsigned long   ESLim;
        unsigned long   ESBase;
        unsigned char   ESAcc;
        unsigned char   ESAtr;
        unsigned short  ES;
        unsigned long   FSLim;
        unsigned long   FSBase;
        unsigned char   FSAcc;
        unsigned char   FSAtr;
        unsigned short  FS;
        unsigned long   GSLim;
        unsigned long   GSBase;
        unsigned char   GSAcc;
        unsigned char   GSAtr;
        unsigned short  GS;
        unsigned long   SSLim;
        unsigned long   SSBase;
        unsigned char   SSAcc;
        unsigned char   SSAtr;
        unsigned short  SS;
} uDB_t;

/***EK+ DBG_C - DosDebug Command Numbers
 *
 *      These numbers are placed in the Cmd field of the uDB on
 *      entry to DosDebug.
 *
 *      These numbers identify which command DosDebug is requested
 *      to perform.
 *
 */

#define DBG_C_Null              0       /* Null                         */
#define DBG_C_ReadMem           1       /* Read Word                    */
#define DBG_C_ReadMem_I         1       /* Read Word                    */
#define DBG_C_ReadMem_D         2       /* Read Word (same as 1)        */
#define DBG_C_ReadReg           3       /* Read Register Set            */
#define DBG_C_WriteMem          4       /* Write Word                   */
#define DBG_C_WriteMem_I        4       /* Write Word                   */
#define DBG_C_WriteMem_D        5       /* Write Word (same as 4)       */
#define DBG_C_WriteReg          6       /* Write Register Set           */
#define DBG_C_Go                7       /* Go                           */
#define DBG_C_Term              8       /* Terminate                    */
#define DBG_C_SStep             9       /* Single Step                  */
#define DBG_C_Stop              10      /* Stop                         */
#define DBG_C_Freeze            11      /* Freeze Thread                */
#define DBG_C_Resume            12      /* Resume Thread                */
#define DBG_C_NumToAddr         13      /* Object Number to Address     */
#define DBG_C_ReadCoRegs        14      /* Read Coprocessor Registers   */
#define DBG_C_WriteCoRegs       15      /* Write Coprocessor Registers  */
                                        /* 16 is reserved               */
#define DBG_C_ThrdStat          17      /* Get Thread Status            */
#define DBG_C_MapROAlias        18      /* Map read-only alias          */
#define DBG_C_MapRWAlias        19      /* Map read-write alias         */
#define DBG_C_UnMapAlias        20      /* Unmap Alias                  */
#define DBG_C_Connect           21      /* Connect to Debuggee          */
#define DBG_C_ReadMemBuf        22      /* Read Memory Buffer           */
#define DBG_C_WriteMemBuf       23      /* Write Memory Buffer          */
#define DBG_C_SetWatch          24      /* Set Watchpoint               */
#define DBG_C_ClearWatch        25      /* Clear Watchpoint             */
#define DBG_C_RangeStep         26      /* Range Step                   */
#define DBG_C_Continue          27      /* Continue after an Exception  */
#define DBG_C_AddrToObject      28      /* Address to Object            */
#define DBG_C_XchgOpcode        29      /* Exchange opcode and go       */
#define DBG_C_LinToSel          30      /* 32 to 16 conversion      A001*/
#define DBG_C_SelToLin          31      /* 16 to 32 conversion      A001*/

   APIRET APIENTRY DosDebug(PVOID pdbgbuf);


   /* codeTerminate values (also passed to ExitList routines) */

   #define TC_EXIT            0
   #define TC_HARDERROR       1
   #define TC_TRAP            2
   #define TC_KILLPROCESS     3
   #define TC_EXCEPTION       4

   typedef VOID APIENTRY FNEXITLIST(ULONG);
   typedef FNEXITLIST *PFNEXITLIST;

   APIRET APIENTRY DosEnterCritSec(VOID);

   APIRET APIENTRY DosExitCritSec(VOID);

   APIRET APIENTRY DosExitList(ULONG ordercode,
                               PFNEXITLIST pfn);

   /* DosExitList functions */

   #define EXLST_ADD          1
   #define EXLST_REMOVE       2
   #define EXLST_EXIT         3

   APIRET APIENTRY DosExecPgm(PCHAR pObjname,
                              LONG cbObjname,
                              ULONG execFlag,
                              PCSZ pArg,
                              PCSZ pEnv,
                              PRESULTCODES pRes,
                              PCSZ pName);

   /* DosExecPgm functions */

   #define EXEC_SYNC          0
   #define EXEC_ASYNC         1
   #define EXEC_ASYNCRESULT   2
   #define EXEC_TRACE         3
   #define EXEC_BACKGROUND    4
   #define EXEC_LOAD          5
   #define EXEC_ASYNCRESULTDB 6


   APIRET APIENTRY  DosSetPriority(ULONG scope,
                                   ULONG ulclass, 
                                   LONG delta,
                                   ULONG PorTid);

   /* Priority scopes */

   #define PRTYS_PROCESS      0
   #define PRTYS_PROCESSTREE  1
   #define PRTYS_THREAD       2

   /* Priority classes */

   #define PRTYC_NOCHANGE     0
   #define PRTYC_IDLETIME     1
   #define PRTYC_REGULAR      2
   #define PRTYC_TIMECRITICAL 3
   #define PRTYC_FOREGROUNDSERVER 4

   /* Priority deltas */

   #define PRTYD_MINIMUM     -31
   #define PRTYD_MAXIMUM      31

   APIRET APIENTRY DosKillProcess(ULONG action,
                                  PID pid);

   #define DKP_PROCESSTREE    0
   #define DKP_PROCESS        1
#endif /* INCL_DOSPROCESS */

#ifndef INCL_SAADEFS
   /*************************************************************************\
   * CCHMAXPATH is the maximum fully qualified path name length including  *
   * the drive letter, colon, backslashes and terminating NULL.            *
   \*************************************************************************/
   #define CCHMAXPATH         260

   /*************************************************************************\
   * CCHMAXPATHCOMP is the maximum individual path component name length   *
   * including a terminating NULL.                                         *
   \*************************************************************************/
   #define CCHMAXPATHCOMP     256
#endif  /* !INCL_SAADEFS */

#if (defined(INCL_DOSFILEMGR) || !defined(INCL_NOCOMMON))
   /*** File manager */
   /* DosSetFilePtr() file position codes */

   #define FILE_BEGIN      0x0000   /* Move relative to beginning of file */
   #define FILE_CURRENT    0x0001   /* Move relative to current fptr position */
   #define FILE_END        0x0002   /* Move relative to end of file */

   /* DosFindFirst/Next Directory handle types */
   #define HDIR_SYSTEM        1     /* Use system handle (1) */
   #define HDIR_CREATE      (-1)    /* Allocate a new, unused handle */

   /* DosCopy control bits; may be or'ed together */
   #define DCPY_EXISTING   0x0001   /* Copy even if target exists */
   #define DCPY_APPEND     0x0002   /* Append to existing file, do not replace */
   #define DCPY_FAILEAS    0x0004   /* Fail if EAs not supported on target*/

   /* DosOpen/DosQFHandState/DosQueryFileInfo et al file attributes; also */
   /* known as Dos File Mode bits... */
   #define FILE_NORMAL     0x0000
   #define FILE_READONLY   0x0001
   #define FILE_HIDDEN     0x0002
   #define FILE_SYSTEM     0x0004
   #define FILE_DIRECTORY  0x0010
   #define FILE_ARCHIVED   0x0020

   #define FILE_IGNORE     0x10000     /* ignore file attribute in */
   /* DosSetPath/File Info if */
   /* this bit is set*/

   #define MUST_HAVE_READONLY      ( (FILE_READONLY  << 8) | FILE_READONLY  )
   #define MUST_HAVE_HIDDEN        ( (FILE_HIDDEN    << 8) | FILE_HIDDEN    )
   #define MUST_HAVE_SYSTEM        ( (FILE_SYSTEM    << 8) | FILE_SYSTEM    )
   #define MUST_HAVE_DIRECTORY     ( (FILE_DIRECTORY << 8) | FILE_DIRECTORY )
   #define MUST_HAVE_ARCHIVED      ( (FILE_ARCHIVED  << 8) | FILE_ARCHIVED  )

   /* DosOpen() actions */
   #define FILE_EXISTED    0x0001
   #define FILE_CREATED    0x0002
   #define FILE_TRUNCATED  0x0003

   /* DosOpen() open flags */
   #define FILE_OPEN       0x0001
   #define FILE_TRUNCATE   0x0002
   #define FILE_CREATE     0x0010

   /*     this nibble applies if file already exists                xxxx */
   #define OPEN_ACTION_FAIL_IF_EXISTS     0x0000  /* ---- ---- ---- 0000 */
   #define OPEN_ACTION_OPEN_IF_EXISTS     0x0001  /* ---- ---- ---- 0001 */
   #define OPEN_ACTION_REPLACE_IF_EXISTS  0x0002  /* ---- ---- ---- 0010 */

   /*     this nibble applies if file does not exist           xxxx      */
   #define OPEN_ACTION_FAIL_IF_NEW        0x0000  /* ---- ---- 0000 ---- */
   #define OPEN_ACTION_CREATE_IF_NEW      0x0010  /* ---- ---- 0001 ---- */

   /* DosOpen/DosSetFHandState flags */
   #define OPEN_ACCESS_READONLY           0x0000  /* ---- ---- ---- -000 */
   #define OPEN_ACCESS_WRITEONLY          0x0001  /* ---- ---- ---- -001 */
   #define OPEN_ACCESS_READWRITE          0x0002  /* ---- ---- ---- -010 */
   #define OPEN_SHARE_DENYREADWRITE       0x0010  /* ---- ---- -001 ---- */
   #define OPEN_SHARE_DENYWRITE           0x0020  /* ---- ---- -010 ---- */
   #define OPEN_SHARE_DENYREAD            0x0030  /* ---- ---- -011 ---- */
   #define OPEN_SHARE_DENYNONE            0x0040  /* ---- ---- -100 ---- */
   #define OPEN_FLAGS_NOINHERIT           0x0080  /* ---- ---- 1--- ---- */
   #define OPEN_FLAGS_NO_LOCALITY         0x0000  /* ---- -000 ---- ---- */
   #define OPEN_FLAGS_SEQUENTIAL          0x0100  /* ---- -001 ---- ---- */
   #define OPEN_FLAGS_RANDOM              0x0200  /* ---- -010 ---- ---- */
   #define OPEN_FLAGS_RANDOMSEQUENTIAL    0x0300  /* ---- -011 ---- ---- */
   #define OPEN_FLAGS_NO_CACHE            0x1000  /* ---1 ---- ---- ---- */
   #define OPEN_FLAGS_FAIL_ON_ERROR       0x2000  /* --1- ---- ---- ---- */
   #define OPEN_FLAGS_WRITE_THROUGH       0x4000  /* -1-- ---- ---- ---- */
   #define OPEN_FLAGS_DASD                0x8000  /* 1--- ---- ---- ---- */
   #define OPEN_FLAGS_NONSPOOLED          0x00040000
   #define OPEN_FLAGS_PROTECTED_HANDLE 0x40000000


   /* DosSearchPath() constants */
   #define SEARCH_PATH           0x0000
   #define SEARCH_CUR_DIRECTORY  0x0001
   #define SEARCH_ENVIRONMENT    0x0002
   #define SEARCH_IGNORENETERRS  0x0004


   /************************************************************
   EA Info Levels & Find First/Next
   =========================================
   API's: DosFindFirst, DosQueryFileInfo, DosQueryPathInfo, DosSetFileInfo,
   DosSetPathInfo
   ************************************************************/

   /* File info levels&gml All listed API's */
   #define FIL_STANDARD          1     /* Info level 1, standard file info */
   #define FIL_QUERYEASIZE       2     /* Level 2, return Full EA size */
   #define FIL_QUERYEASFROMLIST  3     /* Level 3, return requested EA's */

   /* File info levels: Dos...PathInfo only */
   #define FIL_QUERYFULLNAME     5     /* Level 5, return fully qualified
   name of file */


   /* DosFsAttach() */
   /* Attact or detach */
   #define FS_ATTACH             0     /* Attach file server */
   #define FS_DETACH             1     /* Detach file server */
   #define FS_SPOOLATTACH        2     /* Register a spooler device */
   #define FS_SPOOLDETACH        3     /* De-register a spooler device */


   /* DosFsCtl() */
   /* Routing type */
   #define FSCTL_HANDLE          1     /* File Handle directs req routing */
   #define FSCTL_PATHNAME        2     /* Path Name directs req routing */
   #define FSCTL_FSDNAME         3     /* FSD Name directs req routing */

   /* defined FSCTL functions */
   #define FSCTL_ERROR_INFO      1     /* return error info from FSD */
   #define FSCTL_MAX_EASIZE      2     /* Max ea size for the FSD */

   typedef struct  _EASIZEBUF       /* struct for FSCTL fn 2 - max ea size */
   {
      USHORT  cbMaxEASize;        /* max. size of one EA */
      ULONG   cbMaxEAListSize;    /* max size of the full EA List */
   } EASIZEBUF;
   typedef EASIZEBUF  *PEASIZEBUF;



   /* DosQueryFSAttach() */
   /* Information level types (defines method of query) */
   #define FSAIL_QUERYNAME       1     /* Return data for a Drive or Device */
   #define FSAIL_DEVNUMBER       2     /* Return data for Ordinal Device # */
   #define FSAIL_DRVNUMBER       3     /* Return data for Ordinal Drive # */

   /* Item types (from data structure item "iType") */
   #define FSAT_CHARDEV          1     /* Resident character device */
   #define FSAT_PSEUDODEV        2     /* Pusedu-character device */
   #define FSAT_LOCALDRV         3     /* Local drive */
   #define FSAT_REMOTEDRV        4     /* Remote drive attached to FSD */

   typedef struct  _FSQBUFFER       /* fsqbuf Data structure for QFSAttach*/
   {
      USHORT  iType;              /* Item type */
      USHORT  cbName;             /* Length of item name, sans NULL */
      UCHAR   szName[1];          /* ASCIIZ item name */
      USHORT  cbFSDName;          /* Length of FSD name, sans NULL */
      UCHAR   szFSDName[1];       /* ASCIIZ FSD name */
      USHORT  cbFSAData;          /* Length of FSD Attach data returned */
      UCHAR   rgFSAData[1];       /* FSD Attach data from FSD */
   } FSQBUFFER;
   typedef FSQBUFFER  *PFSQBUFFER;


   typedef struct _FSQBUFFER2       /* fsqbuf Data structure for QFSAttach*/
   {
      USHORT  iType;
      USHORT  cbName;
      USHORT  cbFSDName;
      USHORT  cbFSAData;
      UCHAR   szName[1];
      UCHAR   szFSDName[1];
      UCHAR   rgFSAData[1];
   } FSQBUFFER2;
   typedef FSQBUFFER2 *PFSQBUFFER2;

   typedef struct _SPOOLATTACH      /* Data structure for spooler operations */
   {
      USHORT  hNmPipe;            /* Named pipe handle */
      ULONG   ulKey;              /* Attached key */
   } SPOOLATTACH;
   typedef SPOOLATTACH  *PSPOOLATTACH;


   /*****************************************************************************
   * File System Drive Information&gml DosQueryFSInfo DosSetFSInfo              *
   *****************************************************************************/

   /* FS Drive Info Levels */
   #define FSIL_ALLOC            1     /* Drive allocation info (Query only) */
   #define FSIL_VOLSER           2     /* Drive Volum/Serial info */

   /* DosQueryFHType() */
   /* Handle classes (low 8 bits of Handle Type) */
   #define FHT_DISKFILE          0x0000   /* Disk file handle */
   #define FHT_CHRDEV            0x0001   /* Character device handle */
   #define FHT_PIPE              0x0002   /* Pipe handle */

   /* Handle bits (high 8 bits of Handle Type) */
   #define FHB_DSKREMOTE         0x8000   /* Remote disk */
   #define FHB_CHRDEVREMOTE      0x8000   /* Remote character device */
   #define FHB_PIPEREMOTE        0x8000   /* Remote pipe */



   #ifndef INCL_SAADEFS
      /* File time and date types */
      #ifdef __IBMC__
         typedef struct _FTIME           /* ftime */
         {
            UINT   twosecs : 5;
            UINT   minutes : 6;
            UINT   hours   : 5;
         } FTIME;
         typedef FTIME *PFTIME;
      #else
         typedef struct _FTIME           /* ftime */
         {
            USHORT   twosecs : 5;
            USHORT   minutes : 6;
            USHORT   hours   : 5;
         } FTIME;
         typedef FTIME *PFTIME;
      #endif

      #ifdef __IBMC__
         typedef struct _FDATE           /* fdate */
         {
            UINT   day     : 5;
            UINT   month   : 4;
            UINT   year    : 7;
         } FDATE;
         typedef FDATE   *PFDATE;
      #else
         typedef struct _FDATE           /* fdate */
         {
            USHORT   day     : 5;
            USHORT   month   : 4;
            USHORT   year    : 7;
         } FDATE;
         typedef FDATE   *PFDATE;
      #endif
   #endif /* INCL_SAADEFS */


   typedef struct _VOLUMELABEL      /* vol */
   {
      BYTE cch;
      CHAR szVolLabel[12];
   } VOLUMELABEL;
   typedef VOLUMELABEL  *PVOLUMELABEL;

   typedef struct _FSINFO      /* fsinf */
   {
      FDATE fdateCreation;
      FTIME ftimeCreation;
      VOLUMELABEL vol;
   } FSINFO;
   typedef FSINFO *PFSINFO;

   /* HANDTYPE values */
   #define HANDTYPE_FILE         0x0000
   #define HANDTYPE_DEVICE       0x0001
   #define HANDTYPE_PIPE         0x0002
   #define HANDTYPE_PROTECTED    0x4000
   #define HANDTYPE_NETWORK      0x8000

   typedef struct _FILELOCK      /* flock */
   {
      LONG lOffset;
      LONG lRange;
   } FILELOCK;
   typedef FILELOCK  *PFILELOCK;

   typedef LHANDLE HFILE;     /* hf */
   typedef HFILE   *PHFILE;

   #ifndef __HEV__            /* INCL_SEMAPHORE may also define HEV */
      #define __HEV__
      typedef  ULONG    HEV;             /* hev */
      typedef  HEV      *PHEV;
   #endif

   typedef  ULONG  FHLOCK;
   typedef  PULONG  PFHLOCK;

   APIRET APIENTRY DosSetFileLocks(HFILE hFile,
                                   PFILELOCK pflUnlock,
                                   PFILELOCK pflLock,
                                   ULONG timeout,
                                   ULONG flags);
   APIRET APIENTRY DosProtectSetFileLocks(HFILE hFile,
                                          PFILELOCK pflUnlock,
                                          PFILELOCK pflLock,
                                          ULONG timeout, ULONG flags,
                                          FHLOCK fhFileHandleLockID);

   APIRET APIENTRY DosCancelLockRequest(HFILE hFile,
                                        PFILELOCK pflLock);


   #ifndef INCL_SAADEFS

      typedef struct _FILEFINDBUF     /* findbuf */
      {
         FDATE  fdateCreation;
         FTIME  ftimeCreation;
         FDATE  fdateLastAccess;
         FTIME  ftimeLastAccess;
         FDATE  fdateLastWrite;
         FTIME  ftimeLastWrite;
         ULONG  cbFile;
         ULONG  cbFileAlloc;
         USHORT attrFile;
         UCHAR  cchName;
         CHAR   achName[CCHMAXPATHCOMP];
      } FILEFINDBUF;

      typedef FILEFINDBUF *PFILEFINDBUF;

      /*NOINC */
      #pragma pack(2)
      /*INC  */
      typedef struct _FILEFINDBUF2    /* findbuf2 */
      {
         FDATE  fdateCreation;
         FTIME  ftimeCreation;
         FDATE  fdateLastAccess;
         FTIME  ftimeLastAccess;
         FDATE  fdateLastWrite;
         FTIME  ftimeLastWrite;
         ULONG  cbFile;
         ULONG  cbFileAlloc;
         USHORT attrFile;
         ULONG  cbList;
         UCHAR  cchName;
         CHAR   achName[CCHMAXPATHCOMP];
      } FILEFINDBUF2;
      typedef FILEFINDBUF2 *PFILEFINDBUF2;

      typedef struct _FILEFINDBUF3                 /* findbuf3 */
      {
         ULONG   oNextEntryOffset;            /* new field */
         FDATE   fdateCreation;
         FTIME   ftimeCreation;
         FDATE   fdateLastAccess;
         FTIME   ftimeLastAccess;
         FDATE   fdateLastWrite;
         FTIME   ftimeLastWrite;
         ULONG   cbFile;
         ULONG   cbFileAlloc;
         ULONG   attrFile;                    /* widened field */
         UCHAR   cchName;
         CHAR    achName[CCHMAXPATHCOMP];
      } FILEFINDBUF3;
      typedef FILEFINDBUF3 *PFILEFINDBUF3;

      typedef struct _FILEFINDBUF4                 /* findbuf4 */
      {
         ULONG   oNextEntryOffset;            /* new field */
         FDATE   fdateCreation;
         FTIME   ftimeCreation;
         FDATE   fdateLastAccess;
         FTIME   ftimeLastAccess;
         FDATE   fdateLastWrite;
         FTIME   ftimeLastWrite;
         ULONG   cbFile;
         ULONG   cbFileAlloc;
         ULONG   attrFile;                    /* widened field */
         ULONG   cbList;
         UCHAR   cchName;
         CHAR    achName[CCHMAXPATHCOMP];
      } FILEFINDBUF4;
      typedef FILEFINDBUF4  *PFILEFINDBUF4;

      /* extended attribute structures */

      typedef struct _GEA         /* gea */
      {
         BYTE cbName;        /* name length not including NULL */
         CHAR szName[1];     /* attribute name */
      } GEA;
      typedef GEA *PGEA;

      typedef struct _GEALIST     /* geal */
      {
         ULONG cbList;       /* total bytes of structure including full list */
         GEA list[1];        /* variable length GEA structures */
      } GEALIST;
      typedef GEALIST  *PGEALIST;

      typedef struct _FEA         /* fea */
      {
         BYTE fEA;           /* flags                              */
         BYTE cbName;        /* name length not including NULL */
         USHORT cbValue;     /* value length */
      } FEA;
      typedef FEA *PFEA;

      /* flags for _FEA.fEA */
      #define FEA_NEEDEA         0x80     /* need EA bit */

      typedef struct _FEALIST     /* feal */
      {
         ULONG cbList;       /* total bytes of structure including full list */
         FEA list[1];        /* variable length FEA structures */
      } FEALIST;
      typedef FEALIST *PFEALIST;

      typedef struct _EAOP        /* eaop */
      {
         PGEALIST fpGEAList; /* general EA list */
         PFEALIST fpFEAList; /* full EA list */
         ULONG oError;
      } EAOP;
      typedef EAOP *PEAOP;

      /*NOINC*/
      #pragma pack(1)
      /*INC*/

      typedef struct _FEA2         /* fea2 */
      {
         ULONG   oNextEntryOffset;    /* new field */
         BYTE    fEA;
         BYTE    cbName;
         USHORT  cbValue;
         CHAR    szName[1];           /* new field */
      } FEA2;
      typedef FEA2 *PFEA2;


      typedef struct _FEA2LIST     /* fea2l */
      {
         ULONG   cbList;
         FEA2    list[1];
      } FEA2LIST;
      typedef FEA2LIST *PFEA2LIST;

      typedef struct _GEA2          /* gea2 */
      {
         ULONG   oNextEntryOffset;     /* new field */
         BYTE    cbName;
         CHAR    szName[1];            /* new field */
      } GEA2;
      typedef GEA2 *PGEA2;

      typedef struct _GEA2LIST      /* gea2l */
      {
         ULONG   cbList;
         GEA2    list[1];
      } GEA2LIST;
      typedef GEA2LIST *PGEA2LIST;

      typedef struct _EAOP2         /* eaop2 */
      {
         PGEA2LIST   fpGEA2List;       /* GEA set */
         PFEA2LIST   fpFEA2List;       /* FEA set */
         ULONG       oError;           /* offset of FEA error */
      } EAOP2;
      typedef EAOP2 *PEAOP2;


      /*
      * Equates for the types of EAs that follow the convention that we have
      * established.
      *
      * Values 0xFFFE thru 0x8000 are reserved.
      * Values 0x0000 thru 0x7fff are user definable.
      * Value  0xFFFC is not used
      */

      #define EAT_BINARY      0xFFFE      /* length preceeded binary */
      #define EAT_ASCII       0xFFFD      /* length preceeded ASCII */
      #define EAT_BITMAP      0xFFFB      /* length preceeded bitmap */
      #define EAT_METAFILE    0xFFFA      /* length preceeded metafile */
      #define EAT_ICON        0xFFF9      /* length preceeded icon */
      #define EAT_EA          0xFFEE      /* length preceeded ASCII */
                                          /* name of associated data (#include) */
      #define EAT_MVMT        0xFFDF      /* multi-valued, multi-typed field */
      #define EAT_MVST        0xFFDE      /* multi-valued, single-typed field */
      #define EAT_ASN1        0xFFDD      /* ASN.1 field */

   #endif  /* !INCL_SAADEFS */
   /*NOINC*/
   #pragma pack()
   /*INC*/



   APIRET APIENTRY  DosOpen(PCSZ    pszFileName,
                            PHFILE pHf,
                            PULONG pulAction,
                            ULONG  cbFile,
                            ULONG  ulAttribute,
                            ULONG  fsOpenFlags,
                            ULONG  fsOpenMode,
                            PEAOP2 peaop2);

   APIRET APIENTRY  DosProtectOpen(PCSZ pszFileName,
                                   PHFILE phf,
                                   PULONG pulAction,
                                   ULONG cbFile,
                                   ULONG ulAttribute,
                                   ULONG fsOpenFlags,
                                   ULONG fsOpenMode,
                                   PEAOP2 peaop2,
                                   PFHLOCK pfhFileHandleLockID);

   APIRET APIENTRY  DosClose(HFILE hFile);

   APIRET APIENTRY  DosProtectClose(HFILE hFile,
                                    FHLOCK fhFileHandleLockID);

   APIRET APIENTRY  DosRead(HFILE hFile,
                            PVOID pBuffer,
                            ULONG cbRead,
                            PULONG pcbActual);

   APIRET APIENTRY  DosProtectRead(HFILE hFile,
                                   PVOID pBuffer,
                                   ULONG cbRead,
                                   PULONG pcbActual,
                                   FHLOCK fhFileHandleLockID);

   APIRET APIENTRY  DosWrite(HFILE hFile,
                             PVOID pBuffer,
                             ULONG cbWrite,
                             PULONG pcbActual);

   APIRET APIENTRY  DosProtectWrite(HFILE hFile,
                                    PVOID pBuffer,
                                    ULONG cbWrite,
                                    PULONG pcbActual,
                                    FHLOCK fhFileHandleLockID);

   /* File time and date types */

   typedef struct _FILESTATUS      /* fsts */
   {
      FDATE  fdateCreation;
      FTIME  ftimeCreation;
      FDATE  fdateLastAccess;
      FTIME  ftimeLastAccess;
      FDATE  fdateLastWrite;
      FTIME  ftimeLastWrite;
      ULONG  cbFile;
      ULONG  cbFileAlloc;
      USHORT attrFile;
   } FILESTATUS;
   typedef FILESTATUS *PFILESTATUS;

   typedef struct _FILESTATUS2     /* fsts2 */
   {
      FDATE  fdateCreation;
      FTIME  ftimeCreation;
      FDATE  fdateLastAccess;
      FTIME  ftimeLastAccess;
      FDATE  fdateLastWrite;
      FTIME  ftimeLastWrite;
      ULONG  cbFile;
      ULONG  cbFileAlloc;
      USHORT attrFile;
      ULONG  cbList;
   } FILESTATUS2;
   typedef FILESTATUS2 *PFILESTATUS2;

   typedef struct _FILESTATUS3     /* fsts3 */
   {
      FDATE  fdateCreation;
      FTIME  ftimeCreation;
      FDATE  fdateLastAccess;
      FTIME  ftimeLastAccess;
      FDATE  fdateLastWrite;
      FTIME  ftimeLastWrite;
      ULONG  cbFile;
      ULONG  cbFileAlloc;
      ULONG  attrFile;
   } FILESTATUS3;
   typedef FILESTATUS3 *PFILESTATUS3;

   typedef struct _FILESTATUS4      /* fsts4 */
   {
      FDATE  fdateCreation;
      FTIME  ftimeCreation;
      FDATE  fdateLastAccess;
      FTIME  ftimeLastAccess;
      FDATE  fdateLastWrite;
      FTIME  ftimeLastWrite;
      ULONG  cbFile;
      ULONG  cbFileAlloc;
      ULONG  attrFile;
      ULONG  cbList;
   } FILESTATUS4;
   typedef FILESTATUS4  *PFILESTATUS4;


   typedef struct _FSALLOCATE      /* fsalloc */
   {
      ULONG  idFileSystem;
      ULONG  cSectorUnit;
      ULONG  cUnit;
      ULONG  cUnitAvail;
      USHORT cbSector;
   } FSALLOCATE;
   typedef FSALLOCATE *PFSALLOCATE;

   typedef LHANDLE HDIR;        /* hdir */
   typedef HDIR    *PHDIR;

   #define DosOpen2        DosOpen
   #define DosFindFirst2   DosFindFirst
   #define DosQFHandState  DosQueryFHState
   #define DosProtectQFHandState  DosProtectQueryFHState
   #define DosSetFHandState  DosSetFHState
   #define DosProtectSetFHandState  DosProtectSetFHState
   #define DosQHandType    DosQueryHType
   #define DosQFSAttach    DosQueryFSAttach
   #define DosNewSize      DosSetFileSize
   #define DosProtectNewSize  DosProtectSetFileSize
   #define DosBufReset     DosResetBuffer
   #define DosChgFilePtr   DosSetFilePtr
   #define DosProtectChgFilePtr   DosProtectSetFilePtr
   #define DosMkDir        DosCreateDir
   #define DosMkDir2       DosCreateDir
   #define DosRmDir        DosDeleteDir
   #define DosSelectDisk   DosSetDefaultDisk
   #define DosQCurDisk     DosQueryCurrentDisk
   #define DosChDir        DosSetCurrentDir
   #define DosQCurDir      DosQueryCurrentDir
   #define DosQFSInfo      DosQueryFSInfo
   #define DosQVerify      DosQueryVerify
   #define DosQFileInfo    DosQueryFileInfo
   #define DosProtectQFileInfo    DosProtectQueryFileInfo
   #define DosQPathInfo    DosQueryPathInfo

   APIRET APIENTRY  DosDelete(PCSZ pszFile);

   APIRET APIENTRY  DosForceDelete(PCSZ pszFile);

   APIRET APIENTRY  DosDupHandle(HFILE hFile,
                                 PHFILE pHfile);

   APIRET APIENTRY  DosQueryFHState(HFILE hFile,
                                    PULONG pMode);
   APIRET APIENTRY  DosProtectQueryFHState(HFILE hFile,
                                           PULONG pMode,
                                           FHLOCK fhFileHandleLockID);

   APIRET APIENTRY  DosSetFHState(HFILE hFile,
                                  ULONG mode);

   APIRET APIENTRY  DosProtectSetFHState(HFILE hFile,
                                         ULONG mode,
                                         FHLOCK fhFileHandleLockID);

   APIRET APIENTRY  DosQueryHType(HFILE hFile,
                                  PULONG pType,
                                  PULONG pAttr);

   APIRET APIENTRY  DosFindFirst(PCSZ    pszFileSpec,
                                 PHDIR  phdir,
                                 ULONG  flAttribute,
                                 PVOID  pfindbuf,
                                 ULONG  cbBuf,
                                 PULONG pcFileNames,
                                 ULONG  ulInfoLevel);

   APIRET APIENTRY  DosFindNext(HDIR   hDir,
                                PVOID  pfindbuf,
                                ULONG  cbfindbuf,
                                PULONG pcFilenames);

   APIRET APIENTRY  DosFindClose(HDIR hDir);

   APIRET APIENTRY  DosFSAttach(PCSZ pszDevice,
                                PCSZ pszFilesystem,
                                PVOID pData,
                                ULONG cbData,
                                ULONG flag);

   APIRET APIENTRY  DosQueryFSAttach(PCSZ    pszDeviceName,
                                     ULONG  ulOrdinal,
                                     ULONG  ulFSAInfoLevel,
                                     PFSQBUFFER2 pfsqb,
                                     PULONG pcbBuffLength);

   APIRET APIENTRY  DosFSCtl(PVOID pData,
                             ULONG cbData,
                             PULONG pcbData,
                             PVOID pParms,
                             ULONG cbParms,
                             PULONG pcbParms,
                             ULONG function,
                             PCSZ pszRoute,
                             HFILE hFile,
                             ULONG method);

   APIRET APIENTRY  DosSetFileSize(HFILE hFile,
                                   ULONG cbSize);

   APIRET APIENTRY  DosProtectSetFileSize(HFILE hFile,
                                          ULONG cbSize,
                                          FHLOCK fhFileHandleLockID);

   APIRET APIENTRY  DosResetBuffer(HFILE hFile);

   APIRET APIENTRY  DosSetFilePtr(HFILE hFile,
                                  LONG ib,
                                  ULONG method,
                                  PULONG ibActual);

   APIRET APIENTRY  DosProtectSetFilePtr(HFILE hFile,
                                         LONG ib,
                                         ULONG method,
                                         PULONG ibActual,
                                         FHLOCK fhFileHandleLockID);

   APIRET APIENTRY  DosMove(PCSZ pszOld,
                            PCSZ pszNew);

   APIRET APIENTRY  DosCopy(PCSZ pszOld,
                            PCSZ pszNew,
                            ULONG option);

   APIRET APIENTRY  DosEditName(ULONG metalevel,
                                PCSZ pszSource,
                                PCSZ pszEdit,
                                PBYTE pszTarget,
                                ULONG cbTarget);

   APIRET APIENTRY  DosCreateDir(PCSZ pszDirName,
                                 PEAOP2 peaop2);

   APIRET APIENTRY  DosDeleteDir(PCSZ pszDir);

   APIRET APIENTRY  DosSetDefaultDisk(ULONG disknum);

   APIRET APIENTRY  DosQueryCurrentDisk(PULONG pdisknum,
                                        PULONG plogical);

   APIRET APIENTRY  DosSetCurrentDir(PCSZ pszDir);

   APIRET APIENTRY  DosQueryCurrentDir(ULONG disknum,
                                       PBYTE pBuf,
                                       PULONG pcbBuf);

   APIRET APIENTRY  DosQueryFSInfo(ULONG disknum,
                                   ULONG infolevel,
                                   PVOID pBuf,
                                   ULONG cbBuf);

   APIRET APIENTRY  DosSetFSInfo(ULONG disknum,
                                 ULONG infolevel,
                                 PVOID pBuf,
                                 ULONG cbBuf);

   APIRET APIENTRY  DosQueryVerify(PBOOL32 pBool);

   APIRET APIENTRY  DosSetVerify(BOOL32);

   APIRET APIENTRY  DosSetMaxFH(ULONG cFH);

   APIRET APIENTRY  DosSetRelMaxFH(PLONG pcbReqCount,
                                   PULONG pcbCurMaxFH);

   APIRET APIENTRY  DosQueryFileInfo(HFILE hf,
                                     ULONG ulInfoLevel,
                                     PVOID pInfo,
                                     ULONG cbInfoBuf);

   APIRET APIENTRY  DosProtectQueryFileInfo(HFILE hf,
                                            ULONG ulInfoLevel,
                                            PVOID pInfo,
                                            ULONG cbInfoBuf,
                                            FHLOCK fhFileHandleLockID);

   APIRET APIENTRY  DosSetFileInfo(HFILE hf,
                                   ULONG ulInfoLevel,
                                   PVOID pInfoBuf,
                                   ULONG cbInfoBuf);

   APIRET APIENTRY  DosProtectSetFileInfo(HFILE hf,
                                          ULONG ulInfoLevel,
                                          PVOID pInfoBuf,
                                          ULONG cbInfoBuf,
                                          FHLOCK fhFileHandleLockID);

   APIRET APIENTRY  DosQueryPathInfo(PCSZ   pszPathName,
                                     ULONG ulInfoLevel,
                                     PVOID pInfoBuf,
                                     ULONG cbInfoBuf);

   APIRET APIENTRY  DosSetPathInfo(PCSZ   pszPathName,
                                   ULONG ulInfoLevel,
                                   PVOID pInfoBuf,
                                   ULONG cbInfoBuf,
                                   ULONG flOptions);

   /* defines for DosSetPathInfo -pathinfo flag */
   #define DSPI_WRTTHRU    0x10    /* write through */

   APIRET APIENTRY  DosShutdown(ULONG ulReserved);

   APIRET APIENTRY  DosEnumAttribute(ULONG  ulRefType,
                                     PVOID  pvFile,
                                     ULONG  ulEntry,
                                     PVOID  pvBuf,
                                     ULONG  cbBuf,
                                     PULONG pulCount,
                                     ULONG  ulInfoLevel);

   APIRET APIENTRY  DosProtectEnumAttribute(ULONG ulRefType,
                                            PVOID pvFile,
                                            ULONG ulEntry,
                                            PVOID pvBuf,
                                            ULONG cbBuf,
                                            PULONG pulCount,
                                            ULONG ulInfoLevel,
                                            FHLOCK fhFileHandleLockID );

   /*NOINC*/
   #pragma pack(1)
   /*INC */

   typedef struct _DENA1 /* _dena1 level 1 info returned from DosEnumAttribute */
   {
      UCHAR       reserved;       /* 0 */
      UCHAR       cbName;         /* length of name exculding NULL */
      USHORT      cbValue;        /* length of value */
      UCHAR       szName[1];      /* variable length asciiz name */
   } DENA1;
   typedef DENA1 *PDENA1;

   typedef FEA2  DENA2;
   typedef PFEA2 PDENA2;

   /*NOINC*/
   #pragma pack()
   /*INC */
   /* Infolevels for DosEnumAttribute  */
   #define ENUMEA_LEVEL_NO_VALUE   1L      /* FEA without value */
   /* Reference types for DosEnumAttribute */
   #define ENUMEA_REFTYPE_FHANDLE  0       /* file handle */
   #define ENUMEA_REFTYPE_PATH     1       /* path name */
   #define ENUMEA_REFTYPE_MAX      ENUMEA_REFTYPE_PATH

#endif /* common INCL_DOSFILEMGR */

#if (defined(INCL_DOSMEMMGR) || !defined(INCL_NOCOMMON))
   /*** Memory management */

   APIRET APIENTRY  DosAllocMem(PPVOID ppb,
                                ULONG cb,
                                ULONG flag);

   APIRET APIENTRY  DosFreeMem(PVOID pb);

   APIRET APIENTRY  DosSetMem(PVOID pb,
                              ULONG cb,
                              ULONG flag);

   APIRET APIENTRY  DosGiveSharedMem(PVOID pb,
                                     PID pid,
                                     ULONG flag);

   APIRET APIENTRY  DosGetSharedMem(PVOID pb,
                                    ULONG flag);

   APIRET APIENTRY  DosGetNamedSharedMem(PPVOID ppb,
                                         PCSZ pszName,
                                         ULONG flag);

   APIRET APIENTRY  DosAllocSharedMem(PPVOID ppb,
                                      PCSZ pszName,
                                      ULONG cb,
                                      ULONG flag);

   APIRET APIENTRY  DosQueryMem(PVOID pb,
                                PULONG pcb,
                                PULONG pFlag);

   #define DosSubAlloc     DosSubAllocMem
   #define DOSSUBALLOC     DosSubAllocMem
   APIRET APIENTRY  DosSubAllocMem(PVOID pbBase,
                                   PPVOID ppb,
                                   ULONG cb);

   #define DosSubFree      DosSubFreeMem
   #define DOSSUBFREE      DosSubFreeMem
   APIRET APIENTRY  DosSubFreeMem(PVOID pbBase,
                                  PVOID pb,
                                  ULONG cb);

   #define DosSubSet       DosSubSetMem
   #define DOSSUBSET       DosSubSetMem
   APIRET APIENTRY  DosSubSetMem(PVOID pbBase,
                                 ULONG flag,
                                 ULONG cb);

   #define DosSubUnset     DosSubUnsetMem
   #define DOSSUBUNSET     DosSubUnsetMem
   APIRET APIENTRY  DosSubUnsetMem(PVOID pbBase);

   #include <bsememf.h>    /* get flags for API                            */

#endif /* INCL_DOSMEMMGR */



#if (defined(INCL_DOSSEMAPHORES) || !defined(INCL_NOCOMMON))

   /*
   *     32-bit Semaphore Support
   */

   /* Semaphore Attributes */

   #define DC_SEM_SHARED   0x01   /* DosCreateMutex, DosCreateEvent, and     */
                                  /*   DosCreateMuxWait use it to indicate   */
                                  /*   whether the semaphore is shared or    */
                                  /*   private when the PSZ is null          */
   #define DCMW_WAIT_ANY   0x02   /* DosCreateMuxWait option for wait on any */
                                  /*   event/mutex to occur                  */
   #define DCMW_WAIT_ALL   0x04   /* DosCreateMuxWait option for wait on all */
                                  /*   events/mutexs to occur                */

   #define SEM_INDEFINITE_WAIT     -1L
   #define SEM_IMMEDIATE_RETURN     0L

   #ifndef __HSEM__
      #define __HSEM__
      typedef VOID *HSEM;
      typedef HSEM *PHSEM;
   #endif

   typedef struct _PSEMRECORD      /* psr */
   {
      HSEM        hsemCur;
      ULONG       ulUser;
   } SEMRECORD;
   typedef SEMRECORD *PSEMRECORD;

#endif /* common INCL_DOSSEMAPHORES */



#ifdef INCL_DOSSEMAPHORES

   #ifndef __HEV__            /* INCL_SEMAPHORE may also define HEV */
      #define __HEV__
      typedef  ULONG    HEV;             /* hev */
      typedef  HEV      *PHEV;
   #endif

   typedef  ULONG    HMTX;            /* hmtx */
   typedef  HMTX     *PHMTX;
   typedef  ULONG    HMUX;            /* hmux */
   typedef  HMUX     *PHMUX;

   APIRET APIENTRY  DosCreateEventSem (PCSZ pszName,
                                       PHEV phev,
                                       ULONG flAttr,
                                       BOOL32 fState);

   APIRET APIENTRY  DosOpenEventSem (PCSZ pszName,
                                     PHEV phev);

   APIRET APIENTRY  DosCloseEventSem (HEV hev);

   APIRET APIENTRY  DosResetEventSem (HEV hev,
                                      PULONG pulPostCt);

   APIRET APIENTRY  DosPostEventSem (HEV hev);

   APIRET APIENTRY  DosWaitEventSem (HEV hev,
                                     ULONG ulTimeout);

   APIRET APIENTRY  DosQueryEventSem (HEV hev,
                                      PULONG pulPostCt);

   APIRET APIENTRY  DosCreateMutexSem (PCSZ pszName,
                                       PHMTX phmtx,
                                       ULONG flAttr,
                                       BOOL32 fState);

   APIRET APIENTRY  DosOpenMutexSem (PCSZ pszName,
                                     PHMTX phmtx);

   APIRET APIENTRY  DosCloseMutexSem (HMTX hmtx);

   APIRET APIENTRY  DosRequestMutexSem (HMTX hmtx,
                                        ULONG ulTimeout);

   APIRET APIENTRY  DosReleaseMutexSem (HMTX hmtx);

   APIRET APIENTRY  DosQueryMutexSem (HMTX hmtx,
                                      PID *ppid,
                                      TID *ptid,
                                      PULONG pulCount);

   APIRET APIENTRY  DosCreateMuxWaitSem (PCSZ pszName,
                                         PHMUX phmux,
                                         ULONG cSemRec,
                                         PSEMRECORD pSemRec,
                                         ULONG flAttr);

   APIRET APIENTRY  DosOpenMuxWaitSem (PCSZ pszName,
                                       PHMUX phmux);

   APIRET APIENTRY  DosCloseMuxWaitSem (HMUX hmux);

   APIRET APIENTRY  DosWaitMuxWaitSem (HMUX hmux,
                                       ULONG ulTimeout,
                                       PULONG pulUser);

   APIRET APIENTRY  DosAddMuxWaitSem (HMUX hmux,
                                      PSEMRECORD pSemRec);

   APIRET APIENTRY  DosDeleteMuxWaitSem (HMUX hmux,
                                         HSEM hSem);

   APIRET APIENTRY  DosQueryMuxWaitSem (HMUX hmux,
                                        PULONG pcSemRec,
                                        PSEMRECORD pSemRec,
                                        PULONG pflAttr);

#endif /* INCL_DOSSEMAPHORES */



#if (defined(INCL_DOSDATETIME) || !defined(INCL_NOCOMMON))

   /*** Time support */

   typedef struct _DATETIME      /* date */
   {
      UCHAR   hours;
      UCHAR   minutes;
      UCHAR   seconds;
      UCHAR   hundredths;
      UCHAR   day;
      UCHAR   month;
      USHORT  year;
      SHORT   timezone;
      UCHAR   weekday;
   } DATETIME;
   typedef DATETIME *PDATETIME;

   APIRET APIENTRY   DosGetDateTime(PDATETIME pdt);

   APIRET APIENTRY   DosSetDateTime(PDATETIME pdt);

#endif /* common INCL_DOSDATETIME */



#ifdef INCL_DOSDATETIME

   #define DosTimerAsync   DosAsyncTimer
   #define DosTimerStart   DosStartTimer
   #define DosTimerStop    DosStopTimer

   typedef LHANDLE HTIMER;
   typedef HTIMER  *PHTIMER;

   APIRET APIENTRY   DosAsyncTimer(ULONG msec,
                                   HSEM hsem,
                                   PHTIMER phtimer);

   APIRET APIENTRY   DosStartTimer(ULONG msec,
                                   HSEM hsem,
                                   PHTIMER phtimer);

   APIRET APIENTRY   DosStopTimer(HTIMER htimer);

#endif /* INCL_DOSDATETIME */




/*** Module manager */

#ifdef INCL_DOSMODULEMGR


   APIRET APIENTRY  DosLoadModule(PCSZ pszName,
                                  ULONG cbName,
                                  PCSZ pszModname,
                                  PHMODULE phmod);

   APIRET APIENTRY  DosFreeModule(HMODULE hmod);

   APIRET APIENTRY  DosQueryProcAddr(HMODULE hmod,
                                     ULONG ordinal,
                                     PCSZ pszName,
                                     PFN* ppfn);

   APIRET APIENTRY  DosQueryModuleHandle(PCSZ pszModname,
                                         PHMODULE phmod);

   APIRET APIENTRY  DosQueryModuleName(HMODULE hmod,
                                       ULONG cbName,
                                       PCHAR pch);

   #define PT_16BIT        0
   #define PT_32BIT        1

   APIRET APIENTRY  DosQueryProcType(HMODULE hmod,
                                     ULONG ordinal,
                                     PCSZ pszName,
                                     PULONG pulproctype);

#endif /* INCL_DOSMODULEMGR */



#if (defined(INCL_DOSRESOURCES) || !defined(INCL_NOCOMMON))

   /*** Resource support */

   /* Predefined resource types */

   #define RT_POINTER      1   /* mouse pointer shape */
   #define RT_BITMAP       2   /* bitmap */
   #define RT_MENU         3   /* menu template */
   #define RT_DIALOG       4   /* dialog template */
   #define RT_STRING       5   /* string tables */
   #define RT_FONTDIR      6   /* font directory */
   #define RT_FONT         7   /* font */
   #define RT_ACCELTABLE   8   /* accelerator tables */
   #define RT_RCDATA       9   /* binary data */
   #define RT_MESSAGE      10  /* error msg     tables */
   #define RT_DLGINCLUDE   11  /* dialog include file name */
   #define RT_VKEYTBL      12  /* key to vkey tables */
   #define RT_KEYTBL       13  /* key to UGL tables */
   #define RT_CHARTBL      14  /* glyph to character tables */
   #define RT_DISPLAYINFO  15  /* screen display information */

   #define RT_FKASHORT     16  /* function key area short form */
   #define RT_FKALONG      17  /* function key area long form */

   #define RT_HELPTABLE    18  /* Help table for Cary Help manager */
   #define RT_HELPSUBTABLE 19  /* Help subtable for Cary Help manager */

   #define RT_FDDIR        20  /* DBCS uniq/font driver directory */
   #define RT_FD           21  /* DBCS uniq/font driver */

   #define RT_MAX          22  /* 1st unused Resource Type */


   #define RF_ORDINALID    0x80000000L     /* ordinal id flag in resource table */

#endif /* common INCL_DOSRESOURCES */




#ifdef INCL_DOSRESOURCES

   #define DosGetResource2 DosGetResource

   APIRET APIENTRY  DosGetResource(HMODULE hmod,
                                   ULONG idType,
                                   ULONG idName,
                                   PPVOID ppb);

   APIRET APIENTRY  DosFreeResource(PVOID pb);

   APIRET APIENTRY  DosQueryResourceSize(HMODULE hmod,
                                         ULONG idt,
                                         ULONG idn,
                                         PULONG pulsize);

#endif /* INCL_DOSRESOURCES */




/*** NLS Support */

#ifdef INCL_DOSNLS

   typedef struct _COUNTRYCODE   /* ctryc */
   {
      ULONG       country;
      ULONG       codepage;
   } COUNTRYCODE;
   typedef COUNTRYCODE *PCOUNTRYCODE;

   typedef struct _COUNTRYINFO   /* ctryi */
   {
      ULONG       country;
      ULONG       codepage;
      ULONG       fsDateFmt;
      CHAR        szCurrency[5];
      CHAR        szThousandsSeparator[2];
      CHAR        szDecimal[2];
      CHAR        szDateSeparator[2];
      CHAR        szTimeSeparator[2];
      UCHAR       fsCurrencyFmt;
      UCHAR       cDecimalPlace;
      UCHAR       fsTimeFmt;
      USHORT      abReserved1[2];
      CHAR        szDataSeparator[2];
      USHORT      abReserved2[5];
   } COUNTRYINFO, *PCOUNTRYINFO;

   #define DosGetCtryInfo  DosQueryCtryInfo
   #define DosGetDBCSEv    DosQueryDBCSEnv
   #define DosCaseMap      DosMapCase
   #define DosGetCollate   DosQueryCollate
   #define DosGetCp        DosQueryCp
   #define DosSetProcCp    DosSetProcessCp

   APIRET APIENTRY  DosQueryCtryInfo(ULONG cb,
                                     PCOUNTRYCODE pcc,
                                     PCOUNTRYINFO pci,
                                     PULONG pcbActual);

   APIRET APIENTRY  DosQueryDBCSEnv(ULONG cb,
                                    PCOUNTRYCODE pcc,
                                    PCHAR pBuf);

   APIRET APIENTRY  DosMapCase(ULONG cb,
                               PCOUNTRYCODE pcc,
                               PCHAR pch);

   APIRET APIENTRY  DosQueryCollate(ULONG cb,
                                    PCOUNTRYCODE pcc,
                                    PCHAR pch,
                                    PULONG pcch);

   APIRET APIENTRY  DosQueryCp(ULONG cb,
                               PULONG arCP,
                               PULONG pcCP);

   APIRET APIENTRY  DosSetProcessCp(ULONG cp);

#endif /* INCL_DOSNLS */




/*** Signal support */

#ifdef INCL_DOSEXCEPTIONS

   /* DosSetSigExceptionFocus codes */

   #define SIG_UNSETFOCUS 0
   #define SIG_SETFOCUS 1

   #include <bsexcpt.h>

   APIRET APIENTRY  DosSetExceptionHandler(PEXCEPTIONREGISTRATIONRECORD pERegRec);

   APIRET APIENTRY  DosUnsetExceptionHandler(PEXCEPTIONREGISTRATIONRECORD pERegRec);

   APIRET APIENTRY  DosRaiseException(PEXCEPTIONREPORTRECORD pexcept);

   APIRET APIENTRY  DosSendSignalException(PID pid,
                                           ULONG exception);

   APIRET APIENTRY  DosUnwindException(PEXCEPTIONREGISTRATIONRECORD phandler,
                                       PVOID pTargetIP,
                                       PEXCEPTIONREPORTRECORD pERepRec);

   APIRET APIENTRY  DosSetSignalExceptionFocus(BOOL32 flag,
                                               PULONG pulTimes);

   APIRET APIENTRY  DosEnterMustComplete(PULONG pulNesting);

   APIRET APIENTRY  DosExitMustComplete(PULONG pulNesting);

   APIRET APIENTRY  DosAcknowledgeSignalException(ULONG ulSignalNum);

#endif /* INCL_DOSEXCEPTIONS */


/*** Pipe and queue support */

#ifdef INCL_DOSQUEUES
   #if (defined(INCL_DOSFILEMGR) || !defined(INCL_NOCOMMON))

      typedef LHANDLE HQUEUE;  /* hq */
      typedef HQUEUE  *PHQUEUE;
      typedef struct _REQUESTDATA     /* reqqdata */
      {
         PID         pid;
         ULONG       ulData;
      } REQUESTDATA;
      typedef REQUESTDATA *PREQUESTDATA;

      #define QUE_FIFO              0L
      #define QUE_LIFO              1L
      #define QUE_PRIORITY          2L
      #define QUE_NOCONVERT_ADDRESS 0L
      #define QUE_CONVERT_ADDRESS   4L


      APIRET APIENTRY  DosCreatePipe(PHFILE phfRead,
                                     PHFILE phfWrite,
                                     ULONG cb);

      APIRET APIENTRY  DosCloseQueue(HQUEUE hq);

      APIRET APIENTRY  DosCreateQueue(PHQUEUE phq,
                                      ULONG priority,
                                      PCSZ pszName);

      APIRET APIENTRY  DosOpenQueue(PPID ppid,
                                    PHQUEUE phq,
                                    PCSZ pszName);

      APIRET APIENTRY  DosPeekQueue(HQUEUE hq,
                                    PREQUESTDATA pRequest,
                                    PULONG pcbData,
                                    PPVOID ppbuf,
                                    PULONG element,
                                    BOOL32 nowait,
                                    PBYTE ppriority,
                                    HEV hsem);

      APIRET APIENTRY  DosPurgeQueue(HQUEUE hq);

      APIRET APIENTRY  DosQueryQueue(HQUEUE hq,
                                     PULONG pcbEntries);

      APIRET APIENTRY  DosReadQueue(HQUEUE hq,
                                    PREQUESTDATA pRequest,
                                    PULONG pcbData,
                                    PPVOID ppbuf,
                                    ULONG element,
                                    BOOL32 wait,
                                    PBYTE ppriority,
                                    HEV hsem);

      APIRET APIENTRY  DosWriteQueue(HQUEUE hq,
                                     ULONG request,
                                     ULONG cbData,
                                     PVOID pbData,
                                     ULONG priority);

   #else /* INCL_DOSFILEMGR || !INCL_NOCOMMON */
      #error PHFILE not defined - define INCL_DOSFILEMGR or undefine INCL_NOCOMMON
   #endif /* INCL_DOSFILEMGR || !INCL_NOCOMMON */
#endif /* INCL_DOSQUEUES */



#ifdef INCL_DOSMISC

   /* definitions for DosSearchPath control word */
   #define DSP_IMPLIEDCUR          1 /* current dir will be searched first */
   #define DSP_PATHREF             2 /* from env.variable */
   #define DSP_IGNORENETERR        4 /* ignore net errs & continue search */

   /* indices for DosQuerySysInfo */
   #define QSV_MAX_PATH_LENGTH     1
   #define Q_MAX_PATH_LENGTH       QSV_MAX_PATH_LENGTH
   #define QSV_MAX_TEXT_SESSIONS   2
   #define QSV_MAX_PM_SESSIONS     3
   #define QSV_MAX_VDM_SESSIONS    4
   #define QSV_BOOT_DRIVE          5       /* 1=A, 2=B, etc. */
   #define QSV_DYN_PRI_VARIATION   6       /* 0=Absolute, 1=Dynamic */
   #define QSV_MAX_WAIT            7       /* seconds */
   #define QSV_MIN_SLICE           8       /* milli seconds */
   #define QSV_MAX_SLICE           9       /* milli seconds */
   #define QSV_PAGE_SIZE           10
   #define QSV_VERSION_MAJOR       11
   #define QSV_VERSION_MINOR       12
   #define QSV_VERSION_REVISION    13      /* Revision letter */
   #define QSV_MS_COUNT            14      /* Free running millisecond counter */
   #define QSV_TIME_LOW            15      /* Low dword of time in seconds */
   #define QSV_TIME_HIGH           16      /* High dword of time in seconds */
   #define QSV_TOTPHYSMEM          17      /* Physical memory on system */
   #define QSV_TOTRESMEM           18      /* Resident memory on system */
   #define QSV_TOTAVAILMEM         19      /* Available memory for all processes */
   #define QSV_MAXPRMEM            20      /* Avail private mem for calling proc */
   #define QSV_MAXSHMEM            21      /* Avail shared mem for calling proc */
   #define QSV_TIMER_INTERVAL      22      /* Timer interval in tenths of ms */
   #define QSV_MAX_COMP_LENGTH     23      /* max len of one component in a name */
   #define QSV_MAX                 QSV_MAX_COMP_LENGTH

   /* definitions for DosError - combine with | */
   #define FERR_DISABLEHARDERR     0x00000000L     /* disable hard error popups */
   #define FERR_ENABLEHARDERR      0x00000001L     /* enable hard error popups */
   #define FERR_ENABLEEXCEPTION    0x00000000L     /* enable exception popups */
   #define FERR_DISABLEEXCEPTION   0x00000002L     /* disable exception popups */

   /* definitions for DosQueryRASInfo Index */
   #define SIS_MMIOADDR            0
   #define SIS_MEC_TABLE           1
   #define SIS_SYS_LOG             2

   #define DosInsMessage   DosInsertMessage
   #define DosQSysInfo     DosQuerySysInfo

   APIRET APIENTRY  DosError(ULONG error);

   APIRET APIENTRY  DosGetMessage(PCHAR* pTable,
                                  ULONG cTable,
                                  PCHAR pBuf,
                                  ULONG cbBuf,
                                  ULONG msgnumber,
                                  PCSZ pszFile,
                                  PULONG pcbMsg);

   APIRET APIENTRY  DosErrClass(ULONG code,
                                PULONG pClass,
                                PULONG pAction,
                                PULONG pLocus);

   APIRET APIENTRY  DosInsertMessage(PCHAR* pTable,
                                     ULONG cTable,
                                     PCSZ pszMsg,
                                     ULONG cbMsg,
                                     PCHAR pBuf,
                                     ULONG cbBuf,
                                     PULONG pcbMsg);

   APIRET APIENTRY  DosPutMessage(HFILE hfile,
                                  ULONG cbMsg,
                                  PCHAR pBuf);

   APIRET APIENTRY  DosQuerySysInfo(ULONG iStart,
                                    ULONG iLast,
                                    PVOID pBuf,
                                    ULONG cbBuf);

   APIRET APIENTRY  DosScanEnv(PCSZ pszName,
                               PCSZ *ppszValue);

   APIRET APIENTRY  DosSearchPath(ULONG flag,
                                  PCSZ pszPathOrName,
                                  PCSZ pszFilename,
                                  PBYTE pBuf,
                                  ULONG cbBuf);

   APIRET APIENTRY  DosQueryMessageCP(PCHAR pb,
                                      ULONG cb,
                                      PCSZ pszFilename,
                                      PULONG cbBuf);

   APIRET APIENTRY  DosQueryRASInfo(ULONG Index,
                                    PPVOID Addr);

#endif /* INCL_DOSMISC */


/*** Session manager support */

#ifdef INCL_DOSSESMGR

   typedef struct _STARTDATA     /* stdata */
   {
      USHORT  Length;
      USHORT  Related;
      USHORT  FgBg;
      USHORT  TraceOpt;
      PSZ     PgmTitle;
      PSZ     PgmName;
      PBYTE   PgmInputs;
      PBYTE   TermQ;
      PBYTE   Environment;
      USHORT  InheritOpt;
      USHORT  SessionType;
      PSZ     IconFile;
      ULONG   PgmHandle;
      USHORT  PgmControl;
      USHORT  InitXPos;
      USHORT  InitYPos;
      USHORT  InitXSize;
      USHORT  InitYSize;
      USHORT  Reserved;
      PSZ     ObjectBuffer;
      ULONG   ObjectBuffLen;
   } STARTDATA;
   typedef STARTDATA *PSTARTDATA;

   #define SSF_RELATED_INDEPENDENT 0
   #define SSF_RELATED_CHILD       1

   #define SSF_FGBG_FORE           0
   #define SSF_FGBG_BACK           1

   #define SSF_TRACEOPT_NONE       0
   #define SSF_TRACEOPT_TRACE      1
   #define SSF_TRACEOPT_TRACEALL   2

   #define SSF_INHERTOPT_SHELL     0
   #define SSF_INHERTOPT_PARENT    1

   /* note that these types are identical to those in pmshl.h for PROG_* */
   #define SSF_TYPE_DEFAULT        0
   #define SSF_TYPE_FULLSCREEN     1
   #define SSF_TYPE_WINDOWABLEVIO  2
   #define SSF_TYPE_PM             3
   #define SSF_TYPE_VDM            4
   #define SSF_TYPE_GROUP          5
   #define SSF_TYPE_DLL            6
   #define SSF_TYPE_WINDOWEDVDM    7
   #define SSF_TYPE_PDD            8
   #define SSF_TYPE_VDD            9

   /* note that these flags are identical to those in pmshl.h for SHE_* */
   #define SSF_CONTROL_VISIBLE     0x0000
   #define SSF_CONTROL_INVISIBLE   0x0001
   #define SSF_CONTROL_MAXIMIZE    0x0002
   #define SSF_CONTROL_MINIMIZE    0x0004
   #define SSF_CONTROL_NOAUTOCLOSE 0x0008
   #define SSF_CONTROL_SETPOS      0x8000

   typedef struct _STATUSDATA   /* stsdata */
   {
      USHORT Length;
      USHORT SelectInd;
      USHORT BondInd;
   } STATUSDATA;
   typedef STATUSDATA *PSTATUSDATA;

   /* SelectInd and BondInd paramater values for DosSetSession */
   #define SET_SESSION_UNCHANGED      0
   #define SET_SESSION_SELECTABLE     1
   #define SET_SESSION_NON_SELECTABLE 2
   #define SET_SESSION_BOND           1
   #define SET_SESSION_NO_BOND        2

   /* TargetOption (scope) parameter values for DosStopSession */
   #define STOP_SESSION_SPECIFIED     0
   #define STOP_SESSION_ALL           1



   #define DosQAppType     DosQueryAppType

   APIRET APIENTRY  DosStartSession(PSTARTDATA psd,
                                    PULONG pidSession,
                                    PPID ppid);

   APIRET APIENTRY  DosSetSession(ULONG idSession,
                                  PSTATUSDATA psd);

   APIRET APIENTRY  DosSelectSession(ULONG idSession);

   APIRET APIENTRY  DosStopSession(ULONG scope,
                                   ULONG idSession);

   APIRET APIENTRY DosQueryAppType(PCSZ pszName,
                                   PULONG pFlags);

#endif /* INCL_DOSSESMGR */



#if (defined(INCL_DOSSESMGR) || defined(INCL_DOSFILEMGR))

   /* AppType returned in by DosQueryAppType in pFlags as follows          */
   #define FAPPTYP_NOTSPEC         0x0000
   #define FAPPTYP_NOTWINDOWCOMPAT 0x0001
   #define FAPPTYP_WINDOWCOMPAT    0x0002
   #define FAPPTYP_WINDOWAPI       0x0003
   #define FAPPTYP_BOUND           0x0008
   #define FAPPTYP_DLL             0x0010
   #define FAPPTYP_DOS             0x0020
   #define FAPPTYP_PHYSDRV         0x0040  /* physical device driver       */
   #define FAPPTYP_VIRTDRV         0x0080  /* virtual device driver        */
   #define FAPPTYP_PROTDLL         0x0100  /* 'protected memory' dll       */
   #define FAPPTYP_WINDOWSREAL     0x0200  /* Windows real mode app        */
   #define FAPPTYP_WINDOWSPROT     0x0400  /* Windows protect mode app     */
   #define FAPPTYP_WINDOWSPROT31   0x1000  /* Windows 3.1 protect mode app */
   #define FAPPTYP_32BIT           0x4000
   #define FAPPTYP_EXETYPE         FAPPTYP_WINDOWAPI

   #define FAPPTYP_RESERVED        ~(FAPPTYP_WINDOWAPI | FAPPTYP_BOUND | FAPPTYP_DLL | FAPPTYP_DOS | FAPPTYP_PHYSDRV | FAPPTYP_VIRTDRV | FAPPTYP_PROTDLL | FAPPTYP_32BIT)

   #ifdef INCL_DOSFILEMGR

      #define EAT_APPTYP_PMAPI        0x00            /* Uses PM API */
      #define EAT_APPTYP_DOS          0x01            /* DOS APP */
      #define EAT_APPTYP_PMW          0x02            /* Window compatible */
      #define EAT_APPTYP_NOPMW        0x03            /* Not Window compatible */
      #define EAT_APPTYP_EXETYPE      0x03            /* EXE type mask */
      #define EAT_APPTYP_RESERVED     ~(EAT_APPTYP_EXETYPE)

   #endif /* INCL_DOSFILEMGR */

#endif /* INCL_DOSSESMGR || INCL_DOSFILEMGR */




/*** Device support */

#ifdef INCL_DOSDEVICES

   #define DosDevIOCtl2    DosDevIOCtl

   APIRET APIENTRY  DosDevConfig(PVOID pdevinfo,
                                 ULONG item);

   #define DEVINFO_PRINTER         0       /* Number of printers attached */
   #define DEVINFO_RS232           1       /* Number of RS232 ports */
   #define DEVINFO_FLOPPY          2       /* Number of diskette drives */
   #define DEVINFO_COPROCESSOR     3       /* Presence of math coprocessor */
   #define DEVINFO_SUBMODEL        4       /* PC Submodel Type */
   #define DEVINFO_MODEL           5       /* PC Model Type */
   #define DEVINFO_ADAPTER         6       /* Primary display adapter type */

   APIRET APIENTRY  DosDevIOCtl(HFILE hDevice,
                                ULONG category,
                                ULONG function,
                                PVOID pParams,
                                ULONG cbParmLenMax,
                                PULONG pcbParmLen,
                                PVOID pData,
                                ULONG cbDataLenMax,
                                PULONG pcbDataLen);


   APIRET APIENTRY  DosPhysicalDisk(ULONG function,
                                    PVOID pBuf,
                                    ULONG cbBuf,
                                    PVOID pParams,
                                    ULONG cbParams);

   #define INFO_COUNT_PARTITIONABLE_DISKS  1       /* # of partitionable disks */
   #define INFO_GETIOCTLHANDLE             2       /* Obtain handle            */
   #define INFO_FREEIOCTLHANDLE            3       /* Release handle           */

#endif /* INCL_DOSDEVICES */


/*** DosNamedPipes API Support */

#ifdef INCL_DOSNMPIPES

   /*** Data structures used with named pipes ***/

   typedef LHANDLE HPIPE;     /* hp */
   typedef HPIPE   *PHPIPE;

   typedef struct _AVAILDATA              /* AVAILDATA */
   {
      USHORT      cbpipe;            /* bytes left in the pipe */
      USHORT      cbmessage;         /* bytes left in the current message */
   } AVAILDATA;
   typedef AVAILDATA *PAVAILDATA;

   typedef struct _PIPEINFO               /* nmpinf */
   {
      USHORT cbOut;                  /* length of outgoing I/O buffer */
      USHORT cbIn;                   /* length of incoming I/O buffer */
      BYTE   cbMaxInst;              /* maximum number of instances   */
      BYTE   cbCurInst;              /* current number of instances   */
      BYTE   cbName;                 /* length of pipe name           */
      CHAR   szName[1];              /* start of name                 */
   } PIPEINFO;
   typedef PIPEINFO  *PPIPEINFO;

   typedef struct _PIPESEMSTATE    /* nmpsmst */
   {
      BYTE   fStatus;         /* type of record, 0 = EOI, 1 = read ok, */
                              /* 2 = write ok, 3 = pipe closed         */
      BYTE   fFlag;           /* additional info, 01 = waiting thread  */
      USHORT usKey;           /* user's key value                      */
      USHORT usAvail;         /* available data/space if status = 1/2  */
   } PIPESEMSTATE;
   typedef PIPESEMSTATE *PPIPESEMSTATE;

   #define NP_INDEFINITE_WAIT      -1
   #define NP_DEFAULT_WAIT         0L

   /* DosPeekNmPipe() pipe states */

   #define NP_STATE_DISCONNECTED   0x0001
   #define NP_STATE_LISTENING      0x0002
   #define NP_STATE_CONNECTED      0x0003
   #define NP_STATE_CLOSING        0x0004

   /* DosCreateNPipe open modes */

   #define NP_ACCESS_INBOUND       0x0000
   #define NP_ACCESS_OUTBOUND      0x0001
   #define NP_ACCESS_DUPLEX        0x0002
   #define NP_INHERIT              0x0000
   #define NP_NOINHERIT            0x0080
   #define NP_WRITEBEHIND          0x0000
   #define NP_NOWRITEBEHIND        0x4000

   /* DosCreateNPipe and DosQueryNPHState state */

   #define NP_READMODE_BYTE        0x0000
   #define NP_READMODE_MESSAGE     0x0100
   #define NP_TYPE_BYTE            0x0000
   #define NP_TYPE_MESSAGE         0x0400
   #define NP_END_CLIENT           0x0000
   #define NP_END_SERVER           0x4000
   #define NP_WAIT                 0x0000
   #define NP_NOWAIT               0x8000
   #define NP_UNLIMITED_INSTANCES  0x00FF


   APIRET APIENTRY  DosCallNPipe(PCSZ pszName,
                                 PVOID pInbuf,
                                 ULONG cbIn,
                                 PVOID pOutbuf,
                                 ULONG cbOut,
                                 PULONG pcbActual,
                                 ULONG msec);

   APIRET APIENTRY  DosConnectNPipe(HPIPE hpipe);

   APIRET APIENTRY  DosDisConnectNPipe(HPIPE hpipe);

   APIRET APIENTRY  DosCreateNPipe(PCSZ pszName,
                                   PHPIPE pHpipe,
                                   ULONG openmode,
                                   ULONG pipemode,
                                   ULONG cbInbuf,
                                   ULONG cbOutbuf,
                                   ULONG msec);

   APIRET APIENTRY  DosPeekNPipe(HPIPE hpipe,
                                 PVOID pBuf,
                                 ULONG cbBuf,
                                 PULONG pcbActual,
                                 PAVAILDATA pAvail,
                                 PULONG pState);

   APIRET APIENTRY  DosQueryNPHState(HPIPE hpipe,
                                     PULONG pState);

   APIRET APIENTRY  DosQueryNPipeInfo(HPIPE hpipe,
                                      ULONG infolevel,
                                      PVOID pBuf,
                                      ULONG cbBuf);

   APIRET APIENTRY  DosQueryNPipeSemState(HSEM hsem,
                                          PPIPESEMSTATE pnpss,
                                          ULONG cbBuf);

   APIRET APIENTRY  DosRawReadNPipe(PCSZ pszName,
                                    ULONG cb,
                                    PULONG pLen,
                                    PVOID pBuf);

   APIRET APIENTRY  DosRawWriteNPipe(PCSZ pszName,
                                     ULONG cb);

   APIRET APIENTRY  DosSetNPHState(HPIPE hpipe,
                                   ULONG state);

   APIRET APIENTRY  DosSetNPipeSem(HPIPE hpipe,
                                   HSEM hsem,
                                   ULONG key);

   APIRET APIENTRY  DosTransactNPipe(HPIPE hpipe,
                                     PVOID pOutbuf,
                                     ULONG cbOut,
                                     PVOID pInbuf,
                                     ULONG cbIn,
                                     PULONG pcbRead);

   APIRET APIENTRY  DosWaitNPipe(PCSZ pszName,
                                 ULONG msec);

   /* values in fStatus */
   #define NPSS_EOI                   0     /* End Of Information    */
   #define NPSS_RDATA                 1     /* read data available   */
   #define NPSS_WSPACE                2     /* write space available */
   #define NPSS_CLOSE                 3     /* pipe in CLOSING state */

   /* values in npss_flag */
   #define NPSS_WAIT                  0x01  /* waiting thread on end of pipe */

   /* defined bits in pipe mode */
   #define NP_NBLK                    0x8000 /* non-blocking read/write */
   #define NP_SERVER                  0x4000 /* set if server end       */
   #define NP_WMESG                   0x0400 /* write messages          */
   #define NP_RMESG                   0x0100 /* read as messages        */
   #define NP_ICOUNT                  0x00FF /* instance count field    */


   /*Named pipes may be in one of several states depending on the actions
   * that have been taken on it by the server end and client end.  The
   * following state/action table summarizes the valid state transitions:
   *
   * Current state           Action                  Next state
   *
   *  <none>             server DosMakeNmPipe        DISCONNECTED
   *  DISCONNECTED       server connect              LISTENING
   *  LISTENING          client open                 CONNECTED
   *  CONNECTED          server disconn              DISCONNECTED
   *  CONNECTED          client close                CLOSING
   *  CLOSING            server disconn              DISCONNECTED
   *  CONNECTED          server close                CLOSING
   *  <any other>        server close                <pipe deallocated>
   *
   * If a server disconnects his end of the pipe, the client end will enter a
   * special state in which any future operations (except close) on the file
   * descriptor associated with the pipe will return an error.
   */

   /*
   *      Values for named pipe state
   */

   #define NP_DISCONNECTED       1         /* after pipe creation or Disconnect */
   #define NP_LISTENING          2         /* after DosNmPipeConnect            */
   #define NP_CONNECTED          3         /* after Client open                 */
   #define NP_CLOSING            4         /* after Client or Server close      */


#endif /* INCL_DOSNMPIPES */



/*** DosProfile API support */

#ifdef INCL_DOSPROFILE

   /*** Perfview API support */

   APIRET APIENTRY DosTmrQueryFreq(PULONG pulTmrFreq);

   APIRET APIENTRY DosTmrQueryTime(PQWORD pqwTmrTime);

   APIRET APIENTRY DosRegisterPerfCtrs(PBYTE pbDataBlk,
                                       PBYTE pbTextBlk,
                                       ULONG flFlags);

   /* DosProfile ordinal number */

   #define PROF_ORDINAL        133

   /* DosProfile usType */

   #define PROF_SYSTEM           0
   #define PROF_USER             1
   #define PROF_USEDD            2
   #define PROF_KERNEL           4
   #define PROF_VERBOSE          8
   #define PROF_ENABLE          16

   /* DosProfile usFunc */

   #define PROF_ALLOC            0
   #define PROF_CLEAR            1
   #define PROF_ON               2
   #define PROF_OFF              3
   #define PROF_DUMP             4
   #define PROF_FREE             5

   /* DosProfile tic count granularity (DWORD) */

   #define PROF_SHIFT            2

   /* DosProfile module name string length */

   #define PROF_MOD_NAME_SIZE   10

   /* DosProfile error code for end of data */

   #define PROF_END_OF_DATA     13

#endif /* INCL_DOSPROFILE */



/* Virtual DOS Machine API support */
#ifdef INCL_DOSMVDM

   typedef LHANDLE   HVDD;     /* hvdd */
   typedef HVDD     *PHVDD;    /* phvdd */

   APIRET APIENTRY  DosOpenVDD(PCSZ pszVDD,
                               PHVDD phvdd);

   APIRET APIENTRY  DosRequestVDD(HVDD hvdd,
                                  SGID sgid,
                                  ULONG cmd,
                                  ULONG cbInput,
                                  PVOID pInput,
                                  ULONG cbOutput,
                                  PVOID pOutput);

   APIRET APIENTRY  DosCloseVDD(HVDD hvdd);

   APIRET APIENTRY  DosQueryDOSProperty(SGID sgid,
                                        PCSZ pszName,
                                        ULONG cb,
                                        PCSZ pch);

   APIRET APIENTRY  DosSetDOSProperty(SGID sgid,
                                      PCSZ pszName,
                                      ULONG cb,
                                      PCSZ pch);
#endif /* INCL_DOSMVDM */


#ifdef INCL_BDCALLS

   #include "bdcalls.h"

#endif /*INCL_BDCALLS */

#endif /* __BSEDOS__ */

/* NOINC */
#ifdef __cplusplus
        }
#endif
   #pragma info( none )
   #ifndef __CHKHDR__
      #pragma info( restore )
   #endif
   #pragma info( restore )
/* INC */

/**************************** end of file **********************************/
