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