-typedef struct _GENERIC_LIST_ENTRY
-{
- LIST_ENTRY Entry;
- PGENERIC_LIST List;
- PVOID UserData;
- CHAR Text[1]; // FIXME: UI stuff
-} GENERIC_LIST_ENTRY;
-
-
-typedef struct _GENERIC_LIST
-{
- LIST_ENTRY ListHead;
- ULONG NumOfEntries;
-
- PGENERIC_LIST_ENTRY CurrentEntry;
- PGENERIC_LIST_ENTRY BackupEntry;
-} GENERIC_LIST;
-
-
-PGENERIC_LIST
-CreateGenericList(VOID)
-{
- PGENERIC_LIST List;
-
- List = (PGENERIC_LIST)RtlAllocateHeap(ProcessHeap,
- 0,
- sizeof(GENERIC_LIST));
- if (List == NULL)
- return NULL;
-
- InitializeListHead(&List->ListHead);
- List->NumOfEntries = 0;
-
- List->CurrentEntry = NULL;
- List->BackupEntry = NULL;
-
- return List;
-}
-
-VOID
-DestroyGenericList(
- IN OUT PGENERIC_LIST List,
- IN BOOLEAN FreeUserData)
-{
- PGENERIC_LIST_ENTRY ListEntry;
- PLIST_ENTRY Entry;
-
- /* Release list entries */
- while (!IsListEmpty (&List->ListHead))
- {
- Entry = RemoveHeadList (&List->ListHead);
- ListEntry = CONTAINING_RECORD (Entry, GENERIC_LIST_ENTRY, Entry);
-
- /* Release user data */
- if (FreeUserData && ListEntry->UserData != NULL)
- RtlFreeHeap (ProcessHeap, 0, ListEntry->UserData);
-
- /* Release list entry */
- RtlFreeHeap (ProcessHeap, 0, ListEntry);
- }
-
- /* Release list head */
- RtlFreeHeap (ProcessHeap, 0, List);
-}
-
-BOOLEAN
-AppendGenericListEntry(
- IN OUT PGENERIC_LIST List,
- IN PCHAR Text,
- IN PVOID UserData,
- IN BOOLEAN Current)
-{
- PGENERIC_LIST_ENTRY Entry;
-
- Entry = (PGENERIC_LIST_ENTRY)RtlAllocateHeap(ProcessHeap,
- 0,
- sizeof(GENERIC_LIST_ENTRY) + strlen(Text));
- if (Entry == NULL)
- return FALSE;
-
- strcpy (Entry->Text, Text);
- Entry->List = List;
- Entry->UserData = UserData;
-
- InsertTailList(&List->ListHead,
- &Entry->Entry);
- List->NumOfEntries++;
-
- if (Current || List->CurrentEntry == NULL)
- {
- List->CurrentEntry = Entry;
- }
-
- return TRUE;
-}
-
-