void NTAPI RtlInitializeGenericTable(
TABLE *pGenericTable,
TABLE_COMPARE_ELEMENTS CompareElements,
TABLE_ALLOCATE_ELEMENT AllocateElement,
TABLE_FREE_ELEMENT FreeElement,
ULONG Unknown
);ULONG NTAPI RtlNumberGenericTableElements(
TABLE *pGenericTable
);BOOLEAN NTAPI RtlIsGenericTableEmpty(
TABLE *pGenericTable
);PVOID NTAPI RtlGetElementGenericTable(
TABLE *pGenericTable,
ULONG ElementNumber
);PVOID NTAPI RtlInsertElementGenericTable(
TABLE *pGenericTable,
PVOID ElementData,
ULONG DataLength,
OUT BOOLEAN *IsNewElement
);PVOID NTAPI RtlLookupElementGenericTable(
TABLE *pGenericTable,
PVOID ElementToFind
);BOOLEAN NTAPI RtlDeleteElementGenericTable(
TABLE *pGenericTable,
PVOID ElementToFind
);Listing 5.13 Prototypes of the basic generic table APIs.Conclusion
In this chapter, I demonstrated how to investigate, use, and document a rea-
sonably complicated set of functions. If there is one important moral to this196 Chapter 5