bhjinhou
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1925回复:13

关于在驱动中如何使用单键表,会者很简单的!

楼主#
更多 发布于:2003-04-11 11:00
小弟最近看了Waltoney写的《Programming the Microsoft windows Driver Model 》eBook,书中关于在驱动中使用单链表的演示写到,

//先定义数据结构:
typedef struct _ONEWAY {
  UNICODE_STRING p;//小弟自已加入一项
  SINGLE_LIST_ENTRY linkfield;
} ONEWAY, *PONEWAY;

SINGLE_LIST_ENTRY SingleHead;
SingleHead.Next = NULL;
PONEWAY psElement = (PONEWAY) ExAllocatePool(PagedPool,
                                            sizeof(ONEWAY)
                                            );
PushEntryList(&SingleHead,
              &psElement->linkfield);
SINGLE_LIST_ENTRY psLink = PopEntryList(&SingleHead);
if (psLink)
{
  psElement = CONTAINING_RECORD(psLink, ONEWAY, linkfield);
  ...
  ExFreePool(psElement);
}

小弟按照上述方法在一个驱动中定义了一个键表, 想使用此链表,但不知为什么,总会出现死机。
小弟不明白怎样使用这个单链表。
如:
如何插入元素及引用,如结构中的:
UNICODE_STRING p;
项,如何引用其值及修改其值?
是不是使用CONTAINING_RECORD()宏,但具体的使用我不是很清楚。
那位大侠肯伸出缓助之手,小弟感激不尽。


[编辑 -  4/11/03 by  bhjinhou]

[编辑 -  4/16/03 by  bhjinhou]
bhjinhou
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-04-11 15:15
那位大侠指点一下。
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-04-11 18:48
那位大侠能说一下单链表如何使用?
知之为知之,不知为不知 有错则改之
LIUTANG
驱动大牛
驱动大牛
  • 注册日期2001-03-30
  • 最后登录2020-12-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望58点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2003-04-16 13:56
为何不使用STL的list类?小弟我最近才开始使用STL,顿时感觉C++实在是接近完美的。
bhjinhou
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-04-16 16:21
为何不使用STL的list类?小弟我最近才开始使用STL,顿时感觉C++实在是接近完美的。


多谢你的参与, 不好意思,是小弟题目没说清楚,我的意思是在Driver中使用单链表. :cool:
kaput
驱动中牛
驱动中牛
  • 注册日期2002-06-26
  • 最后登录2004-08-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-04-16 16:33
个人建议不要使用系统提供的LIST_ENTRY 和SINGLE_LIST_ENTRY  链表及其相关函数

1、不好用
2、出错太容易

自己编一个链表及相关函数集,不难而且调试和差错控制也方便
天下风云出我辈 一入江湖岁月催 鸿图霸业谈笑中 不胜人生一场醉......
bhjinhou
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-04-16 16:53
个人建议不要使用系统提供的LIST_ENTRY 和SINGLE_LIST_ENTRY  链表及其相关函数

1、不好用
2、出错太容易

自己编一个链表及相关函数集,不难而且调试和差错控制也方便
 

谢谢,安你这么说,我在驱动中能这样定义吗?
typedef struct _IPWAY
{
UNICODE_STRING p;
UINT len;
_IPWAY link;
} IPWAY,*PIPWAY;
请指教!
如果能,那在使用中有那些要注意的呢?
 :(
kaput
驱动中牛
驱动中牛
  • 注册日期2002-06-26
  • 最后登录2004-08-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-04-16 17:00
typedef struct _IPWAY
{
struct _IPWAY *link;
UNICODE_STRING p;
UINT len;

} IPWAY,*PIPWAY;

做一个链表不是很难吧!参考数据结构的书

天下风云出我辈 一入江湖岁月催 鸿图霸业谈笑中 不胜人生一场醉......
bhjinhou
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-04-16 17:05
typedef struct _IPWAY
{
struct _IPWAY *link;
UNICODE_STRING p;
UINT len;

} IPWAY,*PIPWAY;

做一个链表不是很难吧!参考数据结构的书

 

我认为在一般的用户态程序中使用是不难,但是在驱动中我没用过,
我是想问你这两者有何区别吗?
如何进行资源的释放?


[编辑 -  4/16/03 by  bhjinhou]
kaput
驱动中牛
驱动中牛
  • 注册日期2002-06-26
  • 最后登录2004-08-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-04-16 17:23
出内存操作外,只使用基本的语句(ansi c的子集)。

看你做什么东西,在NDIS下用, NdisAllocateMemory, NdisAllocateMemoryWithTag,NdisFreeMemory........
天下风云出我辈 一入江湖岁月催 鸿图霸业谈笑中 不胜人生一场醉......
bhjinhou
驱动牛犊
驱动牛犊
  • 注册日期2002-10-10
  • 最后登录2008-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-04-16 17:30
出内存操作外,只使用基本的语句(ansi c的子集)。

看你做什么东西,在NDIS下用, NdisAllocateMemory, NdisAllocateMemoryWithTag,NdisFreeMemory........

好吧,回头我试试,如有什么问题以后还请多多指点.
非常感谢!
hangzhoustayer
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2006-06-19
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-12-05 18:12
自己实现不方便吧,主要是不同的结构如果都要分别定义自己的添加删除等函数就太烦了,楼主帖子里访问方法有误吗?我没有试过,哪位大侠说说看错在哪里
Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-12-06 11:05
这个不要自己去实现了吧,当然你有时间,要深入研究,自己写一个也不难,还是需要比较深入的对windows系统内核的了解的。一般直接用DDK里的就可以了。。。
Shentu
驱动小牛
驱动小牛
  • 注册日期2004-04-05
  • 最后登录2011-01-24
  • 粉丝0
  • 关注0
  • 积分234分
  • 威望24点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-12-06 11:11
自己实现不方便吧,主要是不同的结构如果都要分别定义自己的添加删除等函数就太烦了,楼主帖子里访问方法有误吗?我没有试过,哪位大侠说说看错在哪里


链表里的节点放的是指针,仔细看看DDK的例子就清楚了。UNICODE_STRING 用错了,相信楼主应该找到问题了。

[编辑 -  12/6/04 by  Shentu]
游客

返回顶部