/*++ Copyright (c) 1991 Microsoft Corporation Module Name: vrnmpipe.h Abstract: Prototypes, definitions and structures for VdmRedir named pipe handlers Author: Richard L Firth (rfirth) 10-Sep-1991 Revision History: 10-Sep-1991 RFirth Created --*/ // // manifests // #define MAXIMUM_ASYNC_PIPES 32 // // async named pipe request types // #define ANP_READ 0x86 #define ANP_READ2 0x90 #define ANP_WRITE 0x8f #define ANP_WRITE2 0x91 // // VDM Named Pipe support routines. Prototypes // VOID VrGetNamedPipeInfo( VOID ); VOID VrGetNamedPipeHandleState( VOID ); VOID VrSetNamedPipeHandleState( VOID ); VOID VrPeekNamedPipe( VOID ); VOID VrTransactNamedPipe( VOID ); VOID VrCallNamedPipe( VOID ); VOID VrWaitNamedPipe( VOID ); VOID VrNetHandleGetInfo( VOID ); VOID VrNetHandleSetInfo( VOID ); VOID VrReadWriteAsyncNmPipe( VOID ); BOOLEAN VrNmPipeInterrupt( VOID ); VOID VrTerminateNamedPipes( IN WORD DosPdb ); // // VDM open/close and read/write intercept routines // #ifdef VDMREDIR_DLL BOOL VrAddOpenNamedPipeInfo( IN HANDLE Handle, IN LPSTR lpFileName ); BOOL VrRemoveOpenNamedPipeInfo( IN HANDLE Handle ); BOOL VrReadNamedPipe( IN HANDLE Handle, IN LPBYTE Buffer, IN DWORD Buflen, OUT LPDWORD BytesRead, OUT LPDWORD Error ); BOOL VrWriteNamedPipe( IN HANDLE Handle, IN LPBYTE Buffer, IN DWORD Buflen, OUT LPDWORD BytesWritten ); VOID VrCancelPipeIo( IN DWORD Thread ); #else BOOL (*VrAddOpenNamedPipeInfo)( IN HANDLE Handle, IN LPSTR lpFileName ); BOOL (*VrRemoveOpenNamedPipeInfo)( IN HANDLE Handle ); BOOL (*VrReadNamedPipe)( IN HANDLE Handle, IN LPBYTE Buffer, IN DWORD Buflen, OUT LPDWORD BytesRead, OUT LPDWORD Error ); BOOL (*VrWriteNamedPipe)( IN HANDLE Handle, IN LPBYTE Buffer, IN DWORD Buflen, OUT LPDWORD BytesWritten ); VOID (*VrCancelPipeIo)( IN DWORD Thread ); #endif // // VDM pipe name to NT pipe name helper routines // #ifdef VDMREDIR_DLL BOOL VrIsNamedPipeName( IN LPSTR Name ); BOOL VrIsNamedPipeHandle( IN HANDLE Handle ); LPSTR VrConvertLocalNtPipeName( OUT LPSTR Buffer OPTIONAL, IN LPSTR Name ); #else BOOL (*VrIsNamedPipeName)( IN LPSTR Name ); BOOL (*VrIsNamedPipeHandle)( IN HANDLE Handle ); LPSTR (*VrConvertLocalNtPipeName)( OUT LPSTR Buffer OPTIONAL, IN LPSTR Name ); #endif // // structures // //typedef struct { // PDOSNMPINFO Next; // pointer to next info structure in list // WORD DosPdb; // WORD Handle16; // HANDLE Handle32; // handle returned from CreateFile call // DWORD NameLength; // length of ASCIZ pipe name // LPSTR Name; // ASCIZ pipe name // DWORD Instances; // current instances //} DOSNMPINFO, *PDOSNMPINFO; // // OPEN_NAMED_PIPE_INFO - this structure contains information recorded when a // named pipe is opened on behalf of the VDM. DosQNmPipeInfo wants the name // of the pipe // typedef struct _OPEN_NAMED_PIPE_INFO* POPEN_NAMED_PIPE_INFO; typedef struct _OPEN_NAMED_PIPE_INFO { POPEN_NAMED_PIPE_INFO Next; // linked list HANDLE Handle; // open named pipe handle DWORD NameLength; // including terminating 0 WORD DosPdb; // the process which owns this named pipe CHAR Name[2]; // full pipe name } OPEN_NAMED_PIPE_INFO; // // DOS_ASYNC_NAMED_PIPE_INFO - in this structure we keep all the information // required to complete an asynchronous named pipe operation // typedef struct _DOS_ASYNC_NAMED_PIPE_INFO { struct _DOS_ASYNC_NAMED_PIPE_INFO* Next; // linked list OVERLAPPED Overlapped; // contains 32-bit event handle BOOL Type2; // TRUE if request is Read2 or Write2 BOOL Completed; // TRUE if this request has completed HANDLE Handle; // 32-bit named pipe handle DWORD Buffer; // 16:16 address of buffer DWORD BytesTransferred; // actual number of bytes read/written LPWORD pBytesTransferred; // flat-32 pointer to returned read/write count in VDM LPWORD pErrorCode; // flat-32 pointer to returned error code in VDM DWORD ANR; // 16:16 address of ANR DWORD Semaphore; // 16:16 address of 'semaphore' in VDM #if DBG DWORD RequestType; #endif } DOS_ASYNC_NAMED_PIPE_INFO, *PDOS_ASYNC_NAMED_PIPE_INFO; // // DOS_CALL_NAMED_PIPE_STRUCT - this structure is created and handed to the DOS // CallNmPipe routine because there is too much information to get into a 286's // registers. This structure should be in apistruc.h, but it aint // //#include #pragma pack(1) typedef struct { DWORD Timeout; // Time to wait for pipe to become available LPWORD lpBytesRead; // pointer to returned bytes read WORD nOutBufferLen; // size of send data LPBYTE lpOutBuffer; // pointer to send data WORD nInBufferLen; // size of receive buffer LPBYTE lpInBuffer; // pointer to receive buffer LPSTR lpPipeName; // pointer to pipe name } DOS_CALL_NAMED_PIPE_STRUCT, *PDOS_CALL_NAMED_PIPE_STRUCT; //#include #pragma pack() // // DOS_ASYNC_NAMED_PIPE_STRUCT - as with the above, this structure is used // to pass all the info to DosReadAsyncNmPipe which won't fit into registers. // Used for read and write operations. Should be defined in apistruc.h // //#include #pragma pack(1) typedef struct { LPWORD lpBytesRead; // pointer to returned bytes read/written WORD BufferLength; // size of caller's buffer LPBYTE lpBuffer; // pointer to caller's buffer LPWORD lpErrorCode; // pointer to returned error code LPVOID lpANR; // pointer to Asynchronous Notification Routine WORD PipeHandle; // named pipe handle LPBYTE lpSemaphore; // pointer to caller's 'semaphore' } DOS_ASYNC_NAMED_PIPE_STRUCT, *PDOS_ASYNC_NAMED_PIPE_STRUCT; //#include #pragma pack() // // The following selectively copied from BSEDOS.H and other Lanman include // files // /*** Data structures and equates used with named pipes ***/ //#include #pragma pack(1) typedef struct _PIPEINFO { /* nmpinf */ USHORT cbOut; USHORT cbIn; BYTE cbMaxInst; BYTE cbCurInst; BYTE cbName; CHAR szName[1]; } PIPEINFO; //#include #pragma pack() typedef PIPEINFO FAR *PPIPEINFO; /* 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 * * 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 * server close * * 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 */ /* DosMakeNmPipe 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 /* DosMakeNmPipe and DosQNmPHandState 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 typedef struct _AVAILDATA { /* PeekNMPipe Bytes Available record */ USHORT cbpipe; /* bytes left in the pipe */ USHORT cbmessage; /* bytes left in current message */ } AVAILDATA; typedef AVAILDATA FAR *PAVAILDATA; // // handle info level 1 - this is different to the structure in lmchdev.h // //#include #pragma pack(1) typedef struct _VDM_HANDLE_INFO_1 { ULONG CharTime; USHORT CharCount; } VDM_HANDLE_INFO_1, *LPVDM_HANDLE_INFO_1; #pragma pack() //#include