创build一个目录并通过发出一个IRP来获得句柄

当我们通过CreateFile创build一个文件,创build的文件,我们得到的句柄。
但CreateDirectory不返回目录的句柄。

我也想创build一个目录时得到句柄。
我只想发出一个I / O请求包来处理这个问题。

所以,“做CreateDirectory,然后用FILE_FLAG_BACKUP_SEMANTICS CreateFile”。 将不会是一个答案。
它会向文件系统发出两个Irps。

有没有我可以在Usermode(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调用你可以做一些有趣的事情,比如做一个相对于另一个目录句柄的创建。 当然,我在这里放置的所有标志也可能要改变。 查阅文档和/或网页以获得最佳效果。