1 /* $Id: rtl.h,v 1.50 2004/10/05 10:40:13 ekohl 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 /* RtlQueryProcessDebugInformation */
177 #define PDI_MODULES 0x01 /* The loaded modules of the process */
178 #define PDI_BACKTRACE 0x02 /* The heap stack back traces */
179 #define PDI_HEAPS 0x04 /* The heaps of the process */
180 #define PDI_HEAP_TAGS 0x08 /* The heap tags */
181 #define PDI_HEAP_BLOCKS 0x10 /* The heap blocks */
182 #define PDI_LOCKS 0x20 /* The locks created by the process */
186 RtlAddAccessAllowedAceEx (IN OUT PACL Acl
,
189 IN ACCESS_MASK AccessMask
,
193 RtlAddAccessDeniedAceEx (IN OUT PACL Acl
,
196 IN ACCESS_MASK AccessMask
,
200 RtlAddAuditAccessAceEx(IN OUT PACL Acl
,
203 IN ACCESS_MASK AccessMask
,
209 RtlDeleteCriticalSection (PCRITICAL_SECTION CriticalSection
);
212 RtlDowncaseUnicodeChar(IN WCHAR Source
);
215 RtlEnterCriticalSection (PCRITICAL_SECTION CriticalSection
);
218 RtlInitializeCriticalSection (PCRITICAL_SECTION CriticalSection
);
221 RtlInitializeCriticalSectionAndSpinCount (PCRITICAL_SECTION CriticalSection
,
225 RtlInt64ToUnicodeString (IN ULONGLONG Value
,
227 PUNICODE_STRING String
);
230 RtlLeaveCriticalSection (PCRITICAL_SECTION CriticalSection
);
233 RtlTryEnterCriticalSection (PCRITICAL_SECTION CriticalSection
);
242 RtlComputeCrc32 (IN ULONG Initial
,
246 PDEBUG_BUFFER STDCALL
247 RtlCreateQueryDebugBuffer(IN ULONG Size
,
248 IN BOOLEAN EventPair
);
251 RtlDestroyQueryDebugBuffer(IN PDEBUG_BUFFER DebugBuffer
);
254 RtlEqualComputerName (
255 IN PUNICODE_STRING ComputerName1
,
256 IN PUNICODE_STRING ComputerName2
261 IN PUNICODE_STRING DomainName1
,
262 IN PUNICODE_STRING DomainName2
266 RtlEraseUnicodeString (
267 IN PUNICODE_STRING String
271 RtlLargeIntegerToChar (
272 IN PLARGE_INTEGER Value
,
283 RtlDetermineDosPathNameType_U (
289 RtlDoesFileExists_U (
295 RtlDosPathNameToNtPathName_U (
297 PUNICODE_STRING ntname
,
315 RtlGetCurrentDirectory_U (
322 RtlGetFullPathName_U (
331 RtlGetLongestNtPathLength (
336 RtlGetNtGlobalFlags (VOID
);
339 RtlGetNtProductType (PNT_PRODUCT_TYPE ProductType
);
350 RtlIsDosDeviceName_U (
356 RtlSetCurrentDirectory_U (
360 /* Environment functions */
375 RtlCreateEnvironment (
382 RtlDestroyEnvironment (
388 RtlExpandEnvironmentStrings_U (
390 PUNICODE_STRING Source
,
391 PUNICODE_STRING Destination
,
397 RtlQueryEnvironmentVariable_U (
399 PUNICODE_STRING Name
,
400 PUNICODE_STRING Value
404 RtlQueryProcessDebugInformation(IN ULONG ProcessId
,
405 IN ULONG DebugInfoClassMask
,
406 IN OUT PDEBUG_BUFFER DebugBuffer
);
410 RtlSetCurrentEnvironment (
411 PWSTR NewEnvironment
,
412 PWSTR
*OldEnvironment
417 RtlSetEnvironmentVariable (
419 PUNICODE_STRING Name
,
420 PUNICODE_STRING Value
425 RtlCreateUserThread (
426 IN HANDLE ProcessHandle
,
427 IN PSECURITY_DESCRIPTOR SecurityDescriptor
,
428 IN BOOLEAN CreateSuspended
,
429 IN LONG StackZeroBits
,
430 IN OUT PULONG StackReserve
,
431 IN OUT PULONG StackCommit
,
432 IN PTHREAD_START_ROUTINE StartAddress
,
434 IN OUT PHANDLE ThreadHandle
,
435 IN OUT PCLIENT_ID ClientId
439 RtlExitUserThread (NTSTATUS Status
);
443 RtlFreeUserThreadStack (
444 IN HANDLE ProcessHandle
,
445 IN HANDLE ThreadHandle
450 RtlCreateUserProcess (
451 IN PUNICODE_STRING ImageFileName
,
453 IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters
,
454 IN PSECURITY_DESCRIPTOR ProcessSecutityDescriptor OPTIONAL
,
455 IN PSECURITY_DESCRIPTOR ThreadSecurityDescriptor OPTIONAL
,
456 IN HANDLE ParentProcess OPTIONAL
,
457 IN BOOLEAN CurrentDirectory
,
458 IN HANDLE DebugPort OPTIONAL
,
459 IN HANDLE ExceptionPort OPTIONAL
,
460 OUT PRTL_PROCESS_INFO ProcessInfo
465 RtlCreateProcessParameters (
466 OUT PRTL_USER_PROCESS_PARAMETERS
*ProcessParameters
,
467 IN PUNICODE_STRING ImagePathName OPTIONAL
,
468 IN PUNICODE_STRING DllPath OPTIONAL
,
469 IN PUNICODE_STRING CurrentDirectory OPTIONAL
,
470 IN PUNICODE_STRING CommandLine OPTIONAL
,
471 IN PWSTR Environment OPTIONAL
,
472 IN PUNICODE_STRING WindowTitle OPTIONAL
,
473 IN PUNICODE_STRING DesktopInfo OPTIONAL
,
474 IN PUNICODE_STRING ShellInfo OPTIONAL
,
475 IN PUNICODE_STRING RuntimeInfo OPTIONAL
478 PRTL_USER_PROCESS_PARAMETERS
480 RtlDeNormalizeProcessParams (
481 IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters
486 RtlDestroyProcessParameters (
487 IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters
490 PRTL_USER_PROCESS_PARAMETERS
492 RtlNormalizeProcessParams (
493 IN PRTL_USER_PROCESS_PARAMETERS ProcessParameters
498 RtlLocalTimeToSystemTime (
499 PLARGE_INTEGER LocalTime
,
500 PLARGE_INTEGER SystemTime
505 RtlSystemTimeToLocalTime (
506 PLARGE_INTEGER SystemTime
,
507 PLARGE_INTEGER LocalTime
511 RtlTimeToElapsedTimeFields(IN PLARGE_INTEGER Time
,
512 OUT PTIME_FIELDS TimeFields
);
521 /* resource functions */
525 RtlAcquireResourceExclusive (
526 IN PRTL_RESOURCE Resource
,
532 RtlAcquireResourceShared (
533 IN PRTL_RESOURCE Resource
,
539 RtlConvertExclusiveToShared (
540 IN PRTL_RESOURCE Resource
545 RtlConvertSharedToExclusive (
546 IN PRTL_RESOURCE Resource
552 IN PRTL_RESOURCE Resource
558 IN PRTL_RESOURCE Resource
563 RtlInitializeResource (
564 IN PRTL_RESOURCE Resource
570 IN PRTL_RESOURCE Resource
573 /* handle table functions */
578 IN PRTL_HANDLE_TABLE HandleTable
,
584 RtlDestroyHandleTable (
585 IN PRTL_HANDLE_TABLE HandleTable
591 IN PRTL_HANDLE_TABLE HandleTable
,
592 IN PRTL_HANDLE Handle
597 RtlInitializeHandleTable (
600 IN PRTL_HANDLE_TABLE HandleTable
606 IN PRTL_HANDLE_TABLE HandleTable
,
607 IN PRTL_HANDLE Handle
612 RtlIsValidIndexHandle (
613 IN PRTL_HANDLE_TABLE HandleTable
,
614 IN OUT PRTL_HANDLE
*Handle
,
619 RtlAdjustPrivilege(IN ULONG Privilege
,
621 IN BOOLEAN CurrentThread
,
622 OUT PBOOLEAN Enabled
);
627 IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
633 OUT HANDLE KeyHandle
,
634 IN ACCESS_MASK DesiredAccess
,
635 IN POBJECT_ATTRIBUTES ObjectAttributes
,
637 OUT PULONG Disposition
,
643 RtlpNtEnumerateSubKey (
645 OUT PUNICODE_STRING SubKeyName
,
652 RtlpNtMakeTemporaryKey (
659 OUT HANDLE KeyHandle
,
660 IN ACCESS_MASK DesiredAccess
,
661 IN POBJECT_ATTRIBUTES ObjectAttributes
,
667 RtlpNtQueryValueKey (
669 OUT PULONG Type OPTIONAL
,
670 OUT PVOID Data OPTIONAL
,
671 IN OUT PULONG DataLength OPTIONAL
,
686 RtlRunDecodeUnicodeString (IN UCHAR Hash
,
687 IN OUT PUNICODE_STRING String
);
690 RtlRunEncodeUnicodeString (IN OUT PUCHAR Hash
,
691 IN OUT PUNICODE_STRING String
);
693 /* Timer Queue functions */
697 #else /* __USE_W32API */
698 typedef VOID (CALLBACK
*WAITORTIMERCALLBACKFUNC
) (PVOID
, BOOLEAN
);
699 #endif /* __USE_W32API */
703 RtlCreateTimer(HANDLE TimerQueue
,PHANDLE phNewTimer
, WAITORTIMERCALLBACKFUNC Callback
,PVOID Parameter
,DWORD DueTime
,DWORD Period
,ULONG Flags
);
707 RtlCreateTimerQueue(PHANDLE TimerQueue
);
711 RtlDeleteTimer(HANDLE TimerQueue
,HANDLE Timer
,HANDLE CompletionEvent
);
715 RtlUpdateTimer(HANDLE TimerQueue
,HANDLE Timer
,ULONG DueTime
,ULONG Period
);
719 RtlDeleteTimerQueueEx(HANDLE TimerQueue
,HANDLE CompletionEvent
);
723 RtlDeleteTimerQueue(HANDLE TimerQueue
);
728 #ifndef __INTERLOCKED_DECLARED
729 #define __INTERLOCKED_DECLARED
733 InterlockedIncrement (
739 InterlockedDecrement (
745 InterlockedExchange (
752 InterlockedCompareExchange (
760 InterlockedExchangeAdd (
765 #endif /* __INTERLOCKED_DECLARED */
767 #endif /* __NTDRIVER__ */
771 #endif /* __cplusplus */
774 #endif /* __INCLUDE_NTDLL_RTL_H */