2012年7月5日星期四

用户层链表操作

/*
以前知道,要用链表需要自己定义结构,自己操作。
简便和复杂的方法有stl里面的list。
以后发现驱动里面有操作双链表的函数,
又发现用户层也有操作单链表函数(xp开始)。
好像这些操作都是在链表的末尾(头部)插入/删除,能否在中间(或者指定的位置)插入呢/删除?可以参考我写的用驱动(API)操作链表的思路.

本程序修改自msdn,只使用于SLIST_ENTRY是结构的第一个成员的,若要用于别的可以调整代码。
*/
#include <windows.h>

typedef struct _PROGRAM_ITEM {
    SLIST_ENTRY ItemEntry;
    ULONG Signature;
} PROGRAM_ITEM, *PPROGRAM_ITEM;

int main( )
{
    PSLIST_HEADER pListHead = (PSLIST_HEADER)_aligned_malloc(sizeof(SLIST_HEADER),MEMORY_ALLOCATION_ALIGNMENT);//crt函数
    InitializeSListHead(pListHead);//结构清零而已,注意这个结构的第一个成员是:Alignment。

    for(ULONG Count = 1; Count <= 10; Count += 1 )
    {
        PPROGRAM_ITEM pProgramItem;//好像是临时的成员变量。
        pProgramItem = (PPROGRAM_ITEM)_aligned_malloc(sizeof(PROGRAM_ITEM),MEMORY_ALLOCATION_ALIGNMENT);
        pProgramItem->Signature = Count;

        PSLIST_ENTRY pFirstEntry = InterlockedPushEntrySList(pListHead, &(pProgramItem->ItemEntry)); //插入到pListHead的头部,被插入的是后面的。
    }

    for(ULONG Count = 10; Count >= 1; Count -= 1 )
    {
        PSLIST_ENTRY pListEntry = InterlockedPopEntrySList(pListHead);//从头移除
        if( NULL == pListEntry )  return -1;

        PPROGRAM_ITEM pProgramItem;//好像是临时的成员变量。
        pProgramItem = (PPROGRAM_ITEM)pListEntry;
        printf("Signature is %d\n", pProgramItem->Signature);

        _aligned_free(pListEntry);//crt函数。
    }

    PSLIST_ENTRY pListEntry = InterlockedFlushSList(pListHead);
    PSLIST_ENTRY pFirstEntry = InterlockedPopEntrySList(pListHead);
    if (pFirstEntry != NULL)    return -1;

    _aligned_free(pListHead);
    return 1;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//改进的如下:
//加入了遍历的功能,最好加上临界区以支持多线程安全的访问.

/*
made by correy
made at 0:25 2014/2/16
email:kouleguan at hotmail dot com
homepage:http://correy.webs.com

参考资料:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686962(v=vs.85).aspx
*/

#include <windows.h>

typedef struct _PROGRAM_ITEM {
    SLIST_ENTRY ItemEntry;
    ULONG Signature;
} PROGRAM_ITEM, *PPROGRAM_ITEM;

typedef  PSLIST_ENTRY (WINAPI  * pRtlFirstEntrySList) (_In_  PSLIST_HEADER ListHead);//WINAPI

int main( )
{
    pRtlFirstEntrySList RtlFirstEntrySList = (pRtlFirstEntrySList)GetProcAddress(LoadLibrary(L"ntdll.dll"), "RtlFirstEntrySList");
    PSLIST_HEADER pListHead = (PSLIST_HEADER)_aligned_malloc(sizeof(SLIST_HEADER),MEMORY_ALLOCATION_ALIGNMENT);//crt函数
    InitializeSListHead(pListHead);//结构清零而已,注意这个结构的第一个成员是:Alignment。

    USHORT us = QueryDepthSList(pListHead);//测试,个数是0.

    PSLIST_ENTRY pFirstEntry;

    //插入头部.
    for(ULONG Count = 1; Count <= 10; Count += 1 )
    {
        PPROGRAM_ITEM pProgramItem;//好像是临时的成员变量。
        pProgramItem = (PPROGRAM_ITEM)_aligned_malloc(sizeof(PROGRAM_ITEM),MEMORY_ALLOCATION_ALIGNMENT);
        pProgramItem->Signature = Count;

        pFirstEntry = InterlockedPushEntrySList(pListHead, &(pProgramItem->ItemEntry)); //插入到pListHead的头部,被插入的是后面的。
    }

    us = QueryDepthSList(pListHead);//测试,个数是10.

    //遍历.
    for (pFirstEntry = RtlFirstEntrySList(pListHead) ; pFirstEntry != 0; pFirstEntry = pFirstEntry->Next)
    {
        //PPROGRAM_ITEM ppi = CONTAINING_RECORD(pFirstEntry, PROGRAM_ITEM, );
        PPROGRAM_ITEM ppi = (PPROGRAM_ITEM)pFirstEntry;
        printf("Signature is %d\n", ppi->Signature);
    }

    //删除.
    for(ULONG Count = 10; Count >= 1; Count -= 1 )
    {
        PSLIST_ENTRY pListEntry = InterlockedPopEntrySList(pListHead);//从头移除
        if( NULL == pListEntry )  return -1;

        PPROGRAM_ITEM pProgramItem;//好像是临时的成员变量。
        pProgramItem = (PPROGRAM_ITEM)pListEntry;
        printf("Signature is %d\n", pProgramItem->Signature);

        _aligned_free(pListEntry);//crt函数。
    }

    PSLIST_ENTRY pListEntry = InterlockedFlushSList(pListHead);//Removes all items from a singly linked list.
    us = QueryDepthSList(pListHead);//测试,个数是0.
    pFirstEntry = InterlockedPopEntrySList(pListHead);
    us = QueryDepthSList(pListHead);//测试,个数是0.
    if (pFirstEntry != NULL) {
        return -1;
    }

    _aligned_free(pListHead);
    return 1;
}

没有评论:

发表评论