1 /* $Id: rtl.h,v 1.49 2004/10/04 21:38:48 ion Exp $
5 #ifndef __INCLUDE_NTDLL_RTL_H
6 #define __INCLUDE_NTDLL_RTL_H
8 #include <ntos/types.h>
10 #include <ddk/ntddk.h>
11 #include <ddk/ntifs.h>
15 #endif /* __cplusplus */
20 typedef struct _DEBUG_BUFFER
24 PVOID RemoteSectionBase
;
25 ULONG SectionBaseDelta
;
26 HANDLE EventPairHandle
;
28 HANDLE RemoteThreadHandle
;
33 PVOID ModuleInformation
;
34 PVOID BackTraceInformation
;
35 PVOID HeapInformation
;
36 PVOID LockInformation
;
38 } DEBUG_BUFFER
, *PDEBUG_BUFFER
;
40 /* DEBUG_MODULE_INFORMATION.Flags constants */
41 #define LDRP_STATIC_LINK 0x00000002
42 #define LDRP_IMAGE_DLL 0x00000004
43 #define LDRP_LOAD_IN_PROGRESS 0x00001000
44 #define LDRP_UNLOAD_IN_PROGRESS 0x00002000
45 #define LDRP_ENTRY_PROCESSED 0x00004000
46 #define LDRP_ENTRY_INSERTED 0x00008000
47 #define LDRP_CURRENT_LOAD 0x00010000
48 #define LDRP_FAILED_BUILTIN_LOAD 0x00020000
49 #define LDRP_DONT_CALL_FOR_THREADS 0x00040000
50 #define LDRP_PROCESS_ATTACH_CALLED 0x00080000
51 #define LDRP_DEBUG_SYMBOLS_LOADED 0x00100000
52 #define LDRP_IMAGE_NOT_AT_BASE 0x00200000
53 #define LDRP_WX86_IGNORE_MACHINETYPE 0x00400000
55 typedef struct _DEBUG_MODULE_INFORMATION
{
63 USHORT ModuleNameOffset
;
65 } DEBUG_MODULE_INFORMATION
, *PDEBUG_MODULE_INFORMATION
;
67 typedef struct _DEBUG_HEAP_INFORMATION
{
79 } DEBUG_HEAP_INFORMATION
, *PDEBUG_HEAP_INFORMATION
;
81 typedef struct _DEBUG_LOCK_INFORMATION
{
84 USHORT CreatorBackTraceIndex
;
87 ULONG ContentionCount
;
90 ULONG NumberOfSharedWaiters
;
91 ULONG NumberOfExclusiveWaiters
;
92 } DEBUG_LOCK_INFORMATION
, *PDEBUG_LOCK_INFORMATION
;
95 typedef struct _LOCK_INFORMATION
98 DEBUG_LOCK_INFORMATION LockEntry
[1];
99 } LOCK_INFORMATION
, *PLOCK_INFORMATION
;
101 typedef struct _HEAP_INFORMATION
104 DEBUG_HEAP_INFORMATION HeapEntry
[1];
105 } HEAP_INFORMATION
, *PHEAP_INFORMATION
;
108 typedef struct _CRITICAL_SECTION_DEBUG
111 USHORT CreatorBackTraceIndex
;
112 struct _CRITICAL_SECTION
*CriticalSection
;
113 LIST_ENTRY ProcessLocksList
;
115 ULONG ContentionCount
;
117 PVOID OwnerBackTrace
[ 5 ];
118 } CRITICAL_SECTION_DEBUG
, *PCRITICAL_SECTION_DEBUG
;
121 typedef struct _CRITICAL_SECTION
123 PCRITICAL_SECTION_DEBUG DebugInfo
;
127 HANDLE LockSemaphore
;
129 } CRITICAL_SECTION
, *PCRITICAL_SECTION
, *LPCRITICAL_SECTION
;
131 typedef CRITICAL_SECTION RTL_CRITICAL_SECTION
;
132 typedef PCRITICAL_SECTION PRTL_CRITICAL_SECTION
;
133 typedef LPCRITICAL_SECTION LPRTL_CRITICAL_SECTION
;
135 #endif /* !__USE_W32API */
138 typedef struct _RTL_PROCESS_INFO
141 HANDLE ProcessHandle
;
144 SECTION_IMAGE_INFORMATION ImageInfo
;
145 } RTL_PROCESS_INFO
, *PRTL_PROCESS_INFO
;
147 typedef struct _RTL_RESOURCE
149 CRITICAL_SECTION Lock
;
150 HANDLE SharedSemaphore
;
152 HANDLE ExclusiveSemaphore
;
153 ULONG ExclusiveWaiters
;
156 ULONG TimeoutBoost
; /* ?? */
157 PVOID DebugInfo
; /* ?? */
158 } RTL_RESOURCE
, *PRTL_RESOURCE
;
160 typedef struct _RTL_HANDLE
162 struct _RTL_HANDLE
*Next
; /* pointer to next free handle */
163 } RTL_HANDLE
, *PRTL_HANDLE
;
165 typedef struct _RTL_HANDLE_TABLE
167 ULONG TableSize
; /* maximum number of handles */
168 ULONG HandleSize
; /* size of handle in bytes */
169 PRTL_HANDLE Handles
; /* pointer to handle array */
170 PRTL_HANDLE Limit
; /* limit of pointers */
171 PRTL_HANDLE FirstFree
; /* pointer to first free handle */
172 PRTL_HANDLE LastUsed
; /* pointer to last allocated handle */
173 } RTL_HANDLE_TABLE
, *PRTL_HANDLE_TABLE
;
176 #define HEAP_BASE (0xA0000000)
178 /* RtlQueryProcessDebugInformation */
179 #define PDI_MODULES 0x01 /* The loaded modules of the process */
180 #define PDI_BACKTRACE 0x02 /* The heap stack back traces */
181 #define PDI_HEAPS 0x04 /* The heaps of the process */
182 #define PDI_HEAP_TAGS 0x08 /* The heap tags */
183 #define PDI_HEAP_BLOCKS 0x10 /* The heap blocks */
184 #define PDI_LOCKS 0x20 /* The locks created by the process */
188 RtlAddAccessAllowedAceEx (IN OUT PACL Acl
,
191 IN ACCESS_MASK AccessMask
,
195 RtlAddAccessDeniedAceEx (IN OUT PACL Acl
,
198 IN ACCESS_MASK AccessMask
,
202 RtlAddAuditAccessAceEx(IN OUT PACL Acl
,
205 IN ACCESS_MASK AccessMask
,
211 RtlDeleteCriticalSection (PCRITICAL_SECTION CriticalSection
);
214 RtlDowncaseUnicodeChar(IN WCHAR Source
);
217 RtlEnterCriticalSection (PCRITICAL_SECTION CriticalSection
);
220 RtlInitializeCriticalSection (PCRITICAL_SECTION CriticalSection
);
223 RtlInitializeCriticalSectionAndSpinCount (PCRITICAL_SECTION CriticalSection
,
227 RtlInt64ToUnicodeString (IN ULONGLONG Value
,
229 PUNICODE_STRING String
);
232 RtlLeaveCriticalSection (PCRITICAL_SECTION CriticalSection
);
235 RtlTryEnterCriticalSection (PCRITICAL_SECTION CriticalSection
);
244 RtlComputeCrc32 (IN ULONG Initial
,
248 PDEBUG_BUFFER STDCALL
249 RtlCreateQueryDebugBuffer(IN ULONG Size
,
250 IN BOOLEAN EventPair
);
253 RtlDestroyQueryDebugBuffer(IN PDEBUG_BUFFER DebugBuffer
);
256 RtlEqualComputerName (
257 IN PUNICODE_STRING ComputerName1
,
258 IN PUNICODE_STRING ComputerName2
263 IN PUNICODE_STRING DomainName1
,
264 IN PUNICODE_STRING DomainName2
268 RtlEraseUnicodeString (
269 IN PUNICODE_STRING String
273 RtlLargeIntegerToChar (
274 IN PLARGE_INTEGER Value
,
285 RtlDetermineDosPathNameType_U (
291 RtlDoesFileExists_U (
297 RtlDosPathNameToNtPathName_U (
299 PUNICODE_STRING ntname
,
317 RtlGetCurrentDirectory_U (
324 RtlGetFullPathName_U (
333 RtlGetLongestNtPathLength (
338 RtlGetNtGlobalFlags (VOID
);
341 RtlGetNtProductType (PNT_PRODUCT_TYPE ProductType
);
352 RtlIsDosDeviceName_U (
358 RtlSetCurrentDirectory_U (
362 /* Environment functions */
377 RtlCreateEnvironment (
384 RtlDestroyEnvironment (
390 RtlExpandEnvironmentStrings_U (
392 PUNICODE_STRING Source
,
393 PUNICODE_STRING Destination
,
399 RtlQueryEnvironmentVariable_U (
401 PUNICODE_STRING Name
,
402 PUNICODE_STRING Value
406 RtlQueryProcessDebugInformation(IN ULONG ProcessId
,
407 IN ULONG DebugInfoClassMask
,
408 IN OUT PDEBUG_BUFFER DebugBuffer
);
412 RtlSetCurrentEnvironment (
413 PWSTR NewEnvironment
,
414 PWSTR
*OldEnvironment
419 RtlSetEnvironmentVariable (
421 PUNICODE_STRING Name
,
422 PUNICODE_STRING Value
427 RtlCreateUserThread (
428 IN HANDLE ProcessHandle
,
429 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
430 IN BOOLEAN CreateSuspended
,
431 IN LONG StackZeroBits
,
432 IN OUT PULONG StackReserve
,
433 IN OUT PULONG StackCommit
,
434 IN PTHREAD_START_ROUTINE StartAddress
,
436 IN OUT PHANDLE ThreadHandle
,
437 IN OUT PCLIENT_ID ClientId
441 RtlExitUserThread (NTSTATUS Status
);
445 RtlFreeUserThreadStack (
446 IN HANDLE ProcessHandle
,
447 IN HANDLE ThreadHandle
452 RtlCreateUserProcess (
453 IN PUNICODE_STRING ImageFileName
,
455 IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters
,
456 IN PSECURITY_DESCRIPTOR ProcessSecutityDescriptor OPTIONAL
,
457 IN PSECURITY_DESCRIPTOR ThreadSecurityDescriptor OPTIONAL
,
458 IN HANDLE ParentProcess OPTIONAL
,
459 IN BOOLEAN CurrentDirectory
,
460 IN HANDLE DebugPort OPTIONAL
,
461 IN HANDLE ExceptionPort OPTIONAL
,
462 OUT PRTL_PROCESS_INFO ProcessInfo
467 RtlCreateProcessParameters (
468 OUT PRTL_USER_PROCESS_PARAMETERS
*ProcessParameters
,
469 IN PUNICODE_STRING ImagePathName OPTIONAL
,
470 IN PUNICODE_STRING DllPath OPTIONAL
,
471 IN PUNICODE_STRING CurrentDirectory OPTIONAL
,
472 IN PUNICODE_STRING CommandLine OPTIONAL
,
473 IN PWSTR Environment OPTIONAL
,
474 IN PUNICODE_STRING WindowTitle OPTIONAL
,
475 IN PUNICODE_STRING DesktopInfo OPTIONAL
,
476 IN PUNICODE_STRING ShellInfo OPTIONAL
,
477 IN PUNICODE_STRING RuntimeInfo OPTIONAL
480 PRTL_USER_PROCESS_PARAMETERS
482 RtlDeNormalizeProcessParams (
483 IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters
488 RtlDestroyProcessParameters (
489 IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters
492 PRTL_USER_PROCESS_PARAMETERS
494 RtlNormalizeProcessParams (
495 IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters
500 RtlLocalTimeToSystemTime (
501 PLARGE_INTEGER LocalTime
,
502 PLARGE_INTEGER SystemTime
507 RtlSystemTimeToLocalTime (
508 PLARGE_INTEGER SystemTime
,
509 PLARGE_INTEGER LocalTime
513 RtlTimeToElapsedTimeFields(IN PLARGE_INTEGER Time
,
514 OUT PTIME_FIELDS TimeFields
);
523 /* resource functions */
527 RtlAcquireResourceExclusive (
528 IN PRTL_RESOURCE Resource
,
534 RtlAcquireResourceShared (
535 IN PRTL_RESOURCE Resource
,
541 RtlConvertExclusiveToShared (
542 IN PRTL_RESOURCE Resource
547 RtlConvertSharedToExclusive (
548 IN PRTL_RESOURCE Resource
554 IN PRTL_RESOURCE Resource
560 IN PRTL_RESOURCE Resource
565 RtlInitializeResource (
566 IN PRTL_RESOURCE Resource
572 IN PRTL_RESOURCE Resource
575 /* handle table functions */
580 IN PRTL_HANDLE_TABLE HandleTable
,
586 RtlDestroyHandleTable (
587 IN PRTL_HANDLE_TABLE HandleTable
593 IN PRTL_HANDLE_TABLE HandleTable
,
594 IN PRTL_HANDLE Handle
599 RtlInitializeHandleTable (
602 IN PRTL_HANDLE_TABLE HandleTable
608 IN PRTL_HANDLE_TABLE HandleTable
,
609 IN PRTL_HANDLE Handle
614 RtlIsValidIndexHandle (
615 IN PRTL_HANDLE_TABLE HandleTable
,
616 IN OUT PRTL_HANDLE
*Handle
,
621 RtlAdjustPrivilege(IN ULONG Privilege
,
623 IN BOOLEAN CurrentThread
,
624 OUT PBOOLEAN Enabled
);
629 IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
635 OUT HANDLE KeyHandle
,
636 IN ACCESS_MASK DesiredAccess
,
637 IN POBJECT_ATTRIBUTES ObjectAttributes
,
639 OUT PULONG Disposition
,
645 RtlpNtEnumerateSubKey (
647 OUT PUNICODE_STRING SubKeyName
,
654 RtlpNtMakeTemporaryKey (
661 OUT HANDLE KeyHandle
,
662 IN ACCESS_MASK DesiredAccess
,
663 IN POBJECT_ATTRIBUTES ObjectAttributes
,
669 RtlpNtQueryValueKey (
671 OUT PULONG Type OPTIONAL
,
672 OUT PVOID Data OPTIONAL
,
673 IN OUT PULONG DataLength OPTIONAL
,
688 RtlRunDecodeUnicodeString (IN UCHAR Hash
,
689 IN OUT PUNICODE_STRING String
);
692 RtlRunEncodeUnicodeString (IN OUT PUCHAR Hash
,
693 IN OUT PUNICODE_STRING String
);
695 /* Timer Queue functions */
699 #else /* __USE_W32API */
700 typedef VOID (CALLBACK
*WAITORTIMERCALLBACKFUNC
) (PVOID
, BOOLEAN
);
701 #endif /* __USE_W32API */
705 RtlCreateTimer(HANDLE TimerQueue
,PHANDLE phNewTimer
, WAITORTIMERCALLBACKFUNC Callback
,PVOID Parameter
,DWORD DueTime
,DWORD Period
,ULONG Flags
);
709 RtlCreateTimerQueue(PHANDLE TimerQueue
);
713 RtlDeleteTimer(HANDLE TimerQueue
,HANDLE Timer
,HANDLE CompletionEvent
);
717 RtlUpdateTimer(HANDLE TimerQueue
,HANDLE Timer
,ULONG DueTime
,ULONG Period
);
721 RtlDeleteTimerQueueEx(HANDLE TimerQueue
,HANDLE CompletionEvent
);
725 RtlDeleteTimerQueue(HANDLE TimerQueue
);
730 #ifndef __INTERLOCKED_DECLARED
731 #define __INTERLOCKED_DECLARED
735 InterlockedIncrement (
741 InterlockedDecrement (
747 InterlockedExchange (
754 InterlockedCompareExchange (
762 InterlockedExchangeAdd (
767 #endif /* __INTERLOCKED_DECLARED */
769 #endif /* __NTDRIVER__ */
773 #endif /* __cplusplus */
776 #endif /* __INCLUDE_NTDLL_RTL_H */