summaryrefslogblamecommitdiffstats
path: root/private/os2/inc/os2ssrtl.h
blob: 86dff4920870da8bff4e23e7014f14b3eabb4c6a (plain) (tree)
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
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476



























































































































































































































































































































































































































































































                                                                                      
/*++

Copyright (c) 1989  Microsoft Corporation

Module Name:

    os2ssrtl.h

Abstract:

    Main include file for OS/2 Subsystem Runtime Library shared by the Client
    and Server image files.

Author:

    Steve Wood (stevewo) 7-Nov-1989

Revision History:


    4/14/93 - MJarus - Add OS2SS_SKIP_INCL_OS2V20, for not including os2v20.h
    and so enable including <nt.h> and <windows.h> together.

--*/

//
// Include NT Definitions
//

#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>


//
// Include OS/2SS Debug Definitions
//

extern ULONG Os2Debug;
#include "os2dbg.h"



//
// Include OS/2 V2.0 Definitions
//

#ifndef OS2SS_SKIP_INCL_OS2V20      // don'y include os2v20: include nt & windows
#include "os2v20.h"
#else
#ifndef APIRET
#define APIRET ULONG
#endif  // APIRET
#endif  // OS2SS_SKIP_INCL_OS2V20


//
// Include C Runtime Definitions
//

#include <string.h>


//
// CMD shortcut communication between dlltask.c and server
//

#define NO_REDIR        0
#define REDIR_NUL       1
#define REDIR_FILE      2
#define CMD_SHORTCUT    4

//
// Common types and constant definitions
//

#define OS2_SS_ROOT_OBJECT_DIRECTORY L"\\OS2SS"

        //
        // The following constant should get into ntrtl.h
        //
#define RTL_USER_PROC_OS2_16BIT_PROG   0x80000000

//
// SubSystemData field in PEB points to the following data structure for
// OS/2 applications.  Initial contents is passed back via the connection
// information structure when the client process connects to the OS/2
// Emulation Subsystem server
//

// This is equal to OS2_MAX_APPL_NAME in sesport.h
// If you change either one, update also the other.

#define  OS2_PROCESS_MAX_APPL_NAME 33

typedef struct _PEB_OS2_DATA {
    ULONG   Length;
    PVOID   ClientStartAddress;
    BOOLEAN StartedBySm;
    ULONG   SizeOfInheritedHandleTable;
    ULONG   InitialDefaultDrive;
    HANDLE  StdIn;
    HANDLE  StdOut;
    HANDLE  StdErr;
    HANDLE  SessionPortHandle;
    PVOID   SessionDataBaseAddress;
    ULONG   CodePage;
} PEB_OS2_DATA, *PPEB_OS2_DATA;


//
// shandle.c
//

typedef struct _OR2_HANDLE_TABLE {
    ULONG Length;
    RTL_CRITICAL_SECTION Lock;
    PVOID Heap;
    ULONG LogEntrySize;
    ULONG CountEntries;
    ULONG CountFixedEntries;
    ULONG CountFreeEntries;
    PVOID FixedEntries;
    PVOID Entries;
    PVOID Reserved;
} OR2_HANDLE_TABLE, *POR2_HANDLE_TABLE;

//
// 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.
//
ULONG   Od2ThreadId();
#ifdef  Od2SigHandlingInProgress
    extern  BOOLEAN Od2SigHandlingInProgress;
#else
    BOOLEAN Od2SigHandlingInProgress;
#endif
#define AcquireHandleTableLock( p )                            \
        if ((!Od2SigHandlingInProgress) || (Od2ThreadId() != 1)) \
            RtlEnterCriticalSection( &(p)->Lock )
#define ReleaseHandleTableLock( p )                            \
        if ((!Od2SigHandlingInProgress) || (Od2ThreadId() != 1)) \
            RtlLeaveCriticalSection( &(p)->Lock )

POR2_HANDLE_TABLE
Or2CreateHandleTable(
    IN PVOID Heap,
    IN ULONG SizeOfEntry,
    IN ULONG CountFixedEntries
    );


typedef VOID (*OR2_DESTROY_HANDLE_ROUTINE)(
    IN PVOID HandleTableEntry,
    IN ULONG HandleIndex
    );

BOOLEAN
Or2DestroyHandleTable(
    IN POR2_HANDLE_TABLE HandleTable,
    IN OR2_DESTROY_HANDLE_ROUTINE DestroyHandleProcedure
    );


BOOLEAN
Or2CreateHandle(
    IN POR2_HANDLE_TABLE HandleTable,
    IN OUT PULONG Handle,
    IN PVOID Value
    );


BOOLEAN
Or2DestroyHandle(
    IN POR2_HANDLE_TABLE HandleTable,
    IN ULONG Handle
    );


PVOID
Or2MapHandle(
    IN POR2_HANDLE_TABLE HandleTable,
    IN ULONG Handle,
    IN BOOLEAN TableLocked
    );

typedef BOOLEAN (*OR2_ENUMERATE_HANDLE_ROUTINE)(
    IN PVOID HandleTableEntry,
    IN PVOID EnumParameter
    );

BOOLEAN
Or2EnumHandleTable(
    IN POR2_HANDLE_TABLE HandleTable,
    IN OR2_ENUMERATE_HANDLE_ROUTINE EnumHandleProcedure,
    IN PVOID EnumParameter,
    OUT PULONG Handle OPTIONAL
    );

#if DBG
typedef VOID (*OR2_DUMP_HANDLE_ROUTINE)(
    IN PVOID HandleTableEntry,
    IN ULONG HandleIndex,
    IN PVOID DumpParameter
    );

ULONG
Or2DumpHandleTable(
    IN POR2_HANDLE_TABLE HandleTable,
    IN OR2_DUMP_HANDLE_ROUTINE DumpHandleProcedure,
    IN PVOID DumpParameter
    );
#endif

//
// qhandle.c
//

typedef struct _OR2_QHANDLE_ENTRY {
    PVOID Entry;
    BOOLEAN EntryIsAllocated;
    BOOLEAN EntryIsChunkPointer;
} OR2_QHANDLE_ENTRY, *POR2_QHANDLE_ENTRY;

typedef struct _OR2_QHANDLE_TABLE {
    RTL_CRITICAL_SECTION Lock;
    PVOID Heap;
    ULONG EntrySize;
    ULONG CountEntries;
    ULONG CountFreeEntries;
    ULONG NextToAllocate;
    POR2_QHANDLE_ENTRY QHandles;
} OR2_QHANDLE_TABLE, *POR2_QHANDLE_TABLE;

POR2_QHANDLE_TABLE
Or2CreateQHandleTable(
    IN PVOID Heap,
    IN ULONG SizeOfEntry,
    IN ULONG CountFixedEntries
    );

typedef VOID (*OR2_DESTROY_QHANDLE_ROUTINE)(
    IN PVOID HandleTableEntry,
    IN ULONG HandleIndex
    );

BOOLEAN
Or2DestroyQHandleTable(
    IN POR2_QHANDLE_TABLE HandleTable,
    IN OR2_DESTROY_QHANDLE_ROUTINE DestroyHandleProcedure
    );


BOOLEAN
Or2CreateQHandle(
    IN POR2_QHANDLE_TABLE HandleTable,
    IN OUT PULONG Handle,
    IN PVOID Value
    );


BOOLEAN
Or2DestroyQHandle(
    IN POR2_QHANDLE_TABLE HandleTable,
    IN ULONG Handle
    );


PVOID
Or2MapQHandle(
    IN POR2_QHANDLE_TABLE HandleTable,
    IN ULONG Handle,
    IN BOOLEAN TableLocked
    );

//
// ntmap.c
//

APIRET
Or2MapStatus(
    IN NTSTATUS Status
    );

APIRET
Or2MapFlagsToProtection(
    ULONG Flags,
    PULONG Protection
    );

APIRET
Or2MapProtectionToFlags(
    ULONG Protection,
    PULONG Flags
    );

APIRET
Or2MapNtStatusToOs2Error(
    IN NTSTATUS Status,
    IN APIRET DefaultRetCode
    );

//
// consys.c
//

#define FWD             +1L             // these are used with
#define BWD             -1L             // Or2SkipWWS

#define NULL_DELIM      0               // these are used with
#define CRLF_DELIM      1               // Or2IterateEnvironment

//
// if OS2CONF_NAME_OPT == 1 then os2conf.nt will reside in %SystemRoot%\system32\os2 .
// if OS2CONF_NAME_OPT == 0 then os2conf.nt will reside in c:\ .
//
// CLIENT_POPUP_ON_READ designates whether the client should generate a popup if the
// program tries to open config.sys for reading (it always generates a popup when
// opening for writing).
//

#define OS2CONF_NAME_OPT        0
#define CLIENT_POPUP_ON_READ    1

#if OS2CONF_NAME_OPT
#define OS2CONF_NAMEA "\\OS2\\OS2CONF.NT"
#define OS2CONF_NAMEW L"\\OS2\\OS2CONF.NT"
#else
#define OS2CONF_NAMEA "\\OS2CONF.NT"
#define OS2CONF_NAMEW L"\\OS2CONF.NT"
#endif

typedef VOID (*PFN_ENVIRONMENT_PROCESSOR)(
    IN ULONG DispatchTableIndex,
    IN PVOID UserParameter,
    IN PWSTR Name,
    IN ULONG NameLen,
    IN PWSTR Value,
    IN ULONG ValueLen
    );

typedef struct _ENVIRONMENT_DISPATCH_TABLE_ENTRY {
    PWSTR VarName;
    PWSTR Delimiters;
    PFN_ENVIRONMENT_PROCESSOR DispatchFunction;
    PVOID UserParameter;
} ENVIRONMENT_DISPATCH_TABLE_ENTRY, *PENVIRONMENT_DISPATCH_TABLE_ENTRY;

typedef PENVIRONMENT_DISPATCH_TABLE_ENTRY ENVIRONMENT_DISPATCH_TABLE;

typedef struct _ENVIRONMENT_SEARCH_RECORD {
    ULONG DispatchTableIndex;
    PWSTR Name;
    ULONG NameLen;
    PWSTR Value;
    ULONG ValueLen;
} ENVIRONMENT_SEARCH_RECORD, *PENVIRONMENT_SEARCH_RECORD;

VOID
Or2SkipWWS(
    IN OUT PWSTR *Str,
    IN LONG Direction
    );

VOID
Or2UnicodeStrupr(
    IN OUT PWSTR Str
    );

BOOLEAN
Or2UnicodeEqualCI(
    IN PWSTR Str1,
    IN PWSTR Str2,
    IN ULONG Count
    );

BOOLEAN
Or2AppendPathToPath(
    IN PVOID HeapHandle,
    IN PWSTR SrcPath,
    IN OUT PUNICODE_STRING DestPath,
    IN BOOLEAN ExpandIt
    );

BOOLEAN
Or2ReplacePathByPath(
    IN PVOID HeapHandle,
    IN PWSTR SrcPath,
    IN OUT PUNICODE_STRING DestPath
    );

VOID
Or2CheckSemicolon(
    IN OUT PUNICODE_STRING Str
    );

BOOLEAN
Or2GetEnvPath(
    OUT PUNICODE_STRING Data,
    IN PVOID HeapHandle,
    IN USHORT MaxSiz,
    IN HANDLE EnvKey,
    IN PWSTR ValueName,
    IN BOOLEAN ExpandIt
    );

VOID
Or2IterateEnvironment(
    IN PWSTR Environment,
    IN ENVIRONMENT_DISPATCH_TABLE DispatchTable,
    IN ULONG NumberOfDispatchItems,
    IN ULONG DelimOption
    );

VOID
Or2FillInSearchRecordDispatchFunction(
    IN ULONG DispatchTableIndex,
    IN PVOID UserParameter,
    IN PWSTR Name,
    IN ULONG NameLen,
    IN PWSTR Value,
    IN ULONG ValueLen
    );

//
// datetime.c
//

APIRET
Or2GetDateTimeInfo(
    PLARGE_INTEGER  pSystemTime,
    PLARGE_INTEGER  pLocalTime,
    PTIME_FIELDS    pNtDateTime,
    PVOID           pSystemInformation,
    PSHORT          pTimeZone
    );

//
//  nls.c
//

extern ULONG Or2ProcessCodePage;
extern ULONG Or2CurrentCodePageIsOem;

#define Or2InitMBString RtlInitAnsiString

//VOID
//Or2InitMBString(
//    PANSI_STRING DestinationString,
//    PCSZ SourceString);

APIRET
Or2MBStringToUnicodeString(
    PUNICODE_STRING DestinationString,
    PANSI_STRING    SourceString,
    BOOLEAN         AllocateDestinationString);

BOOLEAN
Or2CreateUnicodeStringFromMBz(
    OUT PUNICODE_STRING DestinationString,
    IN PCSZ SourceString);

APIRET
Or2UnicodeStringToMBString(
    PANSI_STRING    DestinationString,
    PUNICODE_STRING SourceString,
    BOOLEAN         AllocateDestinationString);

#define Or2FreeMBString RtlFreeOemString

//VOID
//Or2FreeMBString(
//    PANSI_STRING AnsiString);

#include "os2crt.h"