mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1650 lines
37 KiB
1650 lines
37 KiB
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
os2srv.h
|
|
|
|
Abstract:
|
|
|
|
Main include file for OS/2 Subsystem Server
|
|
|
|
Author:
|
|
|
|
Steve Wood (stevewo) 22-Aug-1989
|
|
|
|
Revision History:
|
|
|
|
Yaron Shamor 4-Apr-91 Add profile for ComputeValidDrives.
|
|
--*/
|
|
|
|
//
|
|
// Include OS/2 SubSystem Runtime Definitions. Includes NT Definitions,
|
|
// OS/2 V2.0 Definitions and Debug definitions.
|
|
//
|
|
|
|
#include "os2ssrtl.h"
|
|
|
|
#if DBG
|
|
ULONG Os2Debug;
|
|
#endif
|
|
|
|
// Flag to let OS2SRV know whether or not to ignore LOGOFF (when started as a service)
|
|
extern BOOLEAN fService;
|
|
|
|
//
|
|
// Include NT Session Manager and Debug SubSystem Interfaces
|
|
|
|
#include <ntsm.h>
|
|
#include <ntdbg.h>
|
|
typedef BOOLEAN (*PSB_API_ROUTINE)( IN PSBAPIMSG SbApiMsg );
|
|
|
|
|
|
#include "os2file.h"
|
|
#include "os2ssmsg.h"
|
|
|
|
//
|
|
// OS/2 Subsystem Semaphore structures.
|
|
//
|
|
|
|
typedef enum _OS2_SEMAPHORE_TYPE {
|
|
Os2EventSem = 1,
|
|
Os2MutexSem,
|
|
Os2MuxWaitSem
|
|
} OS2_SEMAPHORE_TYPE;
|
|
|
|
typedef struct _OS2_MUXWAIT_RECORD {
|
|
ULONG SemHandleIndex;
|
|
ULONG UserKey;
|
|
struct _OS2_SEMAPHORE *Semaphore;
|
|
} OS2_MUXWAIT_RECORD, *POS2_MUXWAIT_RECORD;
|
|
|
|
typedef struct _OS2_MUXWAIT_SEMAPHORE {
|
|
USHORT CountMuxWaitRecords;
|
|
USHORT Type : 2;
|
|
USHORT WaitAll : 1;
|
|
USHORT Reserved : 13;
|
|
OS2_MUXWAIT_RECORD MuxWaitRecords[ DCMW_MAX_SEMRECORDS ];
|
|
} OS2_MUXWAIT_SEMAPHORE, *POS2_MUXWAIT_SEMAPHORE;
|
|
|
|
typedef struct _OS2_SEMAPHORE {
|
|
USHORT PointerCount : 14;
|
|
USHORT Type : 2;
|
|
USHORT OpenCount;
|
|
STRING Name;
|
|
union {
|
|
PVOID Value;
|
|
HANDLE EventHandle;
|
|
HANDLE MutantHandle;
|
|
POS2_MUXWAIT_SEMAPHORE MuxWait;
|
|
} u;
|
|
} OS2_SEMAPHORE, *POS2_SEMAPHORE;
|
|
|
|
|
|
typedef struct _OS2_SESSION {
|
|
LIST_ENTRY SessionLink;
|
|
ULONG SessionId;
|
|
ULONG ReferenceCount;
|
|
ULONG TerminationQueueHandle;
|
|
struct _OS2_QUEUE *TerminationQueue;
|
|
struct _OS2_SESSION *RelatedSession;
|
|
struct _OS2_SESSION *BindSession;
|
|
HANDLE ConsolePort;
|
|
ULONG SessionUniqueId;
|
|
ULONG ProcessId;
|
|
BOOLEAN Selectable;
|
|
USHORT FgBg; // TRUE for background
|
|
USHORT InheritOpt;
|
|
BOOLEAN ChildSession;
|
|
BOOLEAN WinSession;
|
|
PVOID Thread;
|
|
PVOID Process;
|
|
HANDLE hWaitThread;
|
|
HANDLE hProcess;
|
|
ULONG dwProcessId;
|
|
ULONG dwParentProcessId;
|
|
HANDLE SesGrpHandle;
|
|
PVOID SesGrpAddress;
|
|
BOOLEAN InTermination;
|
|
HANDLE Win32ForegroundWindow;
|
|
struct _OS2_REGISTER_HANDLER_REC *RegisterCtrlHandler;
|
|
} OS2_SESSION, *POS2_SESSION;
|
|
|
|
typedef struct _OS2_NT_SESSION {
|
|
LIST_ENTRY SessionLink;
|
|
ULONG SessionId;
|
|
ULONG ReferenceCount;
|
|
STRING RootDirectory;
|
|
} OS2_NT_SESSION, *POS2_NT_SESSION;
|
|
|
|
typedef struct _OS2_THREAD {
|
|
LIST_ENTRY Link;
|
|
struct _OS2_PROCESS *Process;
|
|
struct _OS2_WAIT_BLOCK *WaitBlock;
|
|
POS2_SEMAPHORE WaitingForSemaphore;
|
|
CLIENT_ID ClientId;
|
|
TID ThreadId;
|
|
HANDLE ThreadHandle;
|
|
POS2_TIB ClientOs2Tib;
|
|
ULONG Flags;
|
|
KPRIORITY Priority;
|
|
USHORT PendingSignals;
|
|
USHORT CurrentSignals;
|
|
USHORT MustComplete;
|
|
USHORT DebugState; // A flag for DosPtrace().
|
|
BOOLEAN Dying;
|
|
CHAR Os2Level;
|
|
UCHAR Os2Class;
|
|
ULONG InitialStack;
|
|
} OS2_THREAD, *POS2_THREAD;
|
|
|
|
//
|
|
// Flag definitions for OS2_THREAD.Flags
|
|
//
|
|
|
|
#define OS2_THREAD_THREAD1 0x00000001
|
|
#define OS2_THREAD_ATTACHED 0x00000002
|
|
|
|
#ifdef PMNT
|
|
#define PMNTFIRSTHIDDENTHREAD 40 // There is a check for Maximum thread in
|
|
// pmwin\wintodos.inc MAXTHRDID = 52
|
|
// Maximum #threads per process handled by
|
|
// AAB.ASM. Assumes thread IDs range from
|
|
// 0 to MAXTHRDID-1
|
|
#define PMNTMAXHIDDENTHREADS 10 // We allocated 10 PMNT hidden threads with
|
|
// Tid 40-50. See process.c os2allocatetid
|
|
#endif
|
|
|
|
#define OS2_EXIT_IN_PROGRESS 0x00000001
|
|
#define OS2_EXIT_WAIT_FOR_SYNC 0x00000002
|
|
|
|
typedef struct _OS2_PROCESS {
|
|
LIST_ENTRY ListLink;
|
|
struct _OS2_PROCESS *Parent;
|
|
LIST_ENTRY ChildrenList;
|
|
LIST_ENTRY SiblingLink;
|
|
LIST_ENTRY ThreadList;
|
|
LIST_ENTRY SharedMemoryList;
|
|
POS2_NT_SESSION NtSession;
|
|
POS2_SESSION Session;
|
|
PVOID ExitListDispatcher;
|
|
PVOID InfiniteSleep;
|
|
PVOID SignalDeliverer;
|
|
PVOID FreezeThread;
|
|
PVOID UnfreezeThread;
|
|
PVOID VectorHandler;
|
|
PVOID CritSectionAddr;
|
|
PVOID TidBitMapHeader;
|
|
PEB_OS2_DATA InitialPebOs2Data;
|
|
RESULTCODES ResultCodes;
|
|
ULONG ExpectedVersion;
|
|
HANDLE ClientPort;
|
|
PCH ClientViewBase;
|
|
PCH ClientViewBounds;
|
|
CLIENT_ID ClientId;
|
|
PID ProcessId;
|
|
PID CommandSubTreeId;
|
|
HANDLE ProcessHandle;
|
|
PPIB ClientPib;
|
|
// ULONG LastThreadId; removed after TidBitMapHeader was added
|
|
#ifdef PMNT
|
|
ULONG LastHiddenThreadId;
|
|
#endif
|
|
ULONG Flags;
|
|
USHORT ExceptionFocus;
|
|
PFILE_HANDLE HandleTable; // temporary copy of the file handle table during exec
|
|
ULONG HandleTableLength; // length of handle table
|
|
ULONG ErrorAction;
|
|
BOOLEAN CtrlHandlerFlag;
|
|
ULONG ExitStatus; // 2 bits:
|
|
// Exit in progress
|
|
// Wait for sync during exit processing
|
|
UCHAR ApplName[OS2_PROCESS_MAX_APPL_NAME];
|
|
ULONG ApplNameLength;
|
|
TID DebugThreadId;
|
|
PVOID ProcessMTE; // Pointer to process MTE structure
|
|
BOOLEAN FirstPtrace; // A flag for first DosPtrace(0xA)
|
|
PVOID FirstMTE; // Pointer to the mte that has the INT 3 we inserted for DosPtrace()
|
|
PVOID LinkMte; // Link list of mte's to transfer to a debugger process
|
|
BOOLEAN ConfigSysUsageFlag; // TRUE if process used config.sys during its life
|
|
} OS2_PROCESS, *POS2_PROCESS;
|
|
|
|
typedef struct _OS2_REGISTER_HANDLER_REC {
|
|
ULONG Signal;
|
|
ULONG fAction;
|
|
POS2_PROCESS Process;
|
|
struct _OS2_REGISTER_HANDLER_REC *Link;
|
|
} OS2_REGISTER_HANDLER_REC, *POS2_REGISTER_HANDLER_REC;
|
|
|
|
//
|
|
// Flags field bit definitions
|
|
//
|
|
|
|
// When process terminates if no process is waiting for result, put the
|
|
// process in the zombie list so that DosWaitChild can find it and return
|
|
// the result.
|
|
//
|
|
#define OS2_PROCESS_SAVERESULT 0x00000001
|
|
|
|
// The process was invoked synchronously and the client is waiting for a
|
|
// response to their DosExecPgm request when this process terminates.
|
|
//
|
|
#define OS2_PROCESS_SYNCHRONOUS 0x00000002
|
|
|
|
// The process was invoked detached from the console and does not get any
|
|
// handles to the console device (keyboard, mouse and/or screen).
|
|
//
|
|
#define OS2_PROCESS_BACKGROUND 0x00000004
|
|
|
|
// The process was invoked in z suspended state. It may be resumed with the
|
|
// DosSystemService API call.
|
|
//
|
|
#define OS2_PROCESS_FROZEN 0x00000008
|
|
|
|
// The process may be modified via the Debug Subsystem. FIX, FIX - what does
|
|
// this really mean.
|
|
//
|
|
#define OS2_PROCESS_TRACE 0x00000010
|
|
|
|
// Any child process created by this process inherits the OS2_PROCESS_TRACE????
|
|
// flags.
|
|
//
|
|
#define OS2_PROCESS_TRACETREE 0x00000020
|
|
|
|
// The process is terminating after DosPtrace() with a TERMINATE command.
|
|
//
|
|
#define OS2_PROCESS_TERMINATE 0x00000040
|
|
|
|
// Process is doing ExitList processing
|
|
//
|
|
#define OS2_PROCESS_EXIT 0x00010000
|
|
|
|
// // Obsolete code below: OS/2 ss was keeping processes around as zombie so
|
|
// // that DosCWait doesn't fail when father calls it after child termination.
|
|
// // However, it turns out that OS/2 doesn't do this.
|
|
//
|
|
// // Process is linked into the zombie list.
|
|
// //
|
|
// #define OS2_PROCESS_ZOMBIE 0x00020000
|
|
|
|
// Process cannot run in the PM screen
|
|
//
|
|
#define OS2_PROCESS_NOTWINDOWCOMPAT 0x00040000
|
|
|
|
// Process can run in a PM screen
|
|
//
|
|
#define OS2_PROCESS_WINDOWCOMPAT 0x00080000
|
|
|
|
// Process is using PM APIs
|
|
//
|
|
#define OS2_PROCESS_WINDOWAPI 0x00100000
|
|
|
|
// Process is PMSHELL - special handling for GPs
|
|
//
|
|
#define OS2_PROCESS_IS_PMSHELL 0x00200000
|
|
|
|
#if PMNT
|
|
// Process is Forced PM process (PM but not marked as WINDOWAPI)
|
|
//
|
|
#define OS2_PROCESS_FORCEDPM 0x00400000
|
|
|
|
// Process calls WinCreateMsgQueue()
|
|
//
|
|
#define OS2_PROCESS_PMMSGQUE 0x00800000
|
|
|
|
#define Os2srvProcessIsPMProcess(Process) (Process->Flags & (OS2_PROCESS_WINDOWAPI \
|
|
| OS2_PROCESS_PMMSGQUE | OS2_PROCESS_FORCEDPM))
|
|
#endif
|
|
//
|
|
// ProcessId limits
|
|
//
|
|
|
|
#define PID_MIN 0x00000001 // Lowest process id
|
|
#define PID_MAX 0x0000FFFF // Highest process id
|
|
|
|
//
|
|
// ProcessStatus field flag bits. All but the first are private to OS/2
|
|
//
|
|
|
|
#define PS_XITLST PS_EXITLIST // Doing ExitList Processing
|
|
#define PS_XITTH1 0x00000002 // Exiting thread 1
|
|
#define PS_XITALL 0x00000004 // The whole process is exiting
|
|
#define PS_SYNCPARENT 0x00000010 // Parent cares about termination
|
|
#define PS_WAITPARENT 0x00000020 // Parent did an exec-and-wait
|
|
#define PS_DYING 0x00000040 // Process is dying
|
|
#define PS_EMBRYO 0x00000080 // Process in embryonic state
|
|
|
|
#define AcquireLocalObjectLock(AssociatedHandleTable) RtlEnterCriticalSection( &(AssociatedHandleTable)->Lock );
|
|
#define ReleaseLocalObjectLock(AssociatedHandleTable) RtlLeaveCriticalSection( &(AssociatedHandleTable)->Lock );
|
|
//
|
|
// All exported API calls define the same interface to the OS/2 Server Request
|
|
// loop. The return value indicates to the request loop whether or not to
|
|
// generate a reply to the client.
|
|
//
|
|
|
|
typedef BOOLEAN (*POS2_API_ROUTINE)( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
|
|
BOOLEAN Os2InternalNullApiCall( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
|
|
|
|
//
|
|
// Global data accessed by OS/2 Subsystem Server
|
|
//
|
|
|
|
#if DBG
|
|
ULONG Os2DebugFlag;
|
|
#endif // DBG
|
|
|
|
PVOID Os2Heap;
|
|
|
|
ULONG Os2BootDrive;
|
|
ULONG Os2DefaultDrive;
|
|
ULONG Os2ValidDrives;
|
|
PSZ *environ;
|
|
PSZ SystemRootValuePtr;
|
|
|
|
HANDLE Os2RootDirectory;
|
|
HANDLE Os2DrivesDirectory;
|
|
HANDLE Os2DevicesDirectory;
|
|
|
|
STRING Os2DebugPortName;
|
|
UNICODE_STRING Os2DebugPortName_U;
|
|
HANDLE Os2DebugPort;
|
|
|
|
STRING Os2ExceptionPortName;
|
|
UNICODE_STRING Os2ExceptionPortName_U;
|
|
HANDLE Os2ExceptionPort;
|
|
|
|
UNICODE_STRING Os2SbApiPortName_U;
|
|
HANDLE Os2SbApiPort;
|
|
HANDLE Os2SmApiPort;
|
|
|
|
/*
|
|
* Port and threads for Console Session globals.
|
|
*/
|
|
HANDLE Os2SessionPort;
|
|
|
|
HANDLE Os2SessionRequestThreadHandle;
|
|
|
|
|
|
#define OS2_SS_SBAPI_PORT_NAME L"\\OS2SS\\SbApiPort"
|
|
|
|
#define OS2_SS_API_LISTEN_THREAD 0
|
|
#define OS2_SS_SBAPI_REQUEST_THREAD 1
|
|
#define OS2_SS_FIRST_API_REQUEST_THREAD 2
|
|
|
|
#define OS2_SS_MAX_THREADS 64
|
|
|
|
HANDLE Os2ServerThreadHandles[ OS2_SS_MAX_THREADS ];
|
|
HANDLE Os2DebugThreadHandle;
|
|
CLIENT_ID Os2ServerThreadClientIds[ OS2_SS_MAX_THREADS ];
|
|
CLIENT_ID Os2DebugThreadClientId;
|
|
|
|
POR2_HANDLE_TABLE Os2SharedSemaphoreTable;
|
|
|
|
CLIENT_ID Os2DebugUserClientId;
|
|
|
|
|
|
//
|
|
// Routines defined in srvinit.c
|
|
//
|
|
|
|
NTSTATUS
|
|
Os2Initialize( VOID );
|
|
|
|
BOOLEAN
|
|
Os2SrvHandleCtrlEvent(
|
|
IN int CtrlType
|
|
);
|
|
|
|
ULONG
|
|
NtGetIntegerFromUnicodeString(
|
|
IN WCHAR *WString
|
|
);
|
|
|
|
//
|
|
// Routines defined in srvnls.c
|
|
//
|
|
// Note: srvnls.c doesn't include this file. It includes <windows.h> instead
|
|
// of <nt.h>.
|
|
// All callers to Win32 APIs (like SetConsoleCtrlHandler) should be put there.
|
|
//
|
|
|
|
ULONG Os2ssCountryCode;
|
|
ULONG Os2ssCodePage[2];
|
|
UCHAR Os2ssKeyboardLayout[2];
|
|
#if PMNT
|
|
UCHAR Os2ssKeyboardName[4]; // Allow space for keyboard sub-code (103,
|
|
// 189, 150G etc.)
|
|
#endif
|
|
ULONG Os2ssKeysOnFlag;
|
|
ULONG Os2SrvExitNow;
|
|
|
|
VOID
|
|
Os2SrvExitProcess(IN ULONG uExitCode);
|
|
|
|
APIRET
|
|
Os2InitializeNLS( VOID );
|
|
|
|
VOID
|
|
SetEventHandlersAndErrorMode(
|
|
IN BOOLEAN fSet
|
|
);
|
|
|
|
//
|
|
// Routines defined in srvobjmn.c
|
|
//
|
|
|
|
typedef enum _OS2_LOCAL_OBJECT_TYPE {
|
|
LocalObjectAnyType,
|
|
LocalObjectQueue,
|
|
MaxLocalObject
|
|
} OS2_LOCAL_OBJECT_TYPE;
|
|
|
|
typedef struct _OS2_LOCAL_OBJECT_DIRENT {
|
|
STRING ObjectName;
|
|
OS2_LOCAL_OBJECT_TYPE ObjectType;
|
|
ULONG ObjectHandle;
|
|
} OS2_LOCAL_OBJECT_DIRENT, *POS2_LOCAL_OBJECT_DIRENT;
|
|
|
|
NTSTATUS
|
|
Os2InitializeLocalObjectManager( VOID );
|
|
|
|
RTL_GENERIC_TABLE Os2LocalObjectNames;
|
|
|
|
RTL_GENERIC_COMPARE_RESULTS
|
|
Os2LocalObjectCompare(
|
|
IN struct _RTL_GENERIC_TABLE *Table,
|
|
IN PVOID FirstStruct,
|
|
IN PVOID SecondStruct
|
|
);
|
|
|
|
PVOID
|
|
Os2LocalObjectDirentAllocate(
|
|
IN struct _RTL_GENERIC_TABLE *Table,
|
|
IN CLONG ByteSize
|
|
);
|
|
|
|
VOID
|
|
Os2LocalObjectDirentDeallocate(
|
|
IN struct _RTL_GENERIC_TABLE *Table,
|
|
IN PVOID Buffer
|
|
);
|
|
|
|
POS2_LOCAL_OBJECT_DIRENT
|
|
Os2LookupLocalObjectByName(
|
|
IN PSTRING ObjectName,
|
|
IN OS2_LOCAL_OBJECT_TYPE ObjectType
|
|
);
|
|
|
|
POS2_LOCAL_OBJECT_DIRENT
|
|
Os2InsertLocalObjectName(
|
|
IN PSTRING ObjectName,
|
|
IN OS2_LOCAL_OBJECT_TYPE ObjectType,
|
|
IN ULONG ObjectHandle
|
|
);
|
|
|
|
VOID
|
|
Os2DeleteLocalObject(
|
|
IN POS2_LOCAL_OBJECT_DIRENT Dirent
|
|
);
|
|
|
|
//
|
|
// Routines defined in srvname.c
|
|
//
|
|
|
|
NTSTATUS
|
|
Os2InitializeNameSpace( VOID );
|
|
|
|
NTSTATUS
|
|
Os2InitializeDriveLetters( VOID );
|
|
|
|
NTSTATUS
|
|
Os2InitLocalObjectDirectory( VOID );
|
|
|
|
ULONG
|
|
Os2ComputeValidDrives( VOID );
|
|
|
|
NTSTATUS
|
|
Os2GetClientId(void);
|
|
|
|
NTSTATUS
|
|
Os2DebugProcess(
|
|
IN PCLIENT_ID DebugUserInterface,
|
|
IN POS2_THREAD Thread,
|
|
IN HANDLE ReplyEvent
|
|
);
|
|
|
|
NTSTATUS
|
|
Os2DebugThread(
|
|
IN HANDLE hThread,
|
|
IN HANDLE ReplyEvent
|
|
);
|
|
|
|
//
|
|
// Routines defined in srvcnfg.c
|
|
//
|
|
|
|
NTSTATUS
|
|
Os2InitializeRegistry(
|
|
VOID
|
|
);
|
|
|
|
BOOLEAN
|
|
Os2ConfigSysCreator(
|
|
IN POS2_THREAD t,
|
|
IN POS2_API_MSG m
|
|
);
|
|
|
|
VOID
|
|
Os2UpdateRegistryFromConfigSys(
|
|
VOID
|
|
);
|
|
|
|
//
|
|
// Routines defined in srvnet.c
|
|
//
|
|
|
|
BOOLEAN
|
|
Os2Netbios2Request(
|
|
IN POS2_THREAD t,
|
|
IN POS2_API_MSG m
|
|
);
|
|
|
|
//
|
|
// Routines defined in sbinit.c
|
|
//
|
|
|
|
NTSTATUS
|
|
Os2SbApiPortInitialize( VOID );
|
|
|
|
|
|
VOID
|
|
Os2SbApiPortTerminate(
|
|
NTSTATUS Status
|
|
);
|
|
|
|
//
|
|
// Routines defined in sbreqst.c
|
|
//
|
|
|
|
NTSTATUS
|
|
Os2SbApiRequestThread(
|
|
IN PVOID Parameter
|
|
);
|
|
|
|
//
|
|
// Routines defined in sbapi.c
|
|
//
|
|
|
|
BOOLEAN
|
|
Os2SbCreateSession(
|
|
IN PSBAPIMSG Msg
|
|
);
|
|
|
|
BOOLEAN
|
|
Os2SbTerminateSession(
|
|
IN PSBAPIMSG Msg
|
|
);
|
|
|
|
BOOLEAN
|
|
Os2SbForeignSessionComplete(
|
|
IN PSBAPIMSG Msg
|
|
);
|
|
|
|
//
|
|
// Routines defined in apiinit.c
|
|
//
|
|
|
|
NTSTATUS
|
|
Os2DebugPortInitialize(void);
|
|
|
|
|
|
//
|
|
// Routines defined in apireqst.c
|
|
//
|
|
|
|
NTSTATUS
|
|
Os2ApiRequestThread(
|
|
IN PVOID Parameter
|
|
);
|
|
|
|
|
|
BOOLEAN
|
|
Os2CaptureArguments(
|
|
IN POS2_THREAD t,
|
|
IN POS2_API_MSG m
|
|
);
|
|
|
|
VOID
|
|
Os2ReleaseCapturedArguments(
|
|
IN POS2_API_MSG m
|
|
);
|
|
|
|
NTSTATUS
|
|
Os2DebugRequestThread(
|
|
IN PVOID Parameter
|
|
);
|
|
|
|
NTSTATUS
|
|
Os2ExceptionRequestThread(
|
|
IN PVOID Parameter
|
|
);
|
|
|
|
//
|
|
// Routines defined in coninit.c
|
|
//
|
|
|
|
NTSTATUS
|
|
Os2InitializeConsolePort( VOID );
|
|
|
|
|
|
//
|
|
// Routines defined in conthrds.c
|
|
//
|
|
|
|
VOID
|
|
Os2SessionHandleConnectionRequest(
|
|
struct _OS2SESREQUESTMSG *Message
|
|
);
|
|
|
|
VOID
|
|
HandleOs2ConRequest(IN PVOID pApiReceiveMsg,
|
|
OUT PVOID *PReplyMsg
|
|
);
|
|
|
|
//
|
|
// Routines defined in concreat.c
|
|
//
|
|
|
|
NTSTATUS
|
|
Os2CreateConSession(
|
|
IN OUT PVOID RequestMsg
|
|
);
|
|
|
|
//
|
|
// Routines defined in consignl.c
|
|
//
|
|
|
|
NTSTATUS
|
|
Os2CtrlSignalHandler(
|
|
IN OUT PVOID RequestMsg,
|
|
IN POS2_PROCESS RecievingProcess
|
|
);
|
|
|
|
NTSTATUS
|
|
Os2TerminateConSession(
|
|
IN POS2_SESSION Session,
|
|
IN POS2_TERMINATEPROCESS_MSG a
|
|
);
|
|
|
|
//
|
|
// Routines and data defined in process.c
|
|
//
|
|
|
|
//
|
|
// The Os2StructureLock critical section protects against races with various
|
|
// threads accessing internal structures.
|
|
//
|
|
|
|
RTL_CRITICAL_SECTION Os2StructureLock;
|
|
#define Os2AcquireStructureLock() RtlEnterCriticalSection( &Os2StructureLock )
|
|
#define Os2ReleaseStructureLock() RtlLeaveCriticalSection( &Os2StructureLock )
|
|
|
|
//
|
|
// The following is a dummy process that acts as the root of the OS/2 Process
|
|
// Structure. It has a ClientId of -1.-1 so it does not conflict with actual
|
|
// OS/2 Processes. All processes created via the session manager are children
|
|
// of this process, as are all orphaned processes. The ListLink field of this
|
|
// process is the head of a list of all OS/2 Processes.
|
|
//
|
|
POS2_PROCESS Os2RootProcess;
|
|
|
|
// // Obsolete code below: OS/2 ss was keeping processes around as zombie so
|
|
// // that DosCWait doesn't fail when father calls it after child termination.
|
|
// // However, it turns out that OS/2 doesn't do this.
|
|
//
|
|
// The Os2ZombieList is a list of all zombie processes that contain result
|
|
// codes that have not been retrieved yet. Processes in the Zombie List
|
|
// are NOT in the process tree rooted at Os2RootProcess. The ListLink
|
|
// field of each zombie process is used for the zombie list pointers, since
|
|
// they are not used to link them into the process structure.
|
|
//
|
|
//
|
|
// LIST_ENTRY Os2ZombieList;
|
|
|
|
//
|
|
// OS/2 Process Id values are assigned from this variable. They are handed
|
|
// out sequentially.
|
|
//
|
|
|
|
PID Os2LastProcessId;
|
|
PID Os2NextHigherProcessId;
|
|
|
|
#define MINIMUM_PROCESS_ID (PID)0x00000001
|
|
#define MAXIMUM_PROCESS_ID (PID)0x0000FFFF
|
|
|
|
|
|
NTSTATUS
|
|
Os2InitializeProcessStructure( VOID );
|
|
|
|
POS2_PROCESS
|
|
Os2AllocateProcess( VOID );
|
|
|
|
VOID
|
|
Os2DeallocateProcess(
|
|
IN POS2_PROCESS Process
|
|
);
|
|
|
|
VOID
|
|
Os2InsertProcess(
|
|
IN POS2_PROCESS ParentProcess,
|
|
IN POS2_PROCESS Process
|
|
);
|
|
|
|
VOID
|
|
Os2RemoveProcess(
|
|
IN POS2_PROCESS Process
|
|
);
|
|
|
|
VOID
|
|
Os2SuspendProcess(
|
|
IN POS2_PROCESS Process
|
|
);
|
|
|
|
NTSTATUS
|
|
Os2SetProcessContext(
|
|
IN POS2_PROCESS Process,
|
|
IN POS2_THREAD Thread,
|
|
IN BOOLEAN StartedBySm,
|
|
IN ULONG HandleTableLength,
|
|
IN ULONG CurrentDrive,
|
|
IN ULONG CodePage
|
|
);
|
|
|
|
POS2_THREAD
|
|
Os2AllocateThread(
|
|
#ifdef PMNT
|
|
IN ULONG Flags,
|
|
#endif
|
|
IN POS2_PROCESS Process
|
|
);
|
|
|
|
VOID
|
|
Os2DeallocateThread(
|
|
IN POS2_THREAD Thread
|
|
);
|
|
|
|
VOID
|
|
Os2InsertThread(
|
|
IN POS2_PROCESS Process,
|
|
IN POS2_THREAD Thread
|
|
);
|
|
|
|
VOID
|
|
Os2RemoveThread(
|
|
IN POS2_PROCESS Process,
|
|
IN POS2_THREAD Thread
|
|
);
|
|
|
|
VOID
|
|
Os2SetThreadPriority(
|
|
IN POS2_THREAD Thread,
|
|
IN ULONG NewClass,
|
|
IN ULONG Delta
|
|
);
|
|
|
|
VOID
|
|
Os2SetProcessPriority(
|
|
IN POS2_PROCESS Process,
|
|
IN ULONG NewClass,
|
|
IN ULONG Delta
|
|
);
|
|
|
|
VOID
|
|
Os2SetProcessTreePriority(
|
|
IN POS2_PROCESS RootProcess,
|
|
IN ULONG NewClass,
|
|
IN ULONG Delta
|
|
);
|
|
|
|
POS2_PROCESS
|
|
Os2LocateProcessByProcessId(
|
|
IN POS2_API_MSG m OPTIONAL,
|
|
IN POS2_PROCESS CurrentProcess,
|
|
IN PID ProcessId,
|
|
IN BOOLEAN MustBeChild
|
|
);
|
|
|
|
POS2_PROCESS
|
|
Os2LocateProcessByClientId(
|
|
IN PCLIENT_ID ClientId
|
|
);
|
|
|
|
POS2_THREAD
|
|
Os2LocateThreadByThreadId(
|
|
IN POS2_API_MSG m OPTIONAL,
|
|
IN POS2_THREAD CurrentThread,
|
|
IN TID ThreadId
|
|
);
|
|
|
|
POS2_THREAD
|
|
Os2LocateThreadByClientId(
|
|
IN POS2_PROCESS Process,
|
|
IN PCLIENT_ID ClientId
|
|
);
|
|
|
|
//
|
|
// Routines and data defined in wait.c
|
|
//
|
|
|
|
typedef enum _OS2_WAIT_REASON {
|
|
WaitProcess,
|
|
WaitThread,
|
|
WaitQueue,
|
|
WaitInterrupt,
|
|
WaitSession,
|
|
WaitWinProcess,
|
|
MaxWaitReason
|
|
} OS2_WAIT_REASON;
|
|
|
|
typedef
|
|
BOOLEAN
|
|
(*OS2_WAIT_ROUTINE)(
|
|
IN OS2_WAIT_REASON WaitReason,
|
|
IN POS2_THREAD WaitingThread,
|
|
IN POS2_API_MSG WaitReplyMessage,
|
|
IN PVOID WaitParameter,
|
|
IN PVOID SatisfyParameter1,
|
|
IN PVOID SatisfyParameter2
|
|
);
|
|
|
|
typedef struct _OS2_WAIT_BLOCK {
|
|
ULONG Length;
|
|
LIST_ENTRY Link;
|
|
LIST_ENTRY UserLink;
|
|
PVOID WaitParameter;
|
|
POS2_THREAD WaitingThread;
|
|
OS2_WAIT_ROUTINE WaitRoutine;
|
|
OS2_API_MSG WaitReplyMessage;
|
|
} OS2_WAIT_BLOCK, *POS2_WAIT_BLOCK;
|
|
|
|
LIST_ENTRY Os2WaitLists[ MaxWaitReason ];
|
|
|
|
BOOLEAN
|
|
Os2InitializeWait(
|
|
IN OS2_WAIT_ROUTINE WaitRoutine,
|
|
IN POS2_THREAD WaitingThread,
|
|
IN OUT POS2_API_MSG WaitReplyMessage,
|
|
IN PVOID WaitParameter,
|
|
OUT POS2_WAIT_BLOCK *WaitBlockPtr
|
|
);
|
|
|
|
BOOLEAN
|
|
Os2CreateWait(
|
|
IN OS2_WAIT_REASON WaitReason,
|
|
IN OS2_WAIT_ROUTINE WaitRoutine,
|
|
IN POS2_THREAD WaitingThread,
|
|
IN OUT POS2_API_MSG WaitReplyMessage,
|
|
IN PVOID WaitParameter,
|
|
IN PLIST_ENTRY UserLinkListHead OPTIONAL
|
|
);
|
|
|
|
|
|
BOOLEAN
|
|
Os2NotifyWaitBlock(
|
|
IN POS2_WAIT_BLOCK WaitBlock,
|
|
IN OS2_WAIT_REASON WaitReason,
|
|
IN PVOID SatisfyParameter1,
|
|
IN PVOID SatisfyParameter2
|
|
);
|
|
|
|
BOOLEAN
|
|
Os2NotifyWait(
|
|
IN OS2_WAIT_REASON WaitReason,
|
|
IN PVOID SatisfyParameter1,
|
|
IN PVOID SatisfyParameter2
|
|
);
|
|
|
|
VOID
|
|
Os2DestroyWait(
|
|
IN POS2_WAIT_BLOCK WaitBlock
|
|
);
|
|
|
|
//
|
|
// srvque.c
|
|
//
|
|
|
|
NTSTATUS
|
|
Os2InitializeQueues( VOID );
|
|
|
|
typedef struct _OS2_QUEUE_ENTRY {
|
|
LIST_ENTRY Links;
|
|
REQUESTDATA RequestData;
|
|
ULONG EntryId;
|
|
PVOID ElementAddress;
|
|
ULONG ElementLength;
|
|
ULONG Priority;
|
|
} OS2_QUEUE_ENTRY, *POS2_QUEUE_ENTRY;
|
|
|
|
typedef struct _OS2_QUEUE_SEM_BLOCK {
|
|
LIST_ENTRY Links;
|
|
HANDLE NtEvent;
|
|
} OS2_QUEUE_SEM_BLOCK, *POS2_QUEUE_SEM_BLOCK;
|
|
|
|
typedef struct _OS2_QUEUE {
|
|
PID CreatorPid;
|
|
POS2_LOCAL_OBJECT_DIRENT Dirent;
|
|
LONG OpenCount;
|
|
ULONG QueueType;
|
|
ULONG EntryIdCounter;
|
|
LIST_ENTRY Entries;
|
|
LIST_ENTRY Waiters;
|
|
LIST_ENTRY SemBlocks;
|
|
} OS2_QUEUE, *POS2_QUEUE;
|
|
|
|
POR2_QHANDLE_TABLE Os2QueueTable;
|
|
|
|
VOID
|
|
Os2PurgeQueueEntries(
|
|
IN POS2_QUEUE Queue
|
|
);
|
|
|
|
POS2_QUEUE_ENTRY
|
|
Os2LocateQueueEntry(
|
|
IN POS2_QUEUE Queue,
|
|
IN ULONG ReadPosition
|
|
);
|
|
|
|
BOOLEAN
|
|
Os2WaitQueueEntries(
|
|
IN OS2_WAIT_REASON WaitReason,
|
|
IN POS2_THREAD WaitingThread,
|
|
IN POS2_API_MSG WaitReplyMessage,
|
|
IN PVOID WaitParameter,
|
|
IN PVOID SatisfyParameter1,
|
|
IN PVOID SatisfyParameter2
|
|
);
|
|
|
|
POS2_QUEUE
|
|
Os2OpenQueueByHandle(
|
|
IN HQUEUE QueueHandle
|
|
);
|
|
|
|
APIRET
|
|
Os2CloseQueueByHandle(
|
|
IN HQUEUE QueueHandle,
|
|
IN ULONG CloseCount,
|
|
IN PID OwnerPid,
|
|
IN POS2_PROCESS Process
|
|
);
|
|
|
|
APIRET
|
|
Os2WriteQueueByHandle(
|
|
POS2_DOSWRITEQUEUE_MSG a,
|
|
PID ProcessId
|
|
);
|
|
|
|
VOID
|
|
Os2ReadQueueEntry(
|
|
IN POS2_QUEUE_ENTRY QueueEntry,
|
|
OUT POS2_DOSREADQUEUE_MSG ReadMsg
|
|
);
|
|
|
|
VOID
|
|
Os2PeekQueueEntry(
|
|
IN POS2_QUEUE Queue,
|
|
IN POS2_QUEUE_ENTRY QueueEntry,
|
|
OUT POS2_DOSPEEKQUEUE_MSG PeekMsg
|
|
);
|
|
|
|
VOID
|
|
DumpQueueEntry(
|
|
IN PSZ Str,
|
|
IN POS2_QUEUE_ENTRY QueueEntry
|
|
);
|
|
VOID
|
|
Os2QueueWaitCheck(
|
|
POS2_QUEUE Queue
|
|
);
|
|
|
|
VOID
|
|
Os2ProcessSemBlocks(
|
|
IN POS2_QUEUE Queue
|
|
);
|
|
|
|
|
|
BOOLEAN Os2DosCreateQueue( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosOpenQueue( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosCloseQueue( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosPurgeQueue( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosQueryQueue( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosPeekQueue( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosReadQueue( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosWriteQueue( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
|
|
//
|
|
// srvsm.c
|
|
//
|
|
|
|
LIST_ENTRY Os2SessionList;
|
|
|
|
#define OS2_MAX_SESSION 30
|
|
|
|
typedef struct
|
|
{
|
|
LIST_ENTRY Waiters;
|
|
POS2_SESSION Session;
|
|
} SessionTableEntry;
|
|
|
|
SessionTableEntry SessionTable[OS2_MAX_SESSION];
|
|
|
|
POS2_SESSION
|
|
Os2AllocateSession(
|
|
POS2_DOSSTARTSESSION_INFO SessionInfo OPTIONAL,
|
|
ULONG UniqueId,
|
|
PAPIRET ApiRet
|
|
);
|
|
|
|
VOID
|
|
Os2ReferenceSession(
|
|
POS2_SESSION Session
|
|
);
|
|
|
|
POS2_SESSION
|
|
Os2DereferenceSession(
|
|
POS2_SESSION Session,
|
|
POS2_TERMINATEPROCESS_MSG msg,
|
|
BOOLEAN Bailout
|
|
);
|
|
|
|
VOID
|
|
Os2DereferenceSessionByUniqueId(
|
|
ULONG UniqueId,
|
|
POS2_TERMINATEPROCESS_MSG msg,
|
|
BOOLEAN Bailout
|
|
);
|
|
|
|
POS2_SESSION
|
|
Os2GetSessionByUniqueId(
|
|
ULONG UniqueId
|
|
);
|
|
|
|
VOID
|
|
Os2CreateConSessionFail( IN ULONG SessionUniqueId);
|
|
|
|
VOID
|
|
Os2CreateConSessionAccept(IN POS2_SESSION Session);
|
|
|
|
NTSTATUS
|
|
Os2SessionFocusSet(IN OUT PVOID RequestMsg);
|
|
|
|
BOOLEAN Os2DosStartSession( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosSelectSession( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosSetSession( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosStopSession( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosSmSetTitle( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosGetCtrlPortForSessionID( IN POS2_THREAD t, IN POS2_API_MSG m);
|
|
|
|
//
|
|
// srvtask.c
|
|
//
|
|
|
|
VOID
|
|
Os2HandleException(
|
|
IN POS2_PROCESS Process,
|
|
IN PDBGKM_APIMSG ReceiveMsg
|
|
);
|
|
|
|
VOID
|
|
Os2HandleDebugEvent(
|
|
IN POS2_PROCESS Process,
|
|
IN PDBGKM_APIMSG ReceiveMsg
|
|
);
|
|
|
|
BOOLEAN Os2DosCreateThread( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosSuspendThread( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosResumeThread( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosExit( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosExitGP(IN POS2_THREAD t, IN POS2_API_MSG m);
|
|
BOOLEAN Os2DosWaitChild( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosWaitThread( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosEnterCritSec( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosExitCritSec( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosExecPgm( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosKillProcess( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosSetPriority( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosGetPriority( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosGetPPID( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosError( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2InternalTerminateProcess( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2InternalTerminateThread( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosPTrace( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosCloseHandle(IN POS2_THREAD t, IN POS2_API_MSG m);
|
|
#if PMNT
|
|
BOOLEAN PMSetPMshellFlag(IN POS2_THREAD t, IN POS2_API_MSG m);
|
|
#endif
|
|
|
|
BOOLEAN
|
|
Os2WaitDeadThreadSatisfy(
|
|
IN OS2_WAIT_REASON WaitReason,
|
|
IN POS2_THREAD t,
|
|
IN POS2_API_MSG m,
|
|
IN PVOID WaitParameter,
|
|
IN PVOID SatisfyParameter1,
|
|
IN PVOID SatisfyParameter2
|
|
);
|
|
|
|
BOOLEAN
|
|
Os2WaitChildSatisfy(
|
|
IN OS2_WAIT_REASON WaitReason,
|
|
IN POS2_THREAD t,
|
|
IN POS2_API_MSG m,
|
|
IN PVOID WaitParameter,
|
|
IN POS2_PROCESS TerminatingProcess,
|
|
IN PVOID SatisfyParameter2
|
|
);
|
|
|
|
BOOLEAN
|
|
Os2WaitThreadSatisfy(
|
|
IN OS2_WAIT_REASON WaitReason,
|
|
IN POS2_THREAD t,
|
|
IN POS2_API_MSG m,
|
|
IN PVOID WaitParameter,
|
|
IN POS2_THREAD TerminatingThread,
|
|
IN PVOID SatisfyParameter2
|
|
);
|
|
|
|
BOOLEAN
|
|
Os2WaitWinExec(
|
|
IN OS2_WAIT_REASON WaitReason,
|
|
IN POS2_THREAD t,
|
|
IN POS2_API_MSG m,
|
|
IN PVOID WaitParameter,
|
|
IN PID TerminatingProcess,
|
|
IN PVOID SatisfyParameter2
|
|
);
|
|
|
|
APIRET
|
|
Os2CreateProcess(
|
|
IN PVOID RequestMsg OPTIONAL,
|
|
IN POS2_THREAD t,
|
|
POS2_DOSEXECPGM_MSG a,
|
|
POS2_SESSION Session OPTIONAL,
|
|
POS2_THREAD *NewThread
|
|
);
|
|
|
|
//
|
|
// srvxcpt.c
|
|
//
|
|
|
|
BOOLEAN Os2DosSetSignalExceptionFocus( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosEnterMustComplete( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosExitMustComplete( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosSendSignalException( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosAcknowledgeSignalException( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosDispatch16Signal( IN POS2_THREAD t, IN POS2_API_MSG m);
|
|
|
|
BOOLEAN
|
|
Os2DispatchVector(
|
|
IN PDBGKM_APIMSG ReceiveMsg,
|
|
POS2_THREAD Thread,
|
|
CONTEXT Context
|
|
);
|
|
|
|
VOID
|
|
SendSyncPterm(
|
|
IN POS2_THREAD Thread
|
|
);
|
|
|
|
VOID
|
|
SendAsyncPterm(
|
|
IN POS2_THREAD Thread
|
|
);
|
|
|
|
APIRET
|
|
Os2IssueSignal(
|
|
IN POS2_PROCESS Process,
|
|
IN int Signal
|
|
);
|
|
|
|
VOID
|
|
Os2IssueSignalTree(
|
|
IN POS2_PROCESS RootProcess,
|
|
IN int Signal
|
|
);
|
|
|
|
BOOLEAN Os2DosRegisterCtrlHandler( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
|
|
VOID Os2DeRegisterCtrlHandler(IN POS2_PROCESS Process);
|
|
|
|
//
|
|
// srvvm.c
|
|
//
|
|
|
|
typedef struct _OS2_SHARED_MEMORY_OBJECT {
|
|
LIST_ENTRY Link;
|
|
ULONG RefCount;
|
|
PVOID BaseAddress;
|
|
ULONG Index;
|
|
ULONG RegionSize;
|
|
HANDLE SectionHandle;
|
|
ULONG AllocationFlags;
|
|
STRING SectionName;
|
|
BOOLEAN IsHuge;
|
|
ULONG MaxSegments;
|
|
ULONG NumOfSegments;
|
|
ULONG SizeOfPartialSeg;
|
|
BOOLEAN Sizeable;
|
|
} OS2_SHARED_MEMORY_OBJECT, *POS2_SHARED_MEMORY_OBJECT;
|
|
|
|
LIST_ENTRY Os2SharedMemoryList;
|
|
|
|
//
|
|
// A linked list of all the shared memory objects that a process currently
|
|
// has open.
|
|
//
|
|
|
|
typedef struct _OS2_SHARED_MEMORY_PROCESS_REF {
|
|
LIST_ENTRY Link;
|
|
ULONG RefCount;
|
|
ULONG AllocationFlags;
|
|
POS2_SHARED_MEMORY_OBJECT SharedMemoryObject;
|
|
} OS2_SHARED_MEMORY_PROCESS_REF, *POS2_SHARED_MEMORY_PROCESS_REF;
|
|
|
|
|
|
NTSTATUS
|
|
Os2InitializeMemory( VOID );
|
|
|
|
|
|
POS2_SHARED_MEMORY_OBJECT
|
|
Os2CreateSharedMemoryObject(
|
|
IN POS2_API_MSG m,
|
|
IN PVOID BaseAddress,
|
|
IN ULONG Index,
|
|
IN ULONG RegionSize,
|
|
IN HANDLE SectionHandle OPTIONAL,
|
|
IN ULONG AllocationFlags,
|
|
IN PSTRING SectionName
|
|
);
|
|
|
|
|
|
VOID
|
|
Os2FreeSharedMemoryObject(
|
|
POS2_SHARED_MEMORY_OBJECT MemoryObject
|
|
);
|
|
|
|
|
|
POS2_SHARED_MEMORY_PROCESS_REF
|
|
Os2CreateProcessRefToSharedMemory(
|
|
IN POS2_PROCESS Process,
|
|
IN POS2_SHARED_MEMORY_OBJECT MemoryObject
|
|
);
|
|
|
|
|
|
BOOLEAN
|
|
Os2FreeProcessRefToSharedMemory(
|
|
IN POS2_PROCESS Process,
|
|
IN POS2_SHARED_MEMORY_PROCESS_REF MemoryProcessRef
|
|
);
|
|
|
|
|
|
VOID
|
|
Os2FreeAllSharedMemoryForProcess(
|
|
IN POS2_PROCESS Process
|
|
);
|
|
|
|
|
|
POS2_SHARED_MEMORY_OBJECT
|
|
Os2FindSharedMemoryObject(
|
|
IN PVOID BaseAddress,
|
|
IN POS2_PROCESS Process
|
|
);
|
|
|
|
|
|
APIRET
|
|
Os2MapViewOfSharedMemoryObject(
|
|
POS2_SHARED_MEMORY_OBJECT MemoryObject,
|
|
POS2_PROCESS Process,
|
|
BOOLEAN ProcessIsSelf,
|
|
ULONG RequiredAccess,
|
|
ULONG PageProtection
|
|
);
|
|
|
|
BOOLEAN Os2DosFreeMem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosSetMem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosGiveSharedMem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosGetSharedMem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosGetNamedSharedMem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosAllocSharedMem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2InternalQueryVirtualMemory( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2InternalMarkSharedMemAsHuge( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosReallocSharedMem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2InternalReallocSharedHuge( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosGetSeg( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosGiveSeg( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosGetShrSeg( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
|
|
//
|
|
// srvfile.c
|
|
//
|
|
|
|
BOOLEAN Os2InternalCopyHandleTable( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2InternalDeviceShare( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
|
|
APIRET
|
|
InitializeFileSystemForExec(
|
|
IN POS2_FILE_SYSTEM_PARAMETERS FileSystemParameters,
|
|
IN HANDLE ParentProcessHandle, // NT process handle
|
|
IN HANDLE ChildProcessHandle, // NT process handle
|
|
POS2_PROCESS ParentProcess, // OS/2 parent process
|
|
POS2_PROCESS ChildProcess, // OS/2 child process
|
|
IN POS2_DOSEXECPGM_MSG pExecPgmMsg
|
|
);
|
|
|
|
VOID
|
|
InitializeFileSystemForSesMgr(
|
|
IN POS2_PROCESS Process // OS/2 process
|
|
);
|
|
|
|
APIRET
|
|
InitializeFileSystemForChildSesMgr(
|
|
IN POS2_FILE_SYSTEM_PARAMETERS FileSystemParameters,
|
|
IN HANDLE ParentProcessHandle, // NT process handle
|
|
IN HANDLE ChildProcessHandle, // NT process handle
|
|
POS2_PROCESS ParentProcess, // OS/2 parent process
|
|
POS2_PROCESS ChildProcess, // OS/2 child process
|
|
IN POS2_DOSEXECPGM_MSG pExecPgmMsg
|
|
);
|
|
|
|
//
|
|
// srvwin.c
|
|
//
|
|
|
|
ULONG
|
|
Os2AccessGPPopup(
|
|
IN ULONG CS,
|
|
IN ULONG IP,
|
|
IN ULONG AX,
|
|
IN ULONG BX,
|
|
IN ULONG CX,
|
|
IN ULONG DX,
|
|
IN ULONG SI,
|
|
IN ULONG DI,
|
|
IN ULONG BP,
|
|
IN ULONG SP,
|
|
IN ULONG SS,
|
|
IN ULONG DS,
|
|
IN ULONG ES,
|
|
IN PUCHAR AppName
|
|
);
|
|
|
|
ULONG
|
|
Os2ApiGPPopup(
|
|
IN PUCHAR AppName,
|
|
IN PUCHAR Text
|
|
);
|
|
|
|
extern HANDLE Os2hOs2SrvInstance; // for resouces
|
|
|
|
//
|
|
// srvsem.c
|
|
//
|
|
|
|
NTSTATUS
|
|
Os2InitializeSemaphores( VOID );
|
|
|
|
BOOLEAN
|
|
Os2SemaphoreCreateProcedure(
|
|
IN POS2_SEMAPHORE Semaphore,
|
|
IN POS2_SEMAPHORE CreateSemaphore
|
|
);
|
|
|
|
BOOLEAN
|
|
Os2SemaphoreOpenProcedure(
|
|
IN POS2_SEMAPHORE Semaphore,
|
|
IN POS2_SEMAPHORE OpenSemaphore
|
|
);
|
|
|
|
APIRET
|
|
Os2ProcessSemaphoreName(
|
|
IN PSTRING ObjectName,
|
|
IN POS2_SEMAPHORE Semaphore OPTIONAL,
|
|
OUT PULONG ExistingHandleIndex OPTIONAL
|
|
);
|
|
|
|
PVOID
|
|
Os2DestroySemaphore(
|
|
IN POS2_SEMAPHORE Semaphore,
|
|
IN ULONG HandleIndex
|
|
);
|
|
|
|
POS2_SEMAPHORE
|
|
Os2ReferenceSemaphore(
|
|
IN POS2_SEMAPHORE Semaphore
|
|
);
|
|
|
|
VOID
|
|
Os2DereferenceSemaphore(
|
|
IN POS2_SEMAPHORE Semaphore
|
|
);
|
|
|
|
VOID
|
|
Os2ThreadWaitingOnSemaphore(
|
|
IN POS2_THREAD t,
|
|
IN POS2_SEMAPHORE Semaphore,
|
|
IN BOOLEAN AboutToWait
|
|
);
|
|
|
|
|
|
#if DBG
|
|
|
|
VOID
|
|
Os2SemaphoreDumpProcedure(
|
|
IN POS2_SEMAPHORE Semaphore,
|
|
IN ULONG HandleIndex,
|
|
IN PVOID DumpParameter
|
|
);
|
|
|
|
VOID
|
|
Os2DumpSemaphoreTable(
|
|
IN PCHAR Title
|
|
);
|
|
|
|
#endif // DBG
|
|
|
|
|
|
//
|
|
// srvevent.c
|
|
//
|
|
|
|
BOOLEAN Os2DosCreateEventSem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosOpenEventSem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosCloseEventSem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
|
|
|
|
//
|
|
// srvmutex.c
|
|
//
|
|
|
|
BOOLEAN Os2DosCreateMutexSem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosOpenMutexSem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosCloseMutexSem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
|
|
|
|
//
|
|
// srvmuxwt.c
|
|
//
|
|
|
|
APIRET
|
|
Os2AddMuxWait(
|
|
IN POS2_MUXWAIT_SEMAPHORE MuxWait,
|
|
IN PSEMRECORD MuxWaitEntry
|
|
);
|
|
|
|
APIRET
|
|
Os2DeleteMuxWait(
|
|
IN POS2_MUXWAIT_SEMAPHORE MuxWait,
|
|
IN ULONG MuxWaitEntryIndex,
|
|
IN ULONG SemHandleIndex OPTIONAL
|
|
);
|
|
|
|
BOOLEAN Os2DosCreateMuxWaitSem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosOpenMuxWaitSem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosCloseMuxWaitSem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosWaitMuxWaitSem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosAddMuxWaitSem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosDeleteMuxWaitSem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2InternalAlertMuxWaiter( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN Os2DosQueryMuxWaitSem( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
|
|
//
|
|
// loader routines
|
|
//
|
|
|
|
BOOLEAN LDRNewExe( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN LDRUnloadExe( IN POS2_PROCESS Process );
|
|
BOOLEAN LDRDosLoadModule( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN LDRDosFreeModule( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN LDRDosGetModName( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN LDRDosGetModHandle( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN LDRDosGetProcAddr( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN LDRDosQAppType( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN LDRDosGetResource( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN LDRDosGetResource2( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN LDRDosFreeResource( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
#if PMNT
|
|
BOOLEAN LDRIdentifyCodeSelector( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
BOOLEAN LDRDumpSegments( IN POS2_THREAD t, IN POS2_API_MSG m );
|
|
#endif
|
|
|
|
BOOLEAN LDRModifySizeOfSharedSegment( IN POS2_THREAD t, IN ULONG Sel, IN ULONG NewLimit );
|
|
|
|
//
|
|
// LinkMTE is used for saving all the mte's of a process
|
|
// in a linked list.
|
|
//
|
|
|
|
typedef struct _LinkMTE {
|
|
USHORT MTE;
|
|
struct _LinkMTE *NextMTE;
|
|
USHORT NeedToTransfer; // used as counter for mtes
|
|
// and for flag for DosPtrace
|
|
} LinkMTE;
|
|
|
|
|
|
//
|
|
// xtlexec.c
|
|
//
|
|
|
|
NTSTATUS
|
|
XtlCreateUserProcess(
|
|
IN PSTRING NtImagePathName,
|
|
IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters,
|
|
IN PSECURITY_DESCRIPTOR ProcessSecurityDescriptor OPTIONAL,
|
|
IN PSECURITY_DESCRIPTOR ThreadSecurityDescriptor OPTIONAL,
|
|
IN HANDLE ParentProcess OPTIONAL,
|
|
IN BOOLEAN InheritHandles,
|
|
IN HANDLE DebugPort OPTIONAL,
|
|
IN HANDLE ExceptionPort OPTIONAL,
|
|
OUT PRTL_USER_PROCESS_INFORMATION ProcessInformation
|
|
);
|
|
|
|
NTSTATUS
|
|
Os2WinCreateProcess (POS2_DOSEXECPGM_MSG a,
|
|
POS2_PROCESS ParentProcess,
|
|
POS2_SESSION Session,
|
|
PHANDLE pHandle
|
|
);
|
|
|
|
NTSTATUS
|
|
Os2WinRunProcess (IN HANDLE tHandle,
|
|
IN POS2_SESSION Session
|
|
);
|
|
|
|
//
|
|
// srvdebug.c
|
|
//
|
|
|
|
NTSTATUS
|
|
Os2UiLookup(PCLIENT_ID AppClientId,
|
|
PCLIENT_ID DebugUiClientId);
|
|
|
|
NTSTATUS
|
|
Os2CheckStopDebugThread(
|
|
IN PVOID Parameter
|
|
);
|
|
|
|
//
|
|
// exception handling structures and equates
|
|
//
|
|
|
|
#define MAXIMUM_MUST_COMPLETE 0xFFFF // maximum must complete nesting
|
|
|
|
#define SIG_MAXSF 0xFFFF // maximum signal focus nesting
|
|
|
|
|
|
// Signal numbers
|
|
// these are also defined in os2dll.h, so if the values change be sure
|
|
// to change them there
|
|
|
|
#define SIGNAL_TO_FLAG(Signal) (1 << (Signal - 1))
|
|
|
|
#define SIGAPTERM 8 // Asynchronous PTERM
|
|
#define SIGPTERM 9 // Synchronous PTERM
|
|
|
|
// Signal flags
|
|
|
|
#define SIGINTRF (1 << (XCPT_SIG_INTR - 1)) // Ctrl-C
|
|
#define SIGTERMF (1 << (XCPT_SIG_KILLPROC - 1)) // program termination
|
|
#define SIGBREAKF (1 << (XCPT_SIG_BREAK - 1)) // Ctrl-Break
|
|
#define SIGAPTERMF (1 << (SIGAPTERM - 1)) // Asyncronous PTERM
|
|
|
|
// Error flags
|
|
// Similar flags are defined in os2dll.h as OD2_ENABLE_ ...
|
|
|
|
#define OS2_ENABLE_HARD_ERROR_POPUP 0x1
|
|
#define OS2_ENABLE_ACCESS_VIO_POPUP 0x2
|
|
|
|
/* Fix for a C8 compilation warning */
|
|
#undef TRUE
|
|
#define TRUE (BOOLEAN)1
|
|
|
|
#undef FALSE
|
|
#define FALSE (BOOLEAN)0
|
|
|
|
/* Global Information Segment */
|
|
|
|
typedef struct _GINFOSEG { /* gis */
|
|
ULONG time;
|
|
ULONG msecs;
|
|
UCHAR hour;
|
|
UCHAR minutes;
|
|
UCHAR seconds;
|
|
UCHAR hundredths;
|
|
USHORT timezone;
|
|
USHORT cusecTimerInterval;
|
|
UCHAR day;
|
|
UCHAR month;
|
|
USHORT year;
|
|
UCHAR weekday;
|
|
UCHAR uchMajorVersion;
|
|
UCHAR uchMinorVersion;
|
|
UCHAR chRevisionLetter;
|
|
UCHAR sgCurrent;
|
|
UCHAR sgMax;
|
|
UCHAR cHugeShift;
|
|
UCHAR fProtectModeOnly;
|
|
USHORT pidForeground;
|
|
UCHAR fDynamicSched;
|
|
UCHAR csecMaxWait;
|
|
USHORT cmsecMinSlice;
|
|
USHORT cmsecMaxSlice;
|
|
USHORT bootdrive;
|
|
UCHAR amecRAS[32];
|
|
UCHAR csgWindowableVioMax;
|
|
UCHAR csgPMMax;
|
|
} GINFOSEG;
|
|
|
|
|