-
-
[原创]文件遍历技术
-
发表于:
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编辑
,原因: