/*++ BUILD Version: 0001 // Increment this if a change has global effects Copyright (c) 1989-1993 Microsoft Corporation Module Name: ntrtl.h Abstract: Include file for NT runtime routines that are callable by only user mode code in various. Author: Steve Wood (stevewo) 10-Aug-1989 Environment: These routines are statically linked in the caller's executable and are callable in only from user mode. They make use of Nt system services. Revision History: --*/ #ifndef _NTURTL_ #define _NTURTL_ // // CriticalSection function definitions // // begin_winnt typedef struct _RTL_CRITICAL_SECTION_DEBUG { USHORT Type; USHORT CreatorBackTraceIndex; struct _RTL_CRITICAL_SECTION *CriticalSection; LIST_ENTRY ProcessLocksList; ULONG EntryCount; ULONG ContentionCount; ULONG Spare[ 2 ]; } RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG; #define RTL_CRITSECT_TYPE 0 #define RTL_RESOURCE_TYPE 1 typedef struct _RTL_CRITICAL_SECTION { PRTL_CRITICAL_SECTION_DEBUG DebugInfo; // // The following three fields control entering and exiting the critical // section for the resource // LONG LockCount; LONG RecursionCount; HANDLE OwningThread; // from the thread's ClientId->UniqueThread HANDLE LockSemaphore; ULONG Reserved; } RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION; // end_winnt // // Shared resource function definitions // typedef struct _RTL_RESOURCE_DEBUG { ULONG Reserved[ 5 ]; // Make it the same length as RTL_CRITICAL_SECTION_DEBUG ULONG ContentionCount; ULONG Spare[ 2 ]; } RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_DEBUG; typedef struct _RTL_RESOURCE { // // The following field controls entering and exiting the critical // section for the resource // RTL_CRITICAL_SECTION CriticalSection; // // The following four fields indicate the number of both shared or // exclusive waiters // HANDLE SharedSemaphore; ULONG NumberOfWaitingShared; HANDLE ExclusiveSemaphore; ULONG NumberOfWaitingExclusive; // // The following indicates the current state of the resource // // <0 the resource is acquired for exclusive access with the // absolute value indicating the number of recursive accesses // to the resource // // 0 the resource is available // // >0 the resource is acquired for shared access with the // value indicating the number of shared accesses to the resource // LONG NumberOfActive; HANDLE ExclusiveOwnerThread; ULONG Flags; // See RTL_RESOURCE_FLAG_ equates below. PRTL_RESOURCE_DEBUG DebugInfo; } RTL_RESOURCE, *PRTL_RESOURCE; #define RTL_RESOURCE_FLAG_LONG_TERM ((ULONG) 0x00000001) NTSYSAPI NTSTATUS NTAPI RtlEnterCriticalSection( PRTL_CRITICAL_SECTION CriticalSection ); NTSYSAPI NTSTATUS NTAPI RtlLeaveCriticalSection( PRTL_CRITICAL_SECTION CriticalSection ); NTSYSAPI BOOLEAN NTAPI RtlTryEnterCriticalSection( PRTL_CRITICAL_SECTION CriticalSection ); NTSYSAPI NTSTATUS NTAPI RtlInitializeCriticalSection( PRTL_CRITICAL_SECTION CriticalSection ); NTSYSAPI NTSTATUS NTAPI RtlDeleteCriticalSection( PRTL_CRITICAL_SECTION CriticalSection ); NTSYSAPI VOID NTAPI RtlInitializeResource( PRTL_RESOURCE Resource ); NTSYSAPI BOOLEAN NTAPI RtlAcquireResourceShared( PRTL_RESOURCE Resource, BOOLEAN Wait ); NTSYSAPI BOOLEAN NTAPI RtlAcquireResourceExclusive( PRTL_RESOURCE Resource, BOOLEAN Wait ); NTSYSAPI VOID NTAPI RtlReleaseResource( PRTL_RESOURCE Resource ); NTSYSAPI VOID NTAPI RtlConvertSharedToExclusive( PRTL_RESOURCE Resource ); NTSYSAPI VOID NTAPI RtlConvertExclusiveToShared( PRTL_RESOURCE Resource ); NTSYSAPI VOID NTAPI RtlDeleteResource ( PRTL_RESOURCE Resource ); // // Current Directory Stuff // typedef struct _RTL_RELATIVE_NAME { STRING RelativeName; HANDLE ContainingDirectory; } RTL_RELATIVE_NAME, *PRTL_RELATIVE_NAME; typedef enum _RTL_PATH_TYPE { RtlPathTypeUnknown, RtlPathTypeUncAbsolute, RtlPathTypeDriveAbsolute, RtlPathTypeDriveRelative, RtlPathTypeRooted, RtlPathTypeRelative, RtlPathTypeLocalDevice, RtlPathTypeRootLocalDevice } RTL_PATH_TYPE; NTSYSAPI RTL_PATH_TYPE NTAPI RtlDetermineDosPathNameType_U( PCWSTR DosFileName ); NTSYSAPI ULONG NTAPI RtlIsDosDeviceName_U( PWSTR DosFileName ); NTSYSAPI ULONG NTAPI RtlGetFullPathName_U( PCWSTR lpFileName, ULONG nBufferLength, PWSTR lpBuffer, PWSTR *lpFilePart ); NTSYSAPI ULONG NTAPI RtlGetCurrentDirectory_U( ULONG nBufferLength, PWSTR lpBuffer ); NTSYSAPI NTSTATUS NTAPI RtlSetCurrentDirectory_U( PUNICODE_STRING PathName ); NTSYSAPI ULONG NTAPI RtlGetLongestNtPathLength( VOID ); NTSYSAPI BOOLEAN NTAPI RtlDosPathNameToNtPathName_U( PCWSTR DosFileName, PUNICODE_STRING NtFileName, PWSTR *FilePart OPTIONAL, PRTL_RELATIVE_NAME RelativeName OPTIONAL ); NTSYSAPI ULONG NTAPI RtlDosSearchPath_U( PWSTR lpPath, PWSTR lpFileName, PWSTR lpExtension, ULONG nBufferLength, PWSTR lpBuffer, PWSTR *lpFilePart ); NTSYSAPI BOOLEAN NTAPI RtlDoesFileExists_U( PCWSTR FileName ); NTSYSAPI NTSTATUS NTAPI RtlInitializeProfile ( BOOLEAN KernelToo ); NTSYSAPI NTSTATUS NTAPI RtlStartProfile ( VOID ); NTSYSAPI NTSTATUS NTAPI RtlStopProfile ( VOID ); NTSYSAPI NTSTATUS NTAPI RtlAnalyzeProfile ( VOID ); // // User mode only security Rtl routines // // // Structure to hold information about an ACE to be created // typedef struct { UCHAR AceType; UCHAR InheritFlags; UCHAR AceFlags; ACCESS_MASK Mask; PSID *Sid; } RTL_ACE_DATA, *PRTL_ACE_DATA; NTSYSAPI NTSTATUS NTAPI RtlNewSecurityObject( PSECURITY_DESCRIPTOR ParentDescriptor, PSECURITY_DESCRIPTOR CreatorDescriptor, PSECURITY_DESCRIPTOR * NewDescriptor, BOOLEAN IsDirectoryObject, HANDLE Token, PGENERIC_MAPPING GenericMapping ); NTSYSAPI NTSTATUS NTAPI RtlSetSecurityObject ( SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR ModificationDescriptor, PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, PGENERIC_MAPPING GenericMapping, HANDLE Token ); NTSYSAPI NTSTATUS NTAPI RtlQuerySecurityObject ( PSECURITY_DESCRIPTOR ObjectDescriptor, SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR ResultantDescriptor, ULONG DescriptorLength, PULONG ReturnLength ); NTSYSAPI NTSTATUS NTAPI RtlDeleteSecurityObject ( PSECURITY_DESCRIPTOR * ObjectDescriptor ); NTSYSAPI NTSTATUS NTAPI RtlNewInstanceSecurityObject( BOOLEAN ParentDescriptorChanged, BOOLEAN CreatorDescriptorChanged, PLUID OldClientTokenModifiedId, PLUID NewClientTokenModifiedId, PSECURITY_DESCRIPTOR ParentDescriptor, PSECURITY_DESCRIPTOR CreatorDescriptor, PSECURITY_DESCRIPTOR * NewDescriptor, BOOLEAN IsDirectoryObject, HANDLE Token, PGENERIC_MAPPING GenericMapping ); NTSYSAPI NTSTATUS NTAPI RtlCopySecurityDescriptor( PSECURITY_DESCRIPTOR InputSecurityDescriptor, PSECURITY_DESCRIPTOR *OutputSecurityDescriptor ); // // list canonicalization // NTSYSAPI NTSTATUS NTAPI RtlConvertUiListToApiList( PUNICODE_STRING UiList OPTIONAL, PUNICODE_STRING ApiList, BOOLEAN BlankIsDelimiter ); NTSYSAPI NTSTATUS NTAPI RtlCreateAndSetSD( IN PRTL_ACE_DATA AceData, IN ULONG AceCount, IN PSID OwnerSid OPTIONAL, IN PSID GroupSid OPTIONAL, OUT PSECURITY_DESCRIPTOR *NewDescriptor ); NTSYSAPI NTSTATUS NTAPI RtlCreateUserSecurityObject( IN PRTL_ACE_DATA AceData, IN ULONG AceCount, IN PSID OwnerSid, IN PSID GroupSid, IN BOOLEAN IsDirectoryObject, IN PGENERIC_MAPPING GenericMapping, OUT PSECURITY_DESCRIPTOR *NewDescriptor ); // // Per-Thread Curdir Support // typedef struct _RTL_PERTHREAD_CURDIR { PRTL_DRIVE_LETTER_CURDIR CurrentDirectories; PUNICODE_STRING ImageName; PVOID Environment; } RTL_PERTHREAD_CURDIR, *PRTL_PERTHREAD_CURDIR; #define RtlAssociatePerThreadCurdir(BLOCK,CURRENTDIRECTORIES,IMAGENAME,ENVIRONMENT)\ (BLOCK)->CurrentDirectories = (CURRENTDIRECTORIES); \ (BLOCK)->ImageName = (IMAGENAME); \ (BLOCK)->Environment = (ENVIRONMENT); \ NtCurrentTeb()->NtTib.SubSystemTib = (PVOID)(BLOCK) \ #define RtlDisAssociatePerThreadCurdir() \ NtCurrentTeb()->NtTib.SubSystemTib = NULL; #define RtlGetPerThreadCurdir() \ ((PRTL_PERTHREAD_CURDIR)(NtCurrentTeb()->NtTib.SubSystemTib)) // // See NTRTL.H for heap functions availble to both kernel and user mode code. // #define RtlProcessHeap() (NtCurrentPeb()->ProcessHeap) NTSYSAPI BOOLEAN NTAPI RtlLockHeap( IN PVOID HeapHandle ); NTSYSAPI BOOLEAN NTAPI RtlUnlockHeap( IN PVOID HeapHandle ); NTSYSAPI PVOID NTAPI RtlReAllocateHeap( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID BaseAddress, IN ULONG Size ); NTSYSAPI BOOLEAN NTAPI RtlGetUserInfoHeap( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID BaseAddress, OUT PVOID *UserValue OPTIONAL, OUT PULONG UserFlags OPTIONAL ); NTSYSAPI BOOLEAN NTAPI RtlSetUserValueHeap( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID BaseAddress, IN PVOID UserValue ); NTSYSAPI BOOLEAN NTAPI RtlSetUserFlagsHeap( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID BaseAddress, IN ULONG UserFlagsReset, IN ULONG UserFlagsSet ); typedef struct _RTL_HEAP_TAG_INFO { ULONG NumberOfAllocations; ULONG NumberOfFrees; ULONG BytesAllocated; } RTL_HEAP_TAG_INFO, *PRTL_HEAP_TAG_INFO; NTSYSAPI ULONG NTAPI RtlCreateTagHeap( IN PVOID HeapHandle, IN ULONG Flags, IN PWSTR TagPrefix OPTIONAL, IN PWSTR TagNames ); #define RTL_HEAP_MAKE_TAG HEAP_MAKE_TAG_FLAGS NTSYSAPI PWSTR NTAPI RtlQueryTagHeap( IN PVOID HeapHandle, IN ULONG Flags, IN USHORT TagIndex, IN BOOLEAN ResetCounters, OUT PRTL_HEAP_TAG_INFO TagInfo OPTIONAL ); NTSYSAPI ULONG NTAPI RtlSizeHeap( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID BaseAddress ); NTSYSAPI NTSTATUS NTAPI RtlExtendHeap( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID Base, IN ULONG Size ); NTSYSAPI ULONG NTAPI RtlCompactHeap( IN PVOID HeapHandle, IN ULONG Flags ); NTSYSAPI NTSTATUS NTAPI RtlZeroHeap( IN PVOID HeapHandle, IN ULONG Flags ); NTSYSAPI BOOLEAN NTAPI RtlValidateHeap( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID BaseAddress ); NTSYSAPI BOOLEAN NTAPI RtlValidateProcessHeaps( VOID ); NTSYSAPI ULONG NTAPI RtlGetProcessHeaps( ULONG NumberOfHeaps, PVOID *ProcessHeaps ); typedef NTSTATUS (*PRTL_ENUM_HEAPS_ROUTINE)( PVOID HeapHandle, PVOID Parameter ); NTSYSAPI NTSTATUS NTAPI RtlEnumProcessHeaps( PRTL_ENUM_HEAPS_ROUTINE EnumRoutine, PVOID Parameter ); typedef struct _RTL_HEAP_USAGE_ENTRY { struct _RTL_HEAP_USAGE_ENTRY *Next; PVOID Address; ULONG Size; USHORT AllocatorBackTraceIndex; USHORT TagIndex; } RTL_HEAP_USAGE_ENTRY, *PRTL_HEAP_USAGE_ENTRY; typedef struct _RTL_HEAP_USAGE { ULONG Length; ULONG BytesAllocated; ULONG BytesCommitted; ULONG BytesReserved; ULONG BytesReservedMaximum; PRTL_HEAP_USAGE_ENTRY Entries; PRTL_HEAP_USAGE_ENTRY AddedEntries; PRTL_HEAP_USAGE_ENTRY RemovedEntries; ULONG Reserved[ 8 ]; } RTL_HEAP_USAGE, *PRTL_HEAP_USAGE; #define HEAP_USAGE_ALLOCATED_BLOCKS HEAP_REALLOC_IN_PLACE_ONLY #define HEAP_USAGE_FREE_BUFFER HEAP_ZERO_MEMORY NTSYSAPI NTSTATUS NTAPI RtlUsageHeap( IN PVOID HeapHandle, IN ULONG Flags, IN OUT PRTL_HEAP_USAGE Usage ); typedef struct _RTL_HEAP_WALK_ENTRY { PVOID DataAddress; ULONG DataSize; UCHAR OverheadBytes; UCHAR SegmentIndex; USHORT Flags; union { struct { ULONG Settable; USHORT TagIndex; USHORT AllocatorBackTraceIndex; ULONG Reserved[ 2 ]; } Block; struct { ULONG CommittedSize; ULONG UnCommittedSize; PVOID FirstEntry; PVOID LastEntry; } Segment; }; } RTL_HEAP_WALK_ENTRY, *PRTL_HEAP_WALK_ENTRY; NTSYSAPI NTSTATUS NTAPI RtlWalkHeap( IN PVOID HeapHandle, IN OUT PRTL_HEAP_WALK_ENTRY Entry ); typedef struct _RTL_HEAP_ENTRY { ULONG Size; USHORT Flags; USHORT AllocatorBackTraceIndex; union { struct { ULONG Settable; ULONG Tag; } s1; // All other heap entries struct { ULONG CommittedSize; PVOID FirstBlock; } s2; // RTL_SEGMENT } u; } RTL_HEAP_ENTRY, *PRTL_HEAP_ENTRY; #define RTL_HEAP_BUSY (USHORT)0x0001 #define RTL_HEAP_SEGMENT (USHORT)0x0002 #define RTL_HEAP_SETTABLE_VALUE (USHORT)0x0010 #define RTL_HEAP_SETTABLE_FLAG1 (USHORT)0x0020 #define RTL_HEAP_SETTABLE_FLAG2 (USHORT)0x0040 #define RTL_HEAP_SETTABLE_FLAG3 (USHORT)0x0080 #define RTL_HEAP_SETTABLE_FLAGS (USHORT)0x00E0 #define RTL_HEAP_UNCOMMITTED_RANGE (USHORT)0x0100 #define RTL_HEAP_PROTECTED_ENTRY (USHORT)0x0200 typedef struct _RTL_HEAP_TAG { ULONG NumberOfAllocations; ULONG NumberOfFrees; ULONG BytesAllocated; USHORT TagIndex; USHORT CreatorBackTraceIndex; WCHAR TagName[ 24 ]; } RTL_HEAP_TAG, *PRTL_HEAP_TAG; typedef struct _RTL_HEAP_INFORMATION { PVOID BaseAddress; ULONG Flags; USHORT EntryOverhead; USHORT CreatorBackTraceIndex; ULONG BytesAllocated; ULONG BytesCommitted; ULONG NumberOfTags; ULONG NumberOfEntries; ULONG NumberOfPseudoTags; ULONG PseudoTagGranularity; ULONG Reserved[ 5 ]; PRTL_HEAP_TAG Tags; PRTL_HEAP_ENTRY Entries; } RTL_HEAP_INFORMATION, *PRTL_HEAP_INFORMATION; typedef struct _RTL_PROCESS_HEAPS { ULONG NumberOfHeaps; RTL_HEAP_INFORMATION Heaps[ 1 ]; } RTL_PROCESS_HEAPS, *PRTL_PROCESS_HEAPS; // // Debugging support // typedef struct _RTL_DEBUG_INFORMATION { HANDLE SectionHandleClient; PVOID ViewBaseClient; PVOID ViewBaseTarget; ULONG ViewBaseDelta; HANDLE EventPairClient; HANDLE EventPairTarget; HANDLE TargetProcessId; HANDLE TargetThreadHandle; ULONG Flags; ULONG OffsetFree; ULONG CommitSize; ULONG ViewSize; PRTL_PROCESS_MODULES Modules; PRTL_PROCESS_BACKTRACES BackTraces; PRTL_PROCESS_HEAPS Heaps; PRTL_PROCESS_LOCKS Locks; PVOID SpecificHeap; HANDLE TargetProcessHandle; PVOID Reserved[ 6 ]; } RTL_DEBUG_INFORMATION, *PRTL_DEBUG_INFORMATION; NTSYSAPI PRTL_DEBUG_INFORMATION NTAPI RtlCreateQueryDebugBuffer( IN ULONG MaximumCommit OPTIONAL, IN BOOLEAN UseEventPair ); NTSYSAPI NTSTATUS NTAPI RtlDestroyQueryDebugBuffer( IN PRTL_DEBUG_INFORMATION Buffer ); NTSYSAPI NTSTATUS NTAPI RtlQueryProcessDebugInformation( IN HANDLE UniqueProcessId, IN ULONG Flags, IN OUT PRTL_DEBUG_INFORMATION Buffer ); #define RTL_QUERY_PROCESS_MODULES 0x00000001 #define RTL_QUERY_PROCESS_BACKTRACES 0x00000002 #define RTL_QUERY_PROCESS_HEAP_SUMMARY 0x00000004 #define RTL_QUERY_PROCESS_HEAP_TAGS 0x00000008 #define RTL_QUERY_PROCESS_HEAP_ENTRIES 0x00000010 #define RTL_QUERY_PROCESS_LOCKS 0x00000020 NTSTATUS NTAPI RtlQueryProcessModuleInformation( IN OUT PRTL_DEBUG_INFORMATION Buffer ); NTSYSAPI NTSTATUS NTAPI RtlQueryProcessBackTraceInformation( IN OUT PRTL_DEBUG_INFORMATION Buffer ); NTSYSAPI NTSTATUS NTAPI RtlQueryProcessHeapInformation( IN OUT PRTL_DEBUG_INFORMATION Buffer ); NTSYSAPI NTSTATUS NTAPI RtlQueryProcessLockInformation( IN OUT PRTL_DEBUG_INFORMATION Buffer ); // // Routines for manipulating user mode handle tables. Used for Atoms // and Local/Global memory allocations. // typedef struct _RTL_HANDLE_TABLE_ENTRY { union { ULONG Flags; // Allocated entries have low bit set struct _RTL_HANDLE_TABLE_ENTRY *NextFree; // Free entries use this word for free list }; } RTL_HANDLE_TABLE_ENTRY, *PRTL_HANDLE_TABLE_ENTRY; #define RTL_HANDLE_ALLOCATED (USHORT)0x0001 typedef struct _RTL_HANDLE_TABLE { ULONG MaximumNumberOfHandles; ULONG SizeOfHandleTableEntry; ULONG Reserved[ 2 ]; PRTL_HANDLE_TABLE_ENTRY FreeHandles; PRTL_HANDLE_TABLE_ENTRY CommittedHandles; PRTL_HANDLE_TABLE_ENTRY UnCommittedHandles; PRTL_HANDLE_TABLE_ENTRY MaxReservedHandles; } RTL_HANDLE_TABLE, *PRTL_HANDLE_TABLE; void RtlInitializeHandleTable( IN ULONG MaximumNumberOfHandles, IN ULONG SizeOfHandleTableEntry, OUT PRTL_HANDLE_TABLE HandleTable ); NTSTATUS RtlDestroyHandleTable( IN OUT PRTL_HANDLE_TABLE HandleTable ); PRTL_HANDLE_TABLE_ENTRY RtlAllocateHandle( IN PRTL_HANDLE_TABLE HandleTable, OUT PULONG HandleIndex OPTIONAL ); BOOLEAN RtlFreeHandle( IN PRTL_HANDLE_TABLE HandleTable, IN PRTL_HANDLE_TABLE_ENTRY Handle ); BOOLEAN RtlIsValidHandle( IN PRTL_HANDLE_TABLE HandleTable, IN PRTL_HANDLE_TABLE_ENTRY Handle ); BOOLEAN RtlIsValidIndexHandle( IN PRTL_HANDLE_TABLE HandleTable, IN ULONG HandleIndex, OUT PRTL_HANDLE_TABLE_ENTRY *Handle ); #endif // _NTURTL_