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

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