首页
社区
课程
招聘
[原创]文件遍历技术
发表于: 2021-11-13 18:12 22557

[原创]文件遍历技术

2021-11-13 18:12
22557

给定一个文件夹的路径,打印这个文件夹中保存的目录路径与文件的路径与大小。

想要在用户层实现文件遍历技术,关键是需要用到两个API,分别是FindFirstFile和FindNextFile。这两个API在文档中的定义如下

返回值:如果函数执行成功,则会返回文件句柄,否则返回INVALID_HANDLE_VALUE。

返回值:如果执行成功,则返回值为TRUE,lpFindFileData中保存了下一个文件或者目录的信息。否则返回FALSE,且lpFindFileData中保存的内容不确定。

其中的WIN32_FIND_DATA在文档中的定义如下

其中比较重要的是如下两个成员:

在用户层要获取文件的大小,需要使用GetFileSize,该函数在文档中的定义如下

返回值:如果执行成功,则返回文件大小的低32为,否则为INVALID_FILE_SIZE。

据此可以写出以下的代码来实现遍历

可以看到,目录中的文件信息被打印出来

要在驱动层实现上述的功能,稍微复杂一些,需要以下的步骤。

首先需要使用ZwCreateFile来打开一个目录的句柄,该函数定义如下

这些参数中的ObjectAttributes是用来保存要打开的文件名的,要初始化这个变量需要用到InitializeObjectAttributes,该函数的定义如下

不同于用户层,驱动层要想获取目录中的所有文件,需要用到ZwQueryDirectoryFile函数,该函数可以在指定的文件句柄指定的目录中返回文件的各种信息,定义如下

当FileInformationClass指定为FileBothDirectoryInformation则会返回文件和目录的信息,此时FileInformation会返回PFILE_BOTH_DIR_INFORMATION指针,该结构体定义如下

其中的几个关键成员如下:

在驱动层,要获取文件的大小,则需要使用ZwQueryInformationFile,定义如下

当FileInformationClass指定为FileStandardInformation的时候,FileInformation指向的就是FILE_STANDARD_INFORMATION指针。该结构体的定义如下

其中的EndOfFile表示文件位置结尾的字节偏移量,它就等于文件的大小。

具体实现代码如下:

可以看到信息都被打印出来了


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

最后于 2021-11-30 09:57 被1900编辑 ,原因:
收藏
免费 5
支持
分享
最新回复 (3)
雪    币: 6723
活跃值: (1199)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习了
2021-12-10 22:03
0
雪    币: 220
活跃值: (721)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
长文件名怎么处理? 
2022-1-2 16:27
0
雪    币: 6102
活跃值: (5520)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
4
学习了,感谢分享!
2022-1-2 21:41
0
游客
登录 | 注册 方可回帖
返回
//