【问题标题】:HANDLE - File Handles and Directory Handles StructuresHANDLE - 文件句柄和目录句柄结构
【发布时间】:2011-09-04 14:53:44
【问题描述】:

语言:C
操作系统:Windows

我的应用程序是用 nt 级别的 api 构建的,并且必须操作文件和目录句柄。 在 Zwopenfile 或 zwcreate 文件上,我得到一个 HANDLE 结果。通常HANDLE 的值类似于 0x00000024、28,2c... 等。 当我将其转换为LPBYTE 以查看内容时。 Visual Studio 显示“无法评估表达式”。我了解到从创建/打开文件 api 返回的 HANDLE 不是指向内存位置的指针。但是,windows 使用该值并执行文件操作。 Ntquerydirectory object 为我提供了有关句柄的信息。然而,windows 是如何实现这个功能的还不得而知。 任何人都可以阐明它。

【问题讨论】:

  • 根据您提供的值,我敢打赌这是指针表中的字节偏移量。
  • @ikegami 我假设你说的那样。您对指针表有任何规范吗?或与此相关的任何文章。

标签: c windows winapi file handle


【解决方案1】:

这是一个所谓的“不透明值”,意思是“它完全取决于 Windows 如何在内部完成。例如,它可能是某个全局表中的索引,您的程序无法直接访问 - Windows 只知道如何到达那里,你甚至不应该考虑这样做。

【讨论】:

  • zwQuerydirectoryfile api 在 HANDLE 中设置的值很少。所以在随后的调用中,它会从它离开的地方恢复枚举。在这种情况下,我需要设置或读取 HANDLE 中保存的值。有没有这样做的机会?
  • @Beetles:也许吧。也许不吧。我不会依赖这个 - 它可以随着下一个服务包而改变。
  • 不,您不需要操纵这些值。你为什么还要使用原生 api?
【解决方案2】:

句柄存储在一个只能从内核代码访问的表中。如果您对 Windows 内核的工作原理感兴趣,您可能会发现 Mark Russinovitch blogdriver development 很有趣。

【讨论】:

    【解决方案3】:

    我所知道的最后一本书很好地参考了这类东西,这是 Mark E. Russinovitch 和 David A. Solomon 所著的Inside Windows 2000。虽然显然已经过时,但那本书的很多内容仍然具有相关性。谷歌搜索“Inside Windows 7”,可以找到 Russinovitch 的演讲视频和其他一些我无法保证但似乎与主题相关的书籍的链接。

    【讨论】:

      【解决方案4】:

      HANDLE 实际上是一个指向包含各种字段的结构的指针,通常它们指向一些内核对象。在 C 语言中编程时通常使用 HANDLES 以具有面向对象编程的概念。

      使用 WinDbg 进行调试时,您有一个名为 !handle 的扩展,它可以显示有关给定句柄的各种信息。

      Windows Internals(Mark Russinovich 着)一书详细介绍了这种机制以及许多其他 Windows 机制。

      也许你会发现这个讨论很有用:What is a Windows Handle?

      还可以查看 Mark 的这篇博文:http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx。它包含许多可以帮助您回答问题的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-28
        • 1970-01-01
        相关资源
        最近更新 更多