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

发布于 2024-10-08 05:56:03 字数 253 浏览 4 评论 0原文

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

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

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

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

When we create a file by CreateFile, the file created and we get the handle.
But CreateDirectory doesn't return directory's handle.

I'd like to also get the handle when I create a directory.
I want to handle this by issuing only one I/O request packet.

So, 'Do CreateDirectory, then CreateFile with FILE_FLAG_BACKUP_SEMANTICS.' won't be an answer.
It will issue two Irps to file system.

Is there an Api I can use in Usermode(Win32 Api)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无需解释 2024-10-15 05:56:03

NT 可以做到这一点,但 Win32 不会公开它。为此,您需要使用 NT API。 NtCreateFile,具体来说。它应遵循 ZwCreateFile

这是一个说明性示例(在 Web 表单中匆忙破解 - 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 路径略有不同...您可能必须清理该路径。< /p>

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

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

NT can do this, but Win32 doesn't expose it. You need to use NT APIs for this. NtCreateFile, specifically. It should follow the same parameters of ZwCreateFile.

Here's an illustrative example (hacked up in a hurry inside a web form -- 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;
    }
}

Some things to note...

  • NT paths have slightly different conventions than Win32 paths... You might have to sanitize the path.

  • When talking about HANDLEs, NT APIs generally deal with NULL rather than INVALID_HANDLE_VALUE.

  • I didn't do it here, but by changing the InitializeObjectAttributes call you can do interesting things, like do a create relative to another directory handle. Of course all the flags I've put in here you might also want to change. Consult documentation and/or the web for best results.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文