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.
165 lines
3.6 KiB
165 lines
3.6 KiB
#pragma once
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef struct _RTL_GROWING_LIST_CHUNK {
|
|
|
|
//
|
|
// Pointer back to the parent list
|
|
//
|
|
struct _RTL_GROWING_LIST *pGrowingListParent;
|
|
|
|
//
|
|
// Pointer to the next chunk in the list
|
|
//
|
|
struct _RTL_GROWING_LIST_CHUNK *pNextChunk;
|
|
|
|
}
|
|
RTL_GROWING_LIST_CHUNK, *PRTL_GROWING_LIST_CHUNK;
|
|
|
|
#define GROWING_LIST_FLAG_IS_SORTED (0x00000001)
|
|
|
|
typedef struct _RTL_GROWING_LIST {
|
|
|
|
//
|
|
// Any flags about this list?
|
|
//
|
|
ULONG ulFlags;
|
|
|
|
//
|
|
// How many total elments are in this growing list?
|
|
//
|
|
ULONG cTotalElements;
|
|
|
|
//
|
|
// How big is each element in this list?
|
|
//
|
|
SIZE_T cbElementSize;
|
|
|
|
//
|
|
// How many to allocate per list chunk? As each piece of the growing list
|
|
// fills up, this is the number of elements to allocate to the new chunk
|
|
// of the list.
|
|
//
|
|
ULONG cElementsPerChunk;
|
|
|
|
//
|
|
// How many are in the initial internal list?
|
|
//
|
|
ULONG cInternalElements;
|
|
|
|
//
|
|
// Pointer to the intial "internal" list, if specified by the caller
|
|
//
|
|
PVOID pvInternalList;
|
|
|
|
//
|
|
// The allocation-freeing context and function pointers
|
|
//
|
|
RTL_ALLOCATOR Allocator;
|
|
|
|
//
|
|
// First chunk
|
|
//
|
|
PRTL_GROWING_LIST_CHUNK pFirstChunk;
|
|
|
|
//
|
|
// Last chunk (quick access)
|
|
//
|
|
PRTL_GROWING_LIST_CHUNK pLastChunk;
|
|
|
|
}
|
|
RTL_GROWING_LIST, *PRTL_GROWING_LIST;
|
|
|
|
|
|
|
|
NTSTATUS
|
|
RtlInitializeGrowingList(
|
|
PRTL_GROWING_LIST pList,
|
|
SIZE_T cbElementSize,
|
|
ULONG cElementsPerChunk,
|
|
PVOID pvInitialListBuffer,
|
|
SIZE_T cbInitialListBuffer,
|
|
PRTL_ALLOCATOR Allocator
|
|
);
|
|
|
|
NTSTATUS
|
|
RtlIndexIntoGrowingList(
|
|
PRTL_GROWING_LIST pList,
|
|
ULONG ulIndex,
|
|
PVOID *ppvPointerToSpace,
|
|
BOOLEAN fGrowingAllowed
|
|
);
|
|
|
|
NTSTATUS
|
|
RtlDestroyGrowingList(
|
|
PRTL_GROWING_LIST pList
|
|
);
|
|
|
|
//
|
|
// The growing list control structure can be placed anywhere in the allocation
|
|
// that's optimal (on cache boundaries, etc.)
|
|
//
|
|
#define RTL_INIT_GROWING_LIST_EX_FLAG_LIST_ANYWHERE (0x00000001)
|
|
|
|
|
|
NTSTATUS
|
|
RtlInitializeGrowingListEx(
|
|
ULONG ulFlags,
|
|
PVOID pvBlob,
|
|
SIZE_T cbBlobSpace,
|
|
SIZE_T cbElementSize,
|
|
ULONG cElementsPerChunk,
|
|
PRTL_ALLOCATOR Allocator,
|
|
PRTL_GROWING_LIST *ppBuiltListPointer,
|
|
PVOID pvReserved
|
|
);
|
|
|
|
NTSTATUS
|
|
RtlCloneGrowingList(
|
|
ULONG ulFlags,
|
|
PRTL_GROWING_LIST pDestination,
|
|
PRTL_GROWING_LIST pSource,
|
|
ULONG ulCount
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
RtlAllocateGrowingList(
|
|
PRTL_GROWING_LIST *ppGrowingList,
|
|
SIZE_T cbThingSize,
|
|
PRTL_ALLOCATOR Allocator
|
|
);
|
|
|
|
typedef NTSTATUS (__cdecl *PFN_LIST_COMPARISON_CALLBACK)(
|
|
PRTL_GROWING_LIST HostList,
|
|
PVOID Left,
|
|
PVOID Right,
|
|
PVOID Context,
|
|
int *Result
|
|
);
|
|
|
|
NTSTATUS
|
|
RtlSortGrowingList(
|
|
PRTL_GROWING_LIST pGrowingList,
|
|
ULONG ItemCount,
|
|
PFN_LIST_COMPARISON_CALLBACK SortCallback,
|
|
PVOID SortContext
|
|
);
|
|
|
|
NTSTATUS
|
|
RtlSearchGrowingList(
|
|
PRTL_GROWING_LIST TheList,
|
|
ULONG ItemCount,
|
|
PFN_LIST_COMPARISON_CALLBACK SearchCallback,
|
|
PVOID SearchTarget,
|
|
PVOID SearchContext,
|
|
PVOID *pvFoundItem
|
|
);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}; // extern "C"
|
|
#endif
|