From e611b132f9b8abe35b362e5870b74bce94a1e58e Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 16 May 2020 20:51:50 -0700 Subject: initial commit --- public/sdk/inc/nturtl.h | 897 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 897 insertions(+) create mode 100644 public/sdk/inc/nturtl.h (limited to 'public/sdk/inc/nturtl.h') diff --git a/public/sdk/inc/nturtl.h b/public/sdk/inc/nturtl.h new file mode 100644 index 000000000..804848cba --- /dev/null +++ b/public/sdk/inc/nturtl.h @@ -0,0 +1,897 @@ +/*++ 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_ -- cgit v1.2.3