【问题标题】:Directory relative ZwCreateFile目录相对 ZwCreateFile
【发布时间】:2013-06-18 11:51:45
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您的起点是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);
    

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

    【讨论】:

    • 不,我多年前在商业产品中使用了其中一些功能......但我会编辑我的帖子以获取更多信息。
    • 对不起,至少没有比“c2220”更具描述性的错误,不确定我能帮忙 - 在我看到 c2220 是“警告视为错误”之后,所以大概有一个警告线,你需要修复。
    • 你能再精确一点吗?恐怕我用作便宜版本的水晶球的塑料球不会“看到”您的代码或错误消息。
    • 主驱动程序文件中包含严重错误。我不确定到底是什么,就像我说的,我现在使用的 Linux 系统没有设置为构建 Windows 驱动程序。如果您退后一步尝试只构建一个空驱动程序,它会起作用吗?
    • 好的,那么你做了什么改变使它停止编译?一步一步来。经常编译,一次只写几行。
    猜你喜欢
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 2013-10-14
    • 2011-12-11
    • 2012-05-28
    • 1970-01-01
    相关资源
    最近更新 更多