HANDLE - 文件句柄和目录句柄结构

时间:2011-05-30 07:06:06

标签: c windows winapi file handle

语言:C
操作系统:Windows

我的应用程序是使用nt级别的apis构建的,并且必须处理文件和目录句柄。 在Zwopenfile或zwcreate文件上,我得到一个HANDLE。通常HANDLE的值类似于0x00000024,88,2c ......等。 当我将其转换为LPBYTE以查看内容时。 Visual Studio显示“表达式无法评估”。我从中了解到,从create / open file apis返回的HANDLE不是指向内存位置的指针。但是,Windows使用该值并执行文件操作。 Ntquerydirectory对象为我提供了有关句柄的信息。但是,Windows如何实现此功能尚不得而知。 任何人都可以点亮它。

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

我所知道的最后一本书是Mark E. Russinovitch和David A. Solomon Inside Windows 2000对这类东西的一个很好的参考。虽然明显过时,但很多书仍然具有相关性。谷歌用于“Inside Windows 7”,用于链接到Russinovitch和其他一些我无法担保的书籍的谈话视频,但似乎是主题。

答案 3 :(得分:0)

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。它包含大量可以帮助您回答问题的信息。