紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 27510|回复: 79

[源码]更正《WIN64驱动编程基础教程》里关于枚举驱动的错误

  [复制链接]

851

主题

3477

帖子

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
37093
发表于 2015-5-20 18:28:40 | 显示全部楼层 |阅读模式
在教程[5-3]里讲到隐藏驱动的部分,有一个在驱动里通过双向链表枚举出系统所有驱动的代码。

但在枚举结果中,总有一个信息不正确。这就是经典的“链表少一个问题”(『寂寞№梧桐』语)。

于是更正后的代码如下:
游客,如果您要查看本帖隐藏内容请回复

0

主题

3

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
145
发表于 2015-5-21 00:52:10 | 显示全部楼层
输出驱动全链表的方法:

  1. //这里字节对齐要采用默认,不要按1对齐,这样才符合32位和64位结构体
  2. typedef struct _LDR_DATA_TABLE_ENTRY
  3. {
  4.         LIST_ENTRY InLoadOrderLinks;
  5.         LIST_ENTRY InMemoryOrderLinks;
  6.         LIST_ENTRY InInitializationOrderLinks;
  7.         PVOID DllBase;
  8.         PVOID EntryPoint;
  9.         ULONG SizeOfImage;
  10.         UNICODE_STRING FullDllName;
  11.         UNICODE_STRING BaseDllName;
  12.         ULONG Flags;
  13.         USHORT LoadCount;
  14.         USHORT TlsIndex;
  15.         union
  16.         {
  17.                 LIST_ENTRY HashLinks;
  18.                 struct
  19.                 {
  20.                         PVOID SectionPointer;
  21.                         ULONG CheckSum;
  22.                 };
  23.         };
  24.         union
  25.         {
  26.                 struct
  27.                 {
  28.                         ULONG TimeDateStamp;
  29.                 };
  30.                 struct
  31.                 {
  32.                         PVOID LoadedImports;
  33.                 };
  34.         };
  35.         struct _ACTIVATION_CONTEXT * EntryPointActivationContext;
  36.         PVOID PatchInformation;
  37. } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;

  38. extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
  39. {
  40.         PLDR_DATA_TABLE_ENTRY Begin = (PLDR_DATA_TABLE_ENTRY)pDriverObj->DriverSection;
  41.         PLIST_ENTRY Head = (PLIST_ENTRY)Begin->InLoadOrderLinks.Flink;
  42.         PLIST_ENTRY Next = Head->Flink;
  43.         do
  44.         {
  45.                 PLDR_DATA_TABLE_ENTRY Entry = CONTAINING_RECORD(Next, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
  46.                 Next = Next->Flink;
  47.                 KdPrint(("%wZ\n",&Entry->FullDllName));
  48.         } while (Next != Head->Flink);

  49.         return STATUS_SUCCESS;
  50. }
复制代码


按照微软的写法,自己实现了一次,在xp 32位 64位 和win7 32下测试通过

评分

参与人数 1水晶币 +100 收起 理由
Tesla.Angela + 100 很给力!

查看全部评分

0

主题

3

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
145
发表于 2015-5-20 18:37:21 | 显示全部楼层
look

1

主题

25

帖子

0

精华

贵宾会员

Rank: 2Rank: 2

积分
677
发表于 2015-5-20 18:39:40 | 显示全部楼层
多谢分享

0

主题

21

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
104
发表于 2015-5-20 19:38:36 | 显示全部楼层
lokk

0

主题

117

帖子

0

精华

银牌会员

Rank: 3Rank: 3Rank: 3

积分
595
发表于 2015-5-20 19:49:23 | 显示全部楼层
学习下,,,,

8

主题

77

帖子

2

精华

钻石会员

Rank: 6Rank: 6

积分
3279
发表于 2015-5-20 20:44:28 | 显示全部楼层
看看怎么回事

0

主题

35

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
158
发表于 2015-5-20 22:07:59 | 显示全部楼层
这得看看!!!

0

主题

7

帖子

0

精华

初来乍到

Rank: 1

积分
21
发表于 2015-5-20 23:30:41 | 显示全部楼层
看看,学习了

0

主题

30

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
124
发表于 2015-5-21 18:03:11 | 显示全部楼层
TA大大更正教程了。。。学习一下
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2024-3-29 05:00 , Processed in 0.033374 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表