windows-nt/Source/XPSP1/NT/base/subsys/posix/inc/psxmsg.h
2020-09-26 16:20:57 +08:00

1005 lines
22 KiB
C

/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
psxmsg.h
Abstract:
This module contains the message format used to communicate transmit
POSIX system services between PSX and its clients.
Author:
Mark Lucovsky (markl) 14-Mar-1989
Revision History:
--*/
#ifndef _PSXMSG_
#define _PSXMSG_
#include <nt.h>
#include <types.h>
#include <signal.h>
#include <utime.h>
#include <sys\times.h>
//
// Define debugging flag as false if not defined already.
//
#ifndef DBG
#define DBG 0
#endif
//
// Define IF_DEBUG macro that can be used to enable debugging code that is
// optimized out if the debugging flag is false.
//
#if DBG
#define IF_DEBUG if (TRUE)
#else
#define IF_DEBUG if (FALSE)
#endif
//
// The following describes the connection information used for
// posix api connections
//
typedef
VOID
(*PSIGNALDELIVERER) (
IN PCONTEXT Context,
IN sigset_t PreviousBlockMask,
IN int Signal,
IN _handler Handler
);
typedef
VOID
(*PNULLAPICALLER) (
IN PCONTEXT Context
);
//
// SubSystemData field in PEB points to the following data structure for
// POSIX applications. Initial contents are passed back via the connection
// information structure when the client process connects to the POSIX
// Emulation Subsystem server
//
typedef struct _PEB_PSX_DATA {
ULONG Length;
PVOID ClientStartAddress;
HANDLE SessionPortHandle;
PVOID SessionDataBaseAddress;
} PEB_PSX_DATA, *PPEB_PSX_DATA;
typedef struct _PSX_DIRECTORY_PREFIX {
STRING NtCurrentWorkingDirectory;
STRING PsxCurrentWorkingDirectory;
STRING PsxRoot;
} PSX_DIRECTORY_PREFIX, *PPSX_DIRECTORY_PREFIX;
typedef struct _PSX_API_CONNECTINFO {
PSIGNALDELIVERER SignalDeliverer;
PNULLAPICALLER NullApiCaller;
PPSX_DIRECTORY_PREFIX DirectoryPrefix;
PEB_PSX_DATA InitialPebPsxData;
ULONG SessionUniqueId;
} PSX_API_CONNECTINFO, *PPSX_API_CONNECTINFO;
#define PSXSRV_VERSION 0x100390
//
// This is only defined here instead of the obvious place because the
// server needs to copy it from one process to another during exec.
//
typedef struct _CLIENT_OPEN_FILE {
BOOLEAN Open;
BOOLEAN FdIsConsole;
ULONG Flags; // descriptor flags
} CLIENT_OPEN_FILE, *PCLIENT_OPEN_FILE;
//
// These Constants define the Posix Api Numbers
// NOTE that the initialization of the ApiDispatch table in server\apiloop.c
// matches this exactly.
//
typedef enum _PSXAPINUMBER {
PsxForkApi,
PsxExecApi,
PsxWaitPidApi,
PsxExitApi,
PsxKillApi,
PsxSigActionApi,
PsxSigProcMaskApi,
PsxSigPendingApi,
PsxSigSuspendApi,
PsxAlarmApi,
PsxGetIdsApi,
PsxSetUidApi,
PsxSetGidApi,
PsxGetGroupsApi,
PsxGetLoginApi,
PsxCUserIdApi,
PsxSetSidApi,
PsxSetPGroupIdApi,
PsxUnameApi,
PsxTimeApi,
PsxGetProcessTimesApi,
PsxTtyNameApi,
PsxIsattyApi,
PsxSysconfApi,
PsxOpenApi,
PsxUmaskApi,
PsxLinkApi,
PsxMkDirApi,
PsxMkFifoApi,
PsxRmDirApi,
PsxRenameApi,
PsxStatApi,
PsxFStatApi,
PsxAccessApi,
PsxChmodApi,
PsxChownApi,
PsxUtimeApi,
PsxPathConfApi,
PsxFPathConfApi,
PsxPipeApi,
PsxDupApi,
PsxDup2Api,
PsxCloseApi,
PsxReadApi,
PsxWriteApi,
PsxFcntlApi,
PsxLseekApi,
PsxTcGetAttrApi,
PsxTcSetAttrApi,
PsxTcSendBreakApi,
PsxTcDrainApi,
PsxTcFlushApi,
PsxTcFlowApi,
PsxTcGetPGrpApi,
PsxTcSetPGrpApi,
PsxGetPwUidApi,
PsxGetPwNamApi,
PsxGetGrGidApi,
PsxGetGrNamApi,
PsxUnlinkApi,
PsxReadDirApi,
PsxFtruncateApi,
PsxNullApi,
#ifdef PSX_SOCKET
PsxSocketApi,
PsxAcceptApi,
PsxBindApi,
PsxConnectApi,
PsxGetPeerNameApi,
PsxGetSockNameApi,
PsxGetSockOptApi,
PsxListenApi,
PsxRecvApi,
PsxRecvFromApi,
PsxSendApi,
PsxSendToApi,
PsxSetSockOptApi,
PsxShutdownApi,
#endif // PSX_SOCKET
PsxMaxApiNumber
} PSXAPINUMBER;
//
// Each of the following structures define the layout of the Arguments portion
// of the PSX_API_MSG that the Api expects.
//
//
// PsxForkApi
//
//
typedef struct _PSX_FORK_MSG {
IN PVOID StackBase;
IN PVOID StackLimit;
IN PVOID StackAllocationBase;
#if defined(_IA64_)
IN PVOID BStoreLimit;
#endif
} PSX_FORK_MSG, *PPSX_FORK_MSG;
//
// PsxExecApi
//
typedef struct _PSX_EXEC_MSG {
IN UNICODE_STRING Path;
IN PCHAR Args; // args + environ, in view mem
} PSX_EXEC_MSG, *PPSX_EXEC_MSG;
//
// PsxWaitPidApi
//
typedef struct _PSX_WAITPID_MSG {
IN pid_t Pid;
OUT ULONG StatLocValue;
IN ULONG Options;
} PSX_WAITPID_MSG, *PPSX_WAITPID_MSG;
//
// PsxExitApi
//
typedef struct _PSX_EXIT_MSG {
IN ULONG ExitStatus;
} PSX_EXIT_MSG, *PPSX_EXIT_MSG;
//
// PsxKillApi
//
typedef struct _PSX_KILL_MSG {
IN pid_t Pid;
IN ULONG Sig;
} PSX_KILL_MSG, *PPSX_KILL_MSG;
//
// PsxSigActionApi
//
typedef struct _PSX_SIGACTION_MSG {
IN ULONG Sig;
IN struct sigaction *ActSpecified;
IN struct sigaction Act;
IN struct sigaction *OactSpecified;
OUT struct sigaction Oact;
} PSX_SIGACTION_MSG, *PPSX_SIGACTION_MSG;
//
// PsxSigProcMaskApi
//
typedef struct _PSX_SIGPROCMASK_MSG {
IN ULONG How;
IN sigset_t *SetSpecified;
IN sigset_t Set;
OUT sigset_t Oset;
} PSX_SIGPROCMASK_MSG, *PPSX_SIGPROCMASK_MSG;
//
// PsxSigPendingApi
//
typedef struct _PSX_SIGPENDING_MSG {
OUT sigset_t Set;
} PSX_SIGPENDING_MSG, *PPSX_SIGPENDING_MSG;
//
// PsxSigSuspendApi
//
typedef struct _PSX_SIGSUSPEND_MSG {
IN PVOID SigMaskSpecified;
IN sigset_t SigMask;
} PSX_SIGSUSPEND_MSG, *PPSX_SIGSUSPEND_MSG;
//
// PsxAlarmApi
//
typedef struct _PSX_ALARM_MSG {
IN BOOLEAN CancelAlarm;
IN LARGE_INTEGER Seconds;
OUT LARGE_INTEGER PreviousSeconds;
} PSX_ALARM_MSG, *PPSX_ALARM_MSG;
//
// PsxSleepApi
//
typedef struct _PSX_SLEEP_MSG {
IN ULONG Seconds;
OUT LARGE_INTEGER PreviousSeconds;
} PSX_SLEEP_MSG, *PPSX_SLEEP_MSG;
//
// PsxGetIdsApi
//
typedef struct _PSX_GETIDS_MSG {
OUT pid_t Pid;
OUT pid_t ParentPid;
OUT pid_t GroupId;
OUT uid_t RealUid;
OUT uid_t EffectiveUid;
OUT gid_t RealGid;
OUT gid_t EffectiveGid;
} PSX_GETIDS_MSG, *PPSX_GETIDS_MSG;
//
// PsxSetUidApi
//
typedef struct _PSX_SETUID_MSG {
IN uid_t Uid;
} PSX_SETUID_MSG, *PPSX_SETUID_MSG;
//
// PsxSetGidApi
//
typedef struct _PSX_SETGID_MSG {
IN gid_t Gid;
} PSX_SETGID_MSG, *PPSX_SETGID_MSG;
//
// PsxGetLoginApi (USES VIEW MEMORY)
//
typedef struct _PSX_GETLOGIN_MSG {
IN OUT STRING LoginName;
} PSX_GETLOGIN_MSG, *PPSX_GETLOGIN_MSG;
//
// PsxCUserIdApi (USES VIEW MEMORY)
//
typedef struct _PSX_CUSERID_MSG {
IN OUT STRING UserName;
} PSX_CUSERID_MSG, *PPSX_CUSERID_MSG;
//
// PsxSetSidApi
//
// No Arguments
//
//
// PsxSetPGroupIdApi
//
typedef struct _PSX_SETPGROUPID_MSG {
IN pid_t Pid;
IN pid_t Pgid;
} PSX_SETPGROUPID_MSG, *PPSX_SETPGROUPID_MSG;
//
// PsxUnameApi (USES VIEW MEMORY)
//
typedef struct _PSX_UNAME_MSG {
OUT struct utsname *Name;
} PSX_UNAME_MSG, *PPSX_UNAME_MSG;
//
// PsxTimeApi
//
typedef struct _PSX_TIME_MSG {
OUT LARGE_INTEGER Time;
} PSX_TIME_MSG, *PPSX_TIME_MSG;
//
// PsxGetProcessTimesApi
//
typedef struct _PSX_GETPROCESSTIMES_MSG {
OUT struct tms ProcessTimes;
} PSX_GETPROCESSTIMES_MSG, *PPSX_GETPROCESSTIMES_MSG;
//
// PsxTtyNameApi (USES VIEW MEMORY)
//
typedef struct _PSX_TTYNAME_MSG {
IN LONG FileDes;
IN OUT STRING TtyName;
} PSX_TTYNAME_MSG, *PPSX_TTYNAME_MSG;
//
// PsxIsattyApi
//
typedef struct _PSX_ISATTY_MSG {
IN LONG FileDes;
OUT ULONG Command;
} PSX_ISATTY_MSG, *PPSX_ISATTY_MSG;
//
// PsxSysconfApi
//
typedef struct _PSX_SYSCONF_MSG {
IN ULONG Name;
} PSX_SYSCONF_MSG, *PPSX_SYSCONF_MSG;
//
// PsxOpenApi (USES VIEW MEMORY)
//
typedef struct _PSX_OPEN_MSG {
IN UNICODE_STRING Path_U;
IN OUT ULONG Flags; // used as flags on input and output
IN OUT mode_t Mode; // used as handle value on output
} PSX_OPEN_MSG, *PPSX_OPEN_MSG;
//
// PsxUmaskApi
//
typedef struct _PSX_UMASK_MSG {
IN mode_t Cmask;
} PSX_UMASK_MSG, *PPSX_UMASK_MSG;
//
// PsxLinkApi (USES VIEW MEMORY)
//
typedef struct _PSX_LINK_MSG {
IN UNICODE_STRING OldName;
IN UNICODE_STRING NewName;
} PSX_LINK_MSG, *PPSX_LINK_MSG;
//
// PsxMkDirApi (USES VIEW MEMORY)
//
typedef struct _PSX_MKDIR_MSG {
IN UNICODE_STRING Path_U;
IN mode_t Mode;
} PSX_MKDIR_MSG, *PPSX_MKDIR_MSG;
//
// PsxMkFifoApi (USES VIEW MEMORY)
//
typedef struct _PSX_MKFIFO_MSG {
IN UNICODE_STRING Path_U;
IN mode_t Mode;
} PSX_MKFIFO_MSG, *PPSX_MKFIFO_MSG;
//
// PsxRmDirApi (USES VIEW MEMORY)
//
typedef struct _PSX_RMDIR_MSG {
IN UNICODE_STRING Path_U;
} PSX_RMDIR_MSG, *PPSX_RMDIR_MSG;
//
// PsxRenameApi (USES VIEW MEMORY)
//
typedef struct _PSX_RENAME_MSG {
IN UNICODE_STRING OldName;
IN UNICODE_STRING NewName;
} PSX_RENAME_MSG, *PPSX_RENAME_MSG;
//
// PsxStatApi (USES VIEW MEMORY)
//
typedef struct _PSX_STAT_MSG {
IN UNICODE_STRING Path_U;
OUT struct stat *StatBuf;
} PSX_STAT_MSG, *PPSX_STAT_MSG;
//
// PsxFStatApi
//
typedef struct _PSX_FSTAT_MSG {
IN LONG FileDes;
OUT struct stat *StatBuf;
} PSX_FSTAT_MSG, *PPSX_FSTAT_MSG;
//
// PsxAccessApi (USES VIEW MEMORY)
//
typedef struct _PSX_ACCESS_MSG {
IN UNICODE_STRING Path_U;
IN LONG Amode;
} PSX_ACCESS_MSG, *PPSX_ACCESS_MSG;
//
// PsxChmodApi (USES VIEW MEMORY)
//
typedef struct _PSX_CHMOD_MSG {
IN UNICODE_STRING Path_U;
IN mode_t Mode;
} PSX_CHMOD_MSG, *PPSX_CHMOD_MSG;
//
// PsxChownApi (USES VIEW MEMORY)
//
typedef struct _PSX_CHOWN_MSG {
IN UNICODE_STRING Path_U;
IN uid_t Owner;
IN gid_t Group;
} PSX_CHOWN_MSG, *PPSX_CHOWN_MSG;
//
// PsxUtimeApi (USES VIEW MEMORY)
//
typedef struct _PSX_UTIME_MSG {
IN UNICODE_STRING Path_U;
IN struct utimbuf *TimesSpecified;
IN struct utimbuf Times;
} PSX_UTIME_MSG, *PPSX_UTIME_MSG;
//
// PsxPathConfApi (USES VIEW MEMORY)
//
typedef struct _PSX_PATHCONF_MSG {
IN UNICODE_STRING Path;
IN ULONG Name;
} PSX_PATHCONF_MSG, *PPSX_PATHCONF_MSG;
//
// PsxFPathConfApi
//
typedef struct _PSX_FPATHCONF_MSG {
IN LONG FileDes;
IN ULONG Name;
} PSX_FPATHCONF_MSG, *PPSX_FPATHCONF_MSG;
//
// PsxPipeApi
//
typedef struct _PSX_PIPE_MSG {
IN LONG FileDes0;
IN LONG FileDes1;
} PSX_PIPE_MSG, *PPSX_PIPE_MSG;
//
// PsxDupApi
//
typedef struct _PSX_DUP_MSG {
IN LONG FileDes;
} PSX_DUP_MSG, *PPSX_DUP_MSG;
//
// PsxDup2Api
//
typedef struct _PSX_DUP2_MSG {
OUT LONG FileDes;
OUT LONG FileDes2;
} PSX_DUP2_MSG, *PPSX_DUP2_MSG;
//
// PsxCloseApi
//
typedef struct _PSX_CLOSE_MSG {
IN LONG FileDes;
} PSX_CLOSE_MSG, *PPSX_CLOSE_MSG;
//
// PsxReadApi (USES VIEW MEMORY)
//
typedef struct _PSX_READ_MSG {
IN LONG FileDes;
OUT PUCHAR Buf;
IN LONG Nbytes;
ULONG Scratch1;
ULONG Scratch2;
OUT ULONG Command;
} PSX_READ_MSG, *PPSX_READ_MSG;
//
// PsxReadDirApi (USES VIEW MEMORY)
//
typedef struct _PSX_READDIR_MSG {
IN LONG FileDes;
OUT PUCHAR Buf;
IN LONG Nbytes;
IN BOOLEAN RestartScan;
} PSX_READDIR_MSG, *PPSX_READDIR_MSG;
//
// PsxWriteApi (USES VIEW MEMORY)
//
typedef struct _PSX_WRITE_MSG {
IN LONG FileDes;
IN PUCHAR Buf;
IN LONG Nbytes;
ULONG Scratch1;
ULONG Scratch2;
OUT ULONG Command;
} PSX_WRITE_MSG, *PPSX_WRITE_MSG;
//
// Values for READ_MSG.Command and WRITE_MSG.Command
//
#define IO_COMMAND_DONE 0
#define IO_COMMAND_DO_CONSIO 1
//
// PsxFcntlApi
//
typedef struct _PSX_FCNTL_MSG {
IN LONG FileDes;
IN int Command;
IN union {
struct flock *pf;
int i;
} u;
} PSX_FCNTL_MSG, *PPSX_FCNTL_MSG;
//
// PsxLseekApi
//
typedef struct _PSX_LSEEK_MSG {
IN LONG FileDes;
IN LONG Whence;
IN off_t Offset;
} PSX_LSEEK_MSG, *PPSX_LSEEK_MSG;
//
// PsxTcGetAttr
//
typedef struct _PSX_TCGETATTR_MSG {
IN LONG FileDes;
OUT struct termios *Termios;
} PSX_TCGETATTR_MSG, *PPSX_TCGETATTR_MSG;
//
// PsxTcSetAttr
//
typedef struct _PSX_TCSETATTR_MSG {
IN LONG FileDes;
IN LONG OptionalActions;
IN struct termios *Termios;
} PSX_TCSETATTR_MSG, *PPSX_TCSETATTR_MSG;
//
// PsxTcSendBreak
//
typedef struct _PSX_TCSENDBREAK_MSG {
IN LONG FileDes;
IN LONG Duration;
} PSX_TCSENDBREAK_MSG, *PPSX_TCSENDBREAK_MSG;
//
// PsxTcDrain
//
typedef struct _PSX_TCDRAIN_MSG {
IN LONG FileDes;
} PSX_TCDRAIN_MSG, *PPSX_TCDRAIN_MSG;
//
// PsxTcFlush
//
typedef struct _PSX_TCFLUSH_MSG {
IN LONG FileDes;
IN LONG QueueSelector;
} PSX_TCFLUSH_MSG, *PPSX_TCFLUSH_MSG;
//
// PsxTcFlow
//
typedef struct _PSX_TCFLOW_MSG {
IN LONG FileDes;
IN LONG Action;
} PSX_TCFLOW_MSG, *PPSX_TCFLOW_MSG;
//
// PsxTcGetPGrp
//
typedef struct _PSX_TCGETPGRP_MSG {
IN LONG FileDes;
} PSX_TCGETPGRP_MSG, *PPSX_TCGETPGRP_MSG;
//
// PsxTcSetPGrp
//
typedef struct _PSX_TCSETPGRP_MSG {
IN LONG FileDes;
IN pid_t PGrpId;
} PSX_TCSETPGRP_MSG, *PPSX_TCSETPGRP_MSG;
//
// PsxGetPwUid
//
typedef struct _PSX_GETPWUID_MSG {
IN uid_t Uid;
IN struct passwd *PwBuf;
OUT int Length;
} PSX_GETPWUID_MSG, *PPSX_GETPWUID_MSG;
//
// PsxGetPwNam
//
typedef struct _PSX_GETPWNAM_MSG {
IN char *Name;
IN struct passwd *PwBuf;
OUT int Length;
} PSX_GETPWNAM_MSG, *PPSX_GETPWNAM_MSG;
//
// PsxGetGrGid
//
typedef struct _PSX_GETGRGID_MSG {
IN gid_t Gid;
IN struct group *GrBuf;
OUT int Length;
} PSX_GETGRGID_MSG, *PPSX_GETGRGID_MSG;
//
// PsxGetGrNam
//
typedef struct _PSX_GETGRNAM_MSG {
IN char *Name;
IN struct group *GrBuf;
OUT int Length;
} PSX_GETGRNAM_MSG, *PPSX_GETGRNAM_MSG;
//
// PsxGetGroups
//
typedef struct _PSX_GETGROUPS_MSG {
IN int NGroups;
IN gid_t *GroupList;
} PSX_GETGROUPS_MSG, *PPSX_GETGROUPS_MSG;
//
// PsxUnlink
//
typedef struct _PSX_UNLINK_MSG {
IN UNICODE_STRING Path_U;
} PSX_UNLINK_MSG, *PPSX_UNLINK_MSG;
//
// PsxFtruncate
//
typedef struct _PSX_FTRUNCATE_MSG {
IN LONG FileDes;
IN off_t Length;
} PSX_FTRUNCATE_MSG, *PPSX_FTRUNCATE_MSG;
#ifdef PSX_SOCKET
//
// -------- Messages for sockets.
//
//
// PsxSocket
//
typedef struct _PSX_SOCKET_MSG {
IN INT AddressFamily;
IN INT Type;
IN INT Protocol;
} PSX_SOCKET_MSG, *PPSX_SOCKET_MSG;
//
// PsxAccept
//
typedef struct _PSX_ACCEPT_MSG {
IN INT Socket;
IN struct sockaddr *Address;
IN OUT INT AddressLength;
} PSX_ACCEPT_MSG, *PPSX_ACCEPT_MSG;
typedef struct _PSX_BIND_MSG {
IN INT Socket;
IN struct sockaddr *Name;
IN INT NameLength;
} PSX_BIND_MSG, *PPSX_BIND_MSG;
typedef struct _PSX_CONNECT_MSG {
IN INT Socket;
IN struct sockaddr *Name;
IN INT NameLength;
} PSX_CONNECT_MSG, *PPSX_CONNECT_MSG;
typedef struct _PSX_GETPEERNAME_MSG {
IN INT Socket;
IN struct sockaddr *Name;
IN OUT INT NameLength;
} PSX_GETPEERNAME_MSG, *PPSX_GETPEERNAME_MSG;
typedef struct _PSX_GETSOCKNAME_MSG {
IN INT Socket;
IN struct sockaddr *Name;
IN OUT INT NameLength;
} PSX_GETSOCKNAME_MSG, *PPSX_GETSOCKNAME_MSG;
typedef struct _PSX_GETSOCKOPT_MSG {
IN INT Socket;
IN INT Level;
IN INT OptName;
IN PCHAR OptVal;
IN OUT INT OptVal;
} PSX_GETSOCKOPT_MSG, *PPSX_GETSOCKOPT_MSG;
typedef struct _PSX_LISTEN_MSG {
IN INT Socket;
IN INT BackLog;
} PSX_LISTEN_MSG, *PPSX_LISTEN_MSG;
typedef struct _PSX_RECV_MSG {
IN INT Socket;
IN PCHAR Buffer;
IN INT Length;
IN INT Flags;
} PSX_RECV_MSG, *PPSX_RECV_MSG;
typedef struct _PSX_RECVFROM_MSG {
IN INT Socket;
IN PCHAR Buffer;
IN INT Length;
IN INT Flags;
IN struct sockaddr *From;
IN INT FromLength;
} PSX_RECVFROM_MSG, *PPSX_RECVFROM_MSG;
typdef struct _PSX_SEND_MSG {
IN INT Socket;
IN PCHAR Buffer;
IN INT Length;
IN INT Flags;
} PSX_SEND_MSG, *PPSX_SEND_MSG;
typedef struct _PSX_SENDTO_MSG {
IN INT Socket;
IN PCHAR Buffer;
IN INT Length;
IN INT Flags;
IN struct sockaddr *To;
IN INT ToLength;
} PSX_SENDTO_MSG, *PPSX_SENDTO_MSG;
typdef struct _PSX_SETSOCKOPT_MSG {
IN INT Socket;
IN INT Level;
IN INT OptName;
IN PCHAR OptVal;
IN INT OptLen;
} PSX_SETSOCKOPT_MSG, *PPSX_SETSOCKOPT_MSG;
typdef struct _PSX_SHUTDOWN_MSG {
IN INT Socket;
IN INT How;
} PSX_SHUTDOWN_MSG, *PPSX_SHUTDOWN_MSG;
#endif // SOCKET
//
// Each API message is overlayed on top of a PORT_MESSAGE. In addition to
// the common PORT_MESSAGE header (SenderId..MsgInfo), the PSX API message
// format standardizes the first few words of MsgValue. The following data
// structure defines the standard PSX API message header. Each API overlays
// an API specific structure on top of the ArgumentArray.
//
#define MAXPSXAPIARGS (16 - 5)
#define MAXPSXAPIARGS_BYTES ( 4 * MAXPSXAPIARGS )
//
// Each PSX Api Message contains:
//
// Lpc Port Message - Fixed size and not counted in the data length
// Psx Overhead (PSXMSGOVERHEAD)
// *ApiPort
// ApiNumber
// Error
// ReturnValue
// DataBlock
// Signal
// Union Data - Per API Structure
//
//
// For Lpc purposes, the TotalLength of a message is sizeof(PSX_API_MSG)
// and the DataLength is PSXMSGOVERHEAD + the sizeof the per API structure
//
//
#define PSXMSGOVERHEAD 24
typedef struct _PSX_API_MSG {
PORT_MESSAGE h;
union {
PSX_API_CONNECTINFO ConnectionRequest;
struct {
struct _APIPORT *ApiPort; // Supplied by ApiDispatch
ULONG ApiNumber; // Supplied by client range valid by ApiDispatch
ULONG Error; // 0'd by ApiDispatch service sets to errno value if appropriate
ULONG ReturnValue; // Api Function Return Code
PVOID DataBlock; // Null or Pointer into message buffer
ULONG Signal; // Signal, if Error == EINTR
union {
PSX_FORK_MSG Fork;
PSX_EXEC_MSG Exec;
PSX_WAITPID_MSG WaitPid;
PSX_EXIT_MSG Exit;
PSX_KILL_MSG Kill;
PSX_SIGACTION_MSG SigAction;
PSX_SIGPROCMASK_MSG SigProcMask;
PSX_SIGPENDING_MSG SigPending;
PSX_SIGSUSPEND_MSG SigSuspend;
PSX_ALARM_MSG Alarm;
PSX_GETIDS_MSG GetIds;
PSX_SETUID_MSG SetUid;
PSX_SETGID_MSG SetGid;
PSX_GETGROUPS_MSG GetGroups;
PSX_GETLOGIN_MSG GetLogin;
PSX_CUSERID_MSG CUserId;
PSX_SETPGROUPID_MSG SetPGroupId;
PSX_UNAME_MSG Uname;
PSX_TIME_MSG Time;
PSX_GETPROCESSTIMES_MSG GetProcessTimes;
PSX_TTYNAME_MSG TtyName;
PSX_ISATTY_MSG Isatty;
PSX_SYSCONF_MSG Sysconf;
PSX_OPEN_MSG Open;
PSX_UMASK_MSG Umask;
PSX_LINK_MSG Link;
PSX_MKDIR_MSG MkDir;
PSX_MKFIFO_MSG MkFifo;
PSX_RMDIR_MSG RmDir;
PSX_RENAME_MSG Rename;
PSX_STAT_MSG Stat;
PSX_FSTAT_MSG FStat;
PSX_ACCESS_MSG Access;
PSX_CHMOD_MSG Chmod;
PSX_CHOWN_MSG Chown;
PSX_UTIME_MSG Utime;
PSX_PATHCONF_MSG PathConf;
PSX_FPATHCONF_MSG FPathConf;
PSX_PIPE_MSG Pipe;
PSX_DUP_MSG Dup;
PSX_DUP2_MSG Dup2;
PSX_CLOSE_MSG Close;
PSX_READ_MSG Read;
PSX_READDIR_MSG ReadDir;
PSX_WRITE_MSG Write;
PSX_FCNTL_MSG Fcntl;
PSX_LSEEK_MSG Lseek;
PSX_TCGETATTR_MSG TcGetAttr;
PSX_TCSETATTR_MSG TcSetAttr;
PSX_TCSENDBREAK_MSG TcSendBreak;
PSX_TCDRAIN_MSG TcDrain;
PSX_TCFLUSH_MSG TcFlush;
PSX_TCFLOW_MSG TcFlow;
PSX_TCGETPGRP_MSG TcGetPGrp;
PSX_TCSETPGRP_MSG TcSetPGrp;
PSX_GETPWUID_MSG GetPwUid;
PSX_GETPWNAM_MSG GetPwNam;
PSX_GETGRGID_MSG GetGrGid;
PSX_GETGRNAM_MSG GetGrNam;
PSX_UNLINK_MSG Unlink;
PSX_FTRUNCATE_MSG Ftruncate;
#ifdef PSX_SOCKET
PSX_SOCKET_MSG Socket;
PSX_ACCEPT_MSG Accept;
PSX_BIND_MSG Bind;
PSX_CONNECT_MSG Connect;
PSX_GETPEERNAME_MSG GetPeerName;
PSX_GETSOCKNAME_MSG GetSockName;
PSX_GETSOCKOPT_MSG GetSockOpt;
PSX_LISTEN_MSG Listen;
PSX_RECV_MSG Recv;
PSX_RECVFROM_MSG RecvFrom;
PSX_SEND_MSG Send;
PSX_SENDTO_MSG SendTo;
PSX_SETSOCKOPT_MSG SetSockOpt;
PSX_SHUTDOWN_MSG Shutdown;
#endif // PSX_SOCKET
} u;
};
};
} PSX_API_MSG;
typedef PSX_API_MSG *PPSX_API_MSG;
#define PSX_API_MSG_LENGTH(TypeSize) \
sizeof(PSX_API_MSG)<<16 | (PSXMSGOVERHEAD + (TypeSize))
#define PSX_FORMAT_API_MSG(m,Number,TypeSize) \
(m).h.u1.Length = PSX_API_MSG_LENGTH((TypeSize)); \
(m).h.u2.ZeroInit = 0L; \
(m).ApiNumber = (Number)
//
// PSX_CLIENT_PORT_MEMORY_SIZE defines how much address space should be
// reserved for passing data to the POSIX Server. The memory is visible
// to both the client and server processes.
//
#define PSX_CLIENT_PORT_MEMORY_SIZE 0x8000
#define PSX_SS_API_PORT_NAME L"\\PSXSS\\ApiPort"
#endif // _PSXMSG_