/*++ Copyright (c) 1989 Microsoft Corporation Module Name: sesport.h Abstract: Author: Ellen Aycock-Wright (ellena) Sept-15-1991 Revision History: --*/ #ifndef _SESPORT_ #define _SESPORT_ #include #include #include #define MAX_SESSION_PATH 256 // it's very important that this string matches exactly like the SESSION_ROOT in \nt\private\csr\server // if this string doesn't then NtConnectPort will fail with an error code of c00003a - path not found #define SESSION_ROOT_W L"\\Sessions" #define SESSION_ROOT_A "\\Sessions" #define DOSDEVICE_X_W L"\\DosDevices\\X:\\" #define DOSDEVICE_X_A "\\DosDevices\\X:\\" #define DOSDEVICE_X2_A "\\DosDevices\\X:" #define DOSDEVICE_A "\\DosDevices\\" #define DOSDEVICE_W L"\\DosDevices\\" #define DEV_TTY L"\\DosDevices\\X:\\dev\\tty" #define DEV_NULL L"\\DosDevices\\X:\\dev\\null" #define PSX_SS_SESSION_PORT_NAME L"\\PSXSS\\SESPORT" #define PSX_SES_BASE_PORT_NAME "\\PSXSS\\PSXSES" #define PSX_SES_BASE_PORT_NAME_LENGTH 256 #define PSX_SES_BASE_PORT_PREFIX 'P' #define PSX_SES_BASE_DATA_PREFIX 'D' #define PSX_CON_PORT_DATA_SIZE 0x1000L #define PSX_GET_WCSLEN(SourceString,Length) \ if (NtCurrentPeb()->SessionId) { \ WCHAR buf[MAX_SESSION_PATH]; \ swprintf(buf, L"\\%ld", NtCurrentPeb()->SessionId);\ Length = wcslen(SESSION_ROOT_W)+wcslen(buf)+wcslen(SourceString);\ }else{\ Length = wcslen(SourceString);\ } #define PSX_GET_STRLEN(SourceString,Length) \ if (NtCurrentPeb()->SessionId) { \ CHAR buf[MAX_SESSION_PATH]; \ sprintf(buf, "\\%d", NtCurrentPeb()->SessionId);\ Length = (USHORT)(strlen(SESSION_ROOT_A)+strlen(buf)+strlen(SourceString));\ }else{\ Length = (USHORT)strlen(SourceString);\ } // this needs to get tested #define PSX_GET_SIZEOF(SourceString,Length) \ if (NtCurrentPeb()->SessionId) { \ WCHAR buf[MAX_SESSION_PATH]; \ swprintf(buf, L"\\%ld", NtCurrentPeb()->SessionId);\ Length = sizeof(SESSION_ROOT_W)+(wcslen(buf)*sizeof(WCHAR))+sizeof(SourceString)-2;\ }else{\ Length = sizeof(SourceString);\ } #define CONSTRUCT_PSX_SES_NAME(Name, t, id) \ if (NtCurrentPeb()->SessionId) { \ sprintf(Name, "%s\\%d%s\\%c%d", SESSION_ROOT_A, NtCurrentPeb()->SessionId,PSX_SES_BASE_PORT_NAME,t,id); \ }else{ \ char *p; \ \ strcpy(Name, PSX_SES_BASE_PORT_NAME); \ p = &Name[sizeof(PSX_SES_BASE_PORT_NAME)-1]; \ *(p++) = '\\'; \ \ *(p++) = t; \ \ RtlIntegerToChar(id, 10, 16, p); \ } #define PSX_GET_SESSION_PORT_NAME(SessionName, Id) \ if (NtCurrentPeb()->SessionId) { \ sprintf(SessionName, "%s\\%d%s\\%c%d", SESSION_ROOT_A, NtCurrentPeb()->SessionId, \ PSX_SES_BASE_PORT_NAME, \ PSX_SES_BASE_PORT_PREFIX, \ Id); \ }else{ \ sprintf(SessionName, "%s\\%c%d", PSX_SES_BASE_PORT_NAME, \ PSX_SES_BASE_PORT_PREFIX, \ Id); \ } #define PSX_GET_SESSION_DATA_NAME(SessionName, Id) \ if (NtCurrentPeb()->SessionId) { \ sprintf(SessionName, "%s\\%d%s\\%c%d", SESSION_ROOT_A, NtCurrentPeb()->SessionId, \ PSX_SES_BASE_PORT_NAME, \ PSX_SES_BASE_DATA_PREFIX, \ Id); \ }else{ \ sprintf(SessionName, "%s\\%c%d", PSX_SES_BASE_PORT_NAME, \ PSX_SES_BASE_DATA_PREFIX, \ Id);\ } #define PSX_GET_SESSION_OBJECT_NAME(DestinationString, SourceString) \ { \ WCHAR SessionDirectory[MAX_SESSION_PATH]; \ if (NtCurrentPeb()->SessionId) { \ swprintf(SessionDirectory,L"%ws\\%ld%ws",SESSION_ROOT_W,NtCurrentPeb()->SessionId,SourceString); \ RtlInitUnicodeString( DestinationString, SessionDirectory ); \ }else{ \ RtlInitUnicodeString( DestinationString, SourceString ); \ }\ } #define PSX_GET_CREATE_UNICODE_STRING_FROM_ASCIIZ(DestinationString, SourceString, bValue) \ { \ CHAR SessionDirectory[MAX_SESSION_PATH]; \ if (NtCurrentPeb()->SessionId) { \ sprintf(SessionDirectory,"%s\\%d%s",SESSION_ROOT_A,NtCurrentPeb()->SessionId,SourceString); \ bValue = RtlCreateUnicodeStringFromAsciiz (DestinationString, SessionDirectory);\ }else{ \ bValue = RtlCreateUnicodeStringFromAsciiz (DestinationString, SourceString);\ }\ } // this is a special case where we need it to be single char #define PSX_GET_SESSION_NAME_A(DestinationString, SourceString) \ { \ if (NtCurrentPeb()->SessionId) { \ sprintf(DestinationString,"%s\\%d%s",SESSION_ROOT_A,NtCurrentPeb()->SessionId,SourceString); \ }else{ \ strcpy(DestinationString,SourceString); \ } \ } /* * Session Console ConnectInfo struct */ typedef struct _SCCONNECTINFO { int dummy; } SCCONNECTINFO, *PSCCONNECTINFO; /* * Console requests * these are mapped 1-1 to the win32 Console services */ typedef enum { ScCreateFile, ScOpenFile, ScCloseFile, ScReadFile, ScWriteFile, ScKbdCharIn, ScIsatty, ScIsatty2 } SCCONREQUESTNUMBER; typedef struct _CONFILEREQUEST { HANDLE Handle; LONG Len; ULONG Flags; } CONFILEREQUEST; // // bits for CONFILEREQUEST.Flags // #define PSXSES_NONBLOCK 0x1 typedef struct _SCCONREQUEST { SCCONREQUESTNUMBER Request; union { CONFILEREQUEST IoBuf; CHAR AsciiChar; } d; } SCCONREQUEST, *PSCCONREQUEST; /* -------- End of Console Requests section -------- */ /* * TaskManager requests */ typedef enum { TmExit, TmTitle } SCTMREQUESTNUMBER; typedef struct { SCTMREQUESTNUMBER Request; ULONG ExitStatus; // for TmExit } SCTMREQUEST, *PSCTMREQUEST; /* -------- End of TaskManager Requests section -------- */ /* * Termios control requests */ typedef enum { TcGetAttr, TcSetAttr, TcDrain, TcFlow, TcFlush, TcGetPGrp, TcSetPGrp, TcSendBreak } SCTCREQUESTNUMBER; typedef struct _SCTCREQUEST { SCTCREQUESTNUMBER Request; LONG FileDes; struct termios Termios; LONG OptionalActions; } SCTCREQUEST, *PSCTCREQUEST; /* * PsxSes requests: * Request for CONSOLE services from PSX SS and PSX clients to the console * process */ typedef enum _SCREQUESTNUMBER { ConRequest, TaskManRequest, TcRequest } SCREQUESTNUMBER; #ifdef NTPSX_ONLY typedef struct _SCREQUESTMSG { PORT_MESSAGE h; union { SCCONNECTINFO ConnectionRequest; struct { SCREQUESTNUMBER Request; NTSTATUS Status; // returned status for the request. union { SCCONREQUEST Con; SCTMREQUEST Tm; SCTCREQUEST Tc; } d; }; }; } SCREQUESTMSG, *PSCREQUESTMSG; /* * PSX SS Session ConnectInfo struct */ typedef union _PSXSESCONNECTINFO { struct { int SessionUniqueId; } In; struct { HANDLE SessionPortHandle; } Out; } PSXSESCONNECTINFO, *PPSXSESCONNECTINFO; /* * Psx SS Session requests * Requests from the session console process (PSXSES.EXE) to the PSX SS * e.g. Create session, CtrlBreak, etc. */ typedef enum _PSXSESREQUESTNUMBER { SesConCreate, SesConSignal } PSXSESREQUESTNUMBER; #endif // NTPSX_ONLY typedef struct { ULONG SessionUniqueId; HANDLE SessionPort; HANDLE ConsoleProcessHandle; int OpenFiles; int PgmNameOffset; int CurrentDirOffset; int ArgsOffset; int EnvironmentOffset; PVOID Buffer; // for io and foreign process args } SCREQ_CREATE, *PSCREQ_CREATE; typedef struct { int Type; } SCREQ_SIGNAL; // // Values for SCREQ_SIGNAL.Type // #define PSX_SIGINT 0 #define PSX_SIGQUIT 1 #define PSX_SIGKILL 2 #define PSX_SIGTSTP 3 typedef struct { ULONG Status; HANDLE Session; } SCREQ_REPLY, *PSCREQ_REPLY; #ifdef NTPSX_ONLY typedef struct _PSXSESREQUESTMSG { PORT_MESSAGE h; union { PSXSESCONNECTINFO ConnectionRequest; struct { HANDLE Session; PSXSESREQUESTNUMBER Request; NTSTATUS Status; ULONG UniqueId; union { SCREQ_CREATE Create; SCREQ_SIGNAL Signal; // SCREQ_REPLY Reply; } d; }; }; } PSXSESREQUESTMSG, *PPSXSESREQUESTMSG; /* * Common macros to access PORT_MESSAGE fields */ #define PORT_MSG_TYPE(m) ((m).h.u2.s2.Type) #define PORT_MSG_DATA_LENGTH(m) ((m).h.u1.s1.DataLength) #define PORT_MSG_TOTAL_LENGTH(m) ((m).h.u1.s1.TotalLength) #define PORT_MSG_ZERO_INIT(m) ((m).h.u2.ZeroInit) #endif // NTPSX_ONLY #endif