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
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
|