|
|
/*++ BUILD Version: 0001 // Increment this if a change has global effects
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
nturtl.h
Abstract:
Include file for NT runtime routines that are callable by only user mode code in various NT subsystems.
Author:
Steve Wood (stevewo) 10-Aug-1989
Environment:
These routines are dynamically linked in the caller's executable and are callable only from user mode. They make use of Nt system services.
Revision History:
--*/
#ifndef _NTURTL_ #define _NTURTL_
#if _MSC_VER > 1000 #pragma once #endif
#ifdef __cplusplus extern "C" { #endif
#if defined (_MSC_VER) #if ( _MSC_VER >= 800 ) #pragma warning(disable:4514) #if _MSC_VER >= 1200 #pragma warning(push) #endif #pragma warning(disable:4001) #pragma warning(disable:4201) #pragma warning(disable:4214) #endif #if (_MSC_VER >= 1020) #pragma once #endif #endif
// // 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, RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_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_PTR SpinCount; // force size on 64-bit systems when packed } RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION; // end_winnt
// // These are needed for the debugger and WOW64. //
typedef struct _RTL_CRITICAL_SECTION_DEBUG32 { USHORT Type; USHORT CreatorBackTraceIndex; ULONG CriticalSection; LIST_ENTRY32 ProcessLocksList; ULONG EntryCount; ULONG ContentionCount; ULONG Spare[ 2 ]; } RTL_CRITICAL_SECTION_DEBUG32, *PRTL_CRITICAL_SECTION_DEBUG32, RTL_RESOURCE_DEBUG32, *PRTL_RESOURCE_DEBUG32;
typedef struct _RTL_CRITICAL_SECTION_DEBUG64 { USHORT Type; USHORT CreatorBackTraceIndex; ULONG64 CriticalSection; LIST_ENTRY64 ProcessLocksList; ULONG EntryCount; ULONG ContentionCount; ULONG Spare[ 2 ]; } RTL_CRITICAL_SECTION_DEBUG64, *PRTL_CRITICAL_SECTION_DEBUG64, RTL_RESOURCE_DEBUG64, *PRTL_RESOURCE_DEBUG64;
typedef struct _RTL_CRITICAL_SECTION32 { ULONG DebugInfo; LONG LockCount; LONG RecursionCount; ULONG OwningThread; ULONG LockSemaphore; ULONG SpinCount; } RTL_CRITICAL_SECTION32, *PRTL_CRITICAL_SECTION32;
typedef struct _RTL_CRITICAL_SECTION64 { ULONG64 DebugInfo; LONG LockCount; LONG RecursionCount; ULONG64 OwningThread; ULONG64 LockSemaphore; ULONG64 SpinCount; } RTL_CRITICAL_SECTION64, *PRTL_CRITICAL_SECTION64;
// // Shared resource function definitions //
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 VOID NTAPI RtlEnableEarlyCriticalSectionEventCreation( VOID );
NTSYSAPI NTSTATUS NTAPI RtlInitializeCriticalSectionAndSpinCount( PRTL_CRITICAL_SECTION CriticalSection, ULONG SpinCount );
NTSYSAPI ULONG NTAPI RtlSetCriticalSectionSpinCount( PRTL_CRITICAL_SECTION CriticalSection, ULONG SpinCount );
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 );
NTSYSAPI VOID NTAPI RtlCheckForOrphanedCriticalSections( IN HANDLE hThread );
// // Application verifier types needed by provider dlls //
// begin_winnt
typedef VOID (* RTL_VERIFIER_DLL_LOAD_CALLBACK) ( PWSTR DllName, PVOID DllBase, SIZE_T DllSize, PVOID Reserved );
typedef VOID (* RTL_VERIFIER_DLL_UNLOAD_CALLBACK) ( PWSTR DllName, PVOID DllBase, SIZE_T DllSize, PVOID Reserved );
typedef struct _RTL_VERIFIER_THUNK_DESCRIPTOR {
PCHAR ThunkName; PVOID ThunkOldAddress; PVOID ThunkNewAddress;
} RTL_VERIFIER_THUNK_DESCRIPTOR, *PRTL_VERIFIER_THUNK_DESCRIPTOR;
typedef struct _RTL_VERIFIER_DLL_DESCRIPTOR {
PWCHAR DllName; ULONG DllFlags; PVOID DllAddress; PRTL_VERIFIER_THUNK_DESCRIPTOR DllThunks;
} RTL_VERIFIER_DLL_DESCRIPTOR, *PRTL_VERIFIER_DLL_DESCRIPTOR;
typedef struct _RTL_VERIFIER_PROVIDER_DESCRIPTOR {
// // Filled by verifier provider DLL //
ULONG Length; PRTL_VERIFIER_DLL_DESCRIPTOR ProviderDlls; RTL_VERIFIER_DLL_LOAD_CALLBACK ProviderDllLoadCallback; RTL_VERIFIER_DLL_UNLOAD_CALLBACK ProviderDllUnloadCallback; // // Filled by verifier engine // PWSTR VerifierImage; ULONG VerifierFlags; ULONG VerifierDebug;
} RTL_VERIFIER_PROVIDER_DESCRIPTOR, *PRTL_VERIFIER_PROVIDER_DESCRIPTOR;
// // Application verifier standard flags //
#define RTL_VRF_FLG_FULL_PAGE_HEAP 0x0001 #define RTL_VRF_FLG_LOCK_CHECKS 0x0002 #define RTL_VRF_FLG_HANDLE_CHECKS 0x0004 #define RTL_VRF_FLG_STACK_CHECKS 0x0008 #define RTL_VRF_FLG_APPCOMPAT_CHECKS 0x0010
// // Application verifier standard stop codes //
#define APPLICATION_VERIFIER_INTERNAL_ERROR 0x80000000 #define APPLICATION_VERIFIER_INTERNAL_WARNING 0x40000000 #define APPLICATION_VERIFIER_NO_BREAK 0x20000000 #define APPLICATION_VERIFIER_RESERVED_BIT_28 0x10000000
#define APPLICATION_VERIFIER_UNKNOWN_ERROR 0x0001 #define APPLICATION_VERIFIER_ACCESS_VIOLATION 0x0002 #define APPLICATION_VERIFIER_UNSYNCHRONIZED_ACCESS 0x0003 #define APPLICATION_VERIFIER_EXTREME_SIZE_REQUEST 0x0004 #define APPLICATION_VERIFIER_BAD_HEAP_HANDLE 0x0005 #define APPLICATION_VERIFIER_SWITCHED_HEAP_HANDLE 0x0006 #define APPLICATION_VERIFIER_DOUBLE_FREE 0x0007 #define APPLICATION_VERIFIER_CORRUPTED_HEAP_BLOCK 0x0008 #define APPLICATION_VERIFIER_DESTROY_PROCESS_HEAP 0x0009 #define APPLICATION_VERIFIER_UNEXPECTED_EXCEPTION 0x000A #define APPLICATION_VERIFIER_STACK_OVERFLOW 0x000B
#define APPLICATION_VERIFIER_TERMINATE_THREAD_CALL 0x0100
#define APPLICATION_VERIFIER_EXIT_THREAD_OWNS_LOCK 0x0200 #define APPLICATION_VERIFIER_LOCK_IN_UNLOADED_DLL 0x0201 #define APPLICATION_VERIFIER_LOCK_IN_FREED_HEAP 0x0202 #define APPLICATION_VERIFIER_LOCK_DOUBLE_INITIALIZE 0x0203 #define APPLICATION_VERIFIER_LOCK_IN_FREED_MEMORY 0x0204 #define APPLICATION_VERIFIER_LOCK_CORRUPTED 0x0205 #define APPLICATION_VERIFIER_LOCK_INVALID_OWNER 0x0206 #define APPLICATION_VERIFIER_LOCK_INVALID_RECURSION_COUNT 0x0207 #define APPLICATION_VERIFIER_LOCK_INVALID_LOCK_COUNT 0x0208 #define APPLICATION_VERIFIER_LOCK_OVER_RELEASED 0x0209 #define APPLICATION_VERIFIER_LOCK_NOT_INITIALIZED 0x0210
#define APPLICATION_VERIFIER_INVALID_HANDLE 0x0300
#define VERIFIER_STOP(Code, Msg, P1, S1, P2, S2, P3, S3, P4, S4) { \ RtlApplicationVerifierStop ((Code), \ (Msg), \ (ULONG_PTR)(P1),(S1), \ (ULONG_PTR)(P2),(S2), \ (ULONG_PTR)(P3),(S3), \ (ULONG_PTR)(P4),(S4)); \ }
VOID RtlApplicationVerifierStop ( ULONG_PTR Code, PCHAR Message, ULONG_PTR Param1, PCHAR Description1, ULONG_PTR Param2, PCHAR Description2, ULONG_PTR Param3, PCHAR Description3, ULONG_PTR Param4, PCHAR Description4 );
// end_winnt
// // VectoredExceptionHandler Stuff //
// begin_winnt typedef LONG (NTAPI *PVECTORED_EXCEPTION_HANDLER)( struct _EXCEPTION_POINTERS *ExceptionInfo ); // end_winnt
NTSYSAPI BOOLEAN NTAPI RtlCallVectoredExceptionHandlers( IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT ContextRecord );
NTSYSAPI PVOID NTAPI RtlAddVectoredExceptionHandler( IN ULONG FirstHandler, IN PVECTORED_EXCEPTION_HANDLER VectoredHandler );
NTSYSAPI ULONG NTAPI RtlRemoveVectoredExceptionHandler( IN PVOID VectoredHandlerHandle );
// // Current Directory Stuff //
typedef struct _RTL_RELATIVE_NAME { STRING RelativeName; HANDLE ContainingDirectory; } RTL_RELATIVE_NAME, *PRTL_RELATIVE_NAME;
typedef enum _RTL_PATH_TYPE { RtlPathTypeUnknown, // 0 RtlPathTypeUncAbsolute, // 1 RtlPathTypeDriveAbsolute, // 2 RtlPathTypeDriveRelative, // 3 RtlPathTypeRooted, // 4 RtlPathTypeRelative, // 5 RtlPathTypeLocalDevice, // 6 RtlPathTypeRootLocalDevice // 7 } 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( IN 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( IN PCWSTR lpPath, IN PCWSTR lpFileName, IN PCWSTR lpExtension, ULONG nBufferLength, PWSTR lpBuffer, PWSTR *lpFilePart );
#define RTL_DOS_SEARCH_PATH_FLAG_APPLY_ISOLATION_REDIRECTION (0x00000001) // Flags to preserve Win32 SearchPathW() semantics in the ntdll implementation: #define RTL_DOS_SEARCH_PATH_FLAG_DISALLOW_DOT_RELATIVE_PATH_SEARCH (0x00000002) #define RTL_DOS_SEARCH_PATH_FLAG_APPLY_DEFAULT_EXTENSION_WHEN_NOT_RELATIVE_PATH_EVEN_IF_FILE_HAS_EXTENSION (0x00000004)
NTSYSAPI NTSTATUS NTAPI RtlDosSearchPath_Ustr( IN ULONG Flags, IN PCUNICODE_STRING Path, IN PCUNICODE_STRING FileName, IN PCUNICODE_STRING DefaultExtension OPTIONAL, OUT PUNICODE_STRING StaticString OPTIONAL, OUT PUNICODE_STRING DynamicString OPTIONAL, OUT PCUNICODE_STRING *FullFileNameOut OPTIONAL, OUT SIZE_T *FilePartPrefixCch OPTIONAL, OUT SIZE_T *BytesRequired OPTIONAL );
NTSYSAPI BOOLEAN NTAPI RtlDoesFileExists_U( PCWSTR FileName );
// input flags #define RTL_DOS_APPLY_FILE_REDIRECTION_USTR_FLAG_RESPECT_DOT_LOCAL (1)
// output flags #define RTL_DOS_APPLY_FILE_REDIRECTION_USTR_OUTFLAG_DOT_LOCAL_REDIRECT (1) #define RTL_DOS_APPLY_FILE_REDIRECTION_USTR_OUTFLAG_ACTCTX_REDIRECT (2)
NTSYSAPI NTSTATUS NTAPI RtlDosApplyFileIsolationRedirection_Ustr( IN ULONG Flags, IN PCUNICODE_STRING FileName, IN PCUNICODE_STRING DefaultExtension OPTIONAL, IN PUNICODE_STRING PreAllocatedString OPTIONAL, OUT PUNICODE_STRING DynamicallyAllocatedString OPTIONAL, OUT PUNICODE_STRING *FullPath OPTIONAL, OUT ULONG * OutFlags, OUT SIZE_T *FilePartPrefixCch OPTIONAL, OUT SIZE_T *BytesRequired OPTIONAL );
NTSYSAPI NTSTATUS NTAPI RtlComputePrivatizedDllName_U( IN PCUNICODE_STRING DllName, IN OUT PUNICODE_STRING NewDllNameUnderImageDir, IN OUT PUNICODE_STRING NewDllNameUnderLocalDir );
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 // #ifdef _MAC #pragma warning( disable : 4121) #endif
typedef struct { UCHAR AceType; UCHAR InheritFlags; UCHAR AceFlags; ACCESS_MASK Mask; PSID *Sid; } RTL_ACE_DATA, *PRTL_ACE_DATA;
#ifdef _MAC #pragma warning( default : 4121 ) #endif
NTSYSAPI NTSTATUS NTAPI RtlNewSecurityObject( PSECURITY_DESCRIPTOR ParentDescriptor, PSECURITY_DESCRIPTOR CreatorDescriptor, PSECURITY_DESCRIPTOR * NewDescriptor, BOOLEAN IsDirectoryObject, HANDLE Token, PGENERIC_MAPPING GenericMapping );
NTSYSAPI NTSTATUS NTAPI RtlNewSecurityObjectEx ( IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL, IN PSECURITY_DESCRIPTOR CreatorDescriptor OPTIONAL, OUT PSECURITY_DESCRIPTOR * NewDescriptor, IN GUID *ObjectType OPTIONAL, IN BOOLEAN IsDirectoryObject, IN ULONG AutoInheritFlags, IN HANDLE Token, IN PGENERIC_MAPPING GenericMapping );
NTSYSAPI NTSTATUS NTAPI RtlNewSecurityObjectWithMultipleInheritance ( IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL, IN PSECURITY_DESCRIPTOR CreatorDescriptor OPTIONAL, OUT PSECURITY_DESCRIPTOR * NewDescriptor, IN GUID **pObjectType OPTIONAL, IN ULONG GuidCount, IN BOOLEAN IsDirectoryObject, IN ULONG AutoInheritFlags, IN HANDLE Token, IN PGENERIC_MAPPING GenericMapping );
// Values for AutoInheritFlags // begin_winnt #define SEF_DACL_AUTO_INHERIT 0x01 #define SEF_SACL_AUTO_INHERIT 0x02 #define SEF_DEFAULT_DESCRIPTOR_FOR_OBJECT 0x04 #define SEF_AVOID_PRIVILEGE_CHECK 0x08 #define SEF_AVOID_OWNER_CHECK 0x10 #define SEF_DEFAULT_OWNER_FROM_PARENT 0x20 #define SEF_DEFAULT_GROUP_FROM_PARENT 0x40 // end_winnt
NTSTATUS RtlConvertToAutoInheritSecurityObject( IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL, IN PSECURITY_DESCRIPTOR CurrentSecurityDescriptor, OUT PSECURITY_DESCRIPTOR *NewSecurityDescriptor, IN GUID *ObjectType OPTIONAL, IN BOOLEAN IsDirectoryObject, IN PGENERIC_MAPPING GenericMapping );
NTSYSAPI NTSTATUS NTAPI RtlSetSecurityObject ( SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR ModificationDescriptor, PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, PGENERIC_MAPPING GenericMapping, HANDLE Token );
NTSYSAPI NTSTATUS NTAPI RtlSetSecurityObjectEx ( IN SECURITY_INFORMATION SecurityInformation, IN PSECURITY_DESCRIPTOR ModificationDescriptor, IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, IN ULONG AutoInheritFlags, IN PGENERIC_MAPPING GenericMapping, IN HANDLE Token OPTIONAL );
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 );
NTSYSAPI NTSTATUS NTAPI RtlDefaultNpAcl( OUT PACL * pAcl );
// // 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 SIZE_T 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; SIZE_T 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 NTSTATUS NTAPI RtlExtendHeap( IN PVOID HeapHandle, IN ULONG Flags, IN PVOID Base, IN SIZE_T Size );
NTSYSAPI SIZE_T NTAPI RtlCompactHeap( 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 (NTAPI * 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; SIZE_T Size; USHORT AllocatorBackTraceIndex; USHORT TagIndex; } RTL_HEAP_USAGE_ENTRY, *PRTL_HEAP_USAGE_ENTRY;
typedef struct _RTL_HEAP_USAGE { ULONG Length; SIZE_T BytesAllocated; SIZE_T BytesCommitted; SIZE_T BytesReserved; SIZE_T BytesReservedMaximum; PRTL_HEAP_USAGE_ENTRY Entries; PRTL_HEAP_USAGE_ENTRY AddedEntries; PRTL_HEAP_USAGE_ENTRY RemovedEntries; ULONG_PTR 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; SIZE_T DataSize; UCHAR OverheadBytes; UCHAR SegmentIndex; USHORT Flags; union { struct { SIZE_T 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 { SIZE_T Size; USHORT Flags; USHORT AllocatorBackTraceIndex; union { struct { SIZE_T Settable; ULONG Tag; } s1; // All other heap entries struct { SIZE_T 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; SIZE_T 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; SIZE_T BytesAllocated; SIZE_T 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;
// // Heap Information APIs & data definitions //
// begin_winnt
typedef enum _HEAP_INFORMATION_CLASS {
HeapCompatibilityInformation
} HEAP_INFORMATION_CLASS;
NTSTATUS RtlSetHeapInformation ( IN PVOID HeapHandle, IN HEAP_INFORMATION_CLASS HeapInformationClass, IN PVOID HeapInformation OPTIONAL, IN SIZE_T HeapInformationLength OPTIONAL );
NTSTATUS RtlQueryHeapInformation ( IN PVOID HeapHandle, IN HEAP_INFORMATION_CLASS HeapInformationClass, OUT PVOID HeapInformation OPTIONAL, IN SIZE_T HeapInformationLength OPTIONAL, OUT PSIZE_T ReturnLength OPTIONAL );
// end_winnt
// // Debugging support //
typedef struct _RTL_DEBUG_INFORMATION { HANDLE SectionHandleClient; PVOID ViewBaseClient; PVOID ViewBaseTarget; ULONG_PTR ViewBaseDelta; HANDLE EventPairClient; HANDLE EventPairTarget; HANDLE TargetProcessId; HANDLE TargetThreadHandle; ULONG Flags; SIZE_T OffsetFree; SIZE_T CommitSize; SIZE_T 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 #define RTL_QUERY_PROCESS_MODULES32 0x00000040 #define RTL_QUERY_PROCESS_NONINVASIVE 0x80000000
NTSTATUS NTAPI RtlQueryProcessModuleInformation( IN HANDLE hProcess OPTIONAL, IN ULONG Flags, 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;
NTSYSAPI void NTAPI RtlInitializeHandleTable( IN ULONG MaximumNumberOfHandles, IN ULONG SizeOfHandleTableEntry, OUT PRTL_HANDLE_TABLE HandleTable );
NTSYSAPI NTSTATUS NTAPI RtlDestroyHandleTable( IN OUT PRTL_HANDLE_TABLE HandleTable );
NTSYSAPI PRTL_HANDLE_TABLE_ENTRY NTAPI RtlAllocateHandle( IN PRTL_HANDLE_TABLE HandleTable, OUT PULONG HandleIndex OPTIONAL );
NTSYSAPI BOOLEAN NTAPI RtlFreeHandle( IN PRTL_HANDLE_TABLE HandleTable, IN PRTL_HANDLE_TABLE_ENTRY Handle );
NTSYSAPI BOOLEAN NTAPI RtlIsValidHandle( IN PRTL_HANDLE_TABLE HandleTable, IN PRTL_HANDLE_TABLE_ENTRY Handle );
NTSYSAPI BOOLEAN NTAPI RtlIsValidIndexHandle( IN PRTL_HANDLE_TABLE HandleTable, IN ULONG HandleIndex, OUT PRTL_HANDLE_TABLE_ENTRY *Handle );
// // Routines for thread pool. //
#define WT_EXECUTEDEFAULT 0x00000000 // winnt #define WT_EXECUTEINIOTHREAD 0x00000001 // winnt #define WT_EXECUTEINUITHREAD 0x00000002 // winnt #define WT_EXECUTEINWAITTHREAD 0x00000004 // winnt #define WT_EXECUTEONLYONCE 0x00000008 // winnt #define WT_EXECUTEINTIMERTHREAD 0x00000020 // winnt #define WT_EXECUTELONGFUNCTION 0x00000010 // winnt #define WT_EXECUTEINPERSISTENTIOTHREAD 0x00000040 // winnt #define WT_EXECUTEINPERSISTENTTHREAD 0x00000080 // winnt #define WT_SET_MAX_THREADPOOL_THREADS(Flags, Limit) ((Flags) |= (Limit)<<16) // winnt
typedef VOID (NTAPI * WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN ); // winnt typedef VOID (NTAPI * WORKERCALLBACKFUNC) (PVOID ); // winnt typedef VOID (NTAPI * APC_CALLBACK_FUNCTION) (NTSTATUS, PVOID, PVOID); // winnt
typedef NTSTATUS (NTAPI RTLP_START_THREAD)( PUSER_THREAD_START_ROUTINE, PVOID, HANDLE *);
typedef NTSTATUS (NTAPI RTLP_EXIT_THREAD)( NTSTATUS );
typedef RTLP_START_THREAD * PRTLP_START_THREAD ; typedef RTLP_EXIT_THREAD * PRTLP_EXIT_THREAD ;
NTSTATUS NTAPI RtlSetThreadPoolStartFunc( PRTLP_START_THREAD StartFunc, PRTLP_EXIT_THREAD ExitFunc );
NTSYSAPI NTSTATUS NTAPI RtlRegisterWait ( OUT PHANDLE WaitHandle, IN HANDLE Handle, IN WAITORTIMERCALLBACKFUNC Function, IN PVOID Context, IN ULONG Milliseconds, IN ULONG Flags ) ;
NTSYSAPI NTSTATUS NTAPI RtlDeregisterWait( IN HANDLE WaitHandle ) ;
NTSYSAPI NTSTATUS NTAPI RtlDeregisterWaitEx( IN HANDLE WaitHandle, IN HANDLE Event ) ;
NTSYSAPI NTSTATUS NTAPI RtlQueueWorkItem( IN WORKERCALLBACKFUNC Function, IN PVOID Context, IN ULONG Flags ) ;
NTSTATUS NTAPI RtlSetIoCompletionCallback ( IN HANDLE FileHandle, IN APC_CALLBACK_FUNCTION CompletionProc, IN ULONG Flags ) ;
NTSYSAPI NTSTATUS NTAPI RtlCreateTimerQueue( OUT PHANDLE TimerQueueHandle ) ;
NTSYSAPI NTSTATUS NTAPI RtlCreateTimer( IN HANDLE TimerQueueHandle, OUT HANDLE *Handle, IN WAITORTIMERCALLBACKFUNC Function, IN PVOID Context, IN ULONG DueTime, IN ULONG Period, IN ULONG Flags ) ;
NTSYSAPI NTSTATUS NTAPI RtlUpdateTimer( IN HANDLE TimerQueueHandle, IN HANDLE TimerHandle, IN ULONG DueTime, IN ULONG Period ) ;
NTSYSAPI NTSTATUS NTAPI RtlDeleteTimer( IN HANDLE TimerQueueHandle, IN HANDLE TimerToCancel, IN HANDLE Event ) ;
NTSYSAPI NTSTATUS NTAPI RtlDeleteTimerQueue( IN HANDLE TimerQueueHandle ) ;
NTSYSAPI NTSTATUS NTAPI RtlDeleteTimerQueueEx( IN HANDLE TimerQueueHandle, IN HANDLE Event ) ;
BOOLEAN RtlDllShutdownInProgress ( VOID );
//--------OBSOLETE FUNCTIONS: DONT USE----------//
VOID RtlDebugPrintTimes ( VOID );
NTSYSAPI NTSTATUS NTAPI RtlCancelTimer( IN HANDLE TimerQueueHandle, IN HANDLE TimerToCancel ) ;
NTSYSAPI NTSTATUS NTAPI RtlSetTimer( IN HANDLE TimerQueueHandle, OUT HANDLE *Handle, IN WAITORTIMERCALLBACKFUNC Function, IN PVOID Context, IN ULONG DueTime, IN ULONG Period, IN ULONG Flags ) ;
//todo:delete below: dont use the below flag. will be deleted #define WT_EXECUTEINLONGTHREAD 0x00000010 // winnt #define WT_EXECUTEDELETEWAIT 0x00000008 // winnt
//------end OBSOLUTE FUNCTIONS: DONT USE--------//
#if (defined(RTL_DECLARE_IMALLOC) && RTL_DECLARE_IMALLOC) \ || (defined(RTL_DECLARE_STREAMS) && RTL_DECLARE_STREAMS \ && defined(RTL_DECLARE_MEMORY_STREAM) && RTL_DECLARE_MEMORY_STREAM)
// Introducing the struct before the typedef works better if the // header is enclosed in a C++ namespace. struct IMallocVtbl; typedef struct IMallocVtbl IMallocVtbl;
#if defined(interface) // it's defined in objbase.h interface IMalloc; typedef interface IMalloc IMalloc; #else struct IMalloc; typedef struct IMalloc IMalloc; #endif
#endif
#if defined(RTL_DECLARE_IMALLOC) && RTL_DECLARE_IMALLOC
// // IMalloc over an RtlHeap // struct _RTL_IMALLOC;
typedef struct _RTL_IMALLOC { ULONG ReferenceCount; ULONG Flags; VOID (STDMETHODCALLTYPE* FinalRelease)(struct _RTL_HEAP_IMALLOC*); HANDLE Heap; ULONG HeapFlags; } RTL_IMALLOC, *PRTL_IMALLOC;
// // Don't use NTSYSAPI directly so you can more easily // statically link to these functions, independently // of how you link to the rest of ntdll. // #if !defined(RTL_IMALLOC_API) #define RTL_IMALLOC_API NTSYSAPI #endif
RTL_IMALLOC_API HRESULT STDMETHODCALLTYPE RtlAllocHeapIMalloc( PRTL_HEAP_IMALLOC HeapIMalloc );
RTL_IMALLOC_API PVOID STDMETHODCALLTYPE RtlReallocIMalloc( PRTL_IMALLOC Malloc, PVOID BlockOfMemory, ULONG NumberOfBytes );
RTL_IMALLOC_API VOID STDMETHODCALLTYPE RtlFreeIMalloc( PRTL_IMALLOC Malloc, PVOID BlockOfMemory );
RTL_IMALLOC_API ULONG STDMETHODCALLTYPE RtlGetSizeIMalloc( PRTL_IMALLOC Malloc, PVOID BlockOfMemory );
RTL_IMALLOC_API BOOL STDMETHODCALLTYPE RtlDidAllocIMalloc( PRTL_IMALLOC Malloc, PVOID BlockOfMemory );
RTL_IMALLOC_API VOID STDMETHODCALLTYPE RtlMinimizeIMalloc( PRTL_IMALLOC Malloc );
RTL_IMALLOC_API PRTL_IMALLOC STDMETHODCALLTYPE RtlProcessIMalloc( VOID );
#endif // RTL_DECLARE_MALLOC
#if defined(RTL_DECLARE_STREAMS) && RTL_DECLARE_STREAMS
// Introducing the structs before the typedefs works better if the // header is enclosed in a C++ namespace. struct tagSTATSTG; typedef struct tagSTATSTG STATSTG; struct IStreamVtbl; typedef struct IStreamVtbl IStreamVtbl;
#if defined(interface) // it's defined in objbase.h interface IStream; typedef interface IStream IStream; #else struct IStream; typedef struct IStream IStream; #endif
#if defined(RTL_DECLARE_FILE_STREAM) && RTL_DECLARE_FILE_STREAM
// // IStream over an NT File handle (not yet adapted for C++) //
struct _RTL_FILE_STREAM;
typedef struct _RTL_FILE_STREAM { LONG ReferenceCount; ULONG Flags; VOID (STDMETHODCALLTYPE* FinalRelease)(struct _RTL_FILE_STREAM*); HANDLE FileHandle; } RTL_FILE_STREAM, *PRTL_FILE_STREAM;
// // Don't use NTSYSAPI directly so you can more easily // statically link to these functions, independently // of how you link to the rest of ntdll. // #if !defined(RTL_FILE_STREAM_API) #define RTL_FILE_STREAM_API NTSYSAPI #endif
RTL_FILE_STREAM_API HRESULT STDMETHODCALLTYPE RtlInitFileStream( PRTL_FILE_STREAM FileStream );
RTL_FILE_STREAM_API HRESULT STDMETHODCALLTYPE RtlCloseFileStream( PRTL_FILE_STREAM FileStream );
RTL_FILE_STREAM_API ULONG STDMETHODCALLTYPE RtlAddRefFileStream( PRTL_FILE_STREAM FileStream );
RTL_FILE_STREAM_API ULONG STDMETHODCALLTYPE RtlReleaseFileStream( PRTL_FILE_STREAM FileStream );
RTL_FILE_STREAM_API HRESULT STDMETHODCALLTYPE RtlQueryFileStreamInterface( IStream* Functions, PRTL_FILE_STREAM Data, const IID* Interface, PVOID* Object );
RTL_FILE_STREAM_API HRESULT STDMETHODCALLTYPE RtlReadFileStream( PRTL_FILE_STREAM FileStream, PVOID Buffer, ULONG BytesToRead, ULONG* BytesRead );
RTL_FILE_STREAM_API HRESULT STDMETHODCALLTYPE RtlWriteFileStream( PRTL_FILE_STREAM FileStream, const VOID* Buffer, ULONG BytesToWrite, ULONG* BytesWritten );
RTL_FILE_STREAM_API HRESULT STDMETHODCALLTYPE RtlSeekFileStream( PRTL_FILE_STREAM FileStream, LARGE_INTEGER Distance, ULONG Origin, ULARGE_INTEGER* NewPosition );
/* returns E_NOTIMPL */ RTL_FILE_STREAM_API HRESULT STDMETHODCALLTYPE RtlSetFileStreamSize( PRTL_FILE_STREAM FileStream, ULARGE_INTEGER NewSize );
/* returns E_NOTIMPL */ RTL_FILE_STREAM_API HRESULT STDMETHODCALLTYPE RtlCopyFileStreamTo( PRTL_FILE_STREAM FileStream, IStream* AnotherStream, ULARGE_INTEGER NumberOfBytesToCopy, ULARGE_INTEGER* NumberOfBytesRead, ULARGE_INTEGER* NumberOfBytesWritten );
/* returns E_NOTIMPL */ RTL_FILE_STREAM_API HRESULT STDMETHODCALLTYPE RtlCommitFileStream( PRTL_FILE_STREAM FileStream, ULONG Flags );
/* returns E_NOTIMPL */ RTL_FILE_STREAM_API HRESULT STDMETHODCALLTYPE RtlRevertFileStream( PRTL_FILE_STREAM FileStream );
/* returns E_NOTIMPL */ RTL_FILE_STREAM_API HRESULT STDMETHODCALLTYPE RtlLockFileStreamRegion( PRTL_FILE_STREAM FileStream, ULARGE_INTEGER Offset, ULARGE_INTEGER NumberOfBytes, ULONG LockType );
/* returns E_NOTIMPL */ RTL_FILE_STREAM_API HRESULT STDMETHODCALLTYPE RtlUnlockFileStreamRegion( PRTL_FILE_STREAM FileStream, ULARGE_INTEGER Offset, ULARGE_INTEGER NumberOfBytes, ULONG LockType );
/* returns E_NOTIMPL */ RTL_FILE_STREAM_API HRESULT STDMETHODCALLTYPE RtlStatFileStream( PRTL_FILE_STREAM FileStream, STATSTG* StatusInformation, ULONG Flags );
/* returns E_NOTIMPL */ RTL_FILE_STREAM_API HRESULT STDMETHODCALLTYPE RtlCloneFileStream( PRTL_FILE_STREAM FileStream, IStream** NewStream );
#endif // RTL_DECLARE_FILE_STREAM
// // functions for implementing a readable IStream over a block of memory // (writable/growable in the future) // #if defined(RTL_DECLARE_MEMORY_STREAM) && RTL_DECLARE_MEMORY_STREAM
struct _RTL_MEMORY_STREAM_DATA; struct _RTL_MEMORY_STREAM_WITH_VTABLE; struct _RTL_OUT_OF_PROCESS_MEMORY_STREAM_DATA; struct _RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE;
// // Don't use NTSYSAPI directly so you can more easily // statically link to these functions, independently // of how you link to the rest of ntdll. // #if !defined(RTL_MEMORY_STREAM_API) #define RTL_MEMORY_STREAM_API NTSYSAPI #endif
typedef struct _RTL_MEMORY_STREAM_DATA { #define RTLP_MEMORY_STREAM_DATA_PREFIX \ LONG ReferenceCount; \ ULONG Flags; \ PUCHAR Current; \ PUCHAR Begin; \ PUCHAR End
RTLP_MEMORY_STREAM_DATA_PREFIX; VOID (STDMETHODCALLTYPE* FinalRelease)(struct _RTL_MEMORY_STREAM_WITH_VTABLE*); IMalloc* ReservedForMalloc; } RTL_MEMORY_STREAM_DATA, *PRTL_MEMORY_STREAM_DATA;
typedef struct _RTL_MEMORY_STREAM_WITH_VTABLE { const IStreamVtbl* StreamVTable; RTL_MEMORY_STREAM_DATA Data; } RTL_MEMORY_STREAM_WITH_VTABLE, *PRTL_MEMORY_STREAM_WITH_VTABLE;
typedef struct _RTL_OUT_OF_PROCESS_MEMORY_STREAM_DATA { RTLP_MEMORY_STREAM_DATA_PREFIX; VOID (STDMETHODCALLTYPE* FinalRelease)(struct _RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE*); HANDLE Process; } RTL_OUT_OF_PROCESS_MEMORY_STREAM_DATA, *PRTL_OUT_OF_PROCESS_MEMORY_STREAM_DATA;
typedef struct _RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE { const IStreamVtbl* StreamVTable; RTL_OUT_OF_PROCESS_MEMORY_STREAM_DATA Data; } RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE, *PRTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE;
// // These macros generate function pointer types that match the IStream member functions, // but IStream* is replaced by "T". As well, an identifier is placed within the type // appropriately for defining a typedef or a struct member or a variable. // They are used so that a vtable can be somewhat typesafely initialized. // This way, if you fill out the vtable in the wrong order, you will like get a compile // error (other than were function signatures coincide). // Also, you don't have to cast the this pointer in your implementations of member functions. // // You should define a set of macros like this for any COM interface you implement in C. // #define RTLP_STREAM_NOTHING /* nothing */ #define PRTL_QUERYINTERFACE_STREAM2(T, Name) HRESULT (STDMETHODCALLTYPE* Name)(T* This, const IID* riid, VOID** ppvObject) #define PRTL_ADDREF_STREAM2(T, Name) ULONG (STDMETHODCALLTYPE* Name)(T* This) #define PRTL_RELEASE_STREAM2(T, Name) ULONG (STDMETHODCALLTYPE* Name)(T* This) #define PRTL_READ_STREAM2(T, Name) HRESULT (STDMETHODCALLTYPE* Name)(T* This, VOID* pv, ULONG cb, ULONG* pcbRead) #define PRTL_WRITE_STREAM2(T, Name) HRESULT (STDMETHODCALLTYPE* Name)(T* This, const VOID* pv, ULONG cb, ULONG* pcbWritten) #define PRTL_SEEK_STREAM2(T, Name) HRESULT (STDMETHODCALLTYPE* Name)(T* This, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition) #define PRTL_SET_STREAM_SIZE2(T, Name) HRESULT (STDMETHODCALLTYPE* Name)(T* This, ULARGE_INTEGER libNewSize) #define PRTL_COPY_STREAM_TO2(T, Name) HRESULT (STDMETHODCALLTYPE* Name)(T* This, IStream* pstm, ULARGE_INTEGER cb, ULARGE_INTEGER* pcbRead, ULARGE_INTEGER* pcbWritten) #define PRTL_COMMIT_STREAM2(T, Name) HRESULT (STDMETHODCALLTYPE* Name)(T* This, DWORD grfCommitFlags) #define PRTL_REVERT_STREAM2(T, Name) HRESULT (STDMETHODCALLTYPE* Name)(T* This) #define PRTL_LOCK_STREAM_REGION2(T, Name) HRESULT (STDMETHODCALLTYPE* Name)(T* This, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) #define PRTL_UNLOCK_STREAM_REGION2(T, Name) HRESULT (STDMETHODCALLTYPE* Name)(T* This, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) #define PRTL_STAT_STREAM2(T, Name) HRESULT (STDMETHODCALLTYPE* Name)(T* This, STATSTG* pstatstg, DWORD grfStatFlag) #define PRTL_CLONE_STREAM2(T, Name) HRESULT (STDMETHODCALLTYPE* Name)(T* This, IStream** ppstm)
// // These macros are like the previous set, but they do not place a name in the // type. They are appropriate for casting function pointers. // They are used like so: // #define RtlOperateOnDerivedFoo (PRTL_OPERATOR_INTERFACE2(RTL_DERIVED_FOO)RtlOperateOnBaseFoo) // // You should define a set of macros like this for any COM interface you implement in C. // #define PRTL_QUERYINTERFACE_STREAM1(T) PRTL_QUERYINTERFACE_STREAM2(T, RTLP_STREAM_NOTHING) #define PRTL_ADDREF_STREAM1(T) PRTL_ADDREF_STREAM2(T, RTLP_STREAM_NOTHING) #define PRTL_RELEASE_STREAM1(T) PRTL_RELEASE_STREAM2(T, RTLP_STREAM_NOTHING) #define PRTL_READ_STREAM1(T) PRTL_READ_STREAM2(T, RTLP_STREAM_NOTHING) #define PRTL_WRITE_STREAM1(T) PRTL_WRITE_STREAM2(T, RTLP_STREAM_NOTHING) #define PRTL_SEEK_STREAM1(T) PRTL_SEEK_STREAM2(T, RTLP_STREAM_NOTHING) #define PRTL_SET_STREAM_SIZE1(T) PRTL_SET_STREAM_SIZE2(T, RTLP_STREAM_NOTHING) #define PRTL_COPY_STREAM_TO1(T) PRTL_COPY_STREAM_TO2(T, RTLP_STREAM_NOTHING) #define PRTL_COMMIT_STREAM1(T) PRTL_COMMIT_STREAM2(T, RTLP_STREAM_NOTHING) #define PRTL_REVERT_STREAM1(T) PRTL_REVERT_STREAM2(T, RTLP_STREAM_NOTHING) #define PRTL_LOCK_STREAM_REGION1(T) PRTL_LOCK_STREAM_REGION2(T, RTLP_STREAM_NOTHING) #define PRTL_UNLOCK_STREAM_REGION1(T) PRTL_UNLOCK_STREAM_REGION2(T, RTLP_STREAM_NOTHING) #define PRTL_STAT_STREAM1(T) PRTL_STAT_STREAM2(T, RTLP_STREAM_NOTHING) #define PRTL_CLONE_STREAM1(T) PRTL_CLONE_STREAM2(T, RTLP_STREAM_NOTHING)
// // This "template" lets you fill out a VTable // with some type safety. Then cast the address of the vtable. // Midl ought to provide something like this.. // // You should define a macro like this for any COM interface you implement in C. // #define RTL_STREAM_VTABLE_TEMPLATE(T) \ struct \ { \ PRTL_QUERYINTERFACE_STREAM2(T, QueryInterface); \ PRTL_ADDREF_STREAM2(T, AddRef); \ PRTL_RELEASE_STREAM2(T, Release); \ PRTL_READ_STREAM2(T, Read); \ PRTL_WRITE_STREAM2(T, Write); \ PRTL_SEEK_STREAM2(T, Seek); \ PRTL_SET_STREAM_SIZE2(T, SetSize); \ PRTL_COPY_STREAM_TO2(T, CopyTo); \ PRTL_COMMIT_STREAM2(T, Commit); \ PRTL_REVERT_STREAM2(T, Revert); \ PRTL_LOCK_STREAM_REGION2(T, LockRegion); \ PRTL_UNLOCK_STREAM_REGION2(T, UnlockRegion); \ PRTL_STAT_STREAM2(T, Stat); \ PRTL_CLONE_STREAM2(T, Clone); \ }
RTL_MEMORY_STREAM_API VOID STDMETHODCALLTYPE RtlInitMemoryStream( PRTL_MEMORY_STREAM_WITH_VTABLE MemoryStream );
RTL_MEMORY_STREAM_API VOID STDMETHODCALLTYPE RtlInitOutOfProcessMemoryStream( PRTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE MemoryStream );
RTL_MEMORY_STREAM_API VOID STDMETHODCALLTYPE RtlFinalReleaseOutOfProcessMemoryStream( PRTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE MemoryStream );
RTL_MEMORY_STREAM_API ULONG STDMETHODCALLTYPE RtlAddRefMemoryStream( PRTL_MEMORY_STREAM_WITH_VTABLE MemoryStream );
#define RtlAddRefOutOfProcessMemoryStream \ ((PRTL_ADDREF_STREAM1(RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE))RtlAddRefMemoryStream)
RTL_MEMORY_STREAM_API ULONG STDMETHODCALLTYPE RtlReleaseMemoryStream( PRTL_MEMORY_STREAM_WITH_VTABLE MemoryStream );
#define RtlReleaseOutOfProcessMemoryStream \ ((PRTL_RELEASE_STREAM1(RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE))RtlReleaseMemoryStream)
RTL_MEMORY_STREAM_API HRESULT STDMETHODCALLTYPE RtlQueryInterfaceMemoryStream( PRTL_MEMORY_STREAM_WITH_VTABLE MemoryStream, const IID* Interface, PVOID* Object );
#define RtlQueryInterfaceOutOfProcessMemoryStream \ ((PRTL_QUERYINTERFACE_STREAM1(RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE))RtlQueryInterfaceMemoryStream)
RTL_MEMORY_STREAM_API HRESULT STDMETHODCALLTYPE RtlReadMemoryStream( PRTL_MEMORY_STREAM_WITH_VTABLE MemoryStream, PVOID Buffer, ULONG BytesToRead, ULONG* BytesRead );
RTL_MEMORY_STREAM_API HRESULT STDMETHODCALLTYPE RtlReadOutOfProcessMemoryStream( PRTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE MemoryStream, PVOID Buffer, ULONG BytesToRead, ULONG* BytesRead );
// E_NOTIMPL RTL_MEMORY_STREAM_API HRESULT STDMETHODCALLTYPE RtlWriteMemoryStream( PRTL_MEMORY_STREAM_WITH_VTABLE MemoryStream, const VOID* Buffer, ULONG BytesToWrite, ULONG* BytesWritten );
#define RtlWriteOutOfProcessMemoryStream \ ((PRTL_WRITE_STREAM1(RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE))RtlWriteMemoryStream)
RTL_MEMORY_STREAM_API HRESULT STDMETHODCALLTYPE RtlSeekMemoryStream( PRTL_MEMORY_STREAM_WITH_VTABLE MemoryStream, LARGE_INTEGER Distance, ULONG Origin, ULARGE_INTEGER* NewPosition );
#define RtlSeekOutOfProcessMemoryStream \ ((PRTL_SEEK_STREAM1(RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE))RtlSeekMemoryStream)
// E_NOTIMPL RTL_MEMORY_STREAM_API HRESULT STDMETHODCALLTYPE RtlSetMemoryStreamSize( PRTL_MEMORY_STREAM_WITH_VTABLE MemoryStream, ULARGE_INTEGER NewSize );
#define RtlSetOutOfProcessMemoryStreamSize \ ((PRTL_SET_STREAM_SIZE1(RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE))RtlSetMemoryStreamSize)
RTL_MEMORY_STREAM_API HRESULT STDMETHODCALLTYPE RtlCopyMemoryStreamTo( PRTL_MEMORY_STREAM_WITH_VTABLE MemoryStream, IStream* AnotherStream, ULARGE_INTEGER NumberOfBytesToCopy, ULARGE_INTEGER* NumberOfBytesRead, ULARGE_INTEGER* NumberOfBytesWritten );
// E_NOTIMPL RTL_MEMORY_STREAM_API HRESULT STDMETHODCALLTYPE RtlCopyOutOfProcessMemoryStreamTo( PRTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE MemoryStream, IStream* AnotherStream, ULARGE_INTEGER NumberOfBytesToCopy, ULARGE_INTEGER* NumberOfBytesRead, ULARGE_INTEGER* NumberOfBytesWritten );
// E_NOTIMPL RTL_MEMORY_STREAM_API HRESULT STDMETHODCALLTYPE RtlCommitMemoryStream( PRTL_MEMORY_STREAM_WITH_VTABLE MemoryStream, ULONG Flags );
#define RtlCommitOutOfProcessMemoryStream \ ((PRTL_COMMIT_STREAM1(RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE))RtlCommitMemoryStream)
// E_NOTIMPL RTL_MEMORY_STREAM_API HRESULT STDMETHODCALLTYPE RtlRevertMemoryStream( PRTL_MEMORY_STREAM_WITH_VTABLE MemoryStream );
#define RtlRevertOutOfProcessMemoryStream \ ((PRTL_REVERT_STREAM1(RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE))RtlRevertMemoryStream)
// E_NOTIMPL RTL_MEMORY_STREAM_API HRESULT STDMETHODCALLTYPE RtlLockMemoryStreamRegion( PRTL_MEMORY_STREAM_WITH_VTABLE MemoryStream, ULARGE_INTEGER Offset, ULARGE_INTEGER NumberOfBytes, ULONG LockType );
#define RtlLockOutOfProcessMemoryStreamRegion \ ((PRTL_LOCK_STREAM_REGION1(RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE))RtlLockMemoryStreamRegion)
// E_NOTIMPL RTL_MEMORY_STREAM_API HRESULT STDMETHODCALLTYPE RtlUnlockMemoryStreamRegion( PRTL_MEMORY_STREAM_WITH_VTABLE MemoryStream, ULARGE_INTEGER Offset, ULARGE_INTEGER NumberOfBytes, ULONG LockType );
#define RtlUnlockOutOfProcessMemoryStreamRegion \ ((PRTL_UNLOCK_STREAM_REGION1(RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE))RtlUnlockMemoryStreamRegion)
// E_NOTIMPL RTL_MEMORY_STREAM_API HRESULT STDMETHODCALLTYPE RtlStatMemoryStream( PRTL_MEMORY_STREAM_WITH_VTABLE MemoryStream, STATSTG* StatusInformation, ULONG Flags );
#define RtlStatOutOfProcessMemoryStream \ ((PRTL_STAT_STREAM1(RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE))RtlStatMemoryStream)
// E_NOTIMPL RTL_MEMORY_STREAM_API HRESULT STDMETHODCALLTYPE RtlCloneMemoryStream( PRTL_MEMORY_STREAM_WITH_VTABLE MemoryStream, IStream** NewStream );
#define RtlCloneOutOfProcessMemoryStream \ ((PRTL_CLONE_STREAM1(RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE))RtlCloneMemoryStream)
#if defined(__cplusplus) && !defined(CINTERFACE)
#if !defined(interface) // // we need #define interface struct // #include "objbase.h" #endif
#ifdef COM_NO_WINDOWS_H #include "objidl.h" #else #define COM_NO_WINDOWS_H #include "objidl.h" #undef COM_NO_WINDOWS_H #endif
class DECLSPEC_NOVTABLE CRtlMemoryStream : public IStream { protected:
operator PRTL_MEMORY_STREAM_WITH_VTABLE() { return reinterpret_cast<PRTL_MEMORY_STREAM_WITH_VTABLE>(this); }
RTL_MEMORY_STREAM_DATA Data;
public:
/* This conflicts with DECLSPEC_NOVTABLE static VOID STDMETHODCALLTYPE FinalReleaseGlue(PRTL_MEMORY_STREAM_WITH_VTABLE This) { return reinterpret_cast<CRtlMemoryStream*>(This)->FinalRelease(); }
virtual VOID STDMETHODCALLTYPE FinalRelease() { } */
CRtlMemoryStream() { RtlInitMemoryStream(*this); //Data.FinalRelease = FinalReleaseGlue; }
ULONG STDMETHODCALLTYPE AddRef() { return RtlAddRefMemoryStream(*this); }
ULONG STDMETHODCALLTYPE ReleaseRef() { return RtlReleaseMemoryStream(*this); }
HRESULT STDMETHODCALLTYPE QueryInterface( const IID& Interface, PVOID* Object ) { return RtlQueryInterfaceMemoryStream(*this, &Interface, Object); }
HRESULT STDMETHODCALLTYPE Read( PVOID Buffer, ULONG BytesToRead, ULONG* BytesRead ) { return RtlReadMemoryStream(*this, Buffer, BytesToRead, BytesRead); }
HRESULT STDMETHODCALLTYPE Write( const VOID* Buffer, ULONG BytesToWrite, ULONG* BytesWritten ) { return RtlWriteMemoryStream(*this, Buffer, BytesToWrite, BytesWritten); }
HRESULT STDMETHODCALLTYPE Seek( LARGE_INTEGER Distance, ULONG Origin, ULARGE_INTEGER* NewPosition ) { return RtlSeekMemoryStream(*this, Distance, Origin, NewPosition); }
HRESULT STDMETHODCALLTYPE SetSize( ULARGE_INTEGER NewSize ) { return RtlSetMemoryStreamSize(*this, NewSize); }
HRESULT STDMETHODCALLTYPE CopyTo( IStream* AnotherStream, ULARGE_INTEGER NumberOfBytesToCopy, ULARGE_INTEGER* NumberOfBytesRead, ULARGE_INTEGER* NumberOfBytesWritten ) { return RtlCopyMemoryStreamTo( *this, AnotherStream, NumberOfBytesToCopy, NumberOfBytesRead, NumberOfBytesWritten); }
HRESULT STDMETHODCALLTYPE Commit( ULONG Flags ) { return RtlCommitMemoryStream(*this, Flags); }
HRESULT STDMETHODCALLTYPE Revert() { return RtlRevertMemoryStream(*this); }
HRESULT STDMETHODCALLTYPE LockRegion( ULARGE_INTEGER Offset, ULARGE_INTEGER NumberOfBytes, ULONG LockType ) { return RtlLockMemoryStreamRegion(*this, Offset, NumberOfBytes, LockType); }
HRESULT STDMETHODCALLTYPE UnlockRegion( ULARGE_INTEGER Offset, ULARGE_INTEGER NumberOfBytes, ULONG LockType ) { return RtlUnlockMemoryStreamRegion(*this, Offset, NumberOfBytes, LockType); }
HRESULT STDMETHODCALLTYPE Stat( STATSTG* StatusInformation, ULONG Flags ) { return RtlStatMemoryStream(*this, StatusInformation, Flags); }
HRESULT STDMETHODCALLTYPE Clone( IStream** NewStream ) { return RtlCloneMemoryStream(*this, NewStream); }
private: // can't do this outside the class because Data is not public static void CompileTimeAssert() { C_ASSERT(FIELD_OFFSET(RTL_MEMORY_STREAM_WITH_VTABLE, Data) == FIELD_OFFSET(CRtlMemoryStream, Data)); } }; C_ASSERT(sizeof(RTL_MEMORY_STREAM_WITH_VTABLE) == sizeof(CRtlMemoryStream));
class DECLSPEC_NOVTABLE CRtlOutOfProcessMemoryStream : public IStream { protected:
operator PRTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE() { return reinterpret_cast<PRTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE>(this); }
RTL_OUT_OF_PROCESS_MEMORY_STREAM_DATA Data;
public:
/* This conflicts with DECLSPEC_NOVTABLE static VOID STDMETHODCALLTYPE FinalReleaseGlue(PRTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE This) { return reinterpret_cast<CRtlOutOfProcessMemoryStream*>(This)->FinalRelease(); }
virtual VOID STDMETHODCALLTYPE FinalRelease() { } */
CRtlOutOfProcessMemoryStream() { RtlInitOutOfProcessMemoryStream(*this); //Data.FinalRelease = FinalReleaseGlue; }
ULONG STDMETHODCALLTYPE AddRef() { return RtlAddRefOutOfProcessMemoryStream(*this); }
ULONG STDMETHODCALLTYPE ReleaseRef() { return RtlReleaseOutOfProcessMemoryStream(*this); }
HRESULT STDMETHODCALLTYPE QueryInterface( const IID& Interface, PVOID* Object ) { return RtlQueryInterfaceOutOfProcessMemoryStream(*this, &Interface, Object); }
HRESULT STDMETHODCALLTYPE Read( PVOID Buffer, ULONG BytesToRead, ULONG* BytesRead ) { return RtlReadOutOfProcessMemoryStream(*this, Buffer, BytesToRead, BytesRead); }
HRESULT STDMETHODCALLTYPE Write( const VOID* Buffer, ULONG BytesToWrite, ULONG* BytesWritten ) { return RtlWriteOutOfProcessMemoryStream(*this, Buffer, BytesToWrite, BytesWritten); }
HRESULT STDMETHODCALLTYPE Seek( LARGE_INTEGER Distance, ULONG Origin, ULARGE_INTEGER* NewPosition ) { return RtlSeekOutOfProcessMemoryStream(*this, Distance, Origin, NewPosition); }
HRESULT STDMETHODCALLTYPE SetSize( ULARGE_INTEGER NewSize ) { return RtlSetOutOfProcessMemoryStreamSize(*this, NewSize); }
HRESULT STDMETHODCALLTYPE CopyTo( IStream* AnotherStream, ULARGE_INTEGER NumberOfBytesToCopy, ULARGE_INTEGER* NumberOfBytesRead, ULARGE_INTEGER* NumberOfBytesWritten ) { return RtlCopyOutOfProcessMemoryStreamTo( *this, AnotherStream, NumberOfBytesToCopy, NumberOfBytesRead, NumberOfBytesWritten); }
HRESULT STDMETHODCALLTYPE Commit( ULONG Flags ) { return RtlCommitOutOfProcessMemoryStream(*this, Flags); }
HRESULT STDMETHODCALLTYPE Revert() { return RtlRevertOutOfProcessMemoryStream(*this); }
HRESULT STDMETHODCALLTYPE LockRegion( ULARGE_INTEGER Offset, ULARGE_INTEGER NumberOfBytes, ULONG LockType ) { return RtlLockOutOfProcessMemoryStreamRegion(*this, Offset, NumberOfBytes, LockType); }
HRESULT STDMETHODCALLTYPE UnlockRegion( ULARGE_INTEGER Offset, ULARGE_INTEGER NumberOfBytes, ULONG LockType ) { return RtlUnlockOutOfProcessMemoryStreamRegion(*this, Offset, NumberOfBytes, LockType); }
HRESULT STDMETHODCALLTYPE Stat( STATSTG* StatusInformation, ULONG Flags ) { return RtlStatOutOfProcessMemoryStream(*this, StatusInformation, Flags); }
HRESULT STDMETHODCALLTYPE Clone( IStream** NewStream ) { return RtlCloneOutOfProcessMemoryStream(*this, NewStream); }
private: // can't do this outside the class because Data is not public static void CompileTimeAssert() { C_ASSERT(FIELD_OFFSET(RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE, Data) == FIELD_OFFSET(CRtlOutOfProcessMemoryStream, Data)); } }; C_ASSERT(sizeof(RTL_OUT_OF_PROCESS_MEMORY_STREAM_WITH_VTABLE) == sizeof(CRtlOutOfProcessMemoryStream));
#endif // __cplusplus #endif // RTL_DECLARE_MEMORY_STREAM #endif // RTL_DECLARE_STREAMS
#define RTL_CLOSE_HANDLE(handle_) ((handle_) != NULL ? NtClose(handle_) : STATUS_SUCCESS) #define RTL_UNMAP_VIEW_OF_SECTION2(process_, base_) ((base_) != NULL ? NtUnmapViewOfSection((process_), (base_)) : STATUS_SUCCESS) #define RTL_UNMAP_VIEW_OF_SECTION1(base_) (RTL_UNMAP_VIEW_OF_SECTION2(NtCurrentProcess(), (base_))) #if defined(__cplusplus) && !defined(CINTERFACE) #define RTL_RELEASE(punk_) do { if ((punk_) != NULL) { (punk_)->Release(); (punk_) = NULL; } } while(0) #else #define RTL_RELEASE(punk_) do { if ((punk_) != NULL) { (punk_)->lpVtbl->Release(punk_); (punk_) = NULL; } } while(0) #endif
// // Activation context management functions //
// // Data structures are visible both in ntrtl and Win32 APIs, so their // definitions are factored out into a separate header file. //
#define ACTCTX_PROCESS_DEFAULT ((void*)NULL)
// // If you activate this activation context handle, // all activation context queries fail and searches // drop back to pre-activation context behavior, like // searching PATH for .dlls. // // This constant works at the Win32 and Rtl level, but // is intended only for Shell clients, so is kept out of winnt.h // #define ACTCTX_EMPTY ((void*)(LONG_PTR)-3)
// // NULL can also mean ACTCTX_SYSTEM_DEFAULT. We are between decisions // on NULL plus a flag, magic numbers and/or static instances. I generally // favor public magic numbers internally mapped to static instances, but // I was pushed toward flags to start. // #define ACTCTX_SYSTEM_DEFAULT ((void*)(LONG_PTR)-4)
// // Reserve a small range of values, 0 through -7. // (Note that NtCurrentProcess() == -1, NtCurrentThread() == -2, so I avoided // those, though this macro picks them up.) // // We subtract one instead of comparing against NULL seperately to avoid // evaluating the macro parameter more than once. // #define IS_SPECIAL_ACTCTX(x) (((((LONG_PTR)(x)) - 1) | 7) == -1)
typedef struct _ACTIVATION_CONTEXT *PACTIVATION_CONTEXT; typedef const struct _ACTIVATION_CONTEXT *PCACTIVATION_CONTEXT;
#define INVALID_ACTIVATION_CONTEXT ((PACTIVATION_CONTEXT) ((LONG_PTR) -1))
// begin_winnt typedef enum _ACTIVATION_CONTEXT_INFO_CLASS { ActivationContextBasicInformation = 1, ActivationContextDetailedInformation = 2, AssemblyDetailedInformationInActivationContext = 3, FileInformationInAssemblyOfAssemblyInActivationContext = 4, MaxActivationContextInfoClass,
// // compatibility with old names // AssemblyDetailedInformationInActivationContxt = 3, FileInformationInAssemblyOfAssemblyInActivationContxt = 4 } ACTIVATION_CONTEXT_INFO_CLASS;
#define ACTIVATIONCONTEXTINFOCLASS ACTIVATION_CONTEXT_INFO_CLASS
// end_winnt
#define RTL_QUERY_INFORMATION_ACTIVATION_CONTEXT_FLAG_USE_ACTIVE_ACTIVATION_CONTEXT (0x00000001) #define RTL_QUERY_INFORMATION_ACTIVATION_CONTEXT_FLAG_ACTIVATION_CONTEXT_IS_MODULE (0x00000002) #define RTL_QUERY_INFORMATION_ACTIVATION_CONTEXT_FLAG_ACTIVATION_CONTEXT_IS_ADDRESS (0x00000004) #define RTL_QUERY_INFORMATION_ACTIVATION_CONTEXT_FLAG_NO_ADDREF (0x80000000)
// begin_winnt
typedef struct _ACTIVATION_CONTEXT_QUERY_INDEX { ULONG ulAssemblyIndex; ULONG ulFileIndexInAssembly; } ACTIVATION_CONTEXT_QUERY_INDEX, * PACTIVATION_CONTEXT_QUERY_INDEX;
typedef const struct _ACTIVATION_CONTEXT_QUERY_INDEX * PCACTIVATION_CONTEXT_QUERY_INDEX;
// end_winnt
NTSYSAPI NTSTATUS NTAPI RtlQueryInformationActivationContext( IN ULONG Flags, IN PCACTIVATION_CONTEXT ActivationContext, IN PVOID SubInstanceIndex, IN ACTIVATION_CONTEXT_INFO_CLASS ActivationContextInformationClass, OUT PVOID ActivationContextInformation, IN SIZE_T ActivationContextInformationLength, OUT PSIZE_T ReturnLength OPTIONAL );
NTSYSAPI NTSTATUS NTAPI RtlQueryInformationActiveActivationContext( IN ACTIVATION_CONTEXT_INFO_CLASS ActivationContextInformationClass, OUT PVOID ActivationContextInformation, IN SIZE_T ActivationContextInformationLength, OUT PSIZE_T ReturnLength OPTIONAL );
#define FIND_ACTIVATION_CONTEXT_SECTION_OUTFLAG_FOUND_IN_PROCESS_DEFAULT (0x00000001) #define FIND_ACTIVATION_CONTEXT_SECTION_OUTFLAG_FOUND_IN_SYSTEM_DEFAULT (0x00000002)
#if !defined(RC_INVOKED) /* RC complains about long symbols in #ifs */ #if !defined(ACTIVATION_CONTEXT_BASIC_INFORMATION_DEFINED)
typedef struct _ACTIVATION_CONTEXT_BASIC_INFORMATION { union { struct _ACTIVATION_CONTEXT *ActivationContext; HANDLE hActCtx; // for compatibility with windows.h/winbase.h clients }; ULONG Flags; } ACTIVATION_CONTEXT_BASIC_INFORMATION, *PACTIVATION_CONTEXT_BASIC_INFORMATION;
typedef const struct _ACTIVATION_CONTEXT_BASIC_INFORMATION *PCACTIVATION_CONTEXT_BASIC_INFORMATION;
#define ACTIVATION_CONTEXT_BASIC_INFORMATION_DEFINED 1
#endif // !defined(ACTIVATION_CONTEXT_BASIC_INFORMATION_DEFINED) #endif
// begin_winnt
#define ACTIVATION_CONTEXT_PATH_TYPE_NONE (1) #define ACTIVATION_CONTEXT_PATH_TYPE_WIN32_FILE (2) #define ACTIVATION_CONTEXT_PATH_TYPE_URL (3) #define ACTIVATION_CONTEXT_PATH_TYPE_ASSEMBLYREF (4)
typedef struct _ASSEMBLY_FILE_DETAILED_INFORMATION { ULONG ulFlags; ULONG ulFilenameLength; ULONG ulPathLength;
PCWSTR lpFileName; PCWSTR lpFilePath; } ASSEMBLY_FILE_DETAILED_INFORMATION, *PASSEMBLY_FILE_DETAILED_INFORMATION; typedef const ASSEMBLY_FILE_DETAILED_INFORMATION *PCASSEMBLY_FILE_DETAILED_INFORMATION;
// // compatibility with old names // The new names use "file" consistently. // #define _ASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION _ASSEMBLY_FILE_DETAILED_INFORMATION #define ASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION ASSEMBLY_FILE_DETAILED_INFORMATION #define PASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION PASSEMBLY_FILE_DETAILED_INFORMATION #define PCASSEMBLY_DLL_REDIRECTION_DETAILED_INFORMATION PCASSEMBLY_FILE_DETAILED_INFORMATION
typedef struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION { ULONG ulFlags; ULONG ulEncodedAssemblyIdentityLength; // in bytes ULONG ulManifestPathType; // ACTIVATION_CONTEXT_PATH_TYPE_* ULONG ulManifestPathLength; // in bytes LARGE_INTEGER liManifestLastWriteTime; // FILETIME ULONG ulPolicyPathType; // ACTIVATION_CONTEXT_PATH_TYPE_* ULONG ulPolicyPathLength; // in bytes LARGE_INTEGER liPolicyLastWriteTime; // FILETIME ULONG ulMetadataSatelliteRosterIndex; ULONG ulManifestVersionMajor; // 1 ULONG ulManifestVersionMinor; // 0 ULONG ulPolicyVersionMajor; // 0 ULONG ulPolicyVersionMinor; // 0 ULONG ulAssemblyDirectoryNameLength; // in bytes
PCWSTR lpAssemblyEncodedAssemblyIdentity; PCWSTR lpAssemblyManifestPath; PCWSTR lpAssemblyPolicyPath; PCWSTR lpAssemblyDirectoryName;
ULONG ulFileCount; } ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION, * PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;
typedef const struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION * PCACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION ;
typedef struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION { ULONG dwFlags; ULONG ulFormatVersion; ULONG ulAssemblyCount; ULONG ulRootManifestPathType; ULONG ulRootManifestPathChars; ULONG ulRootConfigurationPathType; ULONG ulRootConfigurationPathChars; ULONG ulAppDirPathType; ULONG ulAppDirPathChars; PCWSTR lpRootManifestPath; PCWSTR lpRootConfigurationPath; PCWSTR lpAppDirPath; } ACTIVATION_CONTEXT_DETAILED_INFORMATION, *PACTIVATION_CONTEXT_DETAILED_INFORMATION;
typedef const struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION *PCACTIVATION_CONTEXT_DETAILED_INFORMATION;
// end_winnt
typedef struct _FINDFIRSTACTIVATIONCONTEXTSECTION { ULONG Size; ULONG Flags; const GUID *ExtensionGuid; ULONG Id; ULONG Depth; ULONG OutFlags; } FINDFIRSTACTIVATIONCONTEXTSECTION, *PFINDFIRSTACTIVATIONCONTEXTSECTION; typedef const FINDFIRSTACTIVATIONCONTEXTSECTION * PCFINDFIRSTACTIVATIONCONTEXTSECTION;
#define ACTIVATION_CONTEXT_NOTIFICATION_DESTROY (1) #define ACTIVATION_CONTEXT_NOTIFICATION_ZOMBIFY (2) #define ACTIVATION_CONTEXT_NOTIFICATION_USED (3)
typedef VOID (NTAPI * PACTIVATION_CONTEXT_NOTIFY_ROUTINE)( IN ULONG NotificationType, IN PACTIVATION_CONTEXT ActivationContext, IN const VOID *ActivationContextData, IN PVOID NotificationContext, IN PVOID NotificationData, IN OUT PBOOLEAN DisableThisNotification );
NTSYSAPI NTSTATUS NTAPI RtlInitializeSxs( VOID );
NTSYSAPI NTSTATUS NTAPI RtlCreateActivationContext( IN ULONG Flags, IN PVOID ActivationContextData, IN ULONG ExtraBytes OPTIONAL, IN PACTIVATION_CONTEXT_NOTIFY_ROUTINE NotificationRoutine OPTIONAL, IN PVOID NotificationContext OPTIONAL, OUT PACTIVATION_CONTEXT *ActivationContext );
NTSYSAPI VOID NTAPI RtlAddRefActivationContext( IN PACTIVATION_CONTEXT AppCtx );
NTSYSAPI VOID NTAPI RtlReleaseActivationContext( IN PACTIVATION_CONTEXT AppCtx );
NTSYSAPI NTSTATUS NTAPI RtlZombifyActivationContext( IN PACTIVATION_CONTEXT ActivationContext );
NTSYSAPI NTSTATUS NTAPI RtlGetActiveActivationContext( OUT PACTIVATION_CONTEXT *ActivationContext );
NTSYSAPI BOOLEAN NTAPI RtlIsActivationContextActive( IN PACTIVATION_CONTEXT ActivationContext );
typedef struct _ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_DATA_RESOLUTION_BEGINNING { IN VOID const * Data; // pointer to activation context data IN ULONG AssemblyRosterIndex; OUT PVOID ResolutionContext; OUT UNICODE_STRING Root; // Root path - a default buffer is passed in; if // it is not large enough, callback must allocate // a string using the RtlAllocateStringRoutine // function pointer. OUT BOOLEAN KnownRoot; // default is FALSE; set to TRUE if you were able to // resolve the storage root immediately. this is // how to handle things like run-from-source where // the assembly is on read-only removable media like // a CD-ROM. If you set it to TRUE, the _SUCCESSFUL // vs. _UNSUCCESSFUL callbacks are not made. OUT SIZE_T RootCount; // Caller may set to ((SIZE_T) -1) and use the // .NoMoreEntries BOOLEAN in the callback to stop enumeration OUT BOOLEAN CancelResolution; // set to true if you want to stop the resolution } ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_DATA_RESOLUTION_BEGINNING;
typedef struct _ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_DATA_GET_ROOT { IN PVOID ResolutionContext; IN SIZE_T RootIndex; OUT BOOLEAN CancelResolution; // set to true if you want to stop the resolution with STATUS_CANCELLED OUT BOOLEAN NoMoreEntries; // set to TRUE if you have no more roots to return. OUT UNICODE_STRING Root; // If for some reason you want to skip this index; set .Length to zero } ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_DATA_GET_ROOT;
typedef struct _ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_DATA_RESOLUTION_SUCCESSFUL { IN PVOID ResolutionContext; IN ULONG RootIndexUsed; } ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_DATA_RESOLUTION_SUCCESSFUL;
typedef struct _ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_DATA_RESOLUTION_ENDING { IN PVOID ResolutionContext; } ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_DATA_RESOLUTION_ENDING;
typedef union _ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_DATA { ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_DATA_RESOLUTION_BEGINNING ResolutionBeginning; ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_DATA_GET_ROOT GetRoot; ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_DATA_RESOLUTION_SUCCESSFUL ResolutionSuccessful; ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_DATA_RESOLUTION_ENDING ResolutionEnding; } ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_DATA, *PASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_DATA;
#define ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_REASON_RESOLUTION_BEGINNING (1) #define ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_REASON_GET_ROOT (2) #define ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_REASON_RESOLUTION_SUCCESSFUL (3) #define ASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_REASON_RESOLUTION_ENDING (4)
typedef VOID (NTAPI * PASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_ROUTINE)( IN ULONG CallbackReason, IN OUT PASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_DATA CallbackData, IN PVOID CallbackContext );
NTSYSAPI NTSTATUS NTAPI RtlResolveAssemblyStorageMapEntry( IN ULONG Flags, IN PACTIVATION_CONTEXT ActivationContext, IN ULONG AssemblyRosterIndex, IN PASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_ROUTINE Callback, IN PVOID CallbackContext );
#define RTL_GET_ASSEMBLY_STORAGE_ROOT_FLAG_ACTIVATION_CONTEXT_USE_PROCESS_DEFAULT (0x00000001) #define RTL_GET_ASSEMBLY_STORAGE_ROOT_FLAG_ACTIVATION_CONTEXT_USE_SYSTEM_DEFAULT (0x00000002)
NTSYSAPI NTSTATUS NTAPI RtlGetAssemblyStorageRoot( IN ULONG Flags, IN PACTIVATION_CONTEXT ActivationContext, IN ULONG AssemblyRosterIndex, OUT PCUNICODE_STRING *AssemblyStorageRoot, IN PASSEMBLY_STORAGE_MAP_RESOLUTION_CALLBACK_ROUTINE Callback, IN PVOID CallbackContext );
// // Macro to enable avoiding calling RtlFindActivationContext* APIs if // there is no side-by-side redirection going on in the process // at all. //
#if NTOS_KERNEL_RUNTIME
// // For kernel mode, this needs to be a real function with probes etc. // since it references the process state (peb/teb). //
NTSYSAPI BOOLEAN NTAPI RtlAnyActivationContextDataAvailable(VOID);
#else
#define RtlAnyActivationContextDataAvailable() \ ((NtCurrentTeb()->ActivationContextStack != NULL) || \ (NtCurrentPeb()->ActivationContextData != NULL) || \ (NtCurrentPeb()->SystemDefaultActivationContextData != NULL))
#endif // NTOS_KERNEL_RUNTIME
#define RtlIsProcessDefaultActivationContextActive() ((NtCurrentTeb()->ActivationContextStack == NULL) || RtlIsActivationContextActive(NULL))
#define ACTIVATION_CONTEXT_SECTION_KEYED_DATA_FLAG_FOUND_IN_PROCESS_DEFAULT (0x00000001) #define ACTIVATION_CONTEXT_SECTION_KEYED_DATA_FLAG_FOUND_IN_SYSTEM_DEFAULT (0x00000002)
typedef struct _ACTIVATION_CONTEXT_SECTION_KEYED_DATA_2600 { ULONG Size; ULONG DataFormatVersion; PVOID Data; ULONG Length; PVOID SectionGlobalData; ULONG SectionGlobalDataLength; PVOID SectionBase; ULONG SectionTotalLength; PACTIVATION_CONTEXT ActivationContext; ULONG AssemblyRosterIndex; ULONG Flags; } ACTIVATION_CONTEXT_SECTION_KEYED_DATA_2600, *PACTIVATION_CONTEXT_SECTION_KEYED_DATA_2600; typedef const ACTIVATION_CONTEXT_SECTION_KEYED_DATA_2600 *PCACTIVATION_CONTEXT_SECTION_KEYED_DATA_2600;
typedef struct _ACTIVATION_CONTEXT_SECTION_KEYED_DATA_ASSEMBLY_METADATA { struct _ACTIVATION_CONTEXT_DATA_ASSEMBLY_INFORMATION * Information; PVOID SectionBase; ULONG SectionLength; PVOID SectionGlobalDataBase; ULONG SectionGlobalDataLength; } ACTIVATION_CONTEXT_SECTION_KEYED_DATA_ASSEMBLY_METADATA, *PACTIVATION_CONTEXT_SECTION_KEYED_DATA_ASSEMBLY_METADATA; typedef const ACTIVATION_CONTEXT_SECTION_KEYED_DATA_ASSEMBLY_METADATA *PCACTIVATION_CONTEXT_SECTION_KEYED_DATA_ASSEMBLY_METADATA;
typedef struct _ACTIVATION_CONTEXT_SECTION_KEYED_DATA { ULONG Size; ULONG DataFormatVersion; PVOID Data; ULONG Length; PVOID SectionGlobalData; ULONG SectionGlobalDataLength; PVOID SectionBase; ULONG SectionTotalLength; PACTIVATION_CONTEXT ActivationContext; ULONG AssemblyRosterIndex; ULONG Flags; // 2600 stops here ACTIVATION_CONTEXT_SECTION_KEYED_DATA_ASSEMBLY_METADATA AssemblyMetadata; } ACTIVATION_CONTEXT_SECTION_KEYED_DATA, *PACTIVATION_CONTEXT_SECTION_KEYED_DATA; typedef const ACTIVATION_CONTEXT_SECTION_KEYED_DATA * PCACTIVATION_CONTEXT_SECTION_KEYED_DATA;
// // Flags for the RtlFindActivationContextSection*() APIs //
#define FIND_ACTIVATION_CONTEXT_SECTION_KEY_RETURN_ACTIVATION_CONTEXT (0x00000001) #define FIND_ACTIVATION_CONTEXT_SECTION_KEY_RETURN_FLAGS (0x00000002) #define FIND_ACTIVATION_CONTEXT_SECTION_KEY_RETURN_ASSEMBLY_METADATA (0x00000004)
NTSYSAPI NTSTATUS NTAPI RtlFindActivationContextSectionString( IN ULONG Flags, IN const GUID *ExtensionGuid OPTIONAL, IN ULONG SectionId, IN PCUNICODE_STRING StringToFind, IN OUT PACTIVATION_CONTEXT_SECTION_KEYED_DATA ReturnedData );
NTSYSAPI NTSTATUS NTAPI RtlFindActivationContextSectionGuid( IN ULONG Flags, IN const GUID *ExtensionGuid OPTIONAL, IN ULONG SectionId, IN const GUID *GuidToFind, IN OUT PACTIVATION_CONTEXT_SECTION_KEYED_DATA ReturnedData );
#define ACTIVATION_CONTEXT_ASSEMBLY_DATA_IS_ROOT_ASSEMBLY (0x00000001)
typedef struct _ACTIVATION_CONTEXT_ASSEMBLY_DATA { ULONG Size; ULONG Flags; const WCHAR *AssemblyName; ULONG AssemblyNameLength; // in bytes ULONG HashAlgorithm; ULONG PseudoKey; } ACTIVATION_CONTEXT_ASSEMBLY_DATA, *PACTIVATION_CONTEXT_ASSEMBLY_DATA;
typedef const ACTIVATION_CONTEXT_ASSEMBLY_DATA *PCACTIVATION_CONTEXT_ASSEMBLY_DATA;
NTSYSAPI NTSTATUS NTAPI RtlGetActivationContextAssemblyData( IN PCACTIVATION_CONTEXT ActivationContext, IN ULONG AssemblyRosterIndex, // note that valid indices are [1 .. AssemblyCount] inclusive IN OUT PACTIVATION_CONTEXT_ASSEMBLY_DATA Data );
NTSYSAPI NTSTATUS NTAPI RtlGetActivationContextAssemblyCount( IN PCACTIVATION_CONTEXT ActivationContext, OUT ULONG *AssemblyCount );
NTSYSAPI VOID NTAPI RtlFreeThreadActivationContextStack( VOID );
NTSYSAPI NTSTATUS NTAPI RtlFindFirstActivationContextSection( IN OUT PFINDFIRSTACTIVATIONCONTEXTSECTION Context, OUT PVOID *Section, OUT ULONG *Length, OUT PACTIVATION_CONTEXT *ActivationContext OPTIONAL );
NTSYSAPI NTSTATUS NTAPI RtlFindNextActivationContextSection( IN OUT PFINDFIRSTACTIVATIONCONTEXTSECTION Context, OUT PVOID *Section, OUT ULONG *Length, OUT PACTIVATION_CONTEXT *ActivationContext OPTIONAL );
NTSYSAPI VOID NTAPI RtlEndFindActivationContextSection( IN PFINDFIRSTACTIVATIONCONTEXTSECTION Context );
NTSYSAPI NTSTATUS NTAPI RtlGetActivationContextStack( PVOID *Stack );
// // RTL_ACTIVATION_CONTEXT_STACK_FRAME //
#define RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_RELEASE_ON_DEACTIVATION (0x00000001) #define RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_NO_DEACTIVATE (0x00000002) #define RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_ON_FREE_LIST (0x00000004) #define RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_HEAP_ALLOCATED (0x00000008) #define RTL_ACTIVATION_CONTEXT_STACK_FRAME_FLAG_NOT_REALLY_ACTIVATED (0x00000010)
typedef struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME { struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME *Previous; PACTIVATION_CONTEXT ActivationContext; ULONG Flags; } RTL_ACTIVATION_CONTEXT_STACK_FRAME, *PRTL_ACTIVATION_CONTEXT_STACK_FRAME;
typedef const struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME *PCRTL_ACTIVATION_CONTEXT_STACK_FRAME;
#define RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_FORMAT_WHISTLER (1)
typedef struct _RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME { SIZE_T Size; ULONG Format; RTL_ACTIVATION_CONTEXT_STACK_FRAME Frame; } RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME, *PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME;
#define INVALID_ACTIVATION_CONTEXT_ACTIVATION_COOKIE ((ULONG_PTR) 0)
NTSYSAPI NTSTATUS NTAPI RtlActivateActivationContext( IN ULONG Flags, IN PACTIVATION_CONTEXT ActivationContext, OUT ULONG_PTR *Cookie );
#define RTL_ACTIVATE_ACTIVATION_CONTEXT_EX_FLAG_RELEASE_ON_STACK_DEALLOCATION (0x00000001)
NTSYSAPI NTSTATUS NTAPI RtlActivateActivationContextEx( IN ULONG Flags, IN PTEB Teb, IN PACTIVATION_CONTEXT ActivationContext, OUT PULONG_PTR Cookie );
#define RTL_DEACTIVATE_ACTIVATION_CONTEXT_FLAG_FORCE_EARLY_DEACTIVATION (0x00000001)
NTSYSAPI VOID NTAPI RtlDeactivateActivationContext( IN ULONG Flags, IN ULONG_PTR Cookie );
NTSYSAPI VOID NTAPI RtlActivateActivationContextUnsafeFast( IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME Frame, IN PACTIVATION_CONTEXT ActivationContext );
NTSYSAPI VOID NTAPI RtlDeactivateActivationContextUnsafeFast( IN PRTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME Frame );
NTSYSAPI VOID NTAPI RtlPushFrame( IN PTEB_ACTIVE_FRAME Frame );
NTSYSAPI VOID NTAPI RtlPopFrame( IN PTEB_ACTIVE_FRAME Frame );
NTSYSAPI PTEB_ACTIVE_FRAME NTAPI RtlGetFrame( VOID );
NTSYSAPI NTSTATUS NTAPI RtlGetNativeSystemInformation( IN ULONG SystemInformationClass, IN PVOID NativeSystemInformation, IN ULONG InformationLength, OUT PULONG ReturnLength OPTIONAL );
#if defined (_MSC_VER) && ( _MSC_VER >= 800 ) #if _MSC_VER >= 1200 #pragma warning(pop) #else #pragma warning(default:4001) #pragma warning(default:4201) #pragma warning(default:4214) #endif #endif
#ifdef __cplusplus } // extern "C" #endif
#endif // _NTURTL_
|