/*++ Copyright (c) 1989 Microsoft Corporation Module Name: psxsrv.h Abstract: Main include file for POSIX Subsystem Server Author: Steve Wood (stevewo) 22-Aug-1989 Revision History: Ellen Aycock-Wright 15-Jul-91 Modify for POSIX subsystem --*/ #ifndef _PSXP_ #define _PSXP_ #include #include #include #include #include #include #include #include #include #include #include #include #include "psxmsg.h" #if DBG #define PSX_DEBUG_INIT 0x0000001 #define PSX_DEBUG_LPC 0x0000002 #define PSX_DEBUG_MSGDUMP 0x0000004 #define PSX_DEBUG_EXEC 0x0000008 extern ULONG PsxDebug; #define IF_PSX_DEBUG(ComponentFlag ) \ if (PsxDebug & (PSX_DEBUG_ ## ComponentFlag)) #else #define IF_PSX_DEBUG( ComponentFlag ) if (FALSE) #endif //DBG BOOLEAN PsxpDebuggerActive; HANDLE PsxpDebugPort; ULONG PsxpApiMsgSize; int __NullPosixApi(); VOID Panic( IN PSZ PanicString ); // // Constants for Posix ID / Sid mapping // #define SHARE_ALL (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE) // // This is the name of the directory used to store open files that have // been unlinked. // #define PSX_JUNK_DIR L"$$psxjunk" // // Posix Process types constants and data structures // #define CIDHASHSIZE 256 #define CIDTOHASHINDEX(pcid) (ULONG)(\ ((ULONG_PTR)((pcid)->UniqueProcess))&(CIDHASHSIZE-1)) #define PIDINDEXBITS 0xffff #define PIDSEQSHIFT 16 #define SPECIALPID 1 // #define SPECIALPID 0xff000000 #define PIDTOPROCESS(pid) \ &FirstProcess[(pid) & PIDINDEXBITS] #define MAKEPID(pid,seq,index) \ (pid) = (seq) & 0xff;\ (pid) <<= PIDSEQSHIFT;\ (pid) |= ((index)&PIDINDEXBITS) #define ISFILEDESINRANGE(fd) (\ ( (ULONG)(fd) < OPEN_MAX ) ) typedef struct _FILEDESCRIPTOR { struct _SYSTEMOPENFILE *SystemOpenFileDesc; ULONG Flags; // descriptor flags (FD_CLOEXEC) } FILEDESCRIPTOR; typedef FILEDESCRIPTOR *PFILEDESCRIPTOR; // // Flags for FILEDESCRIPTOR.Flags // #define PSX_FD_CLOSE_ON_EXEC 0x00000001 typedef enum _PSX_INTERRUPTREASON { SignalInterrupt, WaitSatisfyInterrupt, IoCompletionInterrupt, SleepComplete } PSX_INTERRUPTREASON; struct _PSX_PROCESS; //Make mips compiler happy struct _INTCB; typedef void (* INTHANDLER)( IN struct _PSX_PROCESS *p, IN struct _INTCB *IntControlBlock, IN PSX_INTERRUPTREASON InterruptReason, IN int Signal ); typedef struct _INTCB { INTHANDLER IntHandler; PPSX_API_MSG IntMessage; PVOID IntContext; LIST_ENTRY Links; } INTCB, *PINTCB; #define _SIGNULLSET 0x0 #define _SIGFULLSET 0x7ffff // ((1<ProcessLock ) #define ReleaseProcessLock( p ) RtlLeaveCriticalSection( &(p)->ProcessLock ) // // Process is stoppable if it is not part of an orphaned process group. // #define ISPROCESSSTOPABLE(p) (TRUE) #define ISPOINTERVALID_CLIENT(pprocess, p, length) \ (((ULONG_PTR)(p) >= (ULONG_PTR)(pprocess)->ClientViewBase) && \ ((char *)(p) + (length)) < (pprocess)->ClientViewBounds) LIST_ENTRY DefaultBlockList; RTL_CRITICAL_SECTION BlockLock; // // The process Table. // // This table contains the array of processes. The array is dynamically // allocated at PSX initialization time. very few operations use a table scan // to locate processes. Since pids direct map to a process, and since ClientIds // hash to a process, table scans are only needed to locate groups of processes. // // A single lock (PsxProcessStructureLock) guards the process table and // ClientIdHashTable. This lock is needed to add or delete an entry in the // PsxProcessTable or ClientIdHashTable. // PSX_PROCESS PsxProcessTable[32]; PPSX_PROCESS FirstProcess,LastProcess; // // Client Id Hash Table. // // Given a client id, the corresponding process is located by indexing into this // table and then searching the list head at the index. // LIST_ENTRY ClientIdHashTable[CIDHASHSIZE]; RTL_CRITICAL_SECTION PsxProcessStructureLock; #define AcquireProcessStructureLock() RtlEnterCriticalSection( &PsxProcessStructureLock ) #define ReleaseProcessStructureLock() RtlLeaveCriticalSection( &PsxProcessStructureLock ) typedef struct _PSX_EXEC_INFO { ANSI_STRING Path; ANSI_STRING CWD; ANSI_STRING Argv; ANSI_STRING Envp; ANSI_STRING LibPath; } PSX_EXEC_INFO; typedef PSX_EXEC_INFO *PPSX_EXEC_INFO; // // Routines defined in process.c // NTSTATUS PsxInitializeProcess( IN PPSX_PROCESS NewProcess, IN PPSX_PROCESS ForkProcess OPTIONAL, IN ULONG SessionId, IN HANDLE ProcessHandle, IN HANDLE ThreadHandle, IN PPSX_SESSION Session OPTIONAL ); NTSTATUS PsxInitializeProcessStructure( VOID ); PPSX_PROCESS PsxAllocateProcess ( IN PCLIENT_ID ClientId ); BOOLEAN PsxCreateProcess( IN PPSX_EXEC_INFO ExecInfo, OUT PPSX_PROCESS *NewProcess, IN HANDLE ParentProc, IN PPSX_SESSION Session ); PPSX_PROCESS PsxLocateProcessByClientId ( IN PCLIENT_ID ClientId ); PPSX_PROCESS PsxLocateProcessBySession( IN PPSX_SESSION Session ); PPSX_SESSION PsxLocateSessionByUniqueId( IN ULONG UniqueId ); BOOLEAN PsxStopProcess( IN PPSX_PROCESS p, IN PPSX_API_MSG m, IN ULONG Signal, IN sigset_t *RestoreBlockSigset OPTIONAL ); VOID PsxStopProcessHandler( IN PPSX_PROCESS p, IN PINTCB IntControlBlock, IN PSX_INTERRUPTREASON InterruptReason, IN int Signal ); BOOLEAN PsxInitializeDirectories( IN PPSX_PROCESS Process, IN PANSI_STRING pCwd ); BOOLEAN PsxPropagateDirectories( IN PPSX_PROCESS Process ); // // Routines defined in procblk.c // NTSTATUS BlockProcess( IN PPSX_PROCESS p, IN PVOID Context, IN INTHANDLER Handler, IN PPSX_API_MSG m, IN PLIST_ENTRY BlockList OPTIONAL, IN PRTL_CRITICAL_SECTION CriticalSectionToRelease OPTIONAL ); BOOLEAN UnblockProcess( IN PPSX_PROCESS p, IN PSX_INTERRUPTREASON InterruptReason, IN BOOLEAN BlockLockHeld, IN int Signal // or 0 if not awakened by signal ); // // Routines defined in srvinit.c // NTSTATUS PsxInitializeIO( VOID ); // // Routines defined in sigsup.c // int PsxCheckPendingSignals( IN PPSX_PROCESS p ); VOID PsxTerminateProcessBySignal( IN PPSX_PROCESS p, IN PPSX_API_MSG m, IN ULONG Signal ); VOID PsxDeliverSignal( IN PPSX_PROCESS p, IN ULONG Signal, IN sigset_t *RestoreBlockSigset OPTIONAL ); VOID PsxSigSuspendHandler( IN PPSX_PROCESS p, IN PINTCB IntControlBlock, IN PSX_INTERRUPTREASON InterruptReason, IN int Signal ); VOID PsxSignalProcess( IN PPSX_PROCESS p, IN ULONG Signal ); VOID Exit ( IN PPSX_PROCESS p, IN ULONG ExitStatus ); // // Psx Session Primitives // PPSX_SESSION PsxAllocateSession( IN PPSX_CONTROLLING_TTY Terminal OPTIONAL, IN pid_t SessionLeader ); VOID PsxDeallocateSession( IN PPSX_SESSION Session ); // // Psx Session Macros // #define REFERENCE_PSX_SESSION(ppsxsession) \ RtlEnterCriticalSection(&PsxNtSessionLock); \ (ppsxsession)->ReferenceCount++; \ RtlLeaveCriticalSection(&PsxNtSessionLock) // // Dereferences the session. If reference count goes to zero, the session // is deallocated. // #define DEREFERENCE_PSX_SESSION(ppsxsession, status) \ RtlEnterCriticalSection(&PsxNtSessionLock); \ if (--((ppsxsession)->ReferenceCount) == 0) { \ PsxTerminateConSession((ppsxsession), (status));\ PsxDeallocateSession((ppsxsession)); \ } else { \ RtlLeaveCriticalSection(&PsxNtSessionLock); \ } // // Routines defined in sbapi.c // BOOLEAN PsxSbCreateSession( IN PSBAPIMSG Msg ); BOOLEAN PsxSbTerminateSession( IN PSBAPIMSG Msg ); BOOLEAN PsxSbForeignSessionComplete( IN PSBAPIMSG Msg ); // // Routines defined in sbinit.c // NTSTATUS PsxSbApiPortInitialize ( VOID ); // // Routines defined in sbreqst.c // typedef BOOLEAN (*PSB_API_ROUTINE)( IN PSBAPIMSG SbApiMsg ); NTSTATUS PsxSbApiRequestThread( IN PVOID Parameter ); // // Routines defined in coninit.c // NTSTATUS PsxInitializeConsolePort( VOID ); NTSTATUS PsxCreateDirectoryObject( PUNICODE_STRING pUnicodeDirectoryName ); // // Routines defined in conthrds.c // NTSTATUS PsxSessionRequestThread( IN PVOID Parameter ); // // Routines defined in concreat.c // VOID SetDefaultLibPath( OUT PANSI_STRING LibPath, IN PCHAR EnvStrings ); NTSTATUS PsxCreateConSession( IN OUT PVOID RequestMsg ); // // Routines defined in consignl.c // NTSTATUS PsxCtrlSignalHandler( IN OUT PVOID RequestMsg ); NTSTATUS PsxTerminateConSession( IN PPSX_SESSION Session, IN ULONG ExitStatus ); // // Routines defined in session.c // RTL_CRITICAL_SECTION PsxNtSessionLock; #define LockNtSessionList() RtlEnterCriticalSection( &PsxNtSessionLock ) #define UnlockNtSessionList() RtlLeaveCriticalSection( &PsxNtSessionLock ) NTSTATUS PsxInitializeNtSessionList( VOID ); // // Routines defined in apiinit.c // NTSTATUS PsxApiPortInitialize ( VOID ); // // Global data accessed by Client-Server Runtime Server // PVOID PsxHeap; #define PSX_SS_ROOT_OBJECT_DIRECTORY L"\\PSXSS" #define PSX_SS_SBAPI_PORT_NAME L"\\PSXSS\\SbApiPort" UNICODE_STRING PsxApiPortName; ANSI_STRING PsxSbApiPortName; UNICODE_STRING PsxSbApiPortName_U; STRING PsxRootDirectoryName; HANDLE PsxRootDirectory; HANDLE PsxApiPort; HANDLE PsxSbApiPort; HANDLE PsxSmApiPort; ULONG PsxNumberApiRequestThreads; /* * Port and threads for Console Session globals. */ HANDLE PsxSessionPort; HANDLE PsxSessionRequestThreadHandle; #define PSX_SS_SBAPI_REQUEST_THREAD 0 #define PSX_SS_FIRST_API_REQUEST_THREAD 1 #define PSX_SS_MAX_THREADS 64 HANDLE PsxServerThreadHandles[ PSX_SS_MAX_THREADS ]; CLIENT_ID PsxServerThreadClientIds[ PSX_SS_MAX_THREADS ]; // // file descriptor IO types constants and data structures // #define IONODEHASHSIZE 256 #define SERIALNUMBERTOHASHINDEX(DeviceSerialNumber,FileSerialNumber) (\ (FileSerialNumber) & (IONODEHASHSIZE-1) ) // // IoRoutines // // // This function is called when a new handle is created as a result of // an open // typedef BOOLEAN (*PPSXOPEN_NEW_HANDLE_ROUTINE) ( IN PPSX_PROCESS p, IN PFILEDESCRIPTOR Fd, IN PPSX_API_MSG m ); // // This function is called when a new handle is created as a result of // a pipe, dup, or fork // typedef VOID (*PPSXNEW_HANDLE_ROUTINE) ( IN PPSX_PROCESS p, IN PFILEDESCRIPTOR Fd ); // // This function is called whever a handle is closed (close, exec, _exit) // typedef VOID (*PPSXCLOSE_ROUTINE) ( IN PPSX_PROCESS p, IN PFILEDESCRIPTOR Fd ); typedef VOID (*PPSXLAST_CLOSE_ROUTINE) ( IN PPSX_PROCESS p, IN struct _SYSTEMOPENFILE *SystemOpenFile ); struct _IONODE; typedef VOID (*PPSXIONODE_CLOSE_ROUTINE) ( IN struct _IONODE *IoNode ); // // This function is called to do a read // typedef BOOLEAN (*PPSXREAD_ROUTINE) ( IN PPSX_PROCESS p, IN OUT PPSX_API_MSG m, IN PFILEDESCRIPTOR Fd ); // // This function is called to do a write // typedef BOOLEAN (*PPSXWRITE_ROUTINE) ( IN PPSX_PROCESS p, IN OUT PPSX_API_MSG m, IN PFILEDESCRIPTOR Fd ); // // This function is called to do a dup or dup2 // typedef BOOLEAN (*PPSXDUP_ROUTINE) ( IN PPSX_PROCESS p, IN OUT PPSX_API_MSG m, IN PFILEDESCRIPTOR Fd, IN PFILEDESCRIPTOR FdDup ); // // This function is called to do a Lseek // typedef BOOLEAN (*PPSXLSEEK_ROUTINE) ( IN PPSX_PROCESS p, IN OUT PPSX_API_MSG m, IN PFILEDESCRIPTOR Fd ); // // This function is called to fill in an Ionode so that a call to // stat or fstat can be completed. // typedef BOOLEAN (*PPSXSTAT_ROUTINE) ( IN struct _IONODE *IoNode, IN HANDLE FileHandle, OUT struct stat *StatBuf, OUT NTSTATUS *pStatus ); typedef struct _PSXIO_VECTORS { PPSXOPEN_NEW_HANDLE_ROUTINE OpenNewHandleRoutine; PPSXNEW_HANDLE_ROUTINE NewHandleRoutine; PPSXCLOSE_ROUTINE CloseRoutine; PPSXLAST_CLOSE_ROUTINE LastCloseRoutine; PPSXIONODE_CLOSE_ROUTINE IoNodeCloseRoutine; PPSXREAD_ROUTINE ReadRoutine; PPSXWRITE_ROUTINE WriteRoutine; PPSXDUP_ROUTINE DupRoutine; PPSXLSEEK_ROUTINE LseekRoutine; PPSXSTAT_ROUTINE StatRoutine; } PSXIO_VECTORS, *PPSXIO_VECTORS; BOOLEAN IoOpenNewHandle ( IN PPSX_PROCESS p, IN PFILEDESCRIPTOR Fd, IN PPSX_API_MSG m ); VOID IoNewHandle ( IN PPSX_PROCESS p, IN PFILEDESCRIPTOR Fd ); VOID IoClose ( IN PPSX_PROCESS p, IN PFILEDESCRIPTOR Fd ); VOID IoLastClose ( IN PPSX_PROCESS p, IN struct _SYSTEMOPENFILE *SystemOpenFile ); // // Each unique open file in the system results in the creation of an Input // Output Node (IONODE). Multiple opens in the same file may result in // different file descriptors and system open files, but as long as they refer // to the same file, only one IONODE will be created. IONODES track the the // status of a file and keep track of its owner, mode, times. A single lock // (IoNodeLock) guards all reference count operations on IONODES. A hash table // IoNodeHashTable is capable of locating an IONODE based on the device and // inode number of the file the IONODE is refered to. IONODEs are created on // file open. Once the file is opened, a query of the file is made to // determine its device and inode number. An IONODE is searched for in the // InNodeHashTable, if one is found, then its reference count is incremented, // otherwise one is created and initialized. // typedef struct _IONODE { LIST_ENTRY IoNodeHashLinks; RTL_CRITICAL_SECTION IoNodeLock; ULONG ReferenceCount; // // The file mode is created during file open. // The protection portion of the mode is created by reading the file's // SECURITY_DESCRIPTOR and collapsing it into POSIX rwxrwxrwx values. // // The file type portion is created using the file attributes, device type, // and extended attributes of a file // mode_t Mode; // // For regular files, // DeviceSerialNumber == Counter. Per filesystem number that does // not conflict w/ device type. // FileSerialNumber == IndexNumber // For device files // DeviceSerialNumber == DeviceType // FileSerialNumber == Device Object Address (IndexNumber ?) // dev_t DeviceSerialNumber; ULONG_PTR FileSerialNumber; uid_t OwnerId; gid_t GroupId; // // The time fields are magical. When the file is opened, the access time // and modified times returned from the file system are stored in the // IONODE. The change time is set equal to the modified time. Each Psx // IONODE operation sets the appropriate time fields. // time_t AccessDataTime; time_t ModifyDataTime; time_t ModifyIoNodeTime; // // The Io Vectors // PVOID Context; PPSXIO_VECTORS IoVectors; // // File record locks, sorted by the starting position of the lock. // See fcntl(). And a list of those processes blocked while locking // a region (with F_SETLKW). // LIST_ENTRY Flocks; LIST_ENTRY Waiters; // Length of path to ionode, if applicable. For fpathconf(PATH_MAX). ULONG PathLength; // // If the file has been unlinked or renamed over while still open, // we move it to the junkyard and set the "junked" flag. When the // last close occurs for this file, it should be deleted. // BOOLEAN Junked; } IONODE, *PIONODE; // // Each unique open of a file results in the creation of a system open file. // These descriptors are dynamically allocated. There is no limit on the number // of these in the system. Dups of file descriptors, or forking result in a // reference count increment, not a new system open file. Only explicit opens, // creates, or pipe() calls result in a new system open file. A global lock // (SystemOpenFileLock) guards all reference count adjustments. As long as a // reference exists, all fields in this structure can be used without any // locking. // typedef struct _SYSTEMOPENFILE { ULONG HandleCount; ULONG ReadHandleCount; ULONG WriteHandleCount; HANDLE NtIoHandle; PIONODE IoNode; ULONG Flags; // file description flags // // If a file descriptor is open on a console, we need to keep a // reference to that console so we can do io even if the process // changes sessions. 'Terminal' is the reference. // PPSX_CONTROLLING_TTY Terminal; } SYSTEMOPENFILE; typedef SYSTEMOPENFILE *PSYSTEMOPENFILE; // // Flags for SYSTEMOPENFILE.Flags // #define PSX_FD_READ 0x00000001 #define PSX_FD_WRITE 0x00000002 #define PSX_FD_NOBLOCK 0x00000004 #define PSX_FD_APPEND 0x00000008 extern RTL_CRITICAL_SECTION SystemOpenFileLock; extern RTL_CRITICAL_SECTION IoNodeHashTableLock; extern LIST_ENTRY IoNodeHashTable[]; // // IoNode Primitives // BOOLEAN ReferenceOrCreateIoNode ( IN dev_t DeviceSerialNumber, IN ULONG_PTR FileSerialNumber, IN BOOLEAN FindOnly, OUT PIONODE *IoNode ); BOOLEAN LocateIoNode ( IN HANDLE FileHandle, OUT PIONODE *IoNode ); VOID DereferenceIoNode ( IN PIONODE IoNode ); // // Fd Primitives // PFILEDESCRIPTOR AllocateFd( IN PPSX_PROCESS p, IN ULONG Start, OUT PULONG Index ); BOOLEAN DeallocateFd( IN PPSX_PROCESS p, IN ULONG Index ); PFILEDESCRIPTOR FdIndexToFd( IN PPSX_PROCESS p, IN ULONG Index ); // // System Open File Primitives // PSYSTEMOPENFILE AllocateSystemOpenFile(); VOID DeallocateSystemOpenFile( IN PPSX_PROCESS p, IN PSYSTEMOPENFILE SystemOpenFile ); // // System Open File Macros // #define REFERENCE_SYSTEMOPENFILE(systemopenfile) \ RtlEnterCriticalSection(&SystemOpenFileLock); \ (systemopenfile)->HandleCount++; \ RtlLeaveCriticalSection(&SystemOpenFileLock) VOID ForkProcessFileTable( IN PPSX_PROCESS ForkProcess, IN PPSX_PROCESS NewProcess ); VOID ExecProcessFileTable( IN PPSX_PROCESS p ); VOID CloseProcessFileTable( IN PPSX_PROCESS p ); // // Per-Device Type Io structures, types... Filesystems // are numbered 'A'..'Z'. // #define PSX_LOCAL_PIPE 1 #define PSX_CONSOLE_DEV 2 #define PSX_NULL_DEV 3 // // Local Pipes // typedef struct _LOCAL_PIPE { ULONG ReadHandleCount; ULONG WriteHandleCount; LIST_ENTRY WaitingWriters; LIST_ENTRY WaitingReaders; RTL_CRITICAL_SECTION CriticalSection; LONG BufferSize; LONG DataInPipe; PUCHAR WritePointer; PUCHAR ReadPointer; UCHAR Buffer[PIPE_BUF]; } LOCAL_PIPE, *PLOCAL_PIPE; extern PSXIO_VECTORS LocalPipeVectors; extern PSXIO_VECTORS NamedPipeVectors; VOID InitializeLocalPipe( IN PLOCAL_PIPE Pipe ); // // Files // extern PSXIO_VECTORS FileVectors; // // Console // extern PSXIO_VECTORS ConVectors; // // Null device // extern PSXIO_VECTORS NullVectors; NTSTATUS PsxApiHandleConnectionRequest( IN PPSX_API_MSG Message ); BOOLEAN PendingSignalHandledInside( IN PPSX_PROCESS p, IN PPSX_API_MSG m, IN sigset_t *RestoreBlockSigset OPTIONAL ); NTSTATUS PsxApiRequestThread( IN PVOID ThreadParameter ); VOID ApiReply( IN PPSX_PROCESS p, IN PPSX_API_MSG m, IN sigset_t *RestoreBlockSigset OPTIONAL ); ULONG PsxDetermineFileClass( IN HANDLE FileHandle ); ULONG PsxStatusToErrno( IN NTSTATUS Status ); ULONG PsxStatusToErrnoPath( IN PUNICODE_STRING Path ); // // Stuff for file record locking // typedef struct _SYSFLOCK { LIST_ENTRY Links; SHORT Type; // F_RDLCK or F_WRLCK SHORT Whence; // SEEK_SET, etc. off_t Start; // Starting offset off_t Len; // Length of region pid_t Pid; // Pid of lock owner } SYSFLOCK, *PSYSFLOCK; // // hack types // typedef struct _SYSTEMMSG { LIST_ENTRY Links; PORT_MESSAGE PortMsg; } SYSTEMMSG, *PSYSTEMMSG; typedef BOOLEAN (* PPSX_API_ROUTINE)( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); // // Api Prototypes // BOOLEAN PsxFork( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxExec( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxWaitPid( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxExit( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxKill( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxSigAction( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxSigProcMask( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxSigPending( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxSigSuspend( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxAlarm( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxSleep( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxGetIds( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxSetUid( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxSetGid( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxGetGroups( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxGetLogin( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxCUserId( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxSetSid( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxSetPGroupId( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxUname( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxTime( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxGetProcessTimes( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxTtyName( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxIsatty( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxSysconf( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxOpenDir( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxReadDir( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxRewindDir( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxCloseDir( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxChDir( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxGetCwd( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxOpen( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxCreat( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxUmask( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxLink( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxMkDir( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxMkFifo( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxRmDir( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxRename( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxStat( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxFStat( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxAccess( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxChmod( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxChown( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxUtime( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxPathConf( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxFPathConf( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxPipe( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxClose( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxRead( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxWrite( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxFcntl( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxDup( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxDup2( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxLseek( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxTcGetAttr( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxTcSetAttr( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxTcSendBreak( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxTcDrain( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxTcFlush( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxTcFlow( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxTcGetPGrp( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxTcSetPGrp( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxGetPwUid( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxGetPwNam( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxGetGrGid( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxGetGrNam( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxUnlink( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxFtruncate( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxNull( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); #ifdef PSX_SOCKET BOOLEAN PsxSocket( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxAccept( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxBind( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxConnect( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxGetPeerName( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxGetSockName( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxGetSockOpt( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxListen( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxRecv( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxRecvFrom( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxSend( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxSendTo( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxSetSockOpt( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); BOOLEAN PsxShutdown( IN PPSX_PROCESS p, IN PPSX_API_MSG m ); #endif // PSX_SOCKET PVOID PsxViewSessionData( IN ULONG SessionId, OUT PHANDLE Section ); ULONG GetOffsetBySid( PSID Sid ); PSID GetSidByOffset( ULONG Offset ); VOID MapSidToOffset( PSID Sid, ULONG Offset ); VOID InitSidList( VOID ); VOID ModeToAccessMask( mode_t Mode, PACCESS_MASK UserAccess, PACCESS_MASK GroupAccess, PACCESS_MASK OtherAccess ); mode_t AccessMaskToMode( ACCESS_MASK UserAccess, ACCESS_MASK GroupAccess, ACCESS_MASK OtherAccess ); VOID AlarmThreadRoutine( VOID ); HANDLE AlarmThreadHandle; PSID MakeSid( PSID DomainSid, ULONG RelativeId ); VOID EndImpersonation( VOID ); uid_t MakePosixId( PSID Sid ); NTSTATUS RtlInterpretPosixAcl( IN ULONG AclRevision, IN PSID UserSid, IN PSID GroupSid, IN PACL Acl, OUT PACCESS_MASK UserAccess, OUT PACCESS_MASK GroupAccess, OUT PACCESS_MASK OtherAccess ); NTSTATUS RtlMakePosixAcl( IN ULONG AclRevision, IN PSID UserSid, IN PSID GroupSid, IN ACCESS_MASK UserAccess, IN ACCESS_MASK GroupAccess, IN ACCESS_MASK OtherAccess, IN ULONG AclLength, OUT PACL Acl, OUT PULONG ReturnLength ); VOID ReleaseFlocksByPid( PIONODE IoNode, pid_t pid ); BOOLEAN DoFlockStuff( PPSX_PROCESS Proc, PPSX_API_MSG m, int command, IN PFILEDESCRIPTOR Fd, IN OUT struct flock *new, OUT int *error ); #if DBG VOID DumpFlockList( PIONODE IoNode ); #endif // DBG NTSTATUS InitConnectingTerminalList( VOID ); NTSTATUS AddConnectingTerminal( int Id, HANDLE CommPort, HANDLE ReqPort ); PPSX_CONTROLLING_TTY GetConnectingTerminal( int Id ); ULONG OpenTty( PPSX_PROCESS p, PFILEDESCRIPTOR Fd, ULONG DesiredAccess, ULONG Flags, BOOLEAN NewOpen ); ULONG OpenDevNull( PPSX_PROCESS p, PFILEDESCRIPTOR Fd, ULONG DesiredAccess, ULONG Flags ); dev_t GetFileDeviceNumber( PUNICODE_STRING Path ); NTSTATUS InitSecurityDescriptor( IN OUT PSECURITY_DESCRIPTOR pSD, IN PUNICODE_STRING pFileName, IN HANDLE Process, IN mode_t Mode, OUT PVOID *pvSaveMem ); VOID DeInitSecurityDescriptor( IN PSECURITY_DESCRIPTOR pSD, IN PVOID *pvSaveMem ); BOOLEAN IsGroupOrphaned( IN pid_t ProcessGroup ); NTSTATUS ExecForeignImage( PPSX_PROCESS p, PPSX_API_MSG m, PUNICODE_STRING Image, PUNICODE_STRING CurDir ); #endif // _PSXP_