我必须为我的大学项目实施交叉视图文件完整性检查器。为此,我如何在内核模式下列出目录的文件?
问问题
1567 次
1 回答
3
你的出发点是ZwCreateFile
- 它有诸如“FILE_LIST_DIRECTORY”之类的选项。
然后,您将ZwQueryDirectoryFile
用于获取有关该目录中文件的信息。
确保您在打开某些东西后不会忘记ZwClose
- 在使用后再次关闭的用户模式应用程序中,这并不是那么重要。但是内核不知道驱动程序何时停止使用文件(或者,就此而言,是否已为其他驱动程序提供了该文件句柄,并且将在某个时候使用它),因此即使您的驱动程序被卸载,文件它打开将保持打开状态,直到系统重新启动 - 我非常喜欢“不重新启动”我的系统,并且使用一组好的驱动程序,运行一台机器超过一年应该是可能的。如果您的驱动程序一天泄漏一个句柄,那就是 365 个句柄泄漏。
所以,代码看起来像这样:
HANDLE h;
NTSTATUS status;
OBJECT_ATTRIBUTES oa = { sizeof(OBJECT_ATTRIBUTES), NULL, L"mydir",
OPEN_CASE_INSENSITIVE, NULL, NULL };
IO_STATUS_BLOCK iosb = {};
status = ZwCreateFile(&h, FILE_LIST_DIRECTORY, &oa, &iosb, NULL,
FILE_ATTRIBUTE_NORMAL, FILE_OPEN, FILE_DIRECTORY_FILE,
NULL, 0);
if (status != STATUS_SUCCESS)
{
... do something...
return errorcode;
}
else
{
FILE_DIRECTORY_INFORMATION info;
for(;;)
{
status = ZwQueryDirectoryFile(h, NULL, NULL, &iosb, &info, sizeof(info),
FileDirectoryInformation, TRUE, L"*.*",
FALSE);
if (status != STATUS_SUCCESS)
{
... check error code and perhaps print if unexpected error ...
break;
}
... do soemthing with `info` ...
}
}
ZwClose(h);
这只是一个“粗略的草图”。我现在没有编译它的设置,我可能错过了一些重要的东西。但它应该给你一些想法。这里有很多可选参数和可选选项,有些我已经“猜到”了你想要的,但我认为我已经做出了合理的选择。可能缺少一些细节,使这不起作用,但作为一个粗略的起点,它至少应该给你一个想法。
于 2013-06-18T12:40:37.897 回答