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.
 
 
 
 
 
 

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