typedef struct _MYDATA {
    LIST_ENTRY ListEntry;
    ULONG X;
    ULONG Y;
}MYDATA, * PMYDATA;

void LinkListTest()
{
    LIST_ENTRY    linkListHead;//链表头
    InitializeListHead(&linkListHead);//初始化链表
    PMYDATA pData;
    ULONG i = 0;
    KdPrint(("Begin insert to link list\n"));
    for (i = 0; i < 10; i++)
    {
        //分配分页内存
        pData = (PMYDATA)ExAllocatePool(PagedPool, sizeof(MYDATA));
        //给结构体赋值
        pData->X = i;
        pData->Y = i + 1 * 10;
        //从头部插入到链表中
        InsertHeadList(&linkListHead, &pData->ListEntry);
    }
    DbgPrint("Remove Link list\n");
    while (!IsListEmpty(&linkListHead))
    {
        PLIST_ENTRY pEntry = RemoveTailList(&linkListHead);//将链表的尾节点移除链表,返回一个PLIST_ENTRY变量
        pData = CONTAINING_RECORD(pEntry, MYDATA, ListEntry);//通过结构体的某一个变量的地址和结构体里成员的名称来拿到结构体的地址
        DbgPrint("%d,%d\n",pData->X,pData->Y);
        ExFreePool(pData);
    }
}