加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 05:30:02 所属栏目:Windows 来源:网络整理
导读:当我们通过CreateFile创建文件时,创建文件并获取句柄. 但CreateDirectory不返回目录的句柄. 我还想在创建目录时获取句柄. 我想通过只发出一个I / O请求数据包来处理这个问题. 所以,’执行CreateDirectory,然后使用FILE_FLAG_BACKUP_SEMANTICS创建CreateFile.
当我们通过CreateFile创建文件时,创建文件并获取句柄.
但CreateDirectory不返回目录的句柄.

我还想在创建目录时获取句柄.
我想通过只发出一个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,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,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以获得最佳结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读