#include <stdio.h>
#include <stdlib.h>
#define IN
#define STATUS_FAILURE -1
#define STATUS_SUCCESS 0
typedef struct _item_t Item_t;
typedef struct _list_t List_t;
struct _item_t
{
Item_t *Previous;
Item_t *Next;
};
struct _list_t
{
Item_t *First;
Item_t *Last;
};
/* checked */
List_t *
InitializeList()
{
List_t * TList;
TList = malloc(sizeof *TList);
TList->First = NULL;
TList->Last = NULL;
return TList;
}
/* checked */
Item_t *
CreateItem()
{
Item_t * p;
p = malloc(sizeof *p);
p->Next = NULL;
p->Previous = NULL;
p->Priority = 0;
return p;
}
/* checked */
int
InsertItemAtFront( IN List_t * TList,
IN Item_t * kItem)
{
if(TList->First == NULL)
{
TList->First = kItem;
TList->Last = kItem;
kItem->Previous = NULL;
kItem->Next = NULL;
}
else
{
Item_t * FirstItem;
FirstItem = TList->First;
kItem->Next = FirstItem;
TList->First = kItem;
FirstItem->Previous = kItem;
}
return STATUS_SUCCESS;
}
/* checked */
int
SetItemPriority( IN Item_t * kItem,
IN PRIORITY Priority)
{
kItem->Priority = Priority;
return STATUS_SUCCESS;
}
/* checked */
int
InsertItemBetweenItems( IN List_t * TList,
IN Item_t * Previous,
IN Item_t * Next,
IN Item_t * Insert)
{
if(Previous == NULL || Next == NULL)
return STATUS_FAILURE;
else
{
Previous->Next = Insert;
Next->Previous = Insert;
Insert->Previous = Previous;
Insert->Next = Next;
}
return STATUS_SUCCESS;
}
/* checked */
int
RemoveItem( IN List_t * TList,
IN Item_t * kItem)
{
kItem->Previous->Next = kItem->Next;
kItem->Next->Previous = kItem->Previous;
kItem->Previous = NULL;
kItem->Next = NULL;
return STATUS_SUCCESS;
}
/* checked */
int
DestroyItemsInList(IN List_t * ItemList)
{
Item_t * z, tmp;
z = ItemList->Last;
while(z != NULL)
{
tmp = z->Previous;
MmFreeFromNonPagedPool(z);
z = tmp;
}
ItemList->First = NULL;
ItemList->Last = NULL;
return STATUS_SUCCESS;
}
NTSTATUS
DestroyItemList(IN List_t * ItemList)
{
MmFreeFromNonPagedPool(ItemList);
return STATUS_SUCCESS;
}
/* checked */
Item_t *
GetFirstItem(IN List_t * kItem)
{
return kItem->First;
}
/* checked */
Item_t *
GetLastItem(IN List_t * kItem)
{
return kItem->Last;
}
/* checked */
List_t *
RemoveItemListBetweenItems( IN Item_t * Previous,
IN Item_t * Next)
{
List_t * NewList;
NewList = InitializeList();
NewList->First = Previous->Next;
NewList->Last = Next->Previous;
NewList->First->Previous = NULL;
NewList->Last->Next = NULL;
Previous->Next = Next;
Next->Previous = Previous;
return NewList;
}
/* checked */
void
InsertItemListBetweenItems( IN Item_t * Previous,
IN Item_t * Next,
IN List_t * Insert)
{
assert(Previous != NULL);
assert(Next != NULL);
Previous->Next = Insert->First;
Next->Previous = Insert->Last;
Insert->First->Previous = Previous;
Insert->Last->Next = Next;
return STATUS_SUCCESS;
}
int
main()
{
List_t * High;
Item_t * a,b,c,d,e,z;
High = InitializeList();
a = CreateItem();
b = CreateItem();
c = CreateItem();
d = CreateItem();
e = CreateItem();
SetItemPriority(a, 1);
SetItemPriority(b, 2);
SetItemPriority(c, 3);
SetItemPriority(d, 4);
SetItemPriority(e, 5);
InsertItemAtFront(High, a);
InsertItemAtFront(High, b);
InsertItemAtFront(High, c);
InsertItemAtFront(High, d);
InsertItemAtFront(High, e);
z = High->Last;
while(z != NULL)
{
printf("Priority! equals %d\n", z->Priority);
z = z->Previous;
}
return 0;
}