当我们通过CreateFile创建文件时,创建文件并获取句柄 但CreateDirectory不会返回目录的句柄。
我想在创建目录时获取句柄 我想通过只发出一个I / O请求包来处理这个问题。
所以,'执行CreateDirectory,然后使用FILE_FLAG_BACKUP_SEMANTICS创建CreateFile。'不会是答案。
它将向文件系统发出两个Irps。
我可以在Usermode(Win32 Api)中使用Api吗?
答案 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以获得最佳结果。