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