Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

378 lines
12 KiB

/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
ntrtlbuffer3.h
Abstract:
Author:
Jay Krell (JayKrell) January 2002
Environment:
Revision History:
--*/
#if _MSC_VER > 1000
#pragma once
#endif
//
// RTLBUFFER3_USERMODE -- usermode, not necessarily linked into ntdll.dll
// RTLBUFFER3_KERNELMODE -- kernelmode, not necessarily linked into ntoskrnl.exe
// RTLBUFFER3_NTDLL -- usermode, linked into ntdll.dll
// RTLBUFFER3_NTKERNEL -- kernelmode, linked into ntoskrnl.exe
// (if ntdll.dll and ntoskrnl.exe would only export the publically declared string routines...)
//
// RTLBUFFER3_BOOT -- TBD
//
#if defined(_NTDLLBUILD_)
#define RTLBUFFER3_NTDLL 1
#define RTLBUFFER3_USERMODE 1
#endif
#if defined(NTOS_KERNEL_RUNTIME)
#define RTLBUFFER3_NTKERNEL 1
#define RTLBUFFER3_KERNELMODE 1
#endif
#if defined(RTLBUFFER3_USERMODE) && !defined(RTLBUFFER3_KERNELMODE)
#define RTLBUFFER3_KERNELMODE (!RTLBUFFER3_USERMODE)
#endif
#if !defined(RTLBUFFER3_USERMODE) && defined(RTLBUFFER3_KERNELMODE)
#define RTLBUFFER3_USERMODE (!RTLBUFFER3_KERNELMODE)
#endif
#if !defined(RTLBUFFER3_NTDLL)
#define RTLBUFFER3_NTDLL 0
#endif
#if !defined(RTLBUFFER3_NTKERNEL)
#define RTLBUFFER3_NTKERNEL 0
#endif
#if RTLBUFFER3_NTKERNEL && RTLBUFFER3_NTDLL
#error 1
#endif
#if RTLBUFFER3_NTKERNEL && RTLBUFFER3_USERMODE
#error 2
#endif
#if RTLBUFFER3_KERNELMODE && RTLBUFFER3_NTDLL
#error 3
#endif
#if RTLBUFFER3_KERNELMODE && RTLBUFFER3_USERMODE
#error 4
#ifdef __cplusplus
extern "C" {
#endif
#include "nt.h"
#include "ntrtl.h"
#if RTLBUFFER3_USERMODE
#include "nturtl.h"
#include "windows.h"
#endif
//
// This costs an extra heap allocation.
//
typedef struct _RTL_MINI_DYNAMIC_BYTE_BUFFER3 {
ULONG_PTR O_p_a_q_u_e[1];
} RTL_MINI_DYNAMIC_BYTE_BUFFER3, *PRTL_MINI_DYNAMIC_BYTE_BUFFER3;
typedef const RTL_MINI_DYNAMIC_BYTE_BUFFER3 * PCRTL_MINI_DYNAMIC_BYTE_BUFFER3;
typedef struct _RTL_BYTE_BUFFER3 {
ULONG_PTR O_p_a_q_u_e[9];
} RTL_BYTE_BUFFER3, *PRTL_BYTE_BUFFER3;
typedef const RTL_BYTE_BUFFER3 * PCRTL_BYTE_BUFFER3;
typedef struct _RTL_BUFFER3_ALLOCATOR {
BOOL (FASTCALL * CanAllocate)(PVOID Context); // eg: false for FixedSizeAllocator
PVOID (FASTCALL * Allocate)(PVOID Context, SIZE_T NumberOfBytes);
VOID (FASTCALL * Free)(PVOID Context, PVOID Pointer);
BOOL (FASTCALL * CanReallocate)(PVOID Context); // eg: false for NtkernelPoolAllocator
PVOID (FASTCALL * Reallocate)(PVOID Context, PVOID OldPointer, SIZE_T NewSize);
SIZE_T (FASTCALL * GetAllocationSize)(PVOID Context, SIZE_T CurrentAllocatedSize, SIZE_T RequiredSize);
} RTL_BUFFER3_ALLOCATOR, *PRTL_BUFFER3_ALLOCATOR;
typedef const RTL_BUFFER3_ALLOCATOR *PCRTL_BUFFER3_ALLOCATOR;
typedef enum _RTL_BUFFER3_RETURN {
RTL_BUFFER3_SUCCESS = 0,
RTL_BUFFER3_INVALID_PARAMETER = 1,
RTL_BUFFER3_INTERNAL_ERROR = 2,
RTL_BUFFER3_CALLBACK_ERROR = 3
} RTL_BUFFER3_RETURN;
//
// These are only "hints" for debugging, and to
// establish "causality" from the macro calls.
//
#define RTL_INIT_BYTE_BUFFER3_FLAGS_PREALLOCATED 0x80000000
#define RTL_INIT_BYTE_BUFFER3_FLAGS_FIXED_SIZE 0x40000000
#define RTL_INIT_BYTE_BUFFER3_FLAGS_DYNAMIC 0x20000000
RTL_BUFFER3_RETURN
FASTCALL
RtlInitByteBuffer3(
ULONG Flags,
PRTL_BYTE_BUFFER3 Buffer,
SIZE_T SizeofBufferForBinaryCompatibilityPurposes,
PBYTE StaticBuffer,
SIZE_T StaticBufferSize,
PCRTL_BUFFER3_ALLOCATOR Allocator,
PVOID AllocatorContext
);
#define RTL_PREALLOCATED_BYTE_BUFFER3(n) \
struct {
RTL_BYTE_BUFFER3 Buffer; \
BYTE StaticBuffer[n]; \
}
#define RtlInitPreallocatedByteBuffer3(flags, buf, a, ac) \
(RtlInitByteBuffer3((flags) | RTL_INIT_BYTE_BUFFER3_FLAGS_PREALLOCATED, &(buf)->Buffer, sizeof(&(buf)->Buffer), (buf)->StaticBuffer, sizeof((buf)->StaticBuffer), (a), (ac)))
#define RtlInitFixedSizeByteBuffer3(flags, buf, statbuf, statbufsiz) \
(RtlInitByteBuffer3((flags) | RTL_INIT_BYTE_BUFFER3_FLAGS_FIXED_SIZE, (buf), sizeof(*(buf)), (statbuf), (statbufsiz), NULL, NULL))
#define RtlInitDynamicByteBuffer3(flags), buf, a, ac) \
(RtlInitByteBuffer3((flags) | RTL_INIT_BYTE_BUFFER3_FLAGS_DYNAMIC, (buf), sizeof(buf), NULL, 0, (a), (ac)))
PVOID
FASTCALL
RtlByteBuffer3GetBuffer(
PRTL_BYTE_BUFFER3 Buffer
);
//
// There is both a "requested" size and an "allocated" size.
// requested <= allocated.
// This returns requested. Allocated is not available.
//
SIZE_T
FASTCALL
RtlByteBuffer3GetSize(
PRTL_BYTE_BUFFER3 Buffer
);
RTL_BUFFER3_RETURN
FASTCALL
RtlByteBuffer3EnsureSize(
PRTL_BYTE_BUFFER3 Buffer,
SIZE_T Size,
OUT PVOID * OutBuffer OPTIONAL
);
RTL_BUFFER3_RETURN
FASTCALL
RtlByteBuffer3AppendBuffer(
PRTL_BYTE_BUFFER3 ToBuffer,
PCRTL_BYTE_BUFFER3 FromBuffer,
);
RTL_BUFFER3_RETURN
FASTCALL
RtlByteBuffer3PrependBuffer(
PRTL_BYTE_BUFFER3 ToBuffer,
PCRTL_BYTE_BUFFER3 FromBuffer,
);
RTL_BUFFER3_RETURN
FASTCALL
RtlByteBuffer3InsertBuffer(
PRTL_BYTE_BUFFER3 ToBuffer,
PCRTL_BYTE_BUFFER3 FromBuffer,
SIZE_T Offset
);
RTL_BUFFER3_RETURN
FASTCALL
RtlByteBuffer3CopyBuffer(
PRTL_BYTE_BUFFER3 ToBuffer,
PCRTL_BYTE_BUFFER3 FromBuffer,
);
VOID
FASTCALL
RtlByteBuffer3TakeRemainingStaticBuffer(
PRTL_BYTE_BUFFER3 Buffer,
OUT PBYTE * RemainingStaticBuffer,
OUT SIZE_T * RemainingStaticBufferSize
);
RTL_BUFFER3_RETURN
FASTCALL
RtlFreeByteBuffer3(
PRTL_BYTE_BUFFER3 Buffer
);
BOOL FASTCALL RtlBuffer3Allocator_CanAllocate_False(PVOID Context);
BOOL FASTCALL RtlBuffer3Allocator_CanAllocate_True(PVOID Context);
BOOL FASTCALL RtlBuffer3Allocator_CanReallocate_False(PVOID Context);
BOOL FASTCALL RtlBuffer3Allocator_CanRellocate_True(PVOID Context);
//
// can be left as all zeros, or even a NULL context
// defaults: heap=GetProcessHeap(), flags=0, SetLastError(ERROR_NO_MEMORY)
//
typedef struct _RTL_BUFFER3_ALLOCATOR_WIN32HEAP {
BOOL UsePrivateHeap;
BOOL DoNotSetLastError;
BOOL UsePrivateError;
HANDLE PrivateHeap;
DWORD HeapFlags;
DWORD PrivateOutOfMemoryError;
} RTL_BUFFER3_ALLOCATOR_WIN32HEAP, *PRTL_BUFFER3_ALLOCATOR_WIN32HEAP;
typedef const RTL_BUFFER3_ALLOCATOR_WIN32HEAP * PCRTL_BUFFER3_ALLOCATOR_WIN32HEAP;
PVOID FASTCALL RtlBuffer3Allocator_Win32HeapAllocate(PVOID VoidContext, SIZE_T NumberOfBytes);
VOID FASTCALL RtlBuffer3Allocator_Win32HeapFree(PVOID VoidContext, PVOID Pointer);
PVOID FASTCALL RtlBuffer3Allocator_Win32HeapReallocate(PVOID Context, PVOID OldPointer, SIZE_T NewSize);
SIZE_T FASTCALL RtlBuffer3Allocator_FixedAllocationSize(PVOID Context, SIZE_T CurrentAllocatedSize, SIZE_T RequiredSize);
SIZE_T FASTCALL RtlBuffer3Allocator_DoublingAllocationSize(PVOID Context, SIZE_T CurrentAllocatedSize, SIZE_T RequiredSize);
SIZE_T FASTCALL RtlBuffer3Allocator_MinimumAlocationSize(PVOID Context, SIZE_T CurrentAllocatedSize, SIZE_T RequiredSize);
#define RtlBuffer3Allocator_Win32Heap \
RtlBuffer3_Allocator_CanAllocate_True, \
RtlBuffer3Allocator_Win32HeapAllocate, \
RtlBuffer3Allocator_Win32HeapFree, \
RtlBuffer3_Allocator_CanReallocate_True, \
RtlBuffer3Allocator_Win32HeapReallocate \
/* user specifies allocationsize */
//
// works in kernelmode and usermode, but kernelmode cannot realloc or use process heap
// context optional in usermode
// defaults: heap=RtlProcessHeap(), flags=0
//
typedef struct _RTL_BUFFER3_ALLOCATOR_NTHEAP {
BOOL UsePrivateHeap; /* Must be true in kernelmode. */
HANDLE PrivateHeap;
ULONG HeapFlags;
} RTL_BUFFER3_ALLOCATOR_NTHEAP, *PRTL_BUFFER3_ALLOCATOR_NTHEAP;
typedef const RTL_BUFFER3_ALLOCATOR_NTHEAP * PCRTL_BUFFER3_ALLOCATOR_NTHEAP;
PVOID FASTCALL RtlBuffer3Allocator_NtHeapHeapAllocate(PVOID VoidContext, SIZE_T NumberOfBytes);
VOID FASTCALL RtlBuffer3Allocator_NtHeapFree(PVOID VoidContext, PVOID Pointer);
PVOID FASTCALL RtlBuffer3Allocator_NtHeapReallocate(PVOID Context, PVOID OldPointer, SIZE_T NewSize);
#define RtlBuffer3Allocator_NtHeapKernelMode \
RtlBuffer3_Allocator_CanAllocate_True, \
RtlBuffer3Allocator_NtHeapAllocate, \
RtlBuffer3Allocator_NtHeapFree, \
RtlBuffer3_Allocator_CanReallocate_False, \
NULL \
/* user specifies allocationsize */
#define RtlBuffer3Allocator_NtHeapUserMode \
RtlBuffer3_Allocator_CanAllocate_True, \
RtlBuffer3Allocator_NtHeapAllocate, \
RtlBuffer3Allocator_NtHeapFree, \
RtlBuffer3_Allocator_CanReallocate_True, \
RtlBuffer3Allocator_NtHeapReallocate \
/* user specifies allocationsize */
#if defined(RTLBUFFER3_KERNELMODE)
#define RtlBuffer3Allocator_NtHeap RtlBuffer3Allocator_NtHeapKernelMode
#else
#define RtlBuffer3Allocator_NtHeap RtlBuffer3Allocator_NtHeapUserMode
#endif
//
// works in kernelmode and usermode
// no context
// realloc in usermode could be provided
//
PVOID FASTCALL RtlBuffer3Allocator_NtStringAllocate(PVOID VoidContext, SIZE_T NumberOfBytes);
VOID FASTCALL RtlBuffer3Allocator_NtStringFree(PVOID VoidContext, PVOID Pointer);
//PVOID FASTCALL RtlBuffer3Allocator_NtStringReallocate(PVOID Context, PVOID OldPointer, SIZE_T NewSize);
#define RtlBuffer3Allocator_NtStringRoutines \
RtlBuffer3_Allocator_CanAllocate_True, \
RtlBuffer3Allocator_NtStringAllocate, \
RtlBuffer3Allocator_NtStringFree, \
RtlBuffer3_Allocator_CanReallocate_False, \
NULL \
/* user specifies allocationsize */
//
// no context
//
PVOID FASTCALL RtlBuffer3Allocator_CrtMalloc(PVOID VoidContext, SIZE_T NumberOfBytes);
VOID FASTCALL RtlBuffer3Allocator_CrtFree(PVOID VoidContext, PVOID Pointer);
PVOID FASTCALL RtlBuffer3Allocator_CrtReallocate(PVOID Context, PVOID OldPointer, SIZE_T NewSize);
#define RtlBuffer3Allocator_CrtMallocFree \
RtlBuffer3_Allocator_CanAllocate_True, \
RtlBuffer3Allocator_CrtMalloc, \
RtlBuffer3Allocator_CrtFree, \
RtlBuffer3_Allocator_CanReallocate_True, \
RtlBuffer3Allocator_CrtReallocate \
/* user specifies allocationsize */
//
// no context
// no realloc
//
PVOID FASTCALL RtlBuffer3Allocator_OperatorNew(PVOID VoidContext, SIZE_T NumberOfBytes);
VOID FASTCALL RtlBuffer3Allocator_OperatorDelete(PVOID VoidContext, PVOID Pointer);
#define RtlBuffer3Allocator_OperatorNewDelete \
RtlBuffer3_Allocator_CanAllocate_True, \
RtlBuffer3Allocator_OperatorNew, \
RtlBuffer3Allocator_OperatorDelete, \
RtlBuffer3_Allocator_CanReallocate_False, \
NULL \
/* user specifies allocationsize */
//
//
// context optional
// defaults are: tag=0, type=nonpaged, priority=normal
// no realloc
// kernelmode only
//
#if defined(_EX_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTOSP_) || defined(_WDM_) || defined(_NTHAL_)
typedef enum _RTL_BUFFER3_ALLOCATOR_NTKERNELPOOL_ALLOCATE {
RTL_BUFFER3_ALLOCATOR_NTKERNELPOOL_ALLOCATE_EX_ALLOCATE_POOL,
RTL_BUFFER3_ALLOCATOR_NTKERNELPOOL_ALLOCATE_EX_ALLOCATE_POOL_WITH_TAG,
RTL_BUFFER3_ALLOCATOR_NTKERNELPOOL_ALLOCATE_EX_ALLOCATE_POOL_WITH_QUOTA,
RTL_BUFFER3_ALLOCATOR_NTKERNELPOOL_ALLOCATE_EX_ALLOCATE_POOL_WITH_QUOTA_TAG,
RTL_BUFFER3_ALLOCATOR_NTKERNELPOOL_ALLOCATE_EX_ALLOCATE_POOL_WITH_TAG_PRIORITY,
} RTL_BUFFER3_ALLOCATOR_NTKERNELPOOL_ALLOCATE;
typedef struct _RTL_BUFFER3_ALLOCATOR_NTKERNELPOOL {
RTL_BUFFER3_ALLOCATOR_NTKERNELPOOL_ALLOCATE WhichFunction;
ULONG Tag;
POOL_TYPE Type;
EX_POOL_PRIORITY Priority;
} RTL_BUFFER3_ALLOCATOR_NTKERNELPOOL, *PRTL_BUFFER3_ALLOCATOR_NTKERNELPOOL;
typedef const RTL_BUFFER3_ALLOCATOR_NTKERNELPOOL * PCRTL_BUFFER3_ALLOCATOR_NTKERNELPOOL;
#endif
PVOID FASTCALL RtlBuffer3Allocator_NtkernelPoolAllocate(PVOID VoidContext, SIZE_T NumberOfBytes);
VOID FASTCALL RtlBuffer3Allocator_NtKernelPoolFree(PVOID VoidContext, PVOID Pointer);
#define RtlBuffer3Allocator_NtkernelPool \
RtlBuffer3Allocator_CanAllocate_True, \
RtlBuffer3Allocator_NtkernelPoolAllocate, \
RtlBuffer3Allocator_NtKernelPoolFree, \
RtlBuffer3Allocator_CanReallocate_False, \
NULL \
/* user specifies allocationsize */
/* TBD
NtkernelTextmodeSetup
NtbootLoader
*/
#ifdef __cplusplus
}
#endif