d471d4f7c7bf8a8301d269177e8fadf21f8add99
[reactos.git] / include / ntdll / rtl.h
1 /* $Id$
2  *
3  */
4
5 #ifndef __INCLUDE_NTDLL_RTL_H
6 #define __INCLUDE_NTDLL_RTL_H
7
8 #include <ntos/types.h>
9 #include <napi/teb.h>
10 #include <ddk/ntddk.h>
11 #include <ddk/ntifs.h>
12
13 #ifdef __cplusplus
14 extern "C" {
15 #endif /* __cplusplus */
16
17
18 #ifndef __USE_W32API
19
20 typedef struct _DEBUG_BUFFER
21 {
22   HANDLE SectionHandle;
23   PVOID SectionBase;
24   PVOID RemoteSectionBase;
25   ULONG SectionBaseDelta;
26   HANDLE EventPairHandle;
27   ULONG Unknown[2];
28   HANDLE RemoteThreadHandle;
29   ULONG InfoClassMask;
30   ULONG SizeOfInfo;
31   ULONG AllocatedSize;
32   ULONG SectionSize;
33   PVOID ModuleInformation;
34   PVOID BackTraceInformation;
35   PVOID HeapInformation;
36   PVOID LockInformation;
37   PVOID Reserved[8];
38 } DEBUG_BUFFER, *PDEBUG_BUFFER;
39
40 typedef struct _CRITICAL_SECTION_DEBUG {
41     WORD   Type;
42     WORD   CreatorBackTraceIndex;
43     struct _CRITICAL_SECTION *CriticalSection;
44     LIST_ENTRY ProcessLocksList;
45     DWORD EntryCount;
46     DWORD ContentionCount;
47     DWORD Depth;
48     PVOID OwnerBackTrace[ 5 ];
49 } CRITICAL_SECTION_DEBUG, *PCRITICAL_SECTION_DEBUG;
50
51 typedef struct _CRITICAL_SECTION {
52     PCRITICAL_SECTION_DEBUG DebugInfo;
53     LONG LockCount;
54     LONG RecursionCount;
55     HANDLE OwningThread;
56     HANDLE LockSemaphore;
57     DWORD Reserved;
58 } CRITICAL_SECTION, *PCRITICAL_SECTION, *LPCRITICAL_SECTION;
59
60 typedef CRITICAL_SECTION RTL_CRITICAL_SECTION;
61 typedef PCRITICAL_SECTION PRTL_CRITICAL_SECTION;
62 typedef LPCRITICAL_SECTION LPRTL_CRITICAL_SECTION;
63
64 #endif /* !__USE_W32API */
65
66
67 typedef struct _RTL_PROCESS_INFO
68 {
69    ULONG Size;
70    HANDLE ProcessHandle;
71    HANDLE ThreadHandle;
72    CLIENT_ID ClientId;
73    SECTION_IMAGE_INFORMATION ImageInfo;
74 } RTL_PROCESS_INFO, *PRTL_PROCESS_INFO;
75
76 typedef struct _RTL_RESOURCE
77 {
78    CRITICAL_SECTION Lock;
79    HANDLE SharedSemaphore;
80    ULONG SharedWaiters;
81    HANDLE ExclusiveSemaphore;
82    ULONG ExclusiveWaiters;
83    LONG NumberActive;
84    HANDLE OwningThread;
85    ULONG TimeoutBoost; /* ?? */
86    PVOID DebugInfo; /* ?? */
87 } RTL_RESOURCE, *PRTL_RESOURCE;
88
89 typedef struct _RTL_HANDLE
90 {
91    struct _RTL_HANDLE *Next;    /* pointer to next free handle */
92 } RTL_HANDLE, *PRTL_HANDLE;
93
94 typedef struct _RTL_HANDLE_TABLE
95 {
96    ULONG TableSize;             /* maximum number of handles */
97    ULONG HandleSize;            /* size of handle in bytes */
98    PRTL_HANDLE Handles;         /* pointer to handle array */
99    PRTL_HANDLE Limit;           /* limit of pointers */
100    PRTL_HANDLE FirstFree;       /* pointer to first free handle */
101    PRTL_HANDLE LastUsed;        /* pointer to last allocated handle */
102 } RTL_HANDLE_TABLE, *PRTL_HANDLE_TABLE;
103
104
105 #define HEAP_BASE (0xa0000000)
106
107 /* RtlQueryProcessDebugInformation */
108 #define PDI_MODULES     0x01    /* The loaded modules of the process */
109 #define PDI_BACKTRACE   0x02    /* The heap stack back traces */
110 #define PDI_HEAPS       0x04    /* The heaps of the process */
111 #define PDI_HEAP_TAGS   0x08    /* The heap tags */
112 #define PDI_HEAP_BLOCKS 0x10    /* The heap blocks */
113 #define PDI_LOCKS       0x20    /* The locks created by the process */
114
115 VOID
116 STDCALL
117 RtlDeleteCriticalSection (
118         PCRITICAL_SECTION       CriticalSection
119         );
120
121 VOID
122 STDCALL
123 RtlEnterCriticalSection (
124         PCRITICAL_SECTION       CriticalSection
125         );
126
127 NTSTATUS
128 STDCALL
129 RtlInitializeCriticalSection (
130         PCRITICAL_SECTION       CriticalSection
131         );
132
133 VOID
134 STDCALL
135 RtlLeaveCriticalSection (
136         PCRITICAL_SECTION       CriticalSection
137         );
138
139 BOOLEAN
140 STDCALL
141 RtlTryEnterCriticalSection (
142         PCRITICAL_SECTION       CriticalSection
143         );
144
145 DWORD
146 STDCALL
147 RtlCompactHeap (
148         HANDLE  heap,
149         DWORD   flags
150         );
151
152 PDEBUG_BUFFER STDCALL
153 RtlCreateQueryDebugBuffer(IN ULONG Size,
154                           IN BOOLEAN EventPair);
155
156 NTSTATUS STDCALL
157 RtlDestroyQueryDebugBuffer(IN PDEBUG_BUFFER DebugBuffer);
158
159 BOOLEAN
160 STDCALL
161 RtlEqualComputerName (
162         IN      PUNICODE_STRING ComputerName1,
163         IN      PUNICODE_STRING ComputerName2
164         );
165
166 BOOLEAN
167 STDCALL
168 RtlEqualDomainName (
169         IN      PUNICODE_STRING DomainName1,
170         IN      PUNICODE_STRING DomainName2
171         );
172
173 VOID
174 STDCALL
175 RtlEraseUnicodeString (
176         IN      PUNICODE_STRING String
177         );
178
179 NTSTATUS
180 STDCALL
181 RtlLargeIntegerToChar (
182         IN      PLARGE_INTEGER  Value,
183         IN      ULONG           Base,
184         IN      ULONG           Length,
185         IN OUT  PCHAR           String
186         );
187
188
189 /* Path functions */
190
191 ULONG
192 STDCALL
193 RtlDetermineDosPathNameType_U (
194         PWSTR Path
195         );
196
197 BOOLEAN
198 STDCALL
199 RtlDoesFileExists_U (
200         PWSTR FileName
201         );
202
203 BOOLEAN
204 STDCALL
205 RtlDosPathNameToNtPathName_U (
206         PWSTR           dosname,
207         PUNICODE_STRING ntname,
208         PWSTR           *shortname,
209         PCURDIR         nah
210         );
211
212 ULONG
213 STDCALL
214 RtlDosSearchPath_U (
215         WCHAR *sp,
216         WCHAR *name,
217         WCHAR *ext,
218         ULONG buf_sz,
219         WCHAR *buffer,
220         WCHAR **shortname
221         );
222
223 ULONG
224 STDCALL
225 RtlGetCurrentDirectory_U (
226         ULONG MaximumLength,
227         PWSTR Buffer
228         );
229
230 ULONG
231 STDCALL
232 RtlGetFullPathName_U (
233         WCHAR *dosname,
234         ULONG size,
235         WCHAR *buf,
236         WCHAR **shortname
237         );
238
239 ULONG
240 STDCALL
241 RtlGetLongestNtPathLength (
242         VOID
243         );
244
245 ULONG STDCALL RtlGetNtGlobalFlags(VOID);
246
247 BOOLEAN STDCALL RtlGetNtProductType(PNT_PRODUCT_TYPE ProductType);
248
249 ULONG
250 STDCALL
251 RtlGetProcessHeaps (
252         ULONG   HeapCount,
253         HANDLE  *HeapArray
254         );
255
256 ULONG
257 STDCALL
258 RtlIsDosDeviceName_U (
259         PWSTR DeviceName
260         );
261
262 NTSTATUS
263 STDCALL
264 RtlSetCurrentDirectory_U (
265         PUNICODE_STRING name
266         );
267
268 /* Environment functions */
269 VOID
270 STDCALL
271 RtlAcquirePebLock (
272         VOID
273         );
274
275 VOID
276 STDCALL
277 RtlReleasePebLock (
278         VOID
279         );
280
281 NTSTATUS
282 STDCALL
283 RtlCreateEnvironment (
284         BOOLEAN Inherit,
285         PWSTR   *Environment
286         );
287
288 VOID
289 STDCALL
290 RtlDestroyEnvironment (
291         PWSTR   Environment
292         );
293
294 NTSTATUS
295 STDCALL
296 RtlExpandEnvironmentStrings_U (
297         PWSTR           Environment,
298         PUNICODE_STRING Source,
299         PUNICODE_STRING Destination,
300         PULONG          Length
301         );
302
303 NTSTATUS
304 STDCALL
305 RtlQueryEnvironmentVariable_U (
306         PWSTR           Environment,
307         PUNICODE_STRING Name,
308         PUNICODE_STRING Value
309         );
310
311 NTSTATUS STDCALL
312 RtlQueryProcessDebugInformation(IN ULONG ProcessId,
313                                 IN ULONG DebugInfoClassMask,
314                                 IN OUT PDEBUG_BUFFER DebugBuffer);
315
316 VOID
317 STDCALL
318 RtlSetCurrentEnvironment (
319         PWSTR   NewEnvironment,
320         PWSTR   *OldEnvironment
321         );
322
323 NTSTATUS
324 STDCALL
325 RtlSetEnvironmentVariable (
326         PWSTR           *Environment,
327         PUNICODE_STRING Name,
328         PUNICODE_STRING Value
329         );
330
331 NTSTATUS
332 STDCALL
333 RtlCreateUserThread (
334         IN      HANDLE                  ProcessHandle,
335         IN      PSECURITY_DESCRIPTOR    SecurityDescriptor,
336         IN      BOOLEAN                 CreateSuspended,
337         IN      LONG                    StackZeroBits,
338         IN OUT  PULONG                  StackReserve,
339         IN OUT  PULONG                  StackCommit,
340         IN      PTHREAD_START_ROUTINE   StartAddress,
341         IN      PVOID                   Parameter,
342         IN OUT  PHANDLE                 ThreadHandle,
343         IN OUT  PCLIENT_ID              ClientId
344         );
345
346 NTSTATUS STDCALL RtlExitUserThread(NTSTATUS Status);
347
348 NTSTATUS
349 STDCALL
350 RtlFreeUserThreadStack (
351         IN      HANDLE  ProcessHandle,
352         IN      HANDLE  ThreadHandle
353         );
354
355 NTSTATUS
356 STDCALL
357 RtlCreateUserProcess (
358         IN      PUNICODE_STRING                 ImageFileName,
359         IN      ULONG                           Attributes,
360         IN      PRTL_USER_PROCESS_PARAMETERS    ProcessParameters,
361         IN      PSECURITY_DESCRIPTOR            ProcessSecutityDescriptor OPTIONAL,
362         IN      PSECURITY_DESCRIPTOR            ThreadSecurityDescriptor OPTIONAL,
363         IN      HANDLE                          ParentProcess OPTIONAL,
364         IN      BOOLEAN                         CurrentDirectory,
365         IN      HANDLE                          DebugPort OPTIONAL,
366         IN      HANDLE                          ExceptionPort OPTIONAL,
367         OUT     PRTL_PROCESS_INFO               ProcessInfo
368         );
369
370 NTSTATUS
371 STDCALL
372 RtlCreateProcessParameters (
373         OUT     PRTL_USER_PROCESS_PARAMETERS    *ProcessParameters,
374         IN      PUNICODE_STRING ImagePathName OPTIONAL,
375         IN      PUNICODE_STRING DllPath OPTIONAL,
376         IN      PUNICODE_STRING CurrentDirectory OPTIONAL,
377         IN      PUNICODE_STRING CommandLine OPTIONAL,
378         IN      PWSTR           Environment OPTIONAL,
379         IN      PUNICODE_STRING WindowTitle OPTIONAL,
380         IN      PUNICODE_STRING DesktopInfo OPTIONAL,
381         IN      PUNICODE_STRING ShellInfo OPTIONAL,
382         IN      PUNICODE_STRING RuntimeInfo OPTIONAL
383         );
384
385 PRTL_USER_PROCESS_PARAMETERS
386 STDCALL
387 RtlDeNormalizeProcessParams (
388         IN      PRTL_USER_PROCESS_PARAMETERS    ProcessParameters
389         );
390
391 NTSTATUS
392 STDCALL
393 RtlDestroyProcessParameters (
394         IN      PRTL_USER_PROCESS_PARAMETERS    ProcessParameters
395         );
396
397 PRTL_USER_PROCESS_PARAMETERS
398 STDCALL
399 RtlNormalizeProcessParams (
400         IN      PRTL_USER_PROCESS_PARAMETERS    ProcessParameters
401         );
402
403 NTSTATUS
404 STDCALL
405 RtlLocalTimeToSystemTime (
406         PLARGE_INTEGER  LocalTime,
407         PLARGE_INTEGER  SystemTime
408         );
409
410 NTSTATUS
411 STDCALL
412 RtlSystemTimeToLocalTime (
413         PLARGE_INTEGER  SystemTime,
414         PLARGE_INTEGER  LocalTime
415         );
416
417 VOID STDCALL
418 RtlTimeToElapsedTimeFields(IN PLARGE_INTEGER Time,
419                            OUT PTIME_FIELDS TimeFields);
420
421 VOID
422 STDCALL
423 RtlRaiseStatus (
424         IN      NTSTATUS        Status
425         );
426
427
428 /* resource functions */
429
430 BOOLEAN
431 STDCALL
432 RtlAcquireResourceExclusive (
433         IN      PRTL_RESOURCE   Resource,
434         IN      BOOLEAN         Wait
435         );
436
437 BOOLEAN
438 STDCALL
439 RtlAcquireResourceShared (
440         IN      PRTL_RESOURCE   Resource,
441         IN      BOOLEAN         Wait
442         );
443
444 VOID
445 STDCALL
446 RtlConvertExclusiveToShared (
447         IN      PRTL_RESOURCE   Resource
448         );
449
450 VOID
451 STDCALL
452 RtlConvertSharedToExclusive (
453         IN      PRTL_RESOURCE   Resource
454         );
455
456 VOID
457 STDCALL
458 RtlDeleteResource (
459         IN      PRTL_RESOURCE   Resource
460         );
461
462 VOID
463 STDCALL
464 RtlDumpResource (
465         IN      PRTL_RESOURCE   Resource
466         );
467
468 VOID
469 STDCALL
470 RtlInitializeResource (
471         IN      PRTL_RESOURCE   Resource
472         );
473
474 VOID
475 STDCALL
476 RtlReleaseResource (
477         IN      PRTL_RESOURCE   Resource
478         );
479
480 /* handle table functions */
481
482 PRTL_HANDLE
483 STDCALL
484 RtlAllocateHandle (
485         IN      PRTL_HANDLE_TABLE       HandleTable,
486         IN OUT  PULONG                  Index
487         );
488
489 VOID
490 STDCALL
491 RtlDestroyHandleTable (
492         IN      PRTL_HANDLE_TABLE       HandleTable
493         );
494
495 BOOLEAN
496 STDCALL
497 RtlFreeHandle (
498         IN      PRTL_HANDLE_TABLE       HandleTable,
499         IN      PRTL_HANDLE             Handle
500         );
501
502 VOID
503 STDCALL
504 RtlInitializeHandleTable (
505         IN      ULONG                   TableSize,
506         IN      ULONG                   HandleSize,
507         IN      PRTL_HANDLE_TABLE       HandleTable
508         );
509
510 BOOLEAN
511 STDCALL
512 RtlIsValidHandle (
513         IN      PRTL_HANDLE_TABLE       HandleTable,
514         IN      PRTL_HANDLE             Handle
515         );
516
517 BOOLEAN
518 STDCALL
519 RtlIsValidIndexHandle (
520         IN      PRTL_HANDLE_TABLE       HandleTable,
521         IN OUT  PRTL_HANDLE             *Handle,
522         IN      ULONG                   Index
523         );
524
525 NTSTATUS STDCALL
526 RtlAdjustPrivilege(IN ULONG Privilege,
527                    IN BOOLEAN Enable,
528                    IN BOOLEAN CurrentThread,
529                    OUT PBOOLEAN Enabled);
530
531 NTSTATUS
532 STDCALL
533 RtlImpersonateSelf (
534         IN      SECURITY_IMPERSONATION_LEVEL    ImpersonationLevel
535         );
536
537 NTSTATUS
538 STDCALL
539 RtlpNtCreateKey (
540         OUT     HANDLE                  KeyHandle,
541         IN      ACCESS_MASK             DesiredAccess,
542         IN      POBJECT_ATTRIBUTES      ObjectAttributes,
543         IN      ULONG                   Unused1,
544         OUT     PULONG                  Disposition,
545         IN      ULONG                   Unused2
546         );
547
548 NTSTATUS
549 STDCALL
550 RtlpNtEnumerateSubKey (
551         IN      HANDLE          KeyHandle,
552         OUT     PUNICODE_STRING SubKeyName,
553         IN      ULONG           Index,
554         IN      ULONG           Unused
555         );
556
557 NTSTATUS
558 STDCALL
559 RtlpNtMakeTemporaryKey (
560         IN      HANDLE  KeyHandle
561         );
562
563 NTSTATUS
564 STDCALL
565 RtlpNtOpenKey (
566         OUT     HANDLE                  KeyHandle,
567         IN      ACCESS_MASK             DesiredAccess,
568         IN      POBJECT_ATTRIBUTES      ObjectAttributes,
569         IN      ULONG                   Unused
570         );
571
572 NTSTATUS
573 STDCALL
574 RtlpNtQueryValueKey (
575         IN      HANDLE  KeyHandle,
576         OUT     PULONG  Type            OPTIONAL,
577         OUT     PVOID   Data            OPTIONAL,
578         IN OUT  PULONG  DataLength      OPTIONAL,
579         IN      ULONG   Unused
580         );
581
582 NTSTATUS
583 STDCALL
584 RtlpNtSetValueKey (
585         IN      HANDLE  KeyHandle,
586         IN      ULONG   Type,
587         IN      PVOID   Data,
588         IN      ULONG   DataLength
589         );
590
591
592 VOID NTAPI RtlRunDecodeUnicodeString
593 (
594  IN UCHAR hash,
595  IN OUT PUNICODE_STRING uString
596 );
597
598 VOID NTAPI RtlRunEncodeUnicodeString
599 (
600  IN OUT PUCHAR hash,
601  IN OUT PUNICODE_STRING uString
602 );
603
604 #ifndef __NTDRIVER__
605
606 #ifndef __INTERLOCKED_DECLARED
607 #define __INTERLOCKED_DECLARED
608
609 LONG
610 STDCALL
611 InterlockedIncrement (
612         PLONG Addend
613         );
614
615 LONG
616 STDCALL
617 InterlockedDecrement (
618         PLONG lpAddend
619         );
620
621 LONG
622 STDCALL
623 InterlockedExchange (
624         PLONG Target,
625         LONG Value
626         );
627
628 PVOID
629 STDCALL
630 InterlockedCompareExchange (
631         PVOID *Destination,
632         PVOID Exchange,
633         PVOID Comperand
634         );
635
636 LONG
637 STDCALL
638 InterlockedExchangeAdd (
639         PLONG Addend,
640         LONG Increment
641         );
642
643 #endif /* __INTERLOCKED_DECLARED */
644
645 #endif /* __NTDRIVER__ */
646
647 #ifdef __cplusplus
648 }
649 #endif /* __cplusplus */
650
651
652 #endif /* __INCLUDE_NTDLL_RTL_H */
653
654 /* EOF */