目录相对ZwCreateFile

时间:2013-06-18 11:51:45

标签: c++ windows winapi driver kernel-mode

我必须为我的大学项目实施跨视图文件完整性检查程序。为此,我如何在内核模式下列出目录的文件??

1 个答案:

答案 0 :(得分:3)

您的起点是ZwCreateFile - 其中包含“FILE_LIST_DIRECTORY”等选项。

然后,您将使用ZwQueryDirectoryFile获取有关该目录中文件的信息。

SURE 让您在打开某些内容后不会忘记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);

这只是一个“草图”。我现在没有设置编译这个,我可能错过了一些重要的东西。但它应该给你一些想法。这里有很多可选参数和可选选项,有些我已经“猜到”了你想要的东西,但我认为我做出了合理的选择。可能有一些细节缺失,这使得这不起作用,但作为一个粗略的起点,它应该至少给你一个想法。