当我们通过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/