首页
社区
课程
招聘
LIST_ENTRY 茫然了!!!
发表于: 2010-4-23 23:21 5516

LIST_ENTRY 茫然了!!!

2010-4-23 23:21
5516
最近在写过滤驱动,要用链表,拿了DDK的 LIST_ENTRY 双向链表用了用觉得挺爽的,但调试过程中却不断蓝屏,问题出在什么地方?望大牛帮忙看看,谢谢了!

typedef        struct _MY_DIRECTORY
{
        LIST_ENTRY        ListEntry;
        int TestData;
} MY_DIRECTORY, *PMY_DIRECTORY;

LIST_ENTRY        LinkListHead;   //声明为全局变量

// 将对象插入链表
//
VOID  MyObjectToSet ( IN PVOID pObject )
{
        PMY_DIRECTORY         pMyDirectory = ( PMY_DIRECTORY ) ExAllocatePool ( PagedPool, sizeof ( MY_DIRECTORY ) );       
        pMyDirectory ->TestData = *(int *)pObject;       
#if DBG
        KdPrint (("pass through value: %d\n", pMyDirectory ->TestData ));
#endif
        //
        // 插入链表
        //
        InsertHeadList ( &LinkListHead, &pMyDirectory ->ListEntry );
        ExFreePool ( pMyDirectory );
}

// 将对象从链表中删除
//
VOID        MyObjectToRemove ( OUT PVOID pObject )
{
#if        DBG
        KdPrint (("IsListEmpty Value: %d\n",IsListEmpty ( &LinkListHead )));
#endif
        if ( !IsListEmpty ( &LinkListHead ) )
        {
                        PLIST_ENTRY                pEntry = RemoveHeadList ( &LinkListHead );
                        PMY_DIRECTORY         pMyDirectory = ( PMY_DIRECTORY ) ExAllocatePool ( PagedPool, sizeof ( MY_DIRECTORY ) );
                        pMyDirectory = CONTAINING_RECORD ( pEntry, MY_DIRECTORY, ListEntry );
                        pObject = (PVOID)&pMyDirectory ->TestData;
                        ExFreePool ( pMyDirectory );
        }
}
//
// MyTest() 是测试函数
VOID MyTest()
{
        // 初始化链表头
        //
        InitializeListHead ( &LinkListHead );
        for ( int i = 0; i<100; i++ )
        {
                MyObjectToSet ( (PVOID)&i );
        }
        while ( !IsListEmpty ( &LinkListHead ))
        {
                int num = 0;
                MyObjectToRemove ( &num );
                KdPrint (("Num: %d\n",num ));
        }
}

问题:将 MyTest() 函数放在 DriverEntry() 执行后,蓝屏。调试查看调用堆栈后,提示在
RemoveHeadList ( &LinkListHead ) 此行出错,仔细检查后,似乎并没有什么问题!麻烦
大牛们帮着看看,问题出在什么地方了?先谢谢了!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 3
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
共同学习共同进步。。。
2010-4-24 00:16
0
雪    币: 594
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我没有尝试运行你的驱动,不过一眼看过去,问题应该是出现在这里:
ExAllocatePool ( PagedPool, ...);

改用这个:
ExAllocatePool ( NonPagedPool, ...);
2010-4-25 10:20
0
雪    币: 86
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
LIST_ENTRY  在保证线程安全性的前提下,可以在符合 IRQL: <= DISPATCH_LEVEL 以下的3个中断级上运行。因此,和分页或非分页内存没有任何关系。
2010-4-25 22:13
0
雪    币: 86
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
呵呵,自己搞定了!
2010-4-25 22:14
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
应该是 你在 添加链表的时候 把内存释放了 所以在释放的时候 再释放一次 产生错误吧。
就是你代码中的
---------------------------------------
// 插入链表
  //
  InsertHeadList ( &LinkListHead, &pMyDirectory ->ListEntry );
  ExFreePool ( pMyDirectory );-----------------------这里!
------------------------------------------------------------
2010-7-31 02:28
0
游客
登录 | 注册 方可回帖
返回
//