summaryrefslogtreecommitdiffstats
path: root/private/os2/os2ses/os2ses.h
blob: 6dcf4c856d6af3f16a4768f3708f22776d602961 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
/*++

Copyright (c) 1989  Microsoft Corporation

Module Name:

    os2ses.h

Abstract:

    Main header file for OS2SES module.
    This module contains includes for both WIN32 and native NT modules.
    Most files are clean WIN32 sources. files named nt* contain NT
    calls and provides the interaction with os2 server and client.

Author:

    Avi Nathan (avin) 17-Jul-1991

Environment:

    User Mode Only

Revision History:

--*/


#ifdef NTOS2_ONLY
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include "os2win.h"
#endif  // NTOS2_ONLY

#include "os2dbg.h"

#ifdef WIN32_ONLY
#include <windows.h>
#include "os2nt.h"
#endif // WIN32_ONLY

#include "os2crt.h"

#if DBG
extern ULONG Os2Debug;

#ifdef NTOS2_ONLY
#define ASSERT1( str, exp ) \
    if (!(exp))                                             \
    {                                                       \
        UCHAR   WinErrBuf[100];                             \
                                                            \
        sprintf(WinErrBuf, "%s NtStatus %lx\n", str, Status);   \
                                                            \
        RtlAssert( #exp, __FILE__, __LINE__, WinErrBuf );   \
    }

#endif  // NTOS2_ONLY
#ifdef WIN32_ONLY
#define ASSERT1( str, exp ) \
    if (!(exp))                                             \
    {                                                       \
        UCHAR   WinErrBuf[100];                             \
                                                            \
        sprintf(WinErrBuf, "%s WinError %lx\n", str, GetLastError());   \
                                                            \
        RtlAssert( #exp, __FILE__, __LINE__, WinErrBuf );   \
    }

#endif  // WIN32_ONLY
#else   // DBG
#define ASSERT1( str, exp )
#endif // DBG

extern BOOLEAN fService;   // Are we running as a service ?

#include "sesport.h"

#define WINDOW_DEFAULT_INPUT_MODE    (ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_WINDOW_INPUT | ENABLE_PROCESSED_INPUT)
#define WINDOW_DEFAULT_OUTPUT_MODE   (ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT)
#define OS2_DEFAULT_INPUT_MODE       0
#define OS2_DEFAULT_OUTPUT_MODE      (ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT)
#define OS2_MOUSE_DEAFULT_EVENT_MASK (OS2_MOUSE_MOTION | OS2_MOUSE_MOTION_WITH_BN1_DOWN | OS2_MOUSE_BN1_DOWN | OS2_MOUSE_MOTION_WITH_BN2_DOWN | OS2_MOUSE_BN2_DOWN)
#define OS2_MOUSE_LEGAL_EVENT_MASK   (OS2_MOUSE_MOTION | OS2_MOUSE_MOTION_WITH_BN1_DOWN | OS2_MOUSE_BN1_DOWN | OS2_MOUSE_MOTION_WITH_BN2_DOWN | OS2_MOUSE_BN2_DOWN | OS2_MOUSE_MOTION_WITH_BN3_DOWN | OS2_MOUSE_BN3_DOWN)

#define CONSOLE_HANDLE_SIGNATURE 0x00000003
#define CONSOLE_HANDLE(HANDLE) (((ULONG)(HANDLE) & CONSOLE_HANDLE_SIGNATURE) == CONSOLE_HANDLE_SIGNATURE)
#define LONG_MINUS_ONE  0xFFFFFFFF

#define OS2_SERVER_THREAD_PRIORITY      THREAD_PRIORITY_NORMAL
#define OS2_EVENT_THREAD_PRIORITY       THREAD_PRIORITY_TIME_CRITICAL
#define OS2_WAITER_THREAD_PRIORITY      THREAD_PRIORITY_HIGHEST


HANDLE  Ow2hOs2srvPort;             /* handle for the port with OS2SRV */
HANDLE  Ow2hSession;                /* handle for the session (return from OS2SRV) */

/* os2ses side listner and reply for Vio, Kbd, Mou, Mon & Ctrl ports */

HANDLE  Ow2hOs2sesPort;             /* handle for the LPC port */

/* SectionHandle & Base Address of Vio, Kbd and Ctrl shared data section
 *
 * address of the shared memory section of the console ports.
 */

PVOID   Os2SessionCtrlDataBaseAddress;
HANDLE  Os2SessionCtrlDataSectionHandle;
PVOID   Os2SessionDataBaseAddress;
HANDLE  Os2SessionSesGrpDataSectionHandle;

POS2_SES_GROUP_PARMS SesGrp;

#define Os2SessionNetDataBaseAddress  Os2SessionCtrlDataBaseAddress

PVOID   KbdAddress;

/* handles of Win-Console */

HANDLE  hConsoleInput;   /* Input Handle */
HANDLE  hConsoleOutput;  /* Output Handle */
HANDLE  hPopUpOutput;    /* PopUp Handle */
HANDLE  hConOut;         /* Current Output Handle: hConsoleOutput or hPopUpOutput */
HANDLE  hConsoleStdIn;   /* Standart Input Handle */
HANDLE  hConsoleStdOut;  /* Standart Output Handle */
HANDLE  hConsoleStdErr;  /* Standart Error Handle */

USHORT  hStdInConsoleType;  /* IS_CONSOLE StdHandle flag */
USHORT  hStdOutConsoleType; /* IS_CONSOLE StdHandle flag */
USHORT  hStdErrConsoleType; /* IS_CONSOLE StdHandle flag */

/* handles of threads */

HANDLE  hCtrlListenThread;
HANDLE  EventServerThreadHandle;
HANDLE  Ow2hSessionRequestThread;

/*
 *  Handle & Base Address of LVB (LogicalVideoBuffer)
 */

HANDLE  LVBHandle;
PUCHAR  LVBBuffer;

/*
 *  Handle of Pause(^S) event
 */

HANDLE      PauseEvent;

HANDLE      HandleHeap;             /* address of heap space for KBD handles */

ULONG   timing;
BOOLEAN Od2SignalEnabled;
ULONG   Os2srvCountryCode;
ULONG   Os2srvCodePage[2];
UCHAR   Os2srvKeyboardLayout[2];
ULONG   PortMessageHeaderSize;
ULONG   KbdEventQueueSize;
ULONG   MouEventQueueSize;
ULONG   Os2WindowFocus;
DWORD   InputModeFlags;             /* Console Input Mode */
DWORD   DefaultWinInputMode;        /* Default Win Console Output Mode */
DWORD   ReturnCode;
DWORD   SetConsoleInputModeAgain;   /* need to set console mode after Win CreateProcess */
DWORD   SetConsoleOutputModeAgain;
ULONG   ApplicationNcbAddress;
ULONG   ApplicationPostAddress;
DWORD   Os2ReturnCode;
#ifdef DBCS
// MSKK Jan.14.1993 V-AkihiS
UCHAR   OldWinAttr[3];               /* Win32 attr at entry point (OS2 format) */
#else
UCHAR   OldWinAttr;                 /* Win32 attr at entry point (OS2 format) */
#endif


#if DBG
BOOL fVerbose;
BOOL fTrace;
BOOL fBrkOnStart;
#endif

/*
 *  initialize procedures
 */

DWORD InitOs2SessionPort(
    char   *PgmName,
    char   **envp
    );
DWORD AnsiInit(VOID);
DWORD AnsiInitForSession(VOID);
DWORD VioInit(IN VOID);
DWORD VioInitForSession(IN VOID);
DWORD NLSInit();
DWORD KbdInitForNLS(IN ULONG KbdCP);
DWORD VioInitForNLS(IN ULONG VioCP);
ULONG NtGetIntegerFromUnicodeString(IN WCHAR *sCountryCode);
DWORD CreateServerThreads(VOID);
DWORD ResumeServerThreads(VOID);
DWORD SesGrpInit(VOID);
ULONG
Ow2GetProcessIdFromLPCMessage(
    IN  PVOID   LPCMessage
    );

/*
 *  ServerThreads to serve all port requests
 */

VOID  ServeSessionRequests(VOID);
DWORD SessionRequestThread(IN PVOID Parameter);
DWORD EventServerThread(IN PVOID Parameter);

/*
 *  ServerRoutine to handle the requests
 */

BOOL  ServeTmRequest(IN PSCTMREQUEST PReq, OUT PVOID PStatus);
BOOL  ServeWinCreateProcess(IN PWINEXECPGM_MSG PReq, OUT PVOID PStatus);
BOOL  ServeKbdRequest(IN PKBDREQUEST PReq, OUT PVOID PStatus,
                IN PVOID pMsg, OUT PULONG pReply);
BOOL  ServeMouRequest(IN PMOUREQUEST PReq, OUT PVOID PStatus,
                IN PVOID pMsg, OUT PULONG pReply);
BOOL  ServeMonRequest(IN PMONREQUEST PReq, OUT PVOID PStatus,
                IN PVOID pMsg, OUT PULONG pReply);
BOOL  ServeNetRequest(IN PNETREQUEST PReq, OUT PVOID PStatus);
BOOL  ServePrtRequest(IN PPRTREQUEST PReq, OUT PVOID PStatus);
#ifdef DBCS
// MSKK Dec.23.1992 V-AkihiS
BOOL  ServeImmonRequest(IN PIMMONREQUEST PReq, OUT PVOID PStatus);
#endif

/*
 *  routine to save requests for proposed replies
 */

VOID  SavePortMessegeInfo(OUT PVOID   MonHeader,
                          IN  PVOID   pMsg);
VOID  SaveKbdPortMessegeInfo(OUT PVOID   MonHeader,
                             OUT PVOID   KbdRequestArea,
                             IN  PVOID   pMsg);
VOID  SendMonReply(IN  PVOID      MonHeader,
                   IN  PVOID      pData,
                   IN  USHORT     Length);
VOID  SendMouReply(IN  PVOID      MonHeader,
                   IN  PVOID      pData);
VOID  SendKbdReply(IN  PVOID      MonHeader,
                   IN  PVOID      KbdRequestArea,
                   IN  PVOID      pData,
                   IN  USHORT     Length);

VOID  DisableScreenUpdate();
VOID  EnableScreenUpdate();
VOID  SendNewFocusSet(IN ULONG WindowFocus);

VOID  RestartEventServerThread(VOID);

VOID  RestoreWin32ParmsBeforeTermination();
VOID  TerminateSession(VOID);
VOID  Os2sesTerminateThread(VOID);
VOID  Os2sesTerminateThreadRc(IN  ULONG Rc);

VOID
EventReleaseLPC(
    IN ULONG ProcessId
    );

VOID
Ow2Exit(
    IN  UINT    StringCode,
    IN  PCHAR   ErrorText,
    IN  int     ExitCode
    );

BOOL  EventHandlerRoutine (IN ULONG CtrlType);
BOOL  SendSignalToOs2Srv(IN int SignalType);
VOID  SetEventHandlers(IN BOOL fSet);

PVOID StartEventHandler(VOID);
PVOID StartEventHandlerForSession(VOID);

DWORD CreateOS2SRV(OUT PHANDLE hProcess);

DWORD RemoveConForWinProcess();
DWORD AddConAfterWinProcess();

/*
 *   OS2 error used in OS2.EXE
 *
 *  cannot include os2err.h because of collapstion wirh Nt/Win error def.
 */

#define ERROR_MONITOR_NOT_SUPPORTED     165
#define NO_ERROR_MOUSE_NO_DATA          393
#define ERROR_VIO_MODE                  355
#define ERROR_VIO_WIDTH                 356
#define ERROR_VIO_ROW                   358
#define ERROR_VIO_COL                   359
#define ERROR_KBD_INVALID_LENGTH        376
#define ERROR_KBD_INVALID_ECHO_MASK     377
#define ERROR_KBD_INVALID_INPUT_MASK    378
#define ERROR_MOUSE_INV_PARMS           387
#define ERROR_VIO_NO_POPUP              405
#define ERROR_VIO_INVALID_PARMS         421
#define ERROR_VIO_INVALID_LENGTH        438
#define ERROR_KBD_NO_MORE_HANDLE        440
#define ERROR_MON_INVALID_PARMS         379
#define ERROR_MON_INVALID_HANDLE        381
#define ERROR_MON_BUFFER_TOO_SMALL      382
#define ERROR_MON_BUFFER_EMPTY          383
#define ERROR_MON_DATA_TOO_LARGE        384
#define ERROR_NLS_NO_CTRY_CODE          398

/*
 * Signal subtypes for XCPT_SIGNAL
 */
#define XCPT_SIGNAL_INTR        1
#define XCPT_SIGNAL_KILLPROC    3
#define XCPT_SIGNAL_BREAK       4

HANDLE Ow2ForegroundWindow;