c++ - 目录相对 ZwCreateFile

标签 c++ windows winapi driver kernel-mode

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

最佳答案

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

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

确定您没有忘记 ZwClose打开某些内容后 - 在使用后再次关闭的用户模式应用程序中,这并不那么重要。但是内核不知道驱动程序何时停止使用文件(或者,就此而言,是否已向其他驱动程序提供了该文件句柄,并且将在某个时刻使用它),因此即使您的驱动程序已卸载,文件它打开的文件将保持打开状态,直到系统重新启动 - 我非常喜欢“不重新启动”我的系统,并且通过一组好的驱动程序,运行机器一年多应该是可能的。如果您的驱动程序每天泄漏 1 个句柄,那么就泄漏了 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);

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

关于c++ - 目录相对 ZwCreateFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17168129/

相关文章:

ruby - windows下的rmagick

c# - xbox kinect 的 C# 库是否适用于 windows kinect SDK?

c++ - 无法在 NetBeans 7.0 上编译 C++ 代码

C++11 搜索对象 vector

c++ - 使用 arduino 的 QT 上的 SerialCommunication 解析失败

windows - 如何将 Visual Studio 的 “Output” 窗口重定向到 DebugView?

c++ - 以下 c++ 函数中的数组重新分配在函数调用后似乎已被忽略。

c# - 在 C# 中模拟数字符号 (#) 击键

c - 如何更改 Rich Edit 控件中的下划线颜色 (Win32/C)

c++我如何获得当前的控制台conhost进程