==== FS_NMPIPE ====
**Purpose**
Perform a special purpose named pipe operation remotely.   
**Calling Sequence**
int far pascal FS_NMPIPE(psffsi, psffsd, OpType, pOpRec, pData, pName)
struct sffsi far * psffsi;
struct sffsd far * psffsd;
unsigned short OpType;
union npoper far * pOpRec;
char far * pData;
char far * pName;
  
**Where**
//psffsi// is a pointer to the file-system-independent portion of an open file instance.   
//psffsd// is a pointer to the file-system-dependent portion of an open file instance.   
//OpType// is the operation to be performed. This parameter has the following values:   
|NMP_GetPHandState    |0x21 |
|NMP_SetPHandState     |0x01 |
|NMP_PipeQInfo             |0x22 |
|NMP_PeekPipe             |0x23 |
|NMP_ConnectPipe        |0x24 |
|NMP_DisconnectPipe    |0x25 |
|NMP_TransactPipe        |0x26 |
|NMP_ReadRaw             |0x11 |
|NMP_WriteRaw             |0x31 |
|NMP_WaitPipe              |0x53 |
|NMP_CallPipe              |0x54 |
|NMP_QNmPipeSemState  |0x58 |
//pOpRec// is the data record which varies depending on the value of //OpType//. The first parameter in each structure encodes the length of the parameter block. The second parameter, if non-zero, indicates that the pData parameter is supplied and gives its length. The following record formats are used:   
union npoper {
    struct phs_param phs;
    struct npi_param npi;
    struct npr_param npr;
    struct npw_param npw;
    struct npq_param npq;
    struct npx_param npx;
    struct npp_param npp;
    struct npt_param npt;
    struct qnps_param qnps;
    struct npc_param npc;
    struct npd_param npd;
};
/* Get/SetPhandState parameter block */
struct phs_param {
    short phs_len;
    short phs_dlen;
    short phs_pmode; /* pipe mode set or returned */
};
/* DosQNmPipeInfo parameter block */
struct npi_param {
    short npi_len;
    short npi_dlen;
    short npi_level; /* information level desired */
};
/* DosRawReadNmPipe parameters */
/* data is buffer addr         */
struct npr_param {
    short npr_len;
    short npr_dlen;
    short npr_nbyt; /* number of bytes read */
};
/* DosRawWriteNmPipe parameters */
/* data is buffer addr          */
struct npw_param {
    short npw_len;
    short npw_dlen;
    short npw_nbyt; /* number of bytes written */
};
/* NPipeWait parameters */
struct npq_param {
    short npq_len;
    short npq_dlen;
    long npq_timeo;  /* time-out in milliseconds */
    short npq_prio;  /* priority of caller       */
};
/* DosCallNmPipe parameters */
/* data is in-buffer addr   */
struct npx_param {
    short npx_len;
    unsigned short npx_ilen;  /* length of in-buffer      */
    char far * npx_obuf;      /* pointer to out-buffer    */
    unsigned short npx_ilen;  /* length of out-buffer     */
    unsigned short npx_nbyt;  /* number of bytes read     */
    long npx_timeo;           /* time-out in milliseconds */
};
/* PeekPipe parameters, data is buffer addr */
struct npp_param {
    short npp_len;
    unsigned short npp_dlen;
    unsigned short npp_nbyt;   /* number of bytes read      */
    unsigned short npp_av10;   /* bytes left in pipe        */
    unsigned short npp_av11;   /* bytes left in current msg */
    unsigned short npp_state;  /* pipe state                */
};
/* DosTransactNmPipe parameters */
/* data is in-buffer addr       */
struct npt_param {
    short npt_len;
    unsigned short npt_ilen;  /* length of in-buffer   */
    char far * npt_obuf;      /* pointer to out-buffer */
    unsigned short npt_olen;  /* length of out-buffer  */
    unsigned short npt_nbyt;  /* number of bytes read  */
};
/* QNmPipeSemState parameter block */ /* data is user data buffer */
struct qnps_param {
    unsigned short qnps_len;  /* length of parameter block      */
    unsigned short qnps_dlen;  /* length of supplied data block */
    long qnps_semh;            /* system semaphore handle       */
    unsigned short qnps_nbyt;  /* number of bytes returned      */
};
/* ConnectPipe parameter block, no data block */
struct npc_param {
    unsigned short npc_len;   /* length of parameter block */
    unsigned short npc_dlen;  /* length of data block      */
};
/* DisconnectPipe parameter block, no data block */
struct npd_param {
    unsigned short npd_len;   /* length of parameter block */
    unsigned short npd_dlen;  /* length of data block      */
};
//pData// is a pointer to a user data for operations which require it. When the pointer is supplied, its length will be given by the second element of the //pOpRec// structure.   
//pName// is a pointer to a remote pipe name. Supplied only for //NMP_WAITPIPE// and //NMP_CALLPIPE// operations. For these two operations only, the psffsi and psffsd parameters have no significance. 
**Remarks**
This entry point is for support of special remote named pipe operations. Not all pointer parameters are used for all operations. In cases where a particular pointer has no significance, it will be NULL.   
This entry point will be called only for the UNC FSD. Non-UNC FSDs are required to have this entry point, but should return NOT SUPPORTED if called.