语言:C
操作系统:Windows
我的应用程序是使用nt级别的apis构建的,并且必须处理文件和目录句柄。
在Zwopenfile或zwcreate文件上,我得到一个HANDLE
。通常HANDLE
的值类似于0x00000024,88,2c ......等。
当我将其转换为LPBYTE
以查看内容时。 Visual Studio显示“表达式无法评估”。我从中了解到,从create / open file apis返回的HANDLE
不是指向内存位置的指针。但是,Windows使用该值并执行文件操作。
Ntquerydirectory
对象为我提供了有关句柄的信息。但是,Windows如何实现此功能尚不得而知。
任何人都可以点亮它。
答案 0 :(得分:4)
这是一个所谓的“不透明值”,这意味着“它完全取决于Windows如何在内部完成。例如,它可能是某个全局表中的索引,无法直接访问您的程序 - Windows只知道如何到达那里,你甚至不应该想到这样做。
答案 1 :(得分:2)
句柄存储在只能从内核代码访问的表中。如果您对Windows内核的工作方式感兴趣,可能会发现Mark Russinovitch blog或driver 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。它包含大量可以帮助您回答问题的信息。