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

.net – 如何异步打开Windows中的文件

发布时间:2020-12-13 22:35:09 所属栏目:Windows 来源:网络整理
导读:有没有办法在 Windows中异步打开文件? CreateFile API函数只有FILE_FLAG_OVERLAPPED,允许进一步的异步读写.尽管如此,文件的打开似乎是同步的.鉴于,它必须访问文件系统(并可能执行昂贵的IO操作),它可能是一个潜在的阻止程序. 这实际上是一个潜在的问题,是否
有没有办法在 Windows中异步打开文件? CreateFile API函数只有FILE_FLAG_OVERLAPPED,允许进一步的异步读写.尽管如此,文件的打开似乎是同步的.鉴于,它必须访问文件系统(并可能执行昂贵的IO操作),它可能是一个潜在的阻止程序.

这实际上是一个潜在的问题,是否可以异步打开.NET中的文件(因为无法等待FileStream ctor).但如果在操作系统中无法做到这一点,问题就毫无意义.

解决方法

不幸的是,在用户模式下无法异步创建/打开文件.即使驱动程序返回STATUS_PENDING为 IRP_MJ_CREATE,系统也会在这种情况下等待,直到驱动程序完成IRP,然后才能从其中一个create / open文件函数返回控制权.

只有当我们处于内核模式时,才有可能,如果您自己格式化IRP_MJ_CREATE并将其发送给驱动程序.但即使在这种情况下,驱动程序几乎总是同步处理IRP_MJ_CREATE.

对于API是异步的 – 必须以某种方式在操作完成时通知调用者

windows使用了3种方法

>参数中的一些回调例程,通常是APC(PIO_APC_ROUTINE)
操作完成时调用
>参数中的一些事件,当操作完成时,事件设置在
信号状态.
在api调用中使用的>文件句柄被绑定用于某些IOCP.什么时候
操作完成的数据包排队到IOCP. (我们稍后通过调用GetQueuedCompletionStatus(ZwRemoveIoCompletion)或KeRemoveQueue删除此数据包

3)在我们的情况下是不可能的,因为文件句柄还没有创建,所以它不能绑定到任何IOCP.关于1)和2)让我们查找文件open / create api签名:

在用户模式下,打开/创建文件的最低级别api是ZwOpenFileZwCreateFile. CreateFile是ZwCreateFile上的shell.在内核模式下NtOpenFile – > NtCreateFile – > IoCreateFile – > IoCreateFileEx even – IoCreateFileEx(创建文件的最低级api) – 没有Event或[Apc]回调参数 – 所以不是异步的. IoCreateFileEx调用ObOpenObjectByName(未记录,但导出例程) – 这里也没有1)或2)参数 – 再次这是设计api同步

(编辑:李大同)

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

    推荐文章
      热点阅读