diff --git a/foo.txt b/foo.txt new file mode 100644 index 0000000..c833fd0 --- /dev/null +++ b/foo.txt @@ -0,0 +1,242 @@ +#include +#include + +#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; +}