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

时间:2010-12-21 02:17:20

标签: windows winapi file-io filesystems ntfs

当我们通过CreateFile创建文件时,创建文件并获取句柄 但CreateDirectory不会返回目录的句柄。

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

所以,'执行CreateDirectory,然后使用FILE_FLAG_BACKUP_SEMANTICS创建CreateFile。'不会是答案。
它将向文件系统发出两个Irps。

我可以在Usermode(Win32 Api)中使用Api吗?

1 个答案:

答案 0 :(得分:4)

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调用你可以做有趣的事情,比如相对于另一个目录句柄创建。当然,我放在这里的所有旗帜你也可能想要改变。请参阅文档和/或Web以获得最佳结果。