/* $Id: psxss.h,v 1.3 2002/10/29 04:45:54 rex Exp $ */
#ifndef _PSX_PSXSS_H
#define _PSX_PSXSS_H

#define NTOS_MODE_USER
#include <ntos.h>
#include <ntdll/rtl.h>
#include <psx/lpcproto.h>

#ifdef __PSXSS_ON_W32__
#include <windows.h>
#endif

#define NAME_BUFFER_SIZE 64

/* PSXSS GLOBAL DATA */

typedef struct _SERVER_DIRECTORY
{
    HANDLE         hObject;
    LPWSTR         wsName;
    UNICODE_STRING usName;

} SERVER_DIRECTORY;

#define PSXSS_THREADS_PER_PORT 2

typedef struct _SERVER_PORT
{
    HANDLE                 hObject;
    LPWSTR                 wsName;
    UNICODE_STRING         usName;
    PTHREAD_START_ROUTINE  EntryPoint;
    struct {
        HANDLE hObject;
        DWORD  Id;
    } ThreadInfo [PSXSS_THREADS_PER_PORT];

} SERVER_PORT, * PSERVER_PORT;

#define SERVER_DIRECTORY_COUNT 3
#define SERVER_PORT_COUNT      3

typedef struct _SERVER
{
    HANDLE           Heap;
    SERVER_DIRECTORY Directory [SERVER_DIRECTORY_COUNT];
    SERVER_PORT      Port [SERVER_PORT_COUNT];

} SERVER;

#define PSX_PORT_API           0
#define PSX_PORT_SBAPI         1
#define PSX_PORT_SESSION       2

#define PSX_DIRECTORY_POSIX    0
#define PSX_DIRECTORY_SESSIONS 1
#define PSX_DIRECTORY_SYSTEM   2

extern SERVER Server; /* server/misc/init.c */

/* System call type */
typedef NTSTATUS (STDCALL *PSX_SYSTEM_CALL)(PPSX_MAX_MESSAGE);

/* System calls table */

extern PSX_SYSTEM_CALL SystemCall []; /* server/call/syscall.c */

/* Listener's Threads */
VOID STDCALL ApiPortListener (PVOID);
VOID STDCALL SbApiPortListener (PVOID);
VOID STDCALL SessionPortListener (PVOID);

/* TERMINAL OBJECT */

typedef struct _PSX_TERMINAL
{
    DWORD Id;
    /* TODO */
} PSX_TERMINAL, * PPSX_TERMINAL;

/* PROCESS OBJECT */

typedef enum 
{
    PROCESS_STATUS_INITIALIZATION,
    PROCESS_STATUS_READY,
    PROCESS_STATUS_WAITING,
    PROCESS_STATUS_DEAD,
    PROCESS_STATUS_ZOMBIE

} PROCESS_STATUS;

typedef DWORD PSX_SECURITY; /* TODO */

struct _PSX_SESSION;

typedef struct _PSX_PROCESS
{
    INT                 Id;         /* pid */
    HANDLE              hProcess;   /* hProcess */
    PROCESS_STATUS      Status;
    struct _PSX_PROCESS    * Parent;
    struct _PSX_SESSION * Session;
    PPSX_TERMINAL       ControlTty;
    PSX_SECURITY        Security;

} PSX_PROCESS, * PPSX_PROCESS;

/* SESSION OBJECT */

typedef enum 
{
    SESSION_STATUS_INITIALIZATION,
    SESSION_STATUS_READY,
    SESSION_STATUS_SHUTDOWN,
    SESSION_STATUS_ERROR

} SESSION_STATUS;

typedef struct _PSX_SESSION
{
    DWORD           Id;
    ULONG           ReferenceCount;
    SESSION_STATUS  Status;
    HANDLE          Heap;
    struct {
        HANDLE  hPort;
        ULONG   ulPortIdentifier; 
    } SessionChannel;
    struct {
        ULONG   Id;   /* csrterm pid */
        HANDLE  hPort; /* LPC port owned by csrterm: \POSIX+\Sessions\P{Id} */
        struct {
            HANDLE  Handle; /* Section owned by csrterm: \POSIX+\Sessions\D{Id} */
            PVOID   BaseAddress;
            ULONG   ViewSize;
        } Section;
    } TerminalChannel;
    PPSX_PROCESS        Leader;
    CRITICAL_SECTION    Lock;
    struct _PSX_SESSION * Previous;
    struct _PSX_SESSION * Next;

} PSX_SESSION, * PPSX_SESSION;

/* prototypes */

VOID STDCALL debug_print (LPWSTR Template, ...);
NTSTATUS STDCALL PsxInitializeSessions (VOID); /* ob/session.c */
NTSTATUS STDCALL PsxCreateSession (PLPC_MAX_MESSAGE,HANDLE,ULONG);
NTSTATUS STDCALL PsxInitializeProcesses (VOID); /* ob/process.c */
NTSTATUS STDCALL PsxCreateProcess (PLPC_MAX_MESSAGE,HANDLE,ULONG);

#endif /* ndef _PSX_PSXSS_H */
