367 lines
9.9 KiB
C
367 lines
9.9 KiB
C
|
|
/*++
|
|
|
|
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 <posix/sys/types.h>
|
|
#include <posix/termios.h>
|
|
#include <stdio.h>
|
|
|
|
|
|
#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
|