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.
1202 lines
24 KiB
1202 lines
24 KiB
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
os2dll.h
|
|
|
|
Abstract:
|
|
|
|
Main include file for OS/2 Subsystem Client DLL
|
|
|
|
Author:
|
|
|
|
Steve Wood (stevewo) 22-Aug-1989
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
//
|
|
// Include OS/2 SubSystem Runtime Definitions. Includes NT Definitions
|
|
// OS/2 V2.0 Definitions and Debug definitions.
|
|
//
|
|
|
|
#include "os2ssrtl.h"
|
|
|
|
#if DBG
|
|
extern ULONG Os2Debug;
|
|
#endif
|
|
|
|
//
|
|
// Include definitions of API Calls exported by the OS/2 Subsystem Server
|
|
// (i.e. the stub procedure definitions).
|
|
//
|
|
#include "dllfile.h"
|
|
#include "os2ssmsg.h"
|
|
|
|
|
|
//
|
|
// Common Types and Definitions
|
|
//
|
|
|
|
//
|
|
// OD2_HEAP_MEMORY_SIZE defines how much address space should be
|
|
// reserved for the OS/2 Client heap. This heap is used to store all
|
|
// data structures maintained by the OS/2 Client DLL.
|
|
//
|
|
|
|
#define OD2_HEAP_MEMORY_SIZE (64*1024)
|
|
|
|
|
|
//
|
|
// OD2_PORT_MEMORY_SIZE defines how much address space should be
|
|
// reserved for passing data to the OS/2 Server. The memory is visible
|
|
// to both the client and server processes.
|
|
//
|
|
|
|
#define OD2_PORT_MEMORY_SIZE 0x10000
|
|
|
|
|
|
//
|
|
// OD2_SEMAPHORE and its related types are the client represenation of OS/2
|
|
// shared semaphores and the entire representation of private OS/2 semaphores.
|
|
//
|
|
|
|
typedef enum _OD2_SEMAPHORE_TYPE {
|
|
Od2EventSem = 1,
|
|
Od2MutexSem,
|
|
Od2MuxWaitSem
|
|
} OD2_SEMAPHORE_TYPE;
|
|
|
|
typedef struct _OD2_MUTEX_SEMAPHORE {
|
|
HANDLE MutantHandle;
|
|
ULONG OwnerRequestLevel;
|
|
TID OwnerTid;
|
|
} OD2_MUTEX_SEMAPHORE, *POD2_MUTEX_SEMAPHORE;
|
|
|
|
typedef struct _OD2_MUXWAIT_RECORD {
|
|
HSEM SemHandle;
|
|
ULONG UserKey;
|
|
struct _OD2_SEMAPHORE *Semaphore;
|
|
} OD2_MUXWAIT_RECORD, *POD2_MUXWAIT_RECORD;
|
|
|
|
typedef struct _OD2_MUXWAIT_SEMAPHORE {
|
|
USHORT CountMuxWaitRecords;
|
|
USHORT Type : 2;
|
|
USHORT WaitAll : 1;
|
|
USHORT Reserved : 13;
|
|
OD2_MUXWAIT_RECORD MuxWaitRecords[ DCMW_MAX_SEMRECORDS ];
|
|
} OD2_MUXWAIT_SEMAPHORE, *POD2_MUXWAIT_SEMAPHORE;
|
|
|
|
typedef struct _OD2_SEMAPHORE {
|
|
USHORT PointerCount : 13;
|
|
USHORT Type : 2;
|
|
USHORT Shared : 1;
|
|
USHORT OpenCount;
|
|
union {
|
|
PVOID Value;
|
|
HANDLE EventHandle;
|
|
POD2_MUTEX_SEMAPHORE Mutex;
|
|
POD2_MUXWAIT_SEMAPHORE MuxWait;
|
|
} u;
|
|
} OD2_SEMAPHORE, *POD2_SEMAPHORE;
|
|
|
|
typedef struct _OD2_QUEUE {
|
|
ULONG OpenCount;
|
|
PID OwnerProcessId;
|
|
} OD2_QUEUE, *POD2_QUEUE;
|
|
|
|
//
|
|
// The OD2_PROCESS and OD2_THREAD data structures describe the OS/2 Client
|
|
// process. Both data structures are allocated from the Od2Heap.
|
|
//
|
|
|
|
typedef struct _OD2_PROCESS {
|
|
HANDLE TaskLock;
|
|
RTL_RESOURCE FileLock;
|
|
LIST_ENTRY ThreadList;
|
|
LIST_ENTRY ExitList;
|
|
RESULTCODES ResultCodes; // Valid if PS_EXITLIST is set in Pib.Status
|
|
ULONG ErrorAction;
|
|
ULONG VerifyFlag;
|
|
ULONG MaximumFileHandles;
|
|
ULONG DefaultDisk;
|
|
BOOLEAN BoundApp;
|
|
POR2_HANDLE_TABLE PrivateSemaphoreTable;
|
|
POR2_HANDLE_TABLE SharedSemaphoreTable;
|
|
POR2_QHANDLE_TABLE QueueTable;
|
|
LIST_ENTRY MsgFileList;
|
|
UCHAR ApplName[OS2_PROCESS_MAX_APPL_NAME];
|
|
PIB Pib; // Make this the last field in the
|
|
// the structure so client cant inadvertantly
|
|
// muck with the other fields in OD2_PROCESS
|
|
} OD2_PROCESS, *POD2_PROCESS;
|
|
|
|
|
|
|
|
|
|
#define OD2_ENABLE_HARD_ERROR_POPUP 0x1
|
|
#define OD2_ENABLE_ACCESS_VIO_POPUP 0x2
|
|
|
|
typedef struct _OD2_THREAD {
|
|
LIST_ENTRY Link;
|
|
PFNTHREAD StartAddress; // Used to pass startup information
|
|
ULONG Parameter; // ... to Od2UserThreadStartup
|
|
POD2_SEMAPHORE WaitingForSemaphore;
|
|
ULONG Saved32Esp;
|
|
ULONG ApiIndex;
|
|
HANDLE ThreadHandle;
|
|
HANDLE Event; // DosCreateThread use this event to get
|
|
// notification from the thread that it has
|
|
// be created and initialized
|
|
// DosSuspendThread use it to suspend thread in
|
|
// 32 bit
|
|
ULONG Flags; // Parameter of DosCreateThread
|
|
APIRET rc; // Return code of the thread during startup
|
|
// to DosCreateThread
|
|
OS2_TIB Os2Tib; // OS2 specific part of the TIB
|
|
// (subsystem portable part is in TEB)
|
|
// Make this the last field in the
|
|
// the structure so client can't inadvertantly
|
|
// muck with the other fields in OD2_THREAD
|
|
} OD2_THREAD, *POD2_THREAD;
|
|
|
|
|
|
typedef struct _OS2_EXITLISTENTRY {
|
|
LIST_ENTRY Link;
|
|
ULONG Order;
|
|
PFNEXITLIST ExitRoutine;
|
|
ULONG flag;
|
|
} OD2_EXITLISTENTRY, *POS2_EXITLISTENTRY;
|
|
|
|
typedef struct _OD2_CONTEXT_SAVE_AREA {
|
|
LOCALINFOSEG TebBlock;
|
|
ULONG Saved16Stack;
|
|
BOOLEAN SignalHandlingInProgress;
|
|
USHORT SegEs;
|
|
USHORT SegDs;
|
|
} OD2_CONTEXT_SAVE_AREA, *POD2_CONTEXT_SAVE_AREA;
|
|
|
|
#define Od2CurrentThreadId() \
|
|
( \
|
|
((POD2_THREAD)(NtCurrentTeb()->EnvironmentPointer)) ? \
|
|
(((POD2_THREAD)(NtCurrentTeb()->EnvironmentPointer))->Os2Tib.ThreadId) : \
|
|
0 \
|
|
)
|
|
|
|
|
|
//
|
|
// The Lock field in an OS/2 Process object protects the fields of the process
|
|
// data structure. This includes the list of thread objects attached
|
|
// to the process object and the list of exit procedures.
|
|
//
|
|
//
|
|
// If the process is dieing, and there is only thread 1, there is no
|
|
// need for the lock, and we should not try it incase we terminated
|
|
// a thread inside (Acquire .. Release) block.
|
|
//
|
|
/*
|
|
#define AcquireTaskLock() \
|
|
if ((!Od2SigHandlingInProgress) || ((Od2CurrentThreadId()) != 1)) \
|
|
RtlEnterCriticalSection( &Od2Process->TaskLock )
|
|
#define ReleaseTaskLock() \
|
|
if ((!Od2SigHandlingInProgress) || ((Od2CurrentThreadId()) != 1)) \
|
|
RtlLeaveCriticalSection( &Od2Process->TaskLock )
|
|
*/
|
|
|
|
NTSTATUS AcquireTaskLock(VOID);
|
|
NTSTATUS ReleaseTaskLock(VOID);
|
|
|
|
#if DBG
|
|
//
|
|
// dllutil.c
|
|
//
|
|
|
|
VOID
|
|
AcquireFileLockShared(
|
|
IN PSZ CallingRoutine
|
|
);
|
|
|
|
VOID
|
|
ReleaseFileLockShared(
|
|
IN PSZ CallingRoutine
|
|
);
|
|
|
|
VOID
|
|
PromoteFileLocktoExclusive(
|
|
IN PSZ CallingRoutine
|
|
);
|
|
|
|
VOID
|
|
AcquireFileLockExclusive(
|
|
IN PSZ CallingRoutine
|
|
);
|
|
|
|
VOID
|
|
ReleaseFileLockExclusive(
|
|
IN PSZ CallingRoutine
|
|
);
|
|
|
|
#else
|
|
#define PromoteFileLocktoExclusive(x) RtlConvertSharedToExclusive( &Od2Process->FileLock )
|
|
|
|
VOID
|
|
AcquireFileLockShared( VOID );
|
|
|
|
VOID
|
|
ReleaseFileLockShared( VOID );
|
|
|
|
VOID
|
|
AcquireFileLockExclusive( VOID );
|
|
|
|
VOID
|
|
ReleaseFileLockExclusive( VOID );
|
|
|
|
#endif
|
|
|
|
//
|
|
// Global data accessed by Client DLL
|
|
//
|
|
|
|
//
|
|
// dllnls.c
|
|
//
|
|
|
|
#define Od2ProcessCodePage Or2ProcessCodePage
|
|
#define Od2CurrentCodePageIsOem Or2CurrentCodePageIsOem
|
|
|
|
#define Od2InitMBString Or2InitMBString
|
|
#define Od2MBStringToUnicodeString Or2MBStringToUnicodeString
|
|
#define Od2CreateUnicodeStringFromMBz Or2CreateUnicodeStringFromMBz
|
|
#define Od2UnicodeStringToMBString Or2UnicodeStringToMBString
|
|
#define Od2FreeMBString Or2FreeMBString
|
|
|
|
//
|
|
// The Od2NtSysInfo global variable contains NT specific constants of
|
|
// interest, such as page size, allocation granularity, etc. It is filled
|
|
// in once during process initialization.
|
|
//
|
|
|
|
extern SYSTEM_BASIC_INFORMATION Od2NtSysInfo;
|
|
|
|
#define ROUND_UP_TO_PAGES(SIZE) (((ULONG)(SIZE) + Od2NtSysInfo.PageSize - 1) & ~(Od2NtSysInfo.PageSize - 1))
|
|
#define ROUND_DOWN_TO_PAGES(SIZE) (((ULONG)(SIZE)) & ~(Od2NtSysInfo.PageSize - 1))
|
|
|
|
//
|
|
// The Od2DebugFlag is non-zero if the OS/2 Client Application was invoked
|
|
// with the Debug option.
|
|
//
|
|
|
|
extern ULONG Od2DebugFlag;
|
|
|
|
|
|
//
|
|
// The Od2Heap global variable describes a single heap used by the Client DLL
|
|
// for process wide storage management. The process data structure, thread
|
|
// data structures, file handle table, current directory structures, etc. are
|
|
// all allocated out of this heap.
|
|
//
|
|
|
|
extern PVOID Od2Heap;
|
|
|
|
|
|
//
|
|
// The Od2Environment variable points to a block of memory that contains the
|
|
// OS/2 Environment block. Od2EnvSize describes how much virtual address space
|
|
// is reserved at this location.
|
|
//
|
|
|
|
extern PVOID Od2Environment;
|
|
extern ULONG Od2EnvSize;
|
|
|
|
|
|
//
|
|
// The Od2BootDrive and Od2SystemDrive define the meaning of \BootDevice and
|
|
// \SystemDisk respectively.
|
|
//
|
|
|
|
extern ULONG Od2BootDrive;
|
|
extern ULONG Od2SystemDrive;
|
|
|
|
|
|
//
|
|
// The connection to the OS/2 Emulation Subsystem is described by the
|
|
// Od2PortHandle global variable. The connection is established during
|
|
// process initialization by Od2ProcessStartup.
|
|
//
|
|
|
|
extern HANDLE Od2PortHandle;
|
|
|
|
|
|
//
|
|
// In order to pass large arguments to the OS/2 Emulation Subsystem (e.g.
|
|
// path name arguments) the Od2PortHeap global variable describes a
|
|
// heap that is visible to both the OS/2 Client process and the OS/2
|
|
// Emulation Subsystem.
|
|
//
|
|
|
|
extern PVOID Od2PortHeap;
|
|
extern ULONG Od2PortMemoryRemoteDelta;
|
|
|
|
//
|
|
// The Od2Process global variable points to the OD2_PROCESS structure for
|
|
// the client process. It is allocated out of Od2Heap.
|
|
//
|
|
|
|
extern POD2_PROCESS Od2Process;
|
|
|
|
|
|
//
|
|
// The Od2Thread1 global variable points to the first thread structure for
|
|
// the client process. It is allocated out of Od2Heap.
|
|
//
|
|
|
|
extern POD2_THREAD Od2Thread1;
|
|
|
|
|
|
//
|
|
// The Od2DllHandle global variable contains the DLL handle for the OS2DLL
|
|
// client stubs executable.
|
|
//
|
|
|
|
extern HMODULE Od2DllHandle;
|
|
|
|
|
|
//
|
|
// The Od2DeviceDirecotory global variable contains the handle to the
|
|
// \OS2SS\DEVICES directory in the object name space.
|
|
//
|
|
|
|
extern HANDLE Od2DeviceDirectory;
|
|
|
|
//
|
|
// Od2NtLibPath replaces what in Os2 1.X is kept in the kernel
|
|
// The DLl get's it from the subsystem
|
|
//
|
|
extern PSZ Od2NtLibPath;
|
|
extern USHORT Od2NtLibPathLength;
|
|
|
|
//
|
|
// Od2LibPath holds the search path for the loader to load
|
|
// the OS/2 specific DLLs. This search path may be different than the
|
|
// NT LibPath since some OS/2 thunk DLLs conflict in name with NT DLLs
|
|
// (like netapi.dll)
|
|
//
|
|
extern PSZ Od2LibPath;
|
|
extern USHORT Od2LibPathLength;
|
|
|
|
//
|
|
//
|
|
// Od2DllInitialize does the OS/2 Client DLL initialization of all of
|
|
// the above global variables. It is a DLL Initialization routine.
|
|
//
|
|
|
|
BOOLEAN
|
|
Od2DllInitialize(
|
|
IN PVOID DllHandle,
|
|
IN ULONG Reason,
|
|
IN PCONTEXT Context OPTIONAL
|
|
);
|
|
|
|
|
|
//
|
|
//
|
|
// Od2ProcessStartup is the modified start address for OS/2 applications.
|
|
// The DLL Initialization procedure makes this the new start address if
|
|
// it successfully initializes the client process. This function in turns
|
|
// calls the application entry point with the OS/2 defined process startup
|
|
// parameters.
|
|
//
|
|
|
|
VOID
|
|
Od2ProcessStartup(
|
|
IN PPEB Peb
|
|
);
|
|
|
|
|
|
//
|
|
// The Od2InitializeTask procedure is called by the Od2ProcessStartup code
|
|
// to initialize the tasking component of the OS/2 Client DLL.
|
|
//
|
|
|
|
NTSTATUS
|
|
Od2InitializeTask( VOID );
|
|
|
|
|
|
NTSTATUS
|
|
Od2InitializeThread(
|
|
IN POD2_THREAD Thread
|
|
);
|
|
|
|
|
|
VOID
|
|
Od2UserThreadStartup(
|
|
IN POD2_THREAD Thread
|
|
);
|
|
|
|
//
|
|
// Common Exec Message formatter used by DosExecPgm and DosStartSession
|
|
//
|
|
|
|
APIRET
|
|
Od2FormatExecPgmMessage(
|
|
OUT POS2_DOSEXECPGM_MSG a,
|
|
OUT POS2_CAPTURE_HEADER *CaptureBuffer,
|
|
OUT PNTSTATUS Od2IsConsoleTypeReturnStatus,
|
|
#if PMNT
|
|
OUT PULONG IsPMApp,
|
|
#endif // PMNT
|
|
IN PSZ ErrorText,
|
|
IN LONG MaximumErrorTextLength,
|
|
IN ULONG Flags,
|
|
IN OUT PSZ *VariablesBuffer,
|
|
IN OUT PSZ *ArgumentBuffer,
|
|
IN PSZ *ImageFileName
|
|
);
|
|
|
|
NTSTATUS
|
|
Od2IsFileConsoleType(
|
|
PSTRING NtImagePathName
|
|
#if PMNT
|
|
,
|
|
PULONG IsPMApp
|
|
#endif // PMNT
|
|
);
|
|
|
|
//
|
|
// routines defined in dllinit.c
|
|
//
|
|
|
|
extern PUCHAR Od2SystemRoot;
|
|
|
|
ULONG
|
|
Od2ProcessException(
|
|
IN PEXCEPTION_POINTERS ExceptionInfo,
|
|
OUT PEXCEPTION_RECORD ExceptionRecord
|
|
);
|
|
|
|
VOID
|
|
Od2ExceptionHandler(
|
|
IN PEXCEPTION_RECORD ExceptionRecord
|
|
);
|
|
|
|
//
|
|
// Routines defined in dllsem.c
|
|
//
|
|
|
|
//
|
|
// The following bit masks define the fields within a 32 bit semaphore
|
|
// handle.
|
|
//
|
|
|
|
#define SEM_SHARED 0x80000000
|
|
#define SEM_HANDLESIG 0x00010000 // 32-bit handle signature
|
|
#define SEM_SIGBITS 0x7FFF0000 // Isolates 32-bit signature bits
|
|
#define SEM_INDEX 0x0000FFFF
|
|
|
|
APIRET
|
|
Od2CaptureSemaphoreName(
|
|
IN PSZ ObjectName,
|
|
IN ULONG ExtraCaptureBufferLength OPTIONAL,
|
|
OUT POS2_CAPTURE_HEADER *CaptureBuffer,
|
|
OUT PSTRING CapturedObjectName
|
|
);
|
|
|
|
|
|
POR2_HANDLE_TABLE
|
|
Od2GetSemaphoreTable(
|
|
BOOLEAN SharedSem,
|
|
BOOLEAN CreateOkay
|
|
);
|
|
|
|
|
|
HSEM
|
|
Od2ConstructSemaphoreHandle(
|
|
IN BOOLEAN SharedSem,
|
|
IN ULONG Index
|
|
);
|
|
|
|
|
|
APIRET
|
|
Od2ValidateSemaphoreHandle(
|
|
IN HSEM SemaphoreHandle,
|
|
OUT PBOOLEAN SharedSem,
|
|
OUT PULONG Index
|
|
);
|
|
|
|
POD2_SEMAPHORE
|
|
Od2ReferenceSemaphore(
|
|
IN POD2_SEMAPHORE Semaphore
|
|
);
|
|
|
|
VOID
|
|
Od2DereferenceSemaphore(
|
|
IN POD2_SEMAPHORE Semaphore
|
|
);
|
|
|
|
VOID
|
|
Od2ThreadWaitingOnSemaphore(
|
|
IN POR2_HANDLE_TABLE SemaphoreTable,
|
|
IN POD2_SEMAPHORE Semaphore,
|
|
IN BOOLEAN AboutToWait
|
|
);
|
|
|
|
POD2_THREAD
|
|
Od2SearchForWaitingThread(
|
|
IN POD2_SEMAPHORE Semaphore
|
|
);
|
|
|
|
VOID
|
|
Od2SemaphoreDestroyProcedure(
|
|
IN POD2_SEMAPHORE Semaphore,
|
|
IN ULONG HandleIndex
|
|
);
|
|
|
|
VOID
|
|
Od2CloseAllSemaphores( VOID );
|
|
|
|
|
|
#if DBG
|
|
|
|
VOID
|
|
Od2SemaphoreDumpProcedure(
|
|
IN POD2_SEMAPHORE Semaphore,
|
|
IN ULONG HandleIndex,
|
|
IN PVOID DumpParameter
|
|
);
|
|
|
|
VOID
|
|
Od2DumpAllSemaphores(
|
|
IN PCHAR Title
|
|
);
|
|
|
|
#endif // DBG
|
|
|
|
|
|
//
|
|
// Routines defined in dllmuxwt.c
|
|
//
|
|
|
|
APIRET
|
|
Od2AddMuxWait(
|
|
IN POD2_MUXWAIT_SEMAPHORE MuxWait,
|
|
IN PSEMRECORD MuxWaitEntry
|
|
);
|
|
|
|
|
|
APIRET
|
|
Od2DeleteMuxWait(
|
|
IN POD2_MUXWAIT_SEMAPHORE MuxWait,
|
|
IN ULONG MuxWaitEntryIndex,
|
|
IN HSEM MuxWaitEntrySem OPTIONAL
|
|
);
|
|
|
|
|
|
//
|
|
// Routines defined in dlltimer.c
|
|
//
|
|
|
|
NTSTATUS
|
|
Od2InitializeTimers(VOID);
|
|
|
|
VOID
|
|
Od2CloseAllTimers(VOID);
|
|
|
|
|
|
//
|
|
// Definitions for dllflopy.c
|
|
//
|
|
|
|
VOID
|
|
Od2DiskIOInitialize(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
Od2DiskIOTerminate(
|
|
VOID
|
|
);
|
|
|
|
|
|
//
|
|
// Routines defined in dllname.c
|
|
//
|
|
|
|
APIRET
|
|
Od2Canonicalize(
|
|
IN PSZ Path,
|
|
IN ULONG ExpectedType,
|
|
OUT PSTRING OutputString,
|
|
OUT PHANDLE OutputDirectory OPTIONAL,
|
|
OUT PULONG ParseFlags OPTIONAL,
|
|
OUT PULONG FileType OPTIONAL
|
|
);
|
|
|
|
//
|
|
// Valid values for ExpectedType parameter
|
|
//
|
|
|
|
#define CANONICALIZE_FILE_DEV_OR_PIPE 0x00000000
|
|
#define CANONICALIZE_FILE_OR_DEV 0x00000001
|
|
#define CANONICALIZE_SHARED_MEMORY 0x00000002
|
|
#define CANONICALIZE_SEMAPHORE 0x00000003
|
|
#define CANONICALIZE_QUEUE 0x00000004
|
|
#define CANONICALIZE_MAILSLOT 0x00000005
|
|
|
|
//
|
|
// Flag definitions returned via the ParseFlags parameter
|
|
//
|
|
|
|
#define CANONICALIZE_META_CHARS_FOUND 0x00000001
|
|
#define CANONICALIZE_IS_ROOT_DIRECTORY 0x00000002
|
|
|
|
//
|
|
// Maximum length of NT specific prefix that is placed at the beginning
|
|
// of the canonical output string.
|
|
//
|
|
|
|
#define CANONICALIZE_MAX_PREFIX_LENGTH 32
|
|
#define IS_OBJ_NAME_PATH_SEPARATOR(ch) ((ch == '\\') || (ch == '\0'))
|
|
|
|
BOOLEAN
|
|
Od2IsAbsolutePath(
|
|
IN PSZ Path
|
|
);
|
|
|
|
|
|
//
|
|
// Routines defined in dllque.c
|
|
//
|
|
|
|
POR2_QHANDLE_TABLE
|
|
Od2GetQueueTable(
|
|
BOOLEAN CreateOkay
|
|
);
|
|
|
|
APIRET
|
|
Od2ValidateQueueSemaphore(
|
|
IN HSEM EventHandle,
|
|
IN PULONG HandleIndex
|
|
);
|
|
|
|
VOID
|
|
Od2CloseAllQueues( VOID );
|
|
|
|
VOID
|
|
Od2QueueDestroyProcedure(
|
|
IN POD2_QUEUE Semaphore,
|
|
IN ULONG HandleIndex
|
|
);
|
|
|
|
//
|
|
// Routines defined in dllutil.c
|
|
//
|
|
|
|
APIRET
|
|
Od2CallSubsystem(
|
|
IN OUT POS2_API_MSG m,
|
|
IN OUT POS2_CAPTURE_HEADER CaptureBuffer OPTIONAL,
|
|
IN OS2_API_NUMBER ApiNumber,
|
|
IN ULONG ArgLength
|
|
);
|
|
|
|
POS2_CAPTURE_HEADER
|
|
Od2AllocateCaptureBuffer(
|
|
IN ULONG CountMessagePointers,
|
|
IN ULONG CountCapturePointers,
|
|
IN ULONG Size
|
|
);
|
|
|
|
VOID
|
|
Od2FreeCaptureBuffer(
|
|
IN POS2_CAPTURE_HEADER CaptureBuffer
|
|
);
|
|
|
|
ULONG
|
|
Od2AllocateMessagePointer(
|
|
IN OUT POS2_CAPTURE_HEADER CaptureBuffer,
|
|
IN ULONG Length,
|
|
OUT PVOID *Pointer
|
|
);
|
|
|
|
ULONG
|
|
Od2AllocateCapturePointer(
|
|
IN OUT POS2_CAPTURE_HEADER CaptureBuffer,
|
|
IN ULONG Length,
|
|
OUT PVOID *Pointer
|
|
);
|
|
|
|
VOID
|
|
Od2CaptureMessageString(
|
|
IN OUT POS2_CAPTURE_HEADER CaptureBuffer,
|
|
IN PCHAR String,
|
|
IN ULONG Length,
|
|
IN ULONG MaximumLength,
|
|
OUT PSTRING CapturedString
|
|
);
|
|
|
|
void
|
|
Od2StartTimeout(
|
|
PLARGE_INTEGER StartTimeStamp
|
|
);
|
|
|
|
NTSTATUS
|
|
Od2ContinueTimeout(
|
|
PLARGE_INTEGER StartTimeStamp,
|
|
PLARGE_INTEGER Timeout
|
|
);
|
|
|
|
PLARGE_INTEGER
|
|
Od2CaptureTimeout(
|
|
IN ULONG Milliseconds,
|
|
OUT PLARGE_INTEGER Timeout
|
|
);
|
|
|
|
VOID
|
|
Od2ProbeForWrite(
|
|
IN PVOID Address,
|
|
IN ULONG Length,
|
|
IN ULONG Alignment
|
|
);
|
|
|
|
VOID
|
|
Od2ProbeForRead(
|
|
IN PVOID Address,
|
|
IN ULONG Length,
|
|
IN ULONG Alignment
|
|
);
|
|
|
|
APIRET
|
|
Od2CaptureObjectName(
|
|
IN PSZ ObjectName,
|
|
IN ULONG ObjectType,
|
|
IN ULONG ExtraCaptureBufferLength OPTIONAL,
|
|
OUT POS2_CAPTURE_HEADER *CaptureBuffer,
|
|
OUT PSTRING CapturedObjectName
|
|
);
|
|
|
|
PWSTR
|
|
Od2CopyStrToWstr(
|
|
IN OUT PWSTR wstr OPTIONAL,
|
|
IN PSZ str
|
|
);
|
|
|
|
int
|
|
Od2WstrSize(
|
|
IN PWSTR pwstr
|
|
);
|
|
|
|
PSZ
|
|
Od2CopyWstrToStr(
|
|
IN OUT PSZ str OPTIONAL,
|
|
IN PWSTR wstr
|
|
);
|
|
|
|
PSZ Od2nCopyWstrToStr(
|
|
IN OUT PSZ str OPTIONAL,
|
|
IN PWSTR wstr,
|
|
IN int n
|
|
);
|
|
|
|
APIRET Od2FixFEA2List(
|
|
IN FEA2LIST *fpFEA2List);
|
|
|
|
VOID
|
|
Od2ExitGP();
|
|
|
|
BOOLEAN
|
|
RetryIO(
|
|
IN NTSTATUS Status,
|
|
IN HANDLE Handle
|
|
);
|
|
|
|
BOOLEAN
|
|
RetryCreateOpen(
|
|
IN NTSTATUS Status,
|
|
IN POBJECT_ATTRIBUTES pObja
|
|
);
|
|
|
|
//
|
|
// Routines defined in dlltask.c
|
|
//
|
|
|
|
VOID
|
|
Od2ProcessCleanup( VOID );
|
|
|
|
|
|
VOID
|
|
Od2DosExit(
|
|
ULONG ExitAction,
|
|
ULONG ExitResult,
|
|
ULONG ExitReason);
|
|
|
|
//
|
|
// Routines defined in dllxcpt.c
|
|
//
|
|
|
|
APIRET
|
|
Od2AcknowledgeSignalException(
|
|
IN ULONG SignalNumber
|
|
);
|
|
|
|
VOID
|
|
_Od2VectorHander( VOID );
|
|
|
|
//
|
|
// Routines defined in dllthunk.s
|
|
//
|
|
|
|
VOID
|
|
_Od2ExitListDispatcher( VOID );
|
|
|
|
VOID
|
|
Od2JumpToExitRoutine(
|
|
IN PFNEXITLIST ExitRoutine,
|
|
IN ULONG ExitReason
|
|
);
|
|
|
|
VOID
|
|
_Od2SignalDeliverer(
|
|
IN PCONTEXT pContext,
|
|
IN int Signal
|
|
);
|
|
|
|
VOID
|
|
_Od2ProcessSignal16(
|
|
IN POS2_REGISTER16_SIGNAL pa
|
|
);
|
|
|
|
VOID
|
|
_Od2FreezeThread(
|
|
IN PCONTEXT pContext
|
|
);
|
|
|
|
VOID
|
|
_Od2UnfreezeThread(
|
|
IN PCONTEXT pContext
|
|
);
|
|
|
|
//
|
|
// Routines defined in dllhandl.c
|
|
//
|
|
|
|
APIRET
|
|
OpenCreatePath(
|
|
OUT PHANDLE FileHandle,
|
|
IN ULONG DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes,
|
|
IN PIO_STATUS_BLOCK IoStatus,
|
|
IN ULONG CreateSize,
|
|
IN ULONG FileAttributes,
|
|
IN ULONG ShareAccess,
|
|
IN ULONG CreateDisposition,
|
|
IN ULONG CreateOptions,
|
|
IN OUT PEAOP2 ExtendedFileAttr OPTIONAL,
|
|
OUT PUSHORT FileType,
|
|
OUT PUSHORT DeviceAttributes,
|
|
IN BOOLEAN OpenDirectory
|
|
);
|
|
|
|
APIRET
|
|
MapFileType(
|
|
IN HANDLE FileHandle,
|
|
OUT PBOOLEAN Directory OPTIONAL,
|
|
OUT PUSHORT FileType,
|
|
OUT PUSHORT DeviceAttribute
|
|
);
|
|
|
|
BOOLEAN
|
|
CheckFileType(
|
|
IN HANDLE FileHandle,
|
|
IN USHORT FileTypes
|
|
);
|
|
|
|
APIRET
|
|
AllocateHandle(
|
|
OUT PHFILE FileHandle
|
|
);
|
|
|
|
APIRET
|
|
FreeHandle(
|
|
IN HFILE FileHandle
|
|
);
|
|
|
|
APIRET
|
|
DereferenceFileHandle(
|
|
IN HFILE FileHandle,
|
|
OUT PFILE_HANDLE *hFileRecord
|
|
);
|
|
|
|
PFILE_HANDLE
|
|
DereferenceFileHandleNoCheck(
|
|
IN HFILE FileHandle
|
|
);
|
|
|
|
VOID
|
|
InvalidateHandle(
|
|
IN PFILE_HANDLE hFileRecord
|
|
);
|
|
|
|
VOID
|
|
ValidateHandle(
|
|
IN PFILE_HANDLE hFileRecord
|
|
);
|
|
|
|
|
|
//
|
|
// Routines defined in fileinit.c
|
|
//
|
|
|
|
APIRET
|
|
Od2InitializeFileSystemForExec(
|
|
IN ULONG ParentTableLength, // number of entries in handle table
|
|
IN ULONG CurrentDrive // current drive in parent process
|
|
);
|
|
|
|
APIRET
|
|
Od2InitializeFileSystemForSM(
|
|
IN ULONG DefaultDrive, // default drive for this session
|
|
IN HANDLE StandardInput,
|
|
IN HANDLE StandardOutput,
|
|
IN HANDLE StandardError
|
|
);
|
|
|
|
APIRET
|
|
Od2InitializeFileSystemForChildSM(
|
|
IN ULONG ParentTableLength, // number of entries in handle table
|
|
IN ULONG CurrentDrive // current drive in parent process
|
|
);
|
|
|
|
APIRET
|
|
Od2InitCurrentDir(
|
|
IN ULONG CurrentDisk
|
|
);
|
|
|
|
//
|
|
// Routines defined in name.c
|
|
//
|
|
|
|
APIRET
|
|
Canonicalize(
|
|
IN PSZ Name,
|
|
IN ULONG Flags,
|
|
OUT PHANDLE Handle,
|
|
OUT PSTRING CanonicalString,
|
|
OUT PUSHORT FileType,
|
|
OUT PBOOLEAN MetaCharacters,
|
|
OUT PBOOLEAN RootDirectory
|
|
);
|
|
|
|
PSZ
|
|
FindLastComponent(
|
|
IN PSZ String
|
|
);
|
|
|
|
//
|
|
// Routines defined in dllea.c
|
|
//
|
|
|
|
BOOLEAN
|
|
NtTimeToFatTimeAndDate (
|
|
OUT PFTIME FatTime,
|
|
OUT PFDATE FatDate,
|
|
IN LARGE_INTEGER NtTime
|
|
);
|
|
|
|
APIRET
|
|
GetEaListLength(
|
|
IN HANDLE NtHandle,
|
|
OUT PULONG EaListSize
|
|
);
|
|
|
|
APIRET
|
|
GetGEAList(
|
|
IN HANDLE NtHandle,
|
|
OUT PBYTE UserBuffer,
|
|
IN ULONG Length
|
|
);
|
|
|
|
//
|
|
// Routines defined in dllea.c
|
|
//
|
|
|
|
VOID
|
|
MapAttributesToOs2(
|
|
IN ULONG NtAttributes,
|
|
OUT PUSHORT Os2Attributes
|
|
);
|
|
|
|
APIRET
|
|
MapEaListToNt(
|
|
IN OUT PBYTE UserBuffer,
|
|
IN ULONG Length,
|
|
OUT PVOID *Buffer,
|
|
OUT PULONG ListLength,
|
|
OUT PULONG BufferLength
|
|
);
|
|
|
|
|
|
//
|
|
// Routines defined in dlldir.c
|
|
//
|
|
|
|
APIRET
|
|
Od2GetCurrentDirectory(
|
|
IN ULONG DiskNumber,
|
|
OUT PSTRING *CurrentDirectoryString,
|
|
OUT PHANDLE CurrentDirectoryHandle,
|
|
IN OUT PULONG DirectoryNameLength,
|
|
IN BOOLEAN Verify
|
|
);
|
|
|
|
//
|
|
// Routines defined in coninit.c
|
|
//
|
|
|
|
NTSTATUS Od2InitializeSessionPort(OUT PBOOLEAN RootProcessInSession);
|
|
|
|
//
|
|
// Routines defined in dllmsg.c
|
|
//
|
|
|
|
|
|
#define COMP_ID_LEN 3 // length of component ID
|
|
|
|
|
|
//
|
|
// header for a 16 bit (OS/2 1.X) message segment
|
|
//
|
|
|
|
typedef struct _MSGSEGMENT_HEADER16 {
|
|
BYTE Signature[10]; // "\xffMKMSGSEG"
|
|
USHORT Version; // should be 1
|
|
USHORT Reserved;
|
|
USHORT FileTableOffset;
|
|
} MSGSEGMENT_HEADER16, *PMSGSEGMENT_HEADER16;
|
|
|
|
|
|
typedef struct _OD2_MSGFILE {
|
|
LIST_ENTRY Link;
|
|
HANDLE SectionHandle;
|
|
PVOID BaseAddress;
|
|
ULONG Size;
|
|
ULONG Type;
|
|
STRING FileName;
|
|
} OD2_MSGFILE, *POD2_MSGFILE;
|
|
|
|
#define MSG_FILE_TYPE_OS2_20 0
|
|
#define MSG_FILE_TYPE_OS2_1x 1
|
|
|
|
typedef struct _OD2_MSGFILE_HEADER {
|
|
ULONG HeaderLength;
|
|
CHAR Signature[ 8 ];
|
|
CHAR Component[ COMP_ID_LEN ];
|
|
CHAR Reserved[ 5 ];
|
|
ULONG CountOfMessages;
|
|
ULONG BaseMessageId;
|
|
ULONG MessageOffsets[ 1 ];
|
|
} OD2_MSGFILE_HEADER, *POD2_MSGFILE_HEADER;
|
|
|
|
APIRET
|
|
Od2FindMessageFile(
|
|
IN PSZ MessageFileName,
|
|
OUT POD2_MSGFILE *ReturnedMsgFile
|
|
);
|
|
|
|
//
|
|
// OD2_MESSAGE_RESOURCE_FILENAME defines the file
|
|
// string, that if specified as the MessageFileName parameter to DosGetMessage
|
|
// or DosQueryMessageCP, will cause the function to access the data in
|
|
// the OS/2 system message file.
|
|
//
|
|
|
|
#define OD2_MESSAGE_RESOURCE_FILENAME "OSO001.MSG"
|
|
|
|
|
|
//
|
|
// Od2MsgFile variable points to an OD2_MSGFILE structure that represents the
|
|
// OSO001.MSG resource contained in the OS/2 DLL image file.
|
|
//
|
|
|
|
extern POD2_MSGFILE Od2MsgFile;
|
|
|
|
//
|
|
// This function will initialize the Od2MsgFile variable.
|
|
//
|
|
|
|
NTSTATUS
|
|
Od2InitializeMessageFile( VOID );
|
|
|
|
// Signal numbers
|
|
// these are also defined in os2srv.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
|
|
|
|
/* Vector exception handlers */
|
|
|
|
#define VECTOR_DIVIDE_BY_ZERO 0x0000
|
|
#define VECTOR_OVERFLOW 0x0004
|
|
#define VECTOR_OUTOFBOUNDS 0x0005
|
|
#define VECTOR_INVALIDOPCODE 0x0006
|
|
#define VECTOR_NO_EXTENSION 0x0007
|
|
#define VECTOR_EXTENSION_ERROR 0x0010
|
|
|
|
typedef struct _OD2_VEC_HANDLER_REC {
|
|
ULONG VecHandler[6];
|
|
ULONG doscallssel;
|
|
} OD2_VEC_HANDLER_REC, *POD2_VEC_HANDLER_REC;
|
|
|
|
#define FIELD_SIZE(type, field) (sizeof( ((type *)0)->field ))
|
|
|
|
//
|
|
// Support for mapping c:\config.sys
|
|
// to the OS/2 SS directory
|
|
//
|
|
|
|
BOOLEAN
|
|
Od2FileIsConfigSys(
|
|
IN OUT PANSI_STRING FileName_A,
|
|
IN ULONG AccessMode,
|
|
OUT PNTSTATUS ResultStatus
|
|
);
|
|
|
|
//
|
|
// routines in dllnb.c
|
|
//
|
|
|
|
|
|
VOID
|
|
Od2NetbiosInitialize(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
Od2NetbiosDelete(
|
|
VOID
|
|
);
|
|
|
|
|
|
/* Fix for a C8 compilation warning */
|
|
#undef TRUE
|
|
#define TRUE (BOOLEAN)1
|
|
|
|
#undef FALSE
|
|
#define FALSE (BOOLEAN)0
|
|
|
|
#ifndef MAX
|
|
#define MAX(a,b) (((a)>(b))? (a):(b))
|
|
#endif
|
|
|