windows - 创建目录并通过发出一个 IRP 获取句柄

标签 windows winapi file-io filesystems ntfs

当我们通过CreateFile创建文件时,创建的文件和我们得到的句柄。
但是 CreateDirectory 不返回目录的句柄。

我还想在创建目录时获取句柄。
我想通过只发出一个 I/O 请求数据包来处理这个问题。

因此,“执行 CreateDirectory,然后使用 FILE_FLAG_BACKUP_SEMANTICS 创建文件。”不会是一个答案。
它将向文件系统发出两个 Irp。

是否有我可以在用户模式(Win32 Api)中使用的 Api?

最佳答案

NT 可以做到这一点,但 Win32 不公开它。为此,您需要使用 NT API。 NtCreateFile , 具体来说。它应该遵循与 ZwCreateFile 相同的参数.

这是一个说明性示例(在网络表单中匆忙破解 - YMMV):

HANDLE
CreateDirectoryAndGetHandle(PWSTR pszFileName)
{
    NTSTATUS Status;
    UNICODE_STRING FileName;
    HANDLE DirectoryHandle;
    IO_STATUS_BLOCK IoStatus;
    OBJECT_ATTRIBUTES ObjectAttributes;

    RtlInitUnicodeString(&FileName, pszFileName);
    InitializeObjectAttributes(&ObjectAtributes, &FileName, 0, NULL, NULL);

    Status = NtCreateFile(&DirectoryHandle,
                          GENERIC_READ | GENERIC_WRITE,
                          &ObjectAttributes,
                          &IoStatus,
                          FILE_ATTRIBUTE_NORMAL,
                          FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
                          FILE_CREATE,
                          FILE_DIRECTORY_FILE,
                          NULL,
                          0);

    if (NT_SUCCESS(Status))
    {
       return DirectoryHandle;
    }
    else
    {
       SetLastError(RtlNtStatusToDosError(Status));
       return INVALID_HANDLE_VALUE;
    }
}

一些注意事项...

  • NT 路径的约定与 Win32 路径略有不同...您可能需要清理路径。

  • 在谈论 HANDLE 时,NT API 通常处理 NULL 而不是 INVALID_HANDLE_VALUE

  • 我没有在此处执行此操作,但通过更改 InitializeObjectAttributes 调用,您可以做一些有趣的事情,例如创建相对于另一个目录句柄的操作。当然,您可能还想更改我放在这里的所有标志。查阅文档和/或网络以获得最佳结果。

关于windows - 创建目录并通过发出一个 IRP 获取句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4495767/

相关文章:

c - "expected declaration specifiers"错误信息

windows - 不允许在 Windows cmd 脚本变量值中使用括号?

java - 使用java在cmd中执行多个命令

c++ - 使用 C++ 的 Win32/MFC 命名约定

c++ - CreateBitmap() 返回颠倒的图像

c++ - 在 Windows 上更改 Qt 的计时器分辨率

c - 输出文件用H符号填充,C

windows - 计划任务是否收到 WM_QUERYENDSESSION 消息?

python - 当变量值更改时,文本对象不会在屏幕上更新

python - 在django中读取文件并写入数据库